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 のような式で左連想構文が機能するように文法を変更するにはどうすればよいですか?