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

Bison中S/R冲突求助:语法移进/归约冲突致解析失败

解决Bison语法的移进/归约冲突问题

冲突根源

你的语法存在歧义:当解析器遇到YY_WORD_NAME YY_IN序列时,无法判断两种操作的优先级:

  • 选项1:将YY_WORD_NAME归约为word_exp,移进YY_IN以匹配word_exp YY_IN set_exp规则;
  • 选项2:继续移进后续符号,匹配set_exp的第二个规则{ YY_WORD_NAME YY_IN set_exp : word_exp }。

这种歧义导致Bison报告移进/归约冲突,默认的移进策略会破坏合法输入的解析逻辑。

解决方法

方法一:通过优先级声明区分不同语境的YY_IN

给set_exp内部的YY_IN设置更高优先级,强制解析器优先匹配set_exp规则:

%token YY_WORD_NAME
%left YY_IN
%precedence SET_IN  /* 优先级高于YY_IN */

%%

word_exp:
  word_exp YY_IN set_exp 
| YY_WORD_NAME 

set_exp:
  '{' word_exp '}' 
| '{' YY_WORD_NAME YY_IN set_exp ':' word_exp '}' %prec SET_IN

%%

用%prec SET_IN标记set_exp的第二个规则,让该规则内的YY_IN优先级更高,解析器会优先移进后续符号完成set_exp的匹配,而非提前归约word_exp。

方法二:重构语法消除歧义

拆分word_exp为基础单元和带IN的表达式,彻底避免结构混淆:

%token YY_WORD_NAME
%left YY_IN 

%%

word_exp:
  base_word_exp YY_IN set_exp 
| base_word_exp 

base_word_exp:
  YY_WORD_NAME 

set_exp:
  '{' word_exp '}' 
| '{' base_word_exp YY_IN set_exp ':' word_exp '}'

%%

这种结构明确:word_exp的IN规则必须以单个base_word_exp开头,set_exp内部的YY_WORD_NAME YY_IN只能对应base_word_exp,完全消除歧义,Bison可无冲突生成解析器。

两种方法都能正确处理a in {b}、a in {b in {c} : d}等合法输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 09:40:04