技術

5.3.3. forループのための構文解析器

LLVMによるプログラミング言語の実装チュートリアル日本語訳
第5章 万華鏡: 言語の拡張: 制御フロー
第3.3節 forループのための構文解析器

構文解析器のコードもかなり普通である。
ここで唯一興味深いのは、オプションであるステップ値の処理である。
この構文解析器のコードでは、2番目のカンマがあるかどうかチェックすることによって、ステップ値を処理する。
省略されていたら、ASTノードの中でステップ値にnullをセットする。

/// forexpr ::= 'for' identifier '=' expr ',' expr (',' expr)? 'in' expression
static ExprAST *ParseForExpr() {
  getNextToken();  // forを消化。

  if (CurTok != tok_identifier)
    return Error("expected identifier after for");

  std::string IdName = IdentifierStr;
  getNextToken();  // 識別子を消化。

  if (CurTok != '=')
    return Error("expected '=' after for");
  getNextToken();  // '='を消化。


  ExprAST *Start = ParseExpression();
  if (Start == 0) return 0;
  if (CurTok != ',')
    return Error("expected ',' after for start value");
  getNextToken();

  ExprAST *End = ParseExpression();
  if (End == 0) return 0;

  // ステップ値はオプション。
  ExprAST *Step = 0;
  if (CurTok == ',') {
    getNextToken();
    Step = ParseExpression();
    if (Step == 0) return 0;
  }

  if (CurTok != tok_in)
    return Error("expected 'in' after for");
  getNextToken();  // inを消化。

  ExprAST *Body = ParseExpression();
  if (Body == 0) return 0;

  return new ForExprAST(IdName, Start, End, Step, Body);
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です



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

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください