目前我在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()
中的第一行相对应答案 0 :(得分:1)
@Juan Lopes写道:
OP回答说:考虑“2 + 2”。 “+”是
<ADD>
的{{1}}或expr2()
的{{1}}?
我可以从
<ADD>
删除Add / Sub命令,但仍会导致同样的问题。我理解你的意思,但这似乎并没有引起问题。
@Theodore Norvell写道:
胡安说的是完全正确的。但是,将
section()
更改为section()
会引入新问题。尝试将(<ADD> | <SUB>) section()
正文中的第一行更改为section()
或expr2
,具体取决于您的实际需要。如果这不起作用,请提出一个新问题。胡安回答了这个问题。