我有一个语法Foo.xtext
(太复杂,无法在此处包含)。XtextInternalFoo.g
从中生成。 经过一些调整后,它还会生成DebugInternalFoo.g
哪些声称是相同的东西而无需采取行动。现在,我直接用 ANTLR 剥离动作
java -cp antlr-3.4.jar org.antlr.tool.Strip Internal.g > Stripped.g
当我检查它们时,我希望这三种语法的行为方式相同。但这是我所经历的
InternalFoo.g
- 错误,规则分配有非 LL(*) 决定DebugInternalFoo.g
- 没问题,解析很好Stripped.g
- 规则分配时的警告,可以使用多种选择来匹配决策。它无法正确解析。
语法是否有可能在有或没有动作的情况下以不同的方式解析文本?或者它是任何动作删除工具中的错误?(有问题的规则有句法谓词,没有它们,它真的会有一个非 LL(*) 决定。)
更新:
我部分找到了导致问题的原因。有问题的规则是这样的
trickyRule:
({ some complex action})
(expression '=')=>...
使用 Antlr 进行剥离删除了该操作,但在那里留下了一个空组:
// Stripped.g
trickyRule:
() (expression '=')=>...
调试语法的生成同时删除了动作和它周围的空组:
// DebugInternalFoo.g
trickyRule:
(expression '=')=>...
所以吸取的教训是:句法谓词前的空组并不等于没有。