%% (* ML-Yaccの宣言(通常のMLプログラムではない) *) %name MyC %pos unit %eop SEMICOLON (* 終端記号の宣言 *) %term VAR of string (* 変数名 *) | CONST of int (* 整数定数 *) | EQUAL (* = *) | PLUS (* + *) | WHILE (* while *) | LPAREN (* ( *) | RPAREN (* ) *) | GREATER (* > *) | LBRACE (* { *) | RBRACE (* } *) | SEMICOLON (* ; *) | PRINT (* print *) (* 非終端記号の宣言 *) %nonterm STATEMENT of Syntax.statement | STATEMENT_LIST of Syntax.statement list %% (* ML-Yaccの規則(通常のMLプログラムではない) *) (* 一つの文を構文解析する規則 *) STATEMENT : VAR EQUAL CONST (Syntax.Const(VAR, CONST)) | VAR EQUAL VAR PLUS VAR (Syntax.Add(VAR1, VAR2, VAR3)) | WHILE LPAREN VAR GREATER VAR RPAREN STATEMENT (Syntax.While(VAR1, VAR2, STATEMENT)) | LBRACE STATEMENT_LIST RBRACE (Syntax.Seq(STATEMENT_LIST)) | PRINT VAR (Syntax.Print(VAR)) (* 文の列を構文解析する規則 *) STATEMENT_LIST : STATEMENT SEMICOLON STATEMENT_LIST (STATEMENT :: STATEMENT_LIST) (* 一つの文を、文のリストの先頭に追加 *) | STATEMENT ([STATEMENT]) (* 一つの文のみを要素とするリスト *) | ([]) (* 空リスト *)