投稿日
2013/8/20 火曜日
LLVMによるプログラミング言語の実装チュートリアル日本語訳
第2章 万華鏡: 構文解析器とASTの実装
第6節 残りの構文解析
まだやってないのは、関数プロトタイプの処理である。
万華鏡では、関数プロトタイプは、関数本体の定義と同じように”extern”関数の定義にも使用される。
これを行うコードは、まぁ馬鹿正直で面白いところはあまりない。(式の処理について理解してたらだけど。)
/// プロトタイプ /// ::= id '(' id* ')' static PrototypeAST *ParsePrototype() { if (CurTok != tok_identifier) return ErrorP("Expected function name in prototype"); std::string FnName = IdentifierStr; getNextToken(); if (CurTok != '(') return ErrorP("Expected '(' in prototype"); // 引数の名前のリストを読み取る。 std::vector<std::string> ArgNames; while (getNextToken() == tok_identifier) ArgNames.push_back(IdentifierStr); if (CurTok != ')') return ErrorP("Expected ')' in prototype"); // 成功。 getNextToken(); // ')'を消費。 return new PrototypeAST(FnName, ArgNames); }
これによって、関数定義はとても簡単になる。
プロトタイプに、関数本体を実装するための式をプラスするだけでよい。
/// definition ::= 'def' prototype expression static FunctionAST *ParseDefinition() { getNextToken(); // "def"を消費。 PrototypeAST *Proto = ParsePrototype(); if (Proto == 0) return 0; if (ExprAST *E = ParseExpression()) return new FunctionAST(Proto, E); return 0; }
さらに、ユーザー関数の前方宣言と同じように”sin”や”cos”などの関数の”extern”宣言をサポートする。
“extern”は、関数本体がないプロトタイプそのものである。
/// external ::= 'extern' prototype static PrototypeAST *ParseExtern() { getNextToken(); // "extern"を消費。 return ParsePrototype(); }
最後に、ユーザーが書いた任意のトップレベルの式をそのまま評価するようにする。
これを、無名で引数が無い関数として定義する事によって処理する。
/// toplevelexpr ::= expression static FunctionAST *ParseTopLevelExpr() { if (ExprAST *E = ParseExpression()) { // 無名のプロトタイプを作成する。 PrototypeAST *Proto = new PrototypeAST("", std::vector<std::string>()); return new FunctionAST(Proto, E); } return 0; }
さてこれによって、全てのパーツはそろった。
次は、これまで我々が書いてきたコードを実際に実行するために、小さなドライバを構築してみよう。
最近のコメント
名前
しゅごい
Jane Doe
FYI Avoid Annoying Unexpe…
Jane Doe
ご存じとは思いますが、whileには、”~の間”と…
peta_okechan
針金みたいなパーツを引っ張ると外れます。 他の方の…
虎徹ファン交換
虎徹の標準ファンを外す際に、どのようにして外されま…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…
花粉症対策2019 – 日曜研究室
[…] 花粉症対策についてはこれまで次の記事を書いてきました。https://…