如何避免使用 ANTLR3 构建中间和无用的 AST 节点?

2023-11-29

我编写了一个 ANTLR3 语法,该语法细分为更小的规则以提高可读性。 例如:

messageSequenceChart:
  'msc' mscHead bmsc 'endmsc' end
;

# Where mscHead is a shortcut to :
mscHead:
  mscName mscParameterDecl? timeOffset? end
  mscInstInterface? mscGateInterface
;

我知道内置的 ANTLR AST 构建功能允许用户声明不会出现在最终 AST 中的中间 AST 节点。但是如果您手动构建 AST 会怎样?

messageSequenceChart returns [msc::MessageSequenceChart* n = 0]:
  'msc' mscHead bmsc'endmsc' end
  {
    $n = new msc::MessageSequenceChart(/* mscHead subrules accessors like $mscHead.mscName.n ? */
                                       $bmsc.n);
  }
;

mscHead:
  mscName mscParameterDecl? timeOffset? end
;

文档中没有谈论这样的事情。因此,看起来我必须为每个中间规则创建节点才能访问其子规则结果。

有谁知道更好的解决方案?

谢谢。


您可以通过让子规则返回多个值并仅访问您感兴趣的值来解决此问题。

以下演示展示了如何操作。尽管它不是用 C 语言编写的,但我相信您能够对其进行调整,使其满足您的需求:

grammar Test;

parse
  :  sub EOF {System.out.printf("second=\%s\n", $sub.second);}
  ;

sub returns [String first, String second, String third]
  :  a=INT b=INT c=INT
     {
       $first = $a.text;
       $second = $b.text;
       $third = $c.text;
     }
  ;

INT
  :  '0'..'9'+
  ;

SPACE
  :  ' ' {$channel=HIDDEN;}
  ;

如果你解析输入"12 34 56"使用生成的解析器,second=34打印到控制台,运行后可以看到:

import org.antlr.runtime.*;

public class Main {
  public static void main(String[] args) throws Exception {
    TestLexer lex = new TestLexer(new ANTLRStringStream("12 34 56"));
    TokenStream tokens = new TokenRewriteStream(lex);
    TestParser parser = new TestParser(tokens);
    parser.parse();
  }
}

因此,从parse规则就像$sub.INT, or $sub.$a访问三个之一INT代币,在not不幸的是,有可能。

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

如何避免使用 ANTLR3 构建中间和无用的 AST 节点? 的相关文章

  • 如何将 XML 数据解析为 PHP 变量

    我对 php 很平庸 对 XML 一无所知 如果你能详细一点 它将帮助我学习 我正在尝试使用 PHP 编程来执行此链接的脚本 VARIABLE ZIP 是在表单中输入的实际邮政编码 该表单将在上面的链接中提交信息 该链接的输出创建了一个 X
  • Java 文档生成器为 Xml 字符串返回 null 文档

    I have tried all possible answers https stackoverflow com questions 33098082 passing xml string as document returning nu
  • Parsec-Parser 工作正常,但是可以做得更好吗?

    我尝试这样做 解析以下形式的文本 一些文本 0 0 0 一些文本 0 0 0 0 0 0 更多文本 0 0 0 进入一些数据结构的列表 内部 一些文本 外部 0 0 0 内部 一些文本 外部 0 0 0 外部 0 0 0 内部 更多文本 外
  • 语法分析和语义分析有什么区别?

    据我了解 Parser由词法分析 句法分析和语义分析三个阶段组成 Lexical 它将我的输入分割成标记 例子 123 100 0 gt 123 100 0 语法 它将研究标记并检查它们是否彼此有意义 我遇到的问题是理解最后阶段的 语义解析
  • 如何在 C# 中将 IEnumerable 转换为 Enum?

    我已将多个字符串解析为枚举标志 但看不到将它们合并为单个枚举位字段的巧妙方法 我使用的方法循环遍历字符串值 然后 将值转换为 Enum 对象 如下所示 Flags public enum MyEnum None 0 First 1 Seco
  • 使用 Boost.spirit 解析简单的重复文本宏

    我正在学习如何使用 Boost Spirit 库来解析字符串 这似乎是一个非常好的工具 但也很困难 所以 我想解析一个字符串 其中一些单词用 并将它们放入字符串向量中 这是一个例子 word1 word2 word3 这是一个简单的任务 我
  • 提升解析器中的 Spirit 段错误

    我一直在尝试将我在本科编译器中编写的一些 lex 和 yacc 代码转换为精神代码以学习精神 我发现了一个我似乎无法弄清楚的段错误 我这样写了词法分析器 namespace lex boost spirit lex enum Tokens
  • [“03C0”]如何匹配附件P中的语法?

    我正在编写一个工具来使用 2005 年附录 P 中提供的语法来解析 Ada 源文件 通过下面的代码 我知道 03C0 代表 希腊字母Pi 但它是合法的变量名吗 01 package Ada Numerics is 02 Pi constan
  • CSV 损坏,如何修复?

    我正在尝试解析 CSV 我想将它放入数据库或只是用 JavaScript 解析它 但由于语法损坏 任何一种方法都会失败 我的整个 CSV 文件在这里 https gist github com 1023560 https gist gith
  • 使用 preg_split 分割和弦和单词

    我正在编写一小段播放处理歌曲标签的代码 但我遇到了一个问题 我需要解析每首歌曲选项卡行并将其拆分以获取大块chords一方面 并 且words在另一个 每个块就像 line chunk array 0 gt part of line con
  • PDF解析提取CheckBox字段值

    我有一个 PDF 文档 想要从 PDF 和 Chackbox 和单选按钮类型字段值中提取内容 PDF 文件的版本为 1 4 Acrobat 5 x 可以从网络浏览器生成 CheckBox appear such types in PDF 我
  • 使用正则表达式或其他解析从文件中读取值

    我有一个记录带有时间戳的值的文件 我必须在特定时间后读取特定值 例如 文件有 2013 03 03 19 08 22 car 2001 Ford 2013 03 03 19 08 27 Truck 2012 Chevy 2013 03 03
  • 关于Java中trim()方法的查询

    我之前提出了一个问题 但遭到了严厉的批评 所以我在这里再次提出 更简单 并重新措辞以吸引那些可能担心我之前提出问题的方式的人 背景 我正在解析一些 HTML 以获取信息 我将所有内容隔离在一系列行中 但我希望抓取的内容以及后面的一堆空格 为
  • C 或 C++ 中是否有轻量级的多部分/表单数据解析器? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在考虑将多部分表单数据解析集成到 Web 服务器模块中 以便可以减轻后端 Web 应用程序 通常用动
  • 如何解析代码(Python)?

    我需要解析一些特殊的数据结构 它们采用某种类似 C 的格式 大致如下所示 Group GroupName C Style comment Group AnotherGroupName Entry some variables 0 3 141
  • 两个基本的 ANTLR 问题

    我正在尝试使用 ANTLR 来获取简单的语法并生成汇编输出 我在 ANTLR 中选择的语言是 Python 许多教程看起来非常复杂或详细阐述与我无关的事情 我真的只需要一些非常简单的功能 所以我有两个问题 将值从一个规则 返回 到另一规则
  • Java 中的递归下降解析器

    我想在序言中说这是我三年级编程语言课的家庭作业 我正在寻求一些帮助 我的作业如下 截止日期 2013年2月22日晚上11点55分提交 请将以下内容上传到CMS 1 源代码2 程序执行的屏幕截图 包括您使用的输入文件 使用您喜欢的任何编程语言
  • 分析 ELF 部分和符号大小的工具

    我需要一种方法来分析 ARM 的 GCC 编译器的输出文件 我正在为裸机进行编译 并且我非常关心大小 我可以用arm none eabi objdump由交叉编译器提供 但如果存在用于此任务的工具 则解析输出并不是我渴望做的事情 您知道存在
  • 生成 C / C++ 代码时表达式的结合性和优先级?

    我编写了一个生成 AST 的基本编译器 正确考虑了表达式中运算符的优先级 但是 在执行代码生成以生成 C 代码时 我不确定如何处理括号的使用 对于这个表达式 A B c AST如下 A B C 应该正确生成包含括号的前一个表达式 但是如果第
  • 从 python 中的缩进文本文件创建树/深度嵌套字典

    基本上 我想迭代一个文件并将每行的内容放入一个深层嵌套的字典中 其结构由每行开头的空格数量定义 本质上 目标是采取这样的事情 a b c d e 并将其变成这样的东西 a b c d e Or this apple colours red

随机推荐

  • 在经典 ASP 中从 ADODB 调用参数化 Oracle 查询

    我目前正在开发一个与 Oracle 数据库交互的经典 ASP 项目 我正在尝试找到一种安全调用 Oracle PL SQL 脚本并使用 ADO 传递参数的方法 当前的解决方案使用嵌入变量手动构建 SQL 脚本 如下所示 strSQL SEL
  • 布尔类型

    在代码审查期间 我发现 C 代码的许多地方如下所示 if IsValid return true else return false 甚至 更好 return IsValid true false 我一直想知道为什么不直接写这样的代码 re
  • SBT:遍历项目依赖图

    我有一个多模块 Web 项目 其依赖关系图与此类似 WAR project A1 A2 A3 B1 B2 B22 B3 这就是战争项目所依赖的A1这又取决于A2 and A3等等 现在 在打包 war 项目之前 我想将一些 Web 资源从其
  • C++ 结构体排序

    我有一个自定义结构向量 每次都需要根据不同的标准进行排序 实现运算符 但我希望每次调用 C 标准排序时都能够指定排序标准 怎么做 请注意 运行时间最好高效 Thanks 您可以使用第三个参数定义每次运行排序算法时使用的比较函数 templa
  • jq 尝试使用变量修改 JSON 时出现“无效数字文字”错误

    我想将值通过管道传输到 bash 脚本中 该脚本将使用 jq 更改 json 文件中的值 我已经为此工作了一段时间 但无法克服第一组错误 这是我的简单 json 文件 0000000 pogo AJHVUYKJBOIHKNNLNM 7000
  • 每台计算机是否都有一些唯一的ID,以区分一台计算机和另一台计算机?

    我正在使用 C 在 NET Framework 中开发一个 Windows 应用程序 我想知道每台制造的计算机是否有唯一的 ID 让它由任何制造商制造 但它必须是唯一的 谢谢 比布 检查一下 如何获取计算机的唯一ID 硬盘 ID 卷序列号
  • Node Mailer 错误:本地主机中的“不支持的配置,将 Nodemailer 降级到 v0.7.1 才能使用它”

    我是 Nodejs 新手 尝试从以下地址发送邮件节点邮件程序模块但有错误 即 Unsupported configuration downgrade Nodemailer to v0 7 1 to use it 这是我的代码 var nod
  • Ionic 框架 PdfViewer

    我想开发移动 pdf 电子书应用程序 是否有 ionic 框架的 pdf 查看器组件 我喜欢 mozilla pdf js 我需要离子项目示例 您尝试过角度模块吗ng pdfviewer 因为 Angular 在 Ionic 的底层工作
  • 从Java中的静态方法获取类名

    如何从该类中的静态方法获取该类的名称 例如 public class MyClass public static String getClassName String name what goes here so the string My
  • 视频未在 Web 视图中显示

    我有一个 Html 页面 在这个 Html 页面中我显示一个视频 但该视频没有显示在我的应用程序的 web 视图中 而是显示在默认浏览器中 所以请告诉我问题是什么 下面是我的代码和视频和 html 文件存储到SD卡中 抱歉我的英语沟通不好
  • 如何更改 DatePickerDialog 中 NumberPickers 的顺序

    我想交换月份和日期 旋转器 我想将日期列 微调器 发送到左侧 将月份列 微调器 发送到中间 是否可以 根据来源中的注释 这些的顺序NumberPickers 由用户选择的系统范围日期格式确定 并根据给定用户区域设置确定最佳顺序 没有可用的公
  • 如何让 Android 响应触摸拖动?

    我正在创建一个网络应用程序 其中包含带有溢出的 div 滚动样式 由于 Android 浏览器不支持此功能 因此我需要通过自己的自定义功能来使用触摸和拖动 element bind touchmove function event even
  • 序列化/反序列化协议缓冲区

    我目前正在使用 Protocol Buffers C 版本 3 我正在向不同的服务来回发送消息 目前正在尝试将某些消息中存储的一些数据保存到数据库 实际上可以是任何类型 问题在于byte 被创建为类型字节串 and 列表被创建为重复字段 现
  • 如何在列表框中的项目之间显示分隔线?

    我在 Windows Phone 7 应用程序中使用 ListBox 控件 我想在列表行之间显示分隔线 线 尽管许多 不是 wp7 ListBox 示例似乎都有分隔符 但我无法找到有关此内容的任何信息 受到 NestorArturo 的启发
  • 导航时部分页面更新(PrimeFaces ajax)

    我使用 Facelets 模板完成了一个基本的 JSF 应用程序 我的模板如下
  • Android HTTP 用户代理

    如何在http user agent中获取真实设备 当我使用 WebView 时 我可以获得这样的真实值 HTTP USER AGENT gt Mozilla 5 0 Linux U Android 2 2 en gb LG P500 Bu
  • 如何解码视图状态

    我需要查看 ASP NET 页面的视图状态内容 我寻找视图状态解码器 发现Fridz Onion 的 ViewState 解码器但它要求页面的 url 来获取其视图状态 由于我的视图状态是在回发后形成的 并且是更新面板中操作的结果 因此我无
  • SQL 分组依据/计数:对多个列中的相同值进行计数?

    我试图弄清楚如何编写一个对多个列的值进行计数的查询 结果表在每列中对每个可能的值进行计数any column 示例 假设我有mytable Source data table P1 P2 P3 a b a a a a b b b a b b
  • 对象未添加到 NSMutableArray Objective -C

    我试图简单地将对象添加到可变数组中 但它们不会插入 我没有收到错误或任何错误 我不知道发生了什么 在我的主委托文件中 我将一个数组分成 4 个单独的字符串 如下所示 NSArray split currentParsedCharacterD
  • 如何避免使用 ANTLR3 构建中间和无用的 AST 节点?

    我编写了一个 ANTLR3 语法 该语法细分为更小的规则以提高可读性 例如 messageSequenceChart msc mscHead bmsc endmsc end Where mscHead is a shortcut to ms