2

不确定是什么原因造成的。当我尝试编译文件时,我收到一条错误消息“检测到左递归表达式...->片段...->表达式。

有这个的代码区域是这个部分

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

我不太确定如何解决这个问题,如果有任何帮助,我将不胜感激!谢谢!

4

2 回答 2

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

更改片段生成规则,其中它的表达式包含两边的括号。这应该可以解决您的递归问题。

于 2013-12-11T14:08:29.493 回答
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())*能够重复来封装

于 2013-12-09T23:27:28.613 回答