簡體   English   中英

從抽象語法樹生成前綴表達式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM