Antlr 简单数学表达式解析器
我有一个简单的数学表达式解析器,我想自己构建AST(意味着没有AST解析器)。但每个节点只能容纳两个操作数。因此,2+3+4将生成如下树:Antlr 简单数学表达式解析器,antlr,Antlr,我有一个简单的数学表达式解析器,我想自己构建AST(意味着没有AST解析器)。但每个节点只能容纳两个操作数。因此,2+3+4将生成如下树: + / \ 2 + / \ 3 4 问题是,我无法让我的语法进行递归,这里只是“添加”部分: 但最终这会产生一棵树,就像: + / \ 2 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