JavaCC选择冲突警告

时间:2014-12-15 15:56:34

标签: compiler-construction javacc ambiguity

目前我在JavaCC遇到一个单一的问题。我定义了语法,语言为LL(1),并且已删除所有Left Recursion。我遇到了选择冲突错误(转储如下)。我认为它是由行expr2()行调用自身并导致冲突引起的。我老实说完全难过了。我甚至不知道如何解决这个问题。

以下是产生警告的代码片段:

void expr() : {}
{
  <LBRAC> arg_list() <RBRAC> expression2()
}

void expr2() : {}
{
  section() (<SUB>|<ADD>|<MUL>|<DIV>|<MOD> section())* expr2()
  | {}
}

void section() : {}
{
  <IDENTIFIER> | <TRUE> | <FALSE> | <REAL> | (<ADD> | <SUB>) section() | expr()
}

警告是:

Warning: 
Choice conflict in (...)* construct at line 233, column 14.
     Expansion nested within construct and expansion following construct
     have common prefixes, one of which is: "-"
     Consider using a lookahead of 2 or more for nested expansion.
Parser generated with 0 errors and 1 warnings.

第233行与expr2()

中的第一行相对应

1 个答案:

答案 0 :(得分:1)

@Juan Lopes写道:

  

考虑“2 + 2”。 “+”是<ADD>的{​​{1}}或expr2()的{​​{1}}?

OP回答说:

  

我可以从<ADD>删除Add / Sub命令,但仍会导致同样的问题。我理解你的意思,但这似乎并没有引起问题。

@Theodore Norvell写道:

  

胡安说的是完全正确的。但是,将section()更改为section()会引入新问题。尝试将(<ADD> | <SUB>) section()正文中的第一行更改为section()expr2,具体取决于您的实际需要。如果这不起作用,请提出一个新问题。胡安回答了这个问题。