Antlr 简单数学表达式解析器

Antlr 简单数学表达式解析器,antlr,Antlr,我有一个简单的数学表达式解析器,我想自己构建AST(意味着没有AST解析器)。但每个节点只能容纳两个操作数。因此,2+3+4将生成如下树: + / \ 2 + / \ 3 4 问题是,我无法让我的语法进行递归,这里只是“添加”部分: 但最终这会产生一棵树,就像: + / \ 2 4 我知道问题出在哪里,因为“加法”永远不会或无限(*)但我不知道如何解决这个问题。我想到了这样的事情:

我有一个简单的数学表达式解析器,我想自己构建AST(意味着没有AST解析器)。但每个节点只能容纳两个操作数。因此,2+3+4将生成如下树:

        +
       / \
      2   +
         / \
        3   4
问题是,我无法让我的语法进行递归,这里只是“添加”部分:

但最终这会产生一棵树,就像:

     +
    / \
   2   4
我知道问题出在哪里,因为“加法”永远不会或无限(*)但我不知道如何解决这个问题。我想到了这样的事情:

“添加”部分:


但这会给我一个补偿错误。有什么想法吗?

< P>我没有完整的语法来测试这个解决方案,但是考虑替换这个(从第一个代码>添加< /代码>问题中的规则):

为此:

$e = new AddOperator($e, $op2.e);  //$e instead of $op1.e
这样,
(“+”乘法)*
上的每次迭代都会扩展
e
,而不是替换它


它可能需要一点变通才能正确,或者您可能需要在规则中使用一个临时的
表达式来管理事情。只需确保循环创建的最后一个表达式位于
=
操作符的右侧,如
$e=new XYZ($e,$rhs.e)

@KIC我很高兴能帮上忙:)
add returns [Expression e]
  : op1=multiply { $e = $op1.e; Print.ln($op1.text); } 
    ( '+' op2=(multiply|add)   { $e = new AddOperator($op1.e, $op2.e); Print.ln($op1.e.getClass(), $op1.text, "+", $op2.e.getClass(), $op2.text); }
    | '-' op2=multiply   { $e = null; } // new MinusOperator    
    )?
  ;
$e = new AddOperator($op1.e, $op2.e);
$e = new AddOperator($e, $op2.e);  //$e instead of $op1.e