投稿日
2013/8/17 土曜日
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を返す。)
以上の基本的なヘルパー関数によって、我々の文法の最初のひとつ、数値リテラルを実装することが可能となった。
最近のコメント
名前
しゅごい
Jane Doe
FYI Avoid Annoying Unexpe…
Jane Doe
ご存じとは思いますが、whileには、”~の間”と…
peta_okechan
針金みたいなパーツを引っ張ると外れます。 他の方の…
虎徹ファン交換
虎徹の標準ファンを外す際に、どのようにして外されま…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…