如何使antlr4完全标记化终端节点

2024-04-08

我正在尝试使用 Antlr 制作一个非常简单的解析器,它基本上标记了一系列.- 分隔标识符。

我做了一个简单的语法:

r  : STRUCTURE_SELECTOR ;
STRUCTURE_SELECTOR: '.' (ID STRUCTURE_SELECTOR?)? ;
ID : [_a-z0-9$]* ;             
WS : [ \t\r\n]+ -> skip ;

生成解析器后,我最终得到一个代表字符串的终端节点,而不是能够进一步找到STRUCTURE_SELECTORs。我想看到一个序列(可能表示为当前节点的子节点)。我怎样才能做到这一点?

举个例子:

  • .将产生一个终端节点,其文本为.
  • .foobar将产生两个节点,一个带有文本的父节点.和一个有文字的孩子foobar
  • .foobar.baz将产生四个节点,一个带有文本的父节点.,一个有文字的孩子foobar,带有文本的二级子项.,以及一个带有文本的三级子级baz.

以大写字母开头的规则是 Lexer 规则。

使用以下输入文件 t.text

.
.foobar
.foobar.baz

你的语法(在文件 Question.g4 中)产生以下标记

$ grun Question r -tokens -diagnostics t.text
[@0,0:0='.',<STRUCTURE_SELECTOR>,1:0]
[@1,2:8='.foobar',<STRUCTURE_SELECTOR>,2:0]
[@2,10:20='.foobar.baz',<STRUCTURE_SELECTOR>,3:0]
[@3,22:21='<EOF>',<EOF>,4:0]

词法分析器(解析器)是贪婪的。它尝试使用该规则读取尽可能多的输入字符(标记)。词法分析器规则STRUCTURE_SELECTOR: '.' (ID STRUCTURE_SELECTOR?)?可以读取一个点、一个 ID,然后再次读取一个点和一个 ID(由于重复标记?),直到NL。这就是为什么每一行都以一个标记结束。

编译语法时,报错

warning(146): Question.g4:5:0: non-fragment lexer rule ID can match the empty string

因为ID的重复标记是*(这意味着0次或多次)而不是+(一次或多次)。

现在尝试这个语法:

grammar Question;

r  
@init {System.out.println("Question last update 2135");}
    :   ( structure_selector NL )+ EOF
    ;

structure_selector
    :   '.'
    |   '.' ID structure_selector*
    ;

ID  : [_a-z0-9$]+ ;   
NL  : [\r\n]+ ;          
WS  : [ \t]+ -> skip ;

$ grun Question r -tokens -diagnostics t.text
[@0,0:0='.',<'.'>,1:0]
[@1,1:1='\n',<NL>,1:1]
[@2,2:2='.',<'.'>,2:0]
[@3,3:8='foobar',<ID>,2:1]
[@4,9:9='\n',<NL>,2:7]
[@5,10:10='.',<'.'>,3:0]
[@6,11:16='foobar',<ID>,3:1]
[@7,17:17='.',<'.'>,3:7]
[@8,18:20='baz',<ID>,3:8]
[@9,21:21='\n',<NL>,3:11]
[@10,22:21='<EOF>',<EOF>,4:0]
Question last update 2135
line 3:7 reportAttemptingFullContext d=1 (structure_selector), input='.'
line 3:7 reportContextSensitivity d=1 (structure_selector), input='.'

and $ grun Question r -gui t.text显示您期望的层次树结构。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使antlr4完全标记化终端节点 的相关文章

  • Antlr4 C# 目标和生成文件的输出路径

    我有一个带有 Antlr3 语法文件的 C 解决方案 我正在尝试升级到 Anltr4 事实证明语法是最简单的部分 它变得更好 大小也减少了三分之一 事实证明 生成解析器是棘手的部分 在旧的解决方案中 我只是在语法文件更改时运行 AntlrW
  • 控制 Scala 插件中的错误 IntelliJ 代码编辑器错误

    我有从 ANTLR4 生成的 Java 代码 Scala 通过扩展一些方法来使用 Java 代码 问题是 IntelliJ 的 scala 插件似乎不知道 Java 基类和 Scala 子类之间的关系 从而显示误报错误消息 当 Scala
  • ANTLRv4:非贪婪规则

    我正在阅读明确的 ANTLR4 参考文献 并对其中一个示例有疑问 第 76 页 STRING ESC fragment ESC 该规则与典型的 C 字符串匹配 包含在 其中可以包含 too 在我的预期中 规则STRING由于非贪婪构造 应该
  • Antlr4 无法正确识别 unicode 字符

    我有非常简单的语法 尝试将 与标记 E CODE 相匹配 我已经使用 TestRig 工具 带有 tokens 选项 对其进行了测试 但解析器无法正确匹配它 我的输入文件采用无 BOM 的 UTF 8 编码 并且我使用了 ANTLR 版本
  • ANTLR - 输入错误不匹配

    我有一个语法 如下所示 由特定语言的注释和控制语句组成 Grammar grammar DD ddlist ddstmt jclcomment ddstmt dd1 dd2 dd3 dd4 dd1 JCLBEGIN ddname DDWOR
  • 如何在ANTLR4中生成AST?

    我正在开发一个项目 在该项目中我必须为给定程序生成抽象语法树 这里的程序可以是任何主流编程语言 在 ANTLR4 中生成 AST 的标准方法应该是什么 我只了解 ANTLR4 的基础知识 并且能够为给定程序生成解析树 ANTLR 4 自动生
  • 如何让ANTLR消耗所有可见元素?

    这是我的语法 grammar test text foo EOF foo X foo foo foo tail tail foo 我正在解析这段文字 X X X X 这是我得到的树 语法应该改变什么才能让我只得到一个tail包含所有元素的集
  • context.getText() 排除 ANTLR4 中的空格

    getText 返回完整的语句 不包括单词之间的空格 考虑空格的一种方法是将它们包含在语法中 但是 有没有其他方法可以获取考虑空格的完整字符串 是的 有 假设您在这里使用ParserRuleContext getText 这个想法是向输入字
  • Antlr4:输入不匹配

    这是一个简单的语法测试 我认为很容易解析 但我立即得到 不匹配的输入 并且我无法弄清楚 Antlr 正在寻找什么 输入 include something program TEST1 BLAH BLAH 我的语法 grammar ProgH
  • 如何强制ANTLR解析所有输入CharStream

    我正在使用 ANTLR4 来解析语法文件 当我使用 BaseErrorListener 检测错误时 遇到了问题 当遇到非法输入字符串时 ANTLR会自动匹配相应的分支 然后忽略后续流字符 即使它包含错误 我想检测这个错误 这是我的 g4 文
  • 访问 ANTLR 4 中的通道并单独解析它们

    我已将我的评论添加到 ANTLR 4 中的一个单独频道中 在我的例子中 它是频道 2 这是我的词法分析器语法 COMMENT gt channel 2 我想访问这个频道 2 并在这个频道上进行解析以积累评论 所以我将其包含在解析语法中 如下
  • antlr4:ATN 版本 2 预计 3

    当尝试使用生成的语法和词法分析器时 我得到 org antlr v4 runtime atn ATN 无法使用版本 2 预期为 3 反序列化 ATN 怎么了 您的解析器是使用 ANTLR 4 0 生成的 但您尝试使用 ANTLR 4 1 执
  • 使用 ANTLR4 解析公式

    我正在尝试使用 ANTLR4 将数学公式解析为 LaTeX 的子集 例如它应该解析 a 4 b 10 to frac a 4 b cdot 10 我的简单语法创建了一棵这样的树 现在我正在尝试实现解析树侦听器 以在遍历树时以某种方式构造 L
  • ANTLR4 左递归错误

    我的 ANTLR4 语法在文件中power g4这是 assign id expr id A B C expr expr term expr term term term term factor term factor factor fac
  • ANTLR 4 令牌规则匹配任何字符,直到遇到 XYZ

    我想要一个标记规则 它会吞噬所有字符 直到它到达字符XYZ 因此 如果输入是这样的 helloXYZ 那么令牌规则应该返回这个令牌 hello 如果输入是这样的 Blah Blah XYZ 那么令牌规则应该返回这个令牌 Blah Blah
  • 在 Linux 上安装 antlr4 c++ 运行时后,一些包含文件被破坏

    我在linux上下载了antlr4工具并安装了c 运行时 usr local include 我创建了一个小语法文件 使用antlr4命令成功生成了解析器和词法分析器 但是在编译主文件时出现以下错误 我改变了Interval h里面的标题
  • ANTLR4 将 ParserRuleContext 树展平为数组

    如何压平一个ParserRuleContext将子树放入令牌数组中 这ParserRuleContext getTokens int ttype 看起来不错 但什么是ttype 是token类型吗 如果我想包含所有令牌类型 应使用什么值 P
  • 如何在 Eclipse 中使用 Antlr4 Ide 查看实时解析树?

    我是 Antlr4 的新手 但我知道 Eclipse 存在一个插件 我有一个简单的问题 创建 g4 文件后 如何可视化实时解析树以便查看输入表达式的树 谢谢 在 Eclipse 中安装 Antlr4Ide 插件后 窗口 gt 显示视图 gt
  • ANTLR4性能问题

    关于 ANTL4 解析的性能已经有一些讨论 例如 Antlr 4 解析大型 c 文件需要很长时间 https stackoverflow com questions 19311864 antlr 4 parsing large c file
  • 摆脱令牌识别错误

    如何摆脱默认的 ANTLR 识别错误 我想使用我自己的错误类而不是 ANTLR 的错误来编写另一条消息 我的意思是是否有可能扩展某些 ANTLR 错误类以显示我自己的消息 更清楚地说 我不想在控制台中看到以下错误消息 令牌识别错误 如果您只

随机推荐

  • python如何表示这么大的整数?

    在C C 和Java中 整数有一定的范围 我在 Python 中意识到的一件事是我可以计算非常大的整数 例如pow 2 100 相同的等效代码 在 C 语言中 pow 2 100 显然会导致溢出 因为在 32 位体系结构中 无符号整数类型的
  • Vala:传递通用数组会破坏值

    如何将数组传递给通用函数 以下代码确实可以编译 但输出有些损坏 void foo
  • 如何在 SugarCRM 中为该字段创建新的自定义字段数据类型和功能

    如何创建新的自定义字段数据类型并在 SugarCRM 中为该字段添加功能 自定义字段类型需要在 Studio 的字段类型下拉列表中可用 None
  • 将 Google OIDC 与代码流和 PKCE 结合使用

    经过反复试验 在我看来 Google OIDC 在不提供客户端密钥的情况下不支持代码流 https developers google com identity protocols oauth2 native app exchange au
  • Arelle Webserver - 如何从 XBRL 申报中提取损益表?

    我正在尝试根据报表类型提取财务报表信息 让我更详细地向您解释一下 我想从 XBRL 实例中提取损益表 资产负债表和现金流量表 特别是美国公认会计原则 US GAAP 对我来说 完美的解决方案是在 XML 文件中添加标签 这样我就可以使用标签
  • Reactjs在布局中隐藏侧边栏的方式?

    我想知道如何处理这两种布局 首先 我有一个 css 网格布局 可用于 1024px 或更大的分辨率 并且它们支持当前的网格标准 非常标准的布局 带有标题 侧边栏和主要区域 container display grid grid templa
  • 如何在 Swift 中使用组合图像创建 GMSMarker

    I need to create a GMSMarker for my Google Maps screen in an iOS app I need the marker to be a combination of images i e
  • 无法替换 android studio 中的默认图标

    我尝试替换默认图标的图像是 512x512px p ng 要更改图标 我转到 app res new 图像资产 它不允许我在 drawable 中替换或创建新的图标集 我最近的想法是 我可能没有解锁一些权限 但我可以通过直接访问可绘制对象的
  • 如何更改 UWP 中所选 ListView 项目的突出显示颜色 (Windows 10)

    我正在使用 C 和 XAML 开发 Windows 10 应用程序 我有一个 ListView 我想更改所选项目的默认高亮颜色 我看到了很多代码示例 例如this https stackoverflow com questions 2559
  • 如果任一参数为 NaN,什么会导致 C/C++ <、<= 和 == 运算符返回 true?

    我对 IEEE 754 浮点比较规则的理解是 除了 如果其中一个或两个参数均为 NaN 则返回 false 而 运算符将返回 true 我可以通过简单的独立测试轻松重现此行为 for int ii 0 ii lt 4 ii float a
  • 未针对 Rails 资源编译 CSS 样式

    我在 Rails 3 2 应用程序中对样式表进行了以下设置 我有一个应用程序 css文件中定义了许多样式 以及其他几个用于更具体样式的文件 例如与页脚有关的所有内容都在页脚 css 在开发中 一切正常 但在生产中 所需文件中的任何移动样式都
  • 输入stream.read返回0还是-1?

    有什么区别 byte buffer new byte 1024 this if inputStream read buffer gt 0 and if inputStream read buffer 1 两者都能确定网络流终止吗 Java
  • 如何在 WPF 中禁用 UserControl 的大小调整

    How to 禁用此用户控件的大小调整 换句话说 当用户用鼠标抓住这个用户控件的角或边时 我不希望用户能够更改用户控件的大小 或者 如果无法停止调整大小 那么我如何只允许拖动用户控件的右侧
  • req.flash() 需要会话

    我在视图中遇到闪光问题 我正在使用连接闪存 这是我的配置 app use express bodyParser app use express methodOverride app use express cookieParser secr
  • 为什么需要消息队列来与 Web 套接字聊天?

    我在互联网上看到了很多使用 Web 套接字和 RabbitMQ 进行聊天的示例 https github com videlalvaro rabbitmq chat https github com videlalvaro rabbitmq
  • 如何在 O(n+m) 时间内找到有向图中的母顶点? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有向图 G V E 中的母顶点是顶点 v 使得所有其他顶点 顶点 G 可以通过从 v 出发的有向路径到达 给出一个 O n m 算法来
  • 由于通道无故陈旧而不断断开连接

    自从几天前发布最新版本以来 我们的用户不断地被断开连接 因为通道令牌在创建几分钟后就变得陈旧了 我们的令牌设置为持续 5 小时 但如果它们持续 5 10 分钟 我们就很幸运 并且当通道关闭时 我们甚至无法重新连接新的通道令牌 直到用户刷新为
  • .NET新手套接字问题

    我有一个使用 C 编写的客户端 服务器网络程序 TCPListener 和 TCPClient 类 服务器正在读取所有内容 来自客户端 少量 xml 就很好 直到我尝试发送 大文件 100k 返回给客户端 我正在使用流函数 客户端和服务器都
  • Spring 将表单的操作映射到控制器

    我是 Spring 框架的新手 我使用以下方法创建了一个控制器 RequestMapping fetch contactId public String getContact PathVariable contactId Long cont
  • 如何使antlr4完全标记化终端节点

    我正在尝试使用 Antlr 制作一个非常简单的解析器 它基本上标记了一系列 分隔标识符 我做了一个简单的语法 r STRUCTURE SELECTOR STRUCTURE SELECTOR ID STRUCTURE SELECTOR ID