Scanner
TypeScript Scannerのソースコードは、完全にscanner.tsにあります。ScannerはソースコードをASTに変換するためにParserによって内部的に制御されます。以下に示すのは、どんな結果が望まれるかです:
1
SourceCode ~~ scanner ~~> Token Stream ~~ parser ~~> AST
Copied!

Parserによる使用法

Scannerを何度も作成するコストを避けるために、parser.tsにシングルトンのscannerが作成されています。このスキャナは、initializeState関数を使ってオンデマンドにParserによって準備されます。
ここでは、この概念を説明するParser内の実際のコードのシンプルバージョンを示します:
code/compiler/scanner/runScanner.ts
1
import * as ts from "ntypescript";
2
3
// TypeScript has a singleton scanner
4
const scanner = ts.createScanner(ts.ScriptTarget.Latest, /*skipTrivia*/ true);
5
6
// That is initialized using a function `initializeState` similar to
7
function initializeState(text: string) {
8
scanner.setText(text);
9
scanner.setOnError((message: ts.DiagnosticMessage, length: number) => {
10
console.error(message);
11
});
12
scanner.setScriptTarget(ts.ScriptTarget.ES5);
13
scanner.setLanguageVariant(ts.LanguageVariant.Standard);
14
}
15
16
// Sample usage
17
initializeState(`
18
var foo = 123;
19
`.trim());
20
21
// Start the scanning
22
var token = scanner.scan();
23
while (token != ts.SyntaxKind.EndOfFileToken) {
24
console.log(ts.formatSyntaxKind(token));
25
token = scanner.scan();
26
}
Copied!
これは以下を出力します:
1
VarKeyword
2
Identifier
3
FirstAssignment
4
FirstLiteralToken
5
SemicolonToken
Copied!

スキャナの状態

scanを呼び出すと、スキャナはローカル状態(スキャン中の位置、現在のトークンの詳細など)を更新します。スキャナには、現在のスキャナの状態を取得するためのユーティリティ機能が用意されています。以下のサンプルでは、スキャナを作成し、それを使用してコード内のトークンとその位置を特定しています。
code/compiler/scanner/runScannerWithPosition.ts
1
// Sample usage
2
initializeState(`
3
var foo = 123;
4
`.trim());
5
6
// Start the scanning
7
var token = scanner.scan();
8
while (token != ts.SyntaxKind.EndOfFileToken) {
9
let currentToken = ts.formatSyntaxKind(token);
10
let tokenStart = scanner.getStartPos();
11
token = scanner.scan();
12
let tokenEnd = scanner.getStartPos();
13
console.log(currentToken, tokenStart, tokenEnd);
14
}
Copied!
これは以下を出力します:
1
VarKeyword 0 3
2
Identifier 3 7
3
FirstAssignment 7 9
4
FirstLiteralToken 9 13
5
SemicolonToken 13 14
Copied!

スタンドアロンScanner

TypeScript ParserはシングルトンのScannerを持っていますが、createScannerを使ってスタンドアロンScannerを作成し、setText/setTextPosを使って、一興のためにファイル内の異なる位置をスキャンすることができます。
最終更新 2yr ago