1

antlr を使用して、抽象構文ツリーを生成するパーサーを生成しています。左結合演算子について問題が発生しました。私の文法は次のようなものです。

add_expr returns [ASTNode value]
    :a=mul_expr {$value = a;}
    (
        o = ('+' | '-') b = add_expr
        {
        $value = new AddNode(a, b, $o.text);
        }
    )?
    ;
mul_expr returns [ASTNode value]
    :a=term {$value = a;}
    (
        o = ('*' | '/') b = mul_expr
        {
        $value = new MultiplyNode(a, b, $o.text);
        }
    )?
    ;

AddNode と MultiplyNode のコンストラクターは次のようになります。

AddNote(ASTNode left, ASTNode right, String operatorr)

問題は、入力 abc の場合、(ab)-c ではなく a-(bc) のように解析されることです。Antlr は左再帰文法を受け入れません。abc のような式で左連想構文が機能するように文法を変更するにはどうすればよいですか?

4

1 に答える 1

1

a-b-cとしてa-(b-c)ではなく、としてでは(a-b)-cなくとして、つまりa (-b) (-c)

additiveExpression 
:   multiplicativeExpression
    (   
        (   '+'
        |   '-'
        )
        multiplicativeExpression
     )*
;

上記の規則はJava grammarから取られています。テキストを保存してエディターで読みます。ブラウザーはテキストの行末を無視する場合があります。

于 2013-04-30T04:17:48.863 に答える