处理野牛中的歧义

  • 本文关键字:歧义 处理 bison
  • 更新时间 :
  • 英文 :


https://pastebin.com/eMAJA9RV

我在上面的链接中使用Bison语法(它是开源flasm项目的旧版本的分叉副本的一部分,我不会详细说明我为什么要修改它(

使用此选项,我的一个文件出现以下错误:检测到歧义。

Option 1,
statements -> <Rule 116, tokens 509 .. 516>
statements -> <Rule 113, tokens 509 .. 514>
statements <tokens 509 .. 512>
statement -> <Rule 127, tokens 513 .. 514>
opcode -> <Rule 301, tokens 513 .. 514>
PUSH <tokens 513 .. 513>
@24 -> <Rule 300, empty>
push_list -> <Rule 217, tokens 514 .. 514>
push_item -> <Rule 178, tokens 514 .. 514>
STRING <tokens 514 .. 514>
statementOptimized -> <Rule 128, tokens 515 .. 516>
opcodeOptimized -> <Rule 254, tokens 515 .. 516>
CALLMETHOD <tokens 515 .. 515>
POP <tokens 516 .. 516>
Option 2,
statements -> <Rule 116, tokens 509 .. 516>
statements <tokens 509 .. 512>
statementOptimized -> <Rule 128, tokens 513 .. 516>
opcodeOptimized -> <Rule 238, tokens 513 .. 516>
PUSH <tokens 513 .. 513>
STRING <tokens 514 .. 514>
CALLMETHOD <tokens 515 .. 515>
POP <tokens 516 .. 516>

我已经在涉及的各种规则上尝试了dprec运算符的各种组合,但我找不到有效的组合。我怎么能让bison解析器在任何时候看到这个组合时都支持选项2,而不是抱怨它无法决定使用哪一个?

由于我不会深入讨论的原因,我在这个项目中一直使用Bison 2.1,所以无论我需要什么解决方案,都必须使用那个版本的Bison。

无论Bison版本如何,我都认为这里没有简单的解决方案。不能使用%dprec,因为同一规则的两个不同应用程序之间存在歧义。不能使用%merge,因为在调用自定义合并函数之前会评估两个可能的产品的操作函数,这在一次编译中是致命的。

如果知道你所做的改变导致了这个问题,那将是非常有用的。您可能会对特定的更改进行特殊处理,但我怀疑唯一可扩展的更改是将窥视孔优化分离到解析后阶段。

相关内容

  • 没有找到相关文章

最新更新