Parsing 用不平衡括号处理输入

Parsing 用不平衡括号处理输入,parsing,compiler-construction,antlr,abstract-syntax-tree,Parsing,Compiler Construction,Antlr,Abstract Syntax Tree,我正在研究一个ANTLR 4语法,它解析Swift编译器生成的AST转储(swiftc-dump AST) 参见下面的示例Swift程序和相应的AST转储 不幸的是,由于存在错误,转储可能包含不平衡的括号(某些树节点中缺少右括号) 按以下方式更改treeNode规则允许解析此类损坏的输出: treeNode : '(' treeNodeContent ')' | functionParameterListNode | '(' treeNodeContent ; 不幸的是

我正在研究一个ANTLR 4语法,它解析Swift编译器生成的AST转储(
swiftc-dump AST

参见下面的示例Swift程序和相应的AST转储

不幸的是,由于存在错误,转储可能包含不平衡的括号(某些树节点中缺少右括号)

按以下方式更改
treeNode
规则允许解析此类损坏的输出:

treeNode
   : '(' treeNodeContent ')'
   | functionParameterListNode
   | '(' treeNodeContent
   ;
不幸的是,此更改也会降低解析性能。解析时间从~50ms增加到~70…80s

语法确实包含一些歧义,但几乎所有的时间都花在
treeNode
规则上。分析器显示了大量的前瞻和DFA缓存未命中率

找出发生此问题的节点的具体类型,并仅对这些节点应用修复,使我的解析时间~50秒(这更好,但仍然不够好)

这是:和它的


问题:是否有其他方法处理不影响性能的不平衡括号?

左因子分解将是我第一次尝试修复它:

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

生成并解析调试输出,特别是不可靠的调试输出(即ast转储),如果您可以使用SourceKit直接检查ast,从而避免重新分析,则这似乎是次优的。您是否查看了哪个似乎能够生成JSON?不幸的是,结果是相同的。