1

我正在研究解析由Swift編譯器(swiftc -dump-ast)生成的AST轉儲的ANTLR 4語法。處理輸入與不平衡的括號

查看Swift程序示例和下面的相應AST轉儲。

不幸的是,由於bug in the compiler轉儲可能包含不平衡的括號(在某些樹節點中缺少右括號)。

更改如下treeNode規則允許解析這種損壞輸出:

treeNode 
    : '(' treeNodeContent ')' 
    | functionParameterListNode 
    | '(' treeNodeContent 
    ; 

不幸的是,這種變化也殺死解析性能。解析時間從〜50ms增加到〜70 ... 80s

該語法確實包含一些含糊之處,但幾乎所有的時間都花在treeNode規則中。 Profiler顯示大量的前瞻和DFA緩存未命中率。

查明發生此問題的節點的具體類型,並將解決方案僅應用於那些給我解析時間爲〜50s(這更好但仍不夠好)。

這裏是complete grammar,example program和它的AST dump

問題:是否有另一種方法來處理不影響性能的不平衡括號?

+0

生成,然後解析調試輸出,特別是不可靠的調試輸出(這是AST轉儲是什麼)似乎不理想時,可以使用SourceKit來直接檢查AST,從而避免重新分析。你看看[SourceKitten](https://github.com/jpsim/SourceKitten),它似乎能夠生成JSON? – rici

回答

1

左保將是我第一次嘗試修復它:

treeNode 
    : '(' treeNodeContent ')'? 
    | functionParameterListNode 
    ; 
+0

不幸的是,結果是一樣的。 –