【发布时间】:2021-02-14 23:44:47
【问题描述】:
我正在解析一个未知的输入,因此解析器可能会失败,但我想尽可能地解析它。
此外,输入可以非常大 (> 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
- 中德
- 德乙
- E
也许这个问题有一个明显的解决方案,但我错过了。 你如何解决这个问题?
谢谢你:)
【问题讨论】:
标签: parsing antlr antlr4 grammar