You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将指定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;
%%

语法说明:

  1. 阶段划分清晰:
    • pre_d阶段:仅处理A和D,且保证至少有一个D,完全对应ABNF中的*(A/D) D部分。
    • post_ab阶段:仅处理A和B,一旦进入此阶段,遇到D会直接触发语法错误(符合D不能出现在B之后的约束)。
  2. 无歧义匹配:
    • 当处于pre_d阶段时,遇到A或D会明确归约到pre_d;遇到B则先完成pre_d的归约,再进入post_ab处理B,不会产生移进/归约冲突。
    • 空输入、无D前缀的情况都被明确覆盖,完全符合原ABNF规则s = [*(A / D) D] *(A / B)。

内容的提问来源于stack exchange,提问作者neorobin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 23:22:40