1

我有一个语法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 '=')=>...

所以吸取的教训是:句法谓词前的空组并不等于没有。

4

1 回答 1

0

语法是否有可能在有或没有动作的情况下以不同的方式解析文本?

是的,这是可能的。org.antlr.tool.Strip保留语法谓词1,但删除验证2和门控3语义谓词(以及member这些语义谓词可能使用的部分)。

例如,以下规则将仅匹配A_TOKEN:

parser_rule1
  :  (parser_rule2)=> parser_rule2
  ;

parser_rule2
  :  {input.LT(1).getType() == A_TOKEN}? .
  ;

但如果你在上面使用该Strip工具,它会留下以下内容:

parser_rule1
  :  (parser_rule2)=> parser_rule2
  ;

parser_rule2
  :  /*{input.LT(1).getType() == A_TOKEN}?*/ .
  ;

使其匹配任何令牌。

换句话说,Strip可以改变生成的词法分析器或解析器的行为。


1句法谓词:( ... )=>
2验证语义谓词{ ... }?
3门控语义谓词{ ... }?=>

于 2011-12-09T08:18:54.067 回答