[英]Generating prefix expression from abstract syntax tree
我正在使用一個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的表達式,所以我的內存和性能都有問題。 因此,我想使用堆棧優化此過程。 任何人都可以給我一個提示嗎? 謝謝。
========================
編輯:表達式是復雜分析的結果,我只是得到結果來處理它,並且無法從開始構建結果。
目前尚不清楚你要做什么,但我會從一開始就將表達式構建到單個StringBuilder中。 這會更快,但不會使用更少的內存。 100 MB文本文件使用200 MB加載和另外200 MB作為字符串操作,加上表達式建議您需要幾GB內存。
如果您仍在使用太多內存,我建議將表達式流式傳輸到文件中。 處理此問題的一般方法是使用Appender
,它是StringBuilder和PrintWriter的接口。
提示:考慮如何在不創建任何對象的情況下構建文本表達式(至少不直接)。 如果你這樣做會更快。
最簡單的解決方案是確保您有足夠的堆並使用CPU和內存分析器來提高其效率。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.