我正在使用一个Java库,它可以根据中缀表达式(1 + 3) + 4
构建如下的AST:
BinaryIntegerExpression
/ | \
IntegerExpression op IntegerExpression
| | |
BinaryIntegerExpression + IntegerConstant
/ | \ |
IntegerExpression op IntegerExpression 4
| | |
IntegerConstant + IntegerConstant
| |
1 3
基本上,BinaryIntegerExpression和IntegerConstant是IntegerExpression的子类。 该库有一个抽象类Visitor,它允许您重写preVisit和postVisit来遍历树。我除此之外不能碰任何东西。
这是我的尝试。我尝试使用简单的递归生成前缀表达式。对于小例子它能够正常工作。
public void preVisit(BinaryIntegerExpression expr) {
if(stop == true)
return;
PrefixVisitor left = new PrefixVisitor();
left.preVisit(expr.getLeft());
PrefixVisitor right = new PrefixVisitor();
right.preVisit(expr.getRight());
str = "( " + expr.getOp().toString() + " " + left.getExpression() + " " + right.getExpression() + " )";
stop = true;
}
public void preVisit(IntegerConstant expr) {
if(stop == true)
return;
str = " " + expr.toString() + " ";
}
然而,我需要处理大小超过100MB的表达式,因此我在内存和性能方面遇到了问题。因此,我想使用堆栈来优化这个过程。有人可以给我一些提示吗?谢谢。
========================
编辑:该表达式是复杂分析的结果,我只是获取结果进行处理,不能从头开始构建结果。