Parser Functions

Parser Functions

前述のようにparseSourceFileは初期状態をセットアップし、それをparseSourceFileWorker関数に渡します。

parseSourceFileWorker

最初にSourceFileASTノードを作成します。次に、parseStatements関数から始まるソースコードを解析します。それが返ってくると、nodeCountidentifierCountなどの追加情報を含むSourceFileノードを完成させます。

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つの重要な関数createNodeparseExpectedfinishNodeを示しています。

createNode

ParserのcreateNode関数function createNode(kind:SyntaxKind、pos ?: number):Nodeはノードの作成、渡されたときのSyntaxKindのセットアップ、渡された場合の初期位置の設定(または、現在のスキャナの位置を使います)を行います。

parseExpected

ParserのparseExpected関数function parseExpected(kind:SyntaxKind、diagnosticMessage ?: DiagnosticMessage):booleanは、Parserの状態に含まれる現在のトークンが目的のSyntaxKindと一致することをチェックします。そうでなければ、送られたdiagnosticMessageを報告するか、foo expectedの形式の一般的なものを作成します。これは内部的にparseErrorAtPosition関数(スキャン位置を使用します)を使用して良いエラー報告を行います。

finishNode

ParserのfinishNode関数function finishNode <T extends Node>(node:T、end ?:: number):TはNodeのend位置や、parserContextFlagsのように便利なモノを設定します。これは、このNodeを解析する前にエラーがあったとしても、同じようにパースされます(その場合、インクリメンタルパーシングでこのASTノードを再利用できません)。