我正在用 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 .
我以前使用过可选标记,但我猜测由于解析器的前瞻缓冲区仅包含 1 个终端OptionalElseBlock
会导致冲突。有没有简单的方法来解决这个冲突?