Parser
TypeScript Parserのソースコードは完全にparser.tsにあります。ScannerはソースコードをASTに変換するためにParserによって内部的に制御されます。下記は、望まれる結果の概要です。
1
SourceCode ~~ scanner ~~> Token Stream ~~ parser ~~> AST
Copied!
Parserはシングルトンとして実装されています(scannerと同様の理由です。再初期化が可能な場合は再作成したくありません)。実際には、Parserのためのstate変数とシングルトンscannerを含むnamespace Parserとして実装されています。前に述べたように、const scannerを含んでいます。Parserの関数はこのScannerを管理します。

Programによる使用例

ParserはProgramによって間接的に駆動されます(実際には前述のCompilerHostによって実際に実行されるので、間接的です)。基本的に以下が、単純化したコールスタックです:
1
Program ->
2
CompilerHost.getSourceFile ->
3
(global function parser.ts).createSourceFile ->
4
Parser.parseSourceFile
Copied!
parseSourceFileは、Parserのstateを準備するだけでなく、initializeStateを呼び出すことによってscannerの状態を準備します。その後、 parseSourceFileWorkerを使ってソースファイルを解析します。

サンプルの使用法

Parser内部を深く掘り下げる前に、(ts.createSourceFileを使用して)ソースファイルのASTを取得するためにTypeScriptのParserを使用するサンプルコードを次に示します。
code/compiler/parser/runParser.ts
1
import * as ts from "ntypescript";
2
3
function printAllChildren(node: ts.Node, depth = 0) {
4
console.log(new Array(depth + 1).join('----'), ts.formatSyntaxKind(node.kind), node.pos, node.end);
5
depth++;
6
node.getChildren().forEach(c=> printAllChildren(c, depth));
7
}
8
9
var sourceCode = `
10
var foo = 123;
11
`.trim();
12
13
var sourceFile = ts.createSourceFile('foo.ts', sourceCode, ts.ScriptTarget.ES5, true);
14
printAllChildren(sourceFile);
Copied!
これは以下を出力します:
1
SourceFile 0 14
2
---- SyntaxList 0 14
3
-------- VariableStatement 0 14
4
------------ VariableDeclarationList 0 13
5
---------------- VarKeyword 0 3
6
---------------- SyntaxList 3 13
7
-------------------- VariableDeclaration 3 13
8
------------------------ Identifier 3 7
9
------------------------ FirstAssignment 7 9
10
------------------------ FirstLiteralToken 9 13
11
------------ SemicolonToken 13 14
12
---- EndOfFileToken 14 14
Copied!
あなたの頭を左に傾けると、これは非常に右に偏った木のように見えます。
最終更新 3yr ago