在.jj文件中检测到左递归

时间:2013-12-09 23:10:51

标签: java recursion compilation javacc left-recursion

不确定究竟是什么造成了这种情况。当我尝试编译文件时,我得到一个错误,说“左递归检测到表达式... - >片段... - >表达式。

具有此功能的代码区域是本节

void statement() : {}

{
    identifier() <ASSIGN> expression()
    | identifier() <ASSIGN> <STRING>
    | <EMARK> expression()
    | <QMARK> identifier()
    | identifier(arg_list())
    | <BEGIN>(statement() <SEMIC>)+ <END>
    | <IF> condition() <THEN> statement()
    | <IF> condition() <THEN> statement() <ELSE> statement()
    | <WHILE> (condition()) <DO> statement()
    | {}
}

void expression () : {}
{
    fragment()((<PLUS_SIGN> | <MINUS_SIGN> | <MULT_SIGN> | <DIV_SIGN>) fragment())*
}

void fragment () : {}
{
    identifier() | <NUM> | (<PLUS_SIGN> | <MINUS_SIGN>)fragment() | expression()
}

我不确定如何解决此问题,并感谢任何帮助! 谢谢!

2 个答案:

答案 0 :(得分:2)

void fragment() #void : {}
|<LBR> expression() <RBR>

更改片段生成规则,其中包含表达式,以在任一侧包含括号。这应该可以解决你的递归问题。

答案 1 :(得分:1)

我认为你的抽象只是一点点。

(<PLUS_SIGN> | <MINUS_SIGN>)fragment()

更像是一个可以否定片段的表达式

我会考虑

void expression () : {}
{
    fragment()((<PLUS_SIGN> | <MINUS_SIGN> | <MULT_SIGN> | <DIV_SIGN>) fragment())*
    | <MINUS_SIGN> fragment()
    | <PLUS_SIGN> fragment()
}

我也相信该片段不需要是expression(),递归已经被((<PLUS_SIGN> | <MINUS_SIGN> | <MULT_SIGN> | <DIV_SIGN>) fragment())*封装了能够重复