如何解决C预处理程序的野牛语法中的“移位/减少”冲突?

时间:2019-07-14 00:16:17

标签: parsing bison

我正在为C预处理器编写扫描仪/解析器。 我刚刚直接从this specification, Annex A复制了语法。

我遇到了移位/减少错误。虽然我了解这在理论上意味着什么,但仍然无法制定解决方案。

您可以同时查看语法和结果输出文件at this gist

有人可以帮忙吗? 我知道您可以使用优先级/关联性说明符来解决移位/归约问题,但是我不确定该怎么做。

编辑:我知道很多人都在问类似的问题,但是很难应用别人语法的答案。

1 个答案:

答案 0 :(得分:0)

这里的基本问题是,#与指令的关键字是分开的标记,因此需要先进行两次标记才能确定下一个预处理指令。 Bison仅使用一个令牌前瞻,因此几乎每个预处理器指令都会发生冲突。

解决此问题的最简单方法是让词法分析器将整个预处理程序指令识别为单个标记(例如,如果使用lex,则为"#"[ \t]*if { return IF; })而不是两个标记。