当前位置: 首页 > 知识库问答 >
问题:

基于Antlr的永续流数据解析

曾光誉
2023-03-14
fox: 'quick' 'brown' 'fox' '\r'? '\n' ;
  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”

然后是“roun”--什么都没有(2个代币在流中--他们中的任何一个都不为leser所知!)

只有在'f'之后,侦听器才会访问第一个令牌:'quick'

谢了!

共有1个答案

吕子真
2023-03-14

ANTLR4本来打算包含一个解析流输入的示例,但我反对它,因为使用自适应无限lookahead解析器来处理类似的问题将不可避免地产生严重的复杂性。

ANTLR4没有保证的lookahead界限(也没有办法告诉它寻找或甚至尝试强制执行一个界限),因此任何在阻塞流上操作的实现都有可能发生死锁,而不会返回关于该点之前的解析的信息。我甚至不会考虑解析流输入的可能性,除非我首先看到了一个中间缓冲区。

  1. 获取所有可用的(或以前未解析的)输入并将其放在字符串字符[]中。
  2. 为缓冲区创建antlrinputstream
  3. 尝试lex/解析此流,其末尾将有一个隐式EOF。

>

  • 如果没有出现语法错误,则输入解析成功,当输入的下一部分稍后可用时,您可以解析它。

    如果在使用EOF令牌之前报告了语法错误,那么实际输入中就会出现语法错误,所以您需要处理它(向用户报告,等等)。

    如果在使用EOF令牌的地方报告了语法错误,那么额外的输入可以解决问题-忽略当前解析的结果,然后在输入流中有更多数据可用时重试。

  •  类似资料:
    • 长话短说:java.io包中有多少种基于数据流的流?它们是字节流和字符流还是二进制流和字符流? 完整问题: https://youtu.be/v1_ATyL4CNQ?t=20m5s昨天看了本教程后跳到20:05,我的印象是基于数据流有两种类型的流:BinaryStreams和CharacterStreams。今天,在了解了更多关于这个主题的知识之后,我的新发现似乎与旧发现相矛盾。 互联网上的大多数

    • Serverless 适合用于事件驱动型应用,以及定时任务。今天,让我们来看看一个事件驱动的例子。 在之前的那篇《Serverless 应用开发指南:CRON 定时执行 Lambda 任务》中,我们介绍了如何调度的示例。 最初我想的是通过 Lambda + DynamoDB 来自定义数据格式,后来发现使用 Kinesis Streams 是一种更简单的方案。 Amazon Kinesis Stre

    • 我们已经构建了一个Flink应用程序来处理来自动觉流的数据。应用程序的执行流程包含基于注册类型过滤数据、基于事件时间戳分配水印的基本操作,以及应用于5分钟数据窗口的映射、处理和聚合功能,如下所示: 我的水印分配程序的参考代码: 现在,这个应用程序的性能很好(在几秒钟内的延迟方面),早就有了。然而,最近在上游系统post中发生了变化,其中Kinesis流中的数据以突发方式发布到流中(每天仅2-3小时

    • 我从smartwatch收到一个DataMap对象,其中包含两个DataMap对象,一个包含字符串列表(标题、字幕、内容……),另一个包含资产列表 当调用onDataChanged时,我转换字符串中的itemFieldDataMap和资产列表中的itemImagesDataMap。对于每一个资产,我希望转换位图中的资产,并将其放在位图列表中。但我有一个错误: 做不好工作的方法是LoadBitMap

    • 本文向大家介绍python基于xml parse实现解析cdatasection数据,包括了python基于xml parse实现解析cdatasection数据的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了python基于xml parse实现解析cdatasection数据的方法,分享给大家供大家参考。 具体实现方法如下: 希望本文所述对大家的Python程序设计有所帮助。

    • 问题内容: 我有一些大型的base64编码数据(存储在hadoop文件系统中的快照文件中)。该数据最初是压缩的文本数据。我需要能够读取此编码数据的大块,对其进行解码,然后将其刷新到GZIPOutputStream。 关于如何执行此操作而不是将整个base64数据加载到数组中并调用Base64.decodeBase64(byte [])的任何想法? 如果我读了直到’\ r \ n’分隔符并逐行解码的