微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 ANTLR 逐个解析输入?

如何解决如何使用 ANTLR 逐个解析输入?

我正在解析一个未知的输入,因此解析器可能会失败,但我想尽可能多地解析它

此外,输入可以非常大 (> 1 Go)

假设解析器解析items (用字母表示),这是输入:

A
B
C
D
E
  1. 我想逐个解析这个输入。我不能给它完整的输入,因为:
  • 它可能太大
  • 某个项目的失败可能会引发后续项目的失败。
  1. 我不想随意剪切输入,因为:
  • 如果我错误的地方剪切,它会产生错误(例如在 B 的中间剪切)
  • 如果我尽量不要在错误的地方剪切,我最终会“准备”输入(preparsing意味着我在preparsing时会遇到和我在parsing时一样的问题,而且语法复杂,items可以嵌套,所以preparsing很复杂)
  1. 我目前的解决方案是这样设置我的语法
blind_parsing
    : blind_statement swallow_to_eof
    ;

swallow_to_eof
    : ~(EOF)*
    ;

解析器解析一项吞下规则swallow_to_eof中的其余部分。 我给解析器一个部分输入并逐个完成它。

我不喜欢这个解决方案:

  • 项目可以有很大的不同(数千到数百万个字符),所以我给解析器大块以确保我不会不小心切入最大的项目两个。
  • 表现不佳
    • 解析输入的大小很大(前一点)
    • 我们不断解析相同的元素,将它们转储到swallow_to_eof规则中(如果一切顺利,上面的例子会解析5次,这听起来效率很低:
      • BCDE
      • B CDE
      • C DE
      • DE
      • E

也许这个问题有一个明显的解决方案,我错过了。 你是如何解决这个问题的?

谢谢:)

解决方法

这被称为增量解析,不,ANTLR4 不支持开箱即用。之前有很多人讨论过这个问题,但我不记得还没有看到可靠的解决方案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。