【问题标题】:How to parse an input piece by piece with ANTLR?如何使用 ANTLR 逐个解析输入?
【发布时间】:2021-02-14 23:44:47
【问题描述】:

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

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

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

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

swallow_to_eof
    : ~(EOF)*
    ;

解析器解析一个项目在规则swallow_to_eof中吞下其余项目。 我给解析器一个部分输入,然后一块一块地完成它。

我不喜欢这个解决方案:

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

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

谢谢你:)

【问题讨论】:

    标签: parsing antlr antlr4 grammar


    【解决方案1】:

    这被称为增量解析,不,ANTLR4 不支持这个开箱即用。过去有很多关于这个问题的讨论,但我不记得见过可靠的解决方案。

    【讨论】:

    • “ANTLR4 不支持这个开箱即用”感谢您的回答,这正是我一直在徘徊的:如果有一个 ANTLR4 解决方案,或者是否必须“从外部”。现在我知道了这个创造的术语。这将使我的搜索更有效率。干杯!
    猜你喜欢
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2020-01-07
    • 2012-04-21
    • 1970-01-01
    相关资源
    最近更新 更多