Compiler construction JavaCC选择冲突警告

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()

目前我对JavaCC有一个独特的问题。我已经定义了语法,语言是LL(1),所有左递归都被删除了。我得到一个选择冲突错误(如下所示)。我相信这是由于行
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.