如何使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完全标记化终端节点 的相关文章

  • context.getText() 排除 ANTLR4 中的空格

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

    我已经开始使用 ANTLR 并注意到它的词法分析器规则非常变化无常 一个极其令人沮丧的例子如下 grammar output test FILEPATH NEWLINE TITLE FILEPATH A Z a z 0 9 NEWLINE
  • 在 ANTLR4 中使用什么来解决歧义(而不是语法谓词)?

    在 ANTLR v3 中 句法谓词可用于解决例如悬空 else 问题 ANTLR4 似乎接受具有类似歧义的语法 但在解析过程中它会报告这些歧义 例如 line 2 29 reportAmbiguity d 0 e ambigAlts 1 2
  • 为什么在将令牌分配给通道时出现错误?

    我的 g4 文件中有以下代码 lexer members public static final int WHITESPACE 1 public static final int COMMENTS 2 WS t f gt channel W
  • Antlr4 从错误中恢复并继续解析直到 EOF

    我正在使用 Antlr 4 5 用 Ja va 编写 C 语法 当我处理具有预处理器指令的 C 源代码时 示例代码 using System using System Collections Generic using System Lin
  • Antlr4 解析异常

    我正在使用 Antlr4 解析语法并遇到一个我无法理解的问题 简而言之 问题是 Antlr4 解析器无法完全解析我原始语法中的测试字符串 但是当我添加多余的规则时 解析就完成了 我提供了语法的简化版本来说明这个问题 grammar my s
  • 否定内部词法分析器和解析器规则

    否定元字符如何 在 ANTLR 的词法分析器和解析器规则中使用吗 否定可以发生在内部词法分析器和解析器规则 https stackoverflow com questions 4297770 practical difference bet
  • 修改表达式,由 Antlr 生成?

    我想用 Antlr4 读取表达式并对它们执行一些修改 例如 如果语法是算术 我会修改表达式 表示 2 3 1 with 2 4 然后与 8 这就是 计算 或 简化 为了执行此操作 我将创建一些树结构 第一个想法是使用由 Antlr 创建的完
  • antlr4数组实现:获取元素的值

    我正在尝试在 antlr4 中实现数组 但我不知道如何在初始化数组时获取数组的多个元素 如下所示 int array 1 2 我正在考虑将它们放入像这样的 HashMap 中 关键是索引 public Map
  • AnTLR4 C# 中的解析树

    我目前正在使用针对 C 的 AnTLR4 创建语法 但在开发访问者时遇到问题 我找不到书中提到的 ParseTree 类 书中我们有 LabeledExprLexer lexer new LabeledExprLexer input Com
  • 是否需要担心“解析器规则中的隐式标记定义”?

    我正在使用 ANTLR 和 ANTLRWorks 2 创建我的第一个语法 我已经完成了语法本身 它识别用所描述的语言编写的代码并构建正确的解析树 但除此之外我还没有开始任何事情 让我担心的是 解析器规则中第一次出现的标记都会用黄色曲线下划线
  • ANTLR4 将 ParserRuleContext 树展平为数组

    如何压平一个ParserRuleContext将子树放入令牌数组中 这ParserRuleContext getTokens int ttype 看起来不错 但什么是ttype 是token类型吗 如果我想包含所有令牌类型 应使用什么值 P
  • 语义词法分析器谓词性能

    我有一个词法分析器为传递给词法分析器的宏字符串的动态列表创建 MACRO 标记 我在最顶层的词法分析器规则中使用了语义谓词来实现此功能 MACRO macros null tryMacro Where tryMacro 只是检查是否有任何宏
  • 如何使antlr4完全标记化终端节点

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

    ANTLR 适合这个项目吗 我正在寻找处理和转换用户输入的字符串 其中可能包含自定义函数 例如 用户可能会在字符串中写入类似 CAPITALIZE word 的内容 而我想执行 使用 StringUtils 在后台进行实际转换 我想用户有时
  • 如何识别 Antlr 语法中的行首?

    在我使用的语言中 某些关键字必须位于行的开头 这主要是因为语言中的字符串值可以跨越多行 并且字符串可以轻松包含这些关键字 我可以轻松处理旧的 yacc lex 语法实现 因为词法分析器使用普通的正则表达式来匹配文本模式 例如 descrip
  • ANTLR语法的迁移工具

    假设我有以下简单语法 查询 DSL grammar TestGrammar term textTerm textTerm Text T VALUE STRING T VALUE value STRING WS t r n gt skip 然
  • antlr4-tool 在 Win10 中失败,并显示:错误:命令失败:哪个 java

    在Win10中运行 为了尝试在Node JS中创建解析器 我安装了ANTLR4工具 npm install save dev antlr4 tool Ran c prj parser node modules bin antlr4 tool
  • 如果输入无效,是否可以抛出异常?

    我有一个简单的 ANLTR 语法和随附的访客 一切都很好 除非输入无效 如果输入无效 错误就会被吞噬 并且我的计算器会输出错误的输出 我尝试过实现一个错误侦听器 超越Recover词法分析器的方法 还有 好吧 今天还有六件事 有人可以告诉我
  • 返回当前标记的最后一个字符的行号

    ANTLR 4 中有没有办法能够返回当前标记的最后一个字符的行号 我提到Antlr 从令牌中获取最后一行 https stackoverflow com questions 7903021 antlr get last line from

随机推荐

  • 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