【问题标题】:Handle input with unbalanced parentheses处理带有不平衡括号的输入
【发布时间】: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 grammarexample program: 及其AST dump

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

【问题讨论】:

  • 当您可以使用 SourceKit 直接检查 AST 从而避免重新解析时,生成然后解析调试输出,尤其是不可靠的调试输出(即 ast 转储)似乎不是最佳选择。你看过SourceKitten 似乎能够生成 JSON 吗?

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


【解决方案1】:

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

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

【讨论】:

  • 很遗憾,结果是一样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多