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

Parsing 如何使用ANTLR逐个解析输入?,parsing,antlr,antlr4,grammar,Parsing,Antlr,Antlr4,Grammar,我正在解析一个未知的输入,因此解析器可能会失败,但我希望尽可能多地解析它 此外,输入可以是非常大的(>1次) 假设解析器解析项(由字母表示),这就是输入: A B C D E 我想逐块分析这个输入。我无法给出全部输入,因为: 它可能太大了 项目故障可能会导致以下项目出现故障 我不想随意剪切输入,因为: 如果在错误的地方 >剪切,它会产生错误(例如在B的中间切割)。 如果我试图不在错误的位置剪切,我最终会“准备”输入。(preparsing意味着我将面临与解析相同的问题,语法复杂,项目可以

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

此外,输入可以是非常大的(>1次)

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

A
B
C
D
E
  • 我想逐块分析这个输入。我无法给出全部输入,因为:
    • 它可能太大了
    • 项目故障可能会导致以下项目出现故障
  • 我不想随意剪切输入,因为:
    • 如果在错误的地方<强> >剪切,它会产生错误(例如在B的中间切割)。
    • 如果我试图不在错误的位置剪切,我最终会“准备”输入。(preparsing意味着我将面临与解析相同的问题,语法复杂,项目可以嵌套,因此preparsing很复杂)
  • 我当前的解决方案是通过以下方式设置语法:
  • 解析器解析一个项,并吞咽规则swallow\u to\u eof中的其余项。 我给解析器一个部分输入,然后一块一块地完成它

    我不喜欢这个解决方案:

    • 项目可能会有很大的差异(数千到数百万个字符),因此我给解析器提供了大量的项目,以确保不会意外地将最大的项目一分为二
    • 性能很差
      • 解析输入的大小很大(上一点)
      • 我们一直在解析相同的元素,将它们转储到swallow_to_eof规则中(如果一切顺利,上面的示例将被解析5次,这听起来非常低效:
        • BCDE
        • B CDE
        • D E
        • E
    也许这个问题有一个显而易见的解决办法,但我错过了。 你如何解决这个问题


    谢谢:)

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

    “ANTLR4不支持开箱即用”谢谢你的回答,这正是我想知道的:是否有ANTLR4解决方案,或者是否必须“从外部”解决。现在我知道这个词的由来了。这将使我的搜索更加高效。干杯
    blind_parsing
        : blind_statement swallow_to_eof
        ;
    
    swallow_to_eof
        : ~(EOF)*
        ;