能否将指定ABNF规则改写为无冲突的Bison LALR语法?
解决Bison移进/归约冲突:符合约束的无冲突LALR语法
你的Bison代码出现移进/归约冲突,根源是语法存在二义性:当解析完a_d_d后遇到A时,语法既允许将a_d_d归约为s再移进A(匹配s A),也允许将a_d_d与A组合成新的a_d_d(匹配A a_d_d),两种选择导致冲突。
根据核心约束(所有D必须在B之前出现,A可任意位置),我们可以通过划分明确的解析阶段来消除二义性,写出无冲突的LALR语法:
%token A B D %start s %% s : %empty // 处理空输入 | pre_d post_ab // 先匹配包含至少一个D的前缀,再匹配后续的A/B | post_ab; // 无D前缀,直接匹配任意A/B(此时不允许出现D) // pre_d:必须包含至少一个D,前缀可带任意数量的A或D pre_d : D | A pre_d | D pre_d; // post_ab:仅允许A和B,禁止出现D,可重复任意次数 post_ab : %empty | post_ab A | post_ab B; %%
语法说明:
- 阶段划分清晰:
pre_d阶段:仅处理A和D,且保证至少有一个D,完全对应ABNF中的*(A/D) D部分。post_ab阶段:仅处理A和B,一旦进入此阶段,遇到D会直接触发语法错误(符合D不能出现在B之后的约束)。
- 无歧义匹配:
- 当处于
pre_d阶段时,遇到A或D会明确归约到pre_d;遇到B则先完成pre_d的归约,再进入post_ab处理B,不会产生移进/归约冲突。 - 空输入、无D前缀的情况都被明确覆盖,完全符合原ABNF规则
s = [*(A / D) D] *(A / B)。
- 当处于
内容的提问来源于stack exchange,提问作者neorobin
相关产品推荐
相关产品推荐

