Parser Functions
Parser Functions
前述のようにparseSourceFileは初期状態をセットアップし、それをparseSourceFileWorker関数に渡します。
parseSourceFileWorker
parseSourceFileWorker最初にSourceFileASTノードを作成します。次に、parseStatements関数から始まるソースコードを解析します。それが返ってくると、nodeCount、identifierCountなどの追加情報を含むSourceFileノードを完成させます。
parseStatements
parseStatements最も重要なparseFooスタイルの関数の1つです(次に説明する概念です)。これは、Scannerから返された現在のtokenによって切り替えられます。例えば現在のトークンが SemicolonTokenであればparseEmptyStatementを呼び出して空文のASTノードを作成します。
Nodeの作成
パーサには、Fooノードを生成するparserFoo関数がたくさんあります。これらは一般的にFooNodeが期待される時点で(他のParser関数から)呼び出されます。このプロセスの典型的なサンプルは、;;;;;;のような空文をパースするために使われるparseEmptyStatement()関数です。以下にその関数の全体があります:
function parseEmptyStatement(): Statement {
let node = <Statement>createNode(SyntaxKind.EmptyStatement);
parseExpected(SyntaxKind.SemicolonToken);
return finishNode(node);
}これは、3つの重要な関数createNode、parseExpectedとfinishNodeを示しています。
createNode
createNodeParserのcreateNode関数function createNode(kind: SyntaxKind, pos?: number): Nodeはノードの作成、渡されたときのSyntaxKindのセットアップ、渡された場合の初期位置の設定(または、現在のスキャナの位置を使います)を行います。
parseExpected
parseExpectedParserのparseExpected関数function parseExpected(kind: SyntaxKind, diagnosticMessage?: DiagnosticMessage): booleanは、Parserの状態に含まれる現在のトークンが目的のSyntaxKindと一致することをチェックします。そうでなければ、送られたdiagnosticMessageを報告するか、foo expectedの形式の一般的なものを作成します。これは内部的にparseErrorAtPosition関数(スキャン位置を使用します)を使用して良いエラー報告を行います。
finishNode
finishNodeParserのfinishNode関数function finishNode<T extends Node>(node: T, end?: number): TはNodeのend位置や、parserContextFlagsのように便利なモノを設定します。これは、このNodeを解析する前にエラーがあったとしても、同じようにパースされます(その場合、インクリメンタルパーシングでこのASTノードを再利用できません)。
最終更新
役に立ちましたか?