Compiler construction JavaCC选择冲突警告
目前我对JavaCC有一个独特的问题。我已经定义了语法,语言是LL(1),所有左递归都被删除了。我得到一个选择冲突错误(如下所示)。我相信这是由于行Compiler construction JavaCC选择冲突警告,compiler-construction,javacc,ambiguity,Compiler Construction,Javacc,Ambiguity,目前我对JavaCC有一个独特的问题。我已经定义了语法,语言是LL(1),所有左递归都被删除了。我得到一个选择冲突错误(如下所示)。我相信这是由于行expr2()line调用自身并导致冲突造成的。老实说,我完全被难住了。我甚至不知道如何着手解决这个问题 以下是生成警告的代码片段: void expr() : {} { <LBRAC> arg_list() <RBRAC> expression2() } void expr2() : {} { section()
expr2()
line调用自身并导致冲突造成的。老实说,我完全被难住了。我甚至不知道如何着手解决这个问题
以下是生成警告的代码片段:
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()
}
其中第233行对应于expr2()中的第一行。Juan Lopes写道:
以“2+2”为例。“+”是位于expr2()
的
或位于节()的
OP答复说:
我可以从section()
中删除Add/Sub命令,但它仍然会导致相同的问题。我明白你的意思,但这似乎不是问题的根源
@西奥多·诺维尔写道:
胡安说的完全正确。但是将(|)section()
更改为section()
会带来一个新问题。根据实际需要,尝试将expr2
正文中的第一行更改为section()(| | section())*expr2()
或section()(| |)section())*expr2()
。如果这不起作用,问一个新问题。胡安回答了这个问题
考虑“2+2”。“+”是at expr2()或at section()?我可以从section()中删除Add/Sub命令,但它仍然会导致相同的问题。虽然我理解你的意思,但这似乎不是问题的根源。胡安说的完全正确。但是将(|)section()
更改为section()
会带来一个新问题。根据实际需要,尝试将expr2
正文中的第一行更改为section()(| | section())*expr2()
或section()(| |)section())*expr2()
。如果这不起作用,问一个新问题。胡安回答了这个问题
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.