2014-02-06 47 views
0

有什麼方法可以複製ParserRule?我需要一個真正的深層拷貝,所以copyFrom()並不能實現這個功能。或者我必須重新解析代碼?如何複製RuleContext

另一種想法如何解決以下也將大加讚賞:

我工作的一個編譯器,轉換舊的遺留代碼,以現代編程語言,在這種情況下,EGL - > Java的。 EGL有一個叫做Standalone Function的概念,它與C宏相似。這意味着函數中的代碼可以引用調用範圍中的符號。因此,定義和解析符號和類型提升都是依賴於上下文的。

在ANTLR3中,我們通過dupTree()解決了這個問題,並簡單地在每個調用範圍內創建了一個副本。

動態類型不是一個選項。

實施例(僞碼)來說明:

Program A 
    int var = 4; 
    saf(); # Prints 5 
end A; 

Program B 
    String var = "abc"; 
    saf(); # Prints abc1 
end B; 

function saf() 
    int j = 1; 
    print(var + j); 
end saf; 

回答

1

作爲版本4.2,ANTLR 4不包括用於操縱解析樹的結構解析完成後任何API。這是我們目前正在探索的一個領域,特別是考慮到新模式匹配語法創建的可能性。

對於複製樹,我建議您實現在生成解析器時創建的訪問者接口。這將允許您在分析樹中的任何節點上調用visit來創建該節點的深層副本。

+0

我希望副本訪問者或偵聽器是自動生成的:( – Y2i