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

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 に答える