gpt4 book ai didi

sockets - 使用 Antlr 解析永无止境的流中的数据

转载 作者:行者123 更新时间:2023-12-02 15:08:11 25 4
gpt4 key购买 nike

Antlr 是否适合从要解析的文本后面没有 EOF 的流中解析数据?根据我的观察,词法分析器在收到下一个 token 的第一个字符之前不会发出当前 token 。最重要的是 - 解析器似乎不会发出规则,直到收到下一个规则的第一个标记。这是我尝试过的简单语法:

fox: 'quick' 'brown' 'fox' '\r'? '\n' ;

然后我将生成的解析器与 UnbufferedCharStream 和 UnbufferedTokenStream 一起使用:

  CharStream input = new UnbufferedCharStream(is);
MyLexer lex = new MyLexer(input);
lex.setTokenFactory(new CommonTokenFactory(true));
TokenStream tokens = new UnbufferedTokenStream(lex);
MyParser parser = new MyParser(tokens);
MyParser.FoxContext fox = parser.fox();

当流变得“快”时 - 什么也不会发生。

当“b”出现时 - 输入规则“fox

然后 'round' - 什么都没有(流中有 2 个 token - 目前还没有一个 token 是已知的!)

仅在“f”之后,监听器才会访问第一个标记:“quick

然后 - 'ox' 上什么也没有

换行 (unix):访问 token 'brown'

现在流已包含所有数据(4 个 token ),但仅识别 2 个 token 。

我发现为了将这些 token 推送到系统中,流可以发出 2 个 token ,即语法已知的任何 token 。它可能是 2 个额外的新行,或者比方说“fox”和“brown”。只有当标记“fox”和“\n”被访问时,解析器才会退出规则“fox”并完成解析。

这是一个错误还是一个功能?有没有办法消除这种滞后?

谢谢!

最佳答案

ANTLR 4 书最初打算包含一个解析流输入的示例,但我反对它,因为使用自适应无限前向解析器来处理类似的事情将不可避免地产生严重的复杂性。

ANTLR 4 没有保证的先行限制(并且没有办法告诉它寻找甚至尝试强制执行),因此任何在阻塞流上操作的实现都有可能出现死锁,而不返回有关解析引导的信息到那时。我什至不会考虑解析流输入的可能性,除非我首先看到中间缓冲区。

  1. 获取所有可用(或之前未解析的)输入并将其放入 Stringchar[] 中。
  2. 为缓冲区创建一个 ANTLRInputStream
  3. 尝试词法/解析此流,该流末尾将有一个隐式 EOF。

解析的结果将告诉您是放弃该点的结果,还是保留它们以在有更多数据可用时重试:

  • 如果没有发生语法错误,则输入已成功解析,您可以在稍后可用时解析下一部分输入。

  • 如果在使用 EOF token 之前报告语法错误,则实际输入中会出现语法错误,因此您需要对其进行处理(将其报告给用户,等等...)。

  • 如果在使用 EOF 标记时报告语法错误,则额外的输入可能会解决问题 - 忽略当前解析的结果,然后在输入流中有更多数据可用时重试。

关于sockets - 使用 Antlr 解析永无止境的流中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14864777/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com