我目前正在将我的一个有趣的项目移至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
由于这两个规则直到code_ifelse
都是相同的(并且假设code_ifelse是一个空规则,例如规则内的操作),所以它无法确定是在YST_ELSE之前还是之后减小code_ifelse
。您可能可以通过使两个规则与code_ifelse
和YST_ELSE
的顺序一致来解决此问题。
语法的一些经验法则:
'('
和')'
之类的单个字符标记使用符号名称,它只会混淆事物并使语法难以阅读和理解。