技術

2.3. 構文解析器の基本

LLVMによるプログラミング言語の実装チュートリアル日本語訳
第2章 万華鏡: 構文解析器とASTの実装
第3節 構文解析器の基本

さて、ASTを構築する準備ができたので、次はそのための構文解析器のコードを定義しなければならない。
例えば”x+y”(字句解析器から3つのトークンとして返される)を構文解析して、以下のような感じでASTを生成したい。

ExprAST *X = new VariableExprAST("x");
ExprAST *Y = new VariableExprAST("y");
ExprAST *Result = new BinaryExprAST('+', X, Y);

これを実現するために、幾つかの基本的なヘルパ関数を定義することからはじめる。

/// CurTok/getNextToken - シンプルなトークンのバッファを提供する。
/// CurTokは構文解析器が現在処理中のトークンである。
/// getNextTokenは字句解析器から別のトークンを読み取り、その結果でCurTokを更新する。
static int CurTok;
static int getNextToken() {
  return CurTok = gettok();
}

これで、字句解析器にトークン用の簡易的なバッファが用意されたことになる。
これによって、字句解析器が返したトークンについて調べることが出来る。
我々の構文解析器の各関数は、解析されるべき現在のトークンがCurTokに入ってると仮定している。

/// Error* - これらはエラー処理のための小さな関数群である。
ExprAST *Error(const char *Str) { fprintf(stderr, "Error: %s\n", Str);return 0;}
PrototypeAST *ErrorP(const char *Str) { Error(Str); return 0; }
FunctionAST *ErrorF(const char *Str) { Error(Str); return 0; }

Error関数は、シンプルなヘルパー関数で、我々の構文解析器がエラーを処理するために使う。
我々の構文解析器におけるエラーの回復は、ベストではないし細かいところでユーザーフレンドリーでもない。
しかし、このチュートリアルではそれで十分である。
これらの関数は、戻り値の型が違う様々な関数におけるエラー処理を簡単にする。(これらは常にnullを返す。)
以上の基本的なヘルパー関数によって、我々の文法の最初のひとつ、数値リテラルを実装することが可能となった。

コメントを残す

メールアドレスが公開されることはありません。



※画像をクリックして別の画像を表示