【发布时间】:2017-03-11 15:28:48
【问题描述】:
我正在研究一种 ANTLR 4 语法,它解析由 Swift 编译器 (swiftc -dump-ast) 生成的 AST 转储。
请参阅下面的示例 Swift 程序和相应的 AST 转储。
不幸的是,由于bug in the compiler,转储可能包含不平衡的括号(某些树节点中缺少右括号)。
如下更改treeNode 规则允许解析此类损坏的输出:
treeNode
: '(' treeNodeContent ')'
| functionParameterListNode
| '(' treeNodeContent
;
不幸的是,这种变化也会影响解析性能。解析时间从 ~50ms 增加到 ~70...80s。
语法确实包含一些歧义,但几乎所有时间都花在treeNode 规则上。 Profiler 显示了大量的前瞻和 DFA 缓存未命中率。
查明发生此问题的具体节点类型并将修复仅应用于那些给我 ~50s 解析时间的节点(这更好,但仍然不够好)。
这是complete grammar、example program: 及其AST dump。
问题:是否有其他方法可以处理不影响性能的不平衡括号?
【问题讨论】:
-
当您可以使用 SourceKit 直接检查 AST 从而避免重新解析时,生成然后解析调试输出,尤其是不可靠的调试输出(即 ast 转储)似乎不是最佳选择。你看过SourceKitten 似乎能够生成 JSON 吗?
标签: parsing compiler-construction antlr abstract-syntax-tree