如何使用 ANTLR 逐段解析输入?
How to parse an input piece by piece with ANTLR?
我正在解析一个未知的输入,因此解析器可能会失败,但我想尽可能多地解析它 .
此外,输入可以非常大 (> 1 Go).
假设解析器解析 items (用字母表示) 这是输入:
A
B
C
D
E
- 我想一段一段地解析这个输入。我不能给它完整的输入,因为 :
- 可能太大
- 一个项目的失败可能会引发后续项目的失败。
- 我不想任意剪切输入因为:
- 如果我切错地方,会产生错误(比如在B中间切).
- 如果我尽量不在错误的地方剪切,我最终会“准备”输入。 (preparsing就是说preparsing和parsing一样的问题,语法复杂,item可以嵌套,所以preparsing很复杂)
- 我目前的解决方案是设置我的语法:
blind_parsing
: blind_statement swallow_to_eof
;
swallow_to_eof
: ~(EOF)*
;
解析器解析一项,吞没规则swallow_to_eof中的其余项。
我给解析器一个部分输入,然后一点一点地完成它。
我不喜欢这个解决方案:
- 项目可能有很大差异(数千到数百万个字符),所以我给解析器很大的部分以确保我不'不小心把最大的东西切成两半。
- 表现不佳:
- 解析输入的大小很大(前一点)
- 我们继续解析相同的元素,将它们转储到 swallow_to_eof 规则中 (如果一切顺利,上面的示例将解析 5 次,这听起来非常低效:
- 一个BCDE
- B CDE
- C德
- D E
- E
也许这个问题有一个明显的解决方案,但我错过了。
你是如何解决这个问题的?
谢谢:)
这被称为增量解析 不,ANTLR4 不支持开箱即用。以前有很多人讨论过这个问题,但我不记得有没有看到可靠的解决方案。
我正在解析一个未知的输入,因此解析器可能会失败,但我想尽可能多地解析它 .
此外,输入可以非常大 (> 1 Go).
假设解析器解析 items (用字母表示) 这是输入:
A
B
C
D
E
- 我想一段一段地解析这个输入。我不能给它完整的输入,因为 :
- 可能太大
- 一个项目的失败可能会引发后续项目的失败。
- 我不想任意剪切输入因为:
- 如果我切错地方,会产生错误(比如在B中间切).
- 如果我尽量不在错误的地方剪切,我最终会“准备”输入。 (preparsing就是说preparsing和parsing一样的问题,语法复杂,item可以嵌套,所以preparsing很复杂)
- 我目前的解决方案是设置我的语法:
blind_parsing
: blind_statement swallow_to_eof
;
swallow_to_eof
: ~(EOF)*
;
解析器解析一项,吞没规则swallow_to_eof中的其余项。 我给解析器一个部分输入,然后一点一点地完成它。
我不喜欢这个解决方案:
- 项目可能有很大差异(数千到数百万个字符),所以我给解析器很大的部分以确保我不'不小心把最大的东西切成两半。
- 表现不佳:
- 解析输入的大小很大(前一点)
- 我们继续解析相同的元素,将它们转储到 swallow_to_eof 规则中 (如果一切顺利,上面的示例将解析 5 次,这听起来非常低效:
- 一个BCDE
- B CDE
- C德
- D E
- E
也许这个问题有一个明显的解决方案,但我错过了。 你是如何解决这个问题的?
谢谢:)
这被称为增量解析 不,ANTLR4 不支持开箱即用。以前有很多人讨论过这个问题,但我不记得有没有看到可靠的解决方案。