問題:在ANTLR v4中,在解析時構建自定義分析樹有沒有(更直接)的方法?在ANTLR v4中構建自定義分析樹
我猜測可以遍歷並重寫自動構建的樹,但是我想知道在解析時是否仍然可以手動構建樹(或者對此進行調整)(類似於ANTLR v3和ealier)。這個想法是,根據一個人寫他/她的語法的方式,我們在ANTLR構建的樹中得到了很多無用的節點,雖然我知道你只能覆蓋你感興趣的那些偵聽器方法,但仍然需要檢查並跳過無用的令牌類型等。
問題:在ANTLR v4中,在解析時構建自定義分析樹有沒有(更直接)的方法?在ANTLR v4中構建自定義分析樹
我猜測可以遍歷並重寫自動構建的樹,但是我想知道在解析時是否仍然可以手動構建樹(或者對此進行調整)(類似於ANTLR v3和ealier)。這個想法是,根據一個人寫他/她的語法的方式,我們在ANTLR構建的樹中得到了很多無用的節點,雖然我知道你只能覆蓋你感興趣的那些偵聽器方法,但仍然需要檢查並跳過無用的令牌類型等。
不,我們與ANTLR 3的經驗是手動AST功能不可避免地導致代碼更難以維護和理解,從而導致開發人員進行任何更改時出現高回報錯誤率語法。因爲很難判斷未來版本的應用程序將需要哪些終端,因此不需要更改/驗證在分析樹上運行的所有代碼,因爲令牌不再需要從樹中刪除。以前未使用的是現在需要的新組件或功能。
您可以覆蓋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();
}
}
謝謝!雖然我從這個「問題」開始,但這似乎確實是一個很好的結果。 (實際上還沒有嘗試過,但通過檢查https://github.com/antlr/antlr4/blob/master/runtime/Java/src/org/antlr/v4/runtime/Parser.java我會說你是正確!) – 2015-01-21 13:45:27
不用擔心 - 目前它似乎對我有用 - 我的應用程序緩存解析樹,並且由於我只需要它們用於符號表信息(函數/變量定義),創建稀疏樹的功能可以節省大量時空。 – mounds 2015-01-22 00:04:46
感謝您的清理!當你改變/重新組織一些語法規則時,你確實有一個強大的優勢,就是保持客戶端代碼不變......我從性能的角度思考,但我認爲開銷通常幾乎沒有。 – 2014-10-16 12:13:02
@OctavianTheodor ANTLR 4的當前設計在我的評估中未被證明是一個重大的性能限制,而這一點我都非常沉迷。其他領域,包括規則本身的實際結構(前瞻性,模糊性等)總是會有更顯着的影響。 – 2014-10-16 12:36:36