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
相关产品推荐
相关产品推荐

