技術

2.7. ドライバ

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

ドライバは、これまで作成した構文解析のためのパーツを、トップレベルのディスパッチループから単に呼び出すだけである。
トップレベルのループを追加するだけなので、とても興味深い部分、というわけではない。
以下は、”トップレベルの構文解析(Top-Level Parsing)”部分の全コードである。
訳注: ここでの”トップレベル”と、これ以降の”トップレベル”は意味が違うと思われる。
ここでの”トップレベル”は、万華鏡コンパイラであるC++のコードにおける”トップレベル”を指し、これ以降の”トップレベル”は、万華鏡言語で書かれるコードにおけるトップレベルを指すと思われる。

/// top ::= definition | external | expression | ';'
static void MainLoop() {
  while (1) {
    fprintf(stderr, "ready> ");
    switch (CurTok) {
    case tok_eof:    return;
    case ';':        getNextToken(); break;  // トップレベルのセミコロンを無視する。
    case tok_def:    HandleDefinition(); break;
    case tok_extern: HandleExtern(); break;
    default:         HandleTopLevelExpression(); break;
    }
  }
}

このなかで一番興味深い部分は、トップレベルのセミコロンを無視するという事である。
なぜこんなことをするのか?
その主な理由は、例えば”4 + 5″とコマンドラインに入力した場合、入力が完了したのかそうでないのか構文解析器は知ることが出来ないからである。
例えば、トップレベルの式の終わりが”4 + 5″の場合、その後に”def foo…”と書くことが出来る。
もしくは、”4 + 5″の後に”* 6″と式を続けることも出来る。
トップレベルでセミコロンが使えれば、ユーザーは”4 + 5;”と書くことができ、構文解析器はそこで式が終了してることを知ることが出来る。
訳注: ちょっとここ分かりづらいと思うので補足。
構文解析器がトップレベルのセミコロンを無視するということは、トップレベルにセミコロンを書いても良いという事になる。
字句解析器ではisspace関数によって空白文字(改行を含む)が無視される(普通の空白と同じ扱い)ので、改行によって式の終わりを特定出来ない。
万華鏡では、式の後に関数定義等が続く場合、式の行末のセミコロンは必須ではないが、セミコロンを使うことによって式の終わりを明示的にコンパイラに伝えることが出来る。

コメントを残す

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



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