处理带有不平衡括号的输入

时间:2017-03-11 15:28:49

标签: parsing compiler-construction antlr abstract-syntax-tree

我正在研究一种ANTLR 4语法,它解析由Swift编译器(treeNode)生成的AST转储。

请参阅示例Swift程序以及下面的相应AST转储。

不幸的是,由于bug in the compiler转储可能包含不平衡的括号(某些树节点中缺少右括号)。

如下更改treeNode : '(' treeNodeContent ')' | functionParameterListNode | '(' treeNodeContent ; 规则允许解析此类损坏的输出:

treeNode

不幸的是,这种变化也会破坏解析性能。解析时间从 ~50ms 增加到 ~70 ... 80s

语法确实包含一些含糊之处,但几乎所有时间都用在{{1}}规则中。 Profiler显示了大量的前瞻和DFA缓存未命中率。

精确定位发生此问题的节点的具体类型,并仅将修复应用于那些使我解析时间 ~50s (这更好,但仍然不够好)。

这里是complete grammarexample program及其AST dump

问题:还有另一种处理不平衡括号的方法吗?

1 个答案:

答案 0 :(得分:1)

左派因素将是我第一次尝试修复它:

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