如何解决如何使用 ANTLR 逐个解析输入?
我正在解析一个未知的输入,因此解析器可能会失败,但我想尽可能多地解析它。
此外,输入可以非常大 (> 1 Go)。
假设解析器解析items (用字母表示),这是输入:
A
B
C
D
E
- 我想逐个解析这个输入。我不能给它完整的输入,因为:
- 它可能太大
- 某个项目的失败可能会引发后续项目的失败。
- 我不想随意剪切输入,因为:
- 如果我在错误的地方剪切,它会产生错误(例如在 B 的中间剪切)。
- 如果我尽量不要在错误的地方剪切,我最终会“准备”输入。 (preparsing意味着我在preparsing时会遇到和我在parsing时一样的问题,而且语法复杂,items可以嵌套,所以preparsing很复杂)
- 我目前的解决方案是这样设置我的语法:
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 举报,一经查实,本站将立刻删除。