2014-10-16 52 views
0

問題:在ANTLR v4中,在解析時構建自定義分析樹有沒有(更直接)的方法?在ANTLR v4中構建自定義分析樹

我猜測可以遍歷並重寫自動構建的樹,但是我想知道在解析時是否仍然可以手動構建樹(或者對此進行調整)(類似於ANTLR v3和ealier)。這個想法是,根據一個人寫他/她的語法的方式,我們在ANTLR構建的樹中得到了很多無用的節點,雖然我知道你只能覆蓋你感興趣的那些偵聽器方法,但仍然需要檢查並跳過無用的令牌類型等。

回答

2

不,我們與ANTLR 3的經驗是手動AST功能不可避免地導致代碼更難以維護和理解,從而導致開發人員進行任何更改時出現高回報錯誤率語法。因爲很難判斷未來版本的應用程序將需要哪些終端,因此不需要更改/驗證在分析樹上運行的所有代碼,因爲令牌不再需要從樹中刪除。以前未使用的是現在需要的新組件或功能。

+0

感謝您的清理!當你改變/重新組織一些語法規則時,你確實有一個強大的優勢,就是保持客戶端代碼不變......我從性能的角度思考,但我認爲開銷通常幾乎沒有。 – 2014-10-16 12:13:02

+0

@OctavianTheodor ANTLR 4的當前設計在我的評估中未被證明是一個重大的性能限制,而這一點我都非常沉迷。其他領域,包括規則本身的實際結構(前瞻性,模糊性等)總是會有更顯着的影響。 – 2014-10-16 12:36:36

2

您可以覆蓋org.antlr.v4.runtime.Parser.addContextToParseTree()以獲得對創建節點的一些控制。不確定這是你自定義的意思。

@parser::members { 

@Override 
protected void addContextToParseTree() { 
    // code is a rule enabled by semantic predicate 'full' 
    // that matches generic lines of code. 
    if(!full && _ctx instanceof CodeContext){ 
     return; 
    } 

    // otherwise add the node to the tree.. 
    super.addContextToParseTree(); 
} 

} 
+0

謝謝!雖然我從這個「問題」開始,但這似乎確實是一個很好的結果。 (實際上還沒有嘗試過,但通過檢查https://github.com/antlr/antlr4/blob/master/runtime/Java/src/org/antlr/v4/runtime/Parser.java我會說你是正確!) – 2015-01-21 13:45:27

+0

不用擔心 - 目前它似乎對我有用 - 我的應用程序緩存解析樹,並且由於我只需要它們用於符號表信息(函數/變量定義),創建稀疏樹的功能可以節省大量時空。 – mounds 2015-01-22 00:04:46