Parsing 用不平衡括号处理输入
我正在研究一个ANTLR 4语法,它解析Swift编译器生成的AST转储(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 ; 不幸的是
swiftc-dump AST
)
参见下面的示例Swift程序和相应的AST转储
不幸的是,由于存在错误,转储可能包含不平衡的括号(某些树节点中缺少右括号)
按以下方式更改treeNode
规则允许解析此类损坏的输出:
treeNode
: '(' treeNodeContent ')'
| functionParameterListNode
| '(' treeNodeContent
;
不幸的是,此更改也会降低解析性能。解析时间从~50ms增加到~70…80s
语法确实包含一些歧义,但几乎所有的时间都花在treeNode
规则上。分析器显示了大量的前瞻和DFA缓存未命中率
找出发生此问题的节点的具体类型,并仅对这些节点应用修复,使我的解析时间~50秒(这更好,但仍然不够好)
这是:和它的
问题:是否有其他方法处理不影响性能的不平衡括号?左因子分解将是我第一次尝试修复它:
treeNode
: '(' treeNodeContent ')'?
| functionParameterListNode
;
生成并解析调试输出,特别是不可靠的调试输出(即ast转储),如果您可以使用SourceKit直接检查ast,从而避免重新分析,则这似乎是次优的。您是否查看了哪个似乎能够生成JSON?不幸的是,结果是相同的。