問題の説明
私のyaccパーサー文法では、次のルールと対応するアクションが定義されています(以下のprogram.yを参照)。構文解析int X;
には派生type => TOK_INT
とが必要variable_list => TOK_VARIABLE
であり、これらは。で終わる宣言と一致しstatment ;
ます。ただし、これをint X
およびとして読み取ります;
。つまり、2つの別々のステートメントです。誰もが理由を見ることができますか?
program.y
program:
function { exit(0); }
;
function:
function line { printf("goal\n"); printtree_print($2); }
|
;
line:
statement ';' { printf("line\n"); printtree_print($1); }
;
statement:
declaration { printf("declaration\n"); printtree_print($1); }
| assignment { printf("assignment\n"); printtree_print($1); }
;
declaration:
type variable_list { printf("varlist\n"); printtree_print($2); $$ = $2; }
;
type:
TOK_INT { typeMode = typeInt; }
;
variable_list:
TOK_VARIABLE
{ $$ = node_mkVariable($1, typeMode);
printtree_print($$);
}
;
assignment:
TOK_VARIABLE TOK_ASSIGN expr
{ printf("assignment %s = expr\n", $1);
node_setInTable($1, $3);
$$ = node_getFromTable($1); }
;
expr:
TOK_INTEGER { $$ = node_mkConstant($1); }
| TOK_VARIABLE { $$ = node_mkVariable($1, typeVariable); }
;