如何修复 C 预处理器的 bison 语法中的 'shift/reduce' 冲突?
How to fix 'shift/reduce' conflict in bison grammar for C preprocessor?
我正在为 C 预处理器编写 scanner/parser。
我只是直接从 this specification, Annex A.
复制语法
我 运行 遇到了 shift/reduce 错误。虽然我理解这在理论上意味着什么,但我仍然无法找到解决方案。
您可以查看语法和生成的输出文件 at this gist。
有人能帮忙吗?
我知道您可以使用 precedence/associativity 说明符解析 shift/reduce,但我不确定具体要做什么。
编辑:我知道很多人会问类似的问题,但是很难应用别人语法的答案。
你在这里遇到的基本问题是你有 #
作为指令关键字的单独标记,所以你需要 two-token 前瞻性来确定下一个预处理器指令。 Bison 仅使用一个标记先行,因此几乎每个预处理器指令都会发生冲突。
解决此问题的最简单方法是让您的词法分析器将整个预处理器指令识别为单个标记(例如 "#"[ \t]*if { return IF; }
,如果您使用的是 lex)而不是两个标记。
我正在为 C 预处理器编写 scanner/parser。 我只是直接从 this specification, Annex A.
复制语法我 运行 遇到了 shift/reduce 错误。虽然我理解这在理论上意味着什么,但我仍然无法找到解决方案。
您可以查看语法和生成的输出文件 at this gist。
有人能帮忙吗? 我知道您可以使用 precedence/associativity 说明符解析 shift/reduce,但我不确定具体要做什么。
编辑:我知道很多人会问类似的问题,但是很难应用别人语法的答案。
你在这里遇到的基本问题是你有 #
作为指令关键字的单独标记,所以你需要 two-token 前瞻性来确定下一个预处理器指令。 Bison 仅使用一个标记先行,因此几乎每个预处理器指令都会发生冲突。
解决此问题的最简单方法是让您的词法分析器将整个预处理器指令识别为单个标记(例如 "#"[ \t]*if { return IF; }
,如果您使用的是 lex)而不是两个标记。