我正在研究解析由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。
問題:是否有另一種方法來處理不影響性能的不平衡括號?
生成,然後解析調試輸出,特別是不可靠的調試輸出(這是AST轉儲是什麼)似乎不理想時,可以使用SourceKit來直接檢查AST,從而避免重新分析。你看看[SourceKitten](https://github.com/jpsim/SourceKitten),它似乎能夠生成JSON? – rici