私は Bison で文法を定義する過程にあり、排除したい shift/reduce 競合に出くわしました。if/else
競合は、ステートメントを一致させることを目的としたルールによって引き起こされます。
state 17
13 Stmt: IfBlock . OptionalElseBlock
ELSE shift, and go to state 42
ELSE [reduce using rule 16 (OptionalElseBlock)]
$default reduce using rule 16 (OptionalElseBlock)
OptionalElseBlock go to state 43
OptionalElseBlock
は次のように定義されました。
16 OptionalElseBlock: /* empty */
17 | ELSE Stmt
状態 42 と 43 は、shift と reduce の情報が省略された次のようになります。
state 42
17 OptionalElseBlock: ELSE . Stmt
state 43
13 Stmt: IfBlock OptionalElseBlock .
OptionalElseBlock
以前にオプションのトークンを使用したことがありますが、パーサーの先読みバッファーには 1 つの端末しか含まれていないため、競合が発生していると推測しています。この競合を解決する簡単な方法はありますか?