Bison Flex减少/减少在悬而未决的情况下通过中间动作产生的冲突

问题描述 投票:0回答:1

我目前正在将我的一个有趣的项目移至bison / flex作为解析器,无法解决减少/减少冲突:

// https://github.com/X39/yaoosl/blob/master/code-gen/yaoosl.y#L761-L766
ifthen: YST_IF YST_ROUNDO expression code_ifstart YST_ROUNDC codebody code_ifendnoelse
        | YST_IF YST_ROUNDO expression code_ifstart YST_ROUNDC ifthen_clsd YST_ELSE code_ifelse ifthen code_ifendelse
        ;
ifthen_clsd: codebody
           | YST_IF YST_ROUNDO expression code_ifstart YST_ROUNDC ifthen_clsd code_ifelse YST_ELSE ifthen_clsd code_ifendelse
           ;

注意:前缀为code_的东西是中间动作

有人可以向我解释如何正确解决此问题,为什么“继续使用”解决方案是错误的或没有用?谢谢,X39

c bison dangling-else
1个回答
0
投票

由于这两个规则直到code_ifelse都是相同的(并且假设code_ifelse是一个空规则,例如规则内的操作),所以它无法确定是在YST_ELSE之前还是之后减小code_ifelse。您可能可以通过使两个规则与code_ifelseYST_ELSE的顺序一致来解决此问题。

语法的一些经验法则:

  • [不要对'('')'之类的单个字符标记使用符号名称,它只会混淆事物并使语法难以阅读和理解。
  • 除非绝对必要,否则请不要使用规则内操作-最好使用满足您需要的结束规则操作创建单个令牌规则。
© www.soinside.com 2019 - 2024. All rights reserved.