私は、一見単純なシフト/削減の競合に無駄に取り組んでいます。当然、競合を無視すればパーサーは正常に機能しますが、ルールを再編成した方がはるかに安全だと感じます。ここでは、比較的複雑な文法を単一の競合に単純化しました。
statement_list
: statement_list statement
|
;
statement
: lvalue '=' expression
| function
;
lvalue
: IDENTIFIER
| '(' expression ')'
;
expression
: lvalue
| function
;
function
: IDENTIFIER '(' ')'
;
yaccのverboseオプションを使用すると、前述の競合のある状態を説明する次の出力ファイルを取得します。
state 2
lvalue -> IDENTIFIER . (rule 5)
function -> IDENTIFIER . '(' ')' (rule 9)
'(' shift, and go to state 7
'(' [reduce using rule 5 (lvalue)]
$default reduce using rule 5 (lvalue)
助けてくれてありがとう。