ANTLR 4 和 AST 访客

2023-12-26

我正在尝试将 AST 与 ANTLR4 一起使用,并使用以下文件:

生成器.java

import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.TokenStream;

public class Builder
{

    public static void main(String[] args)
    {
        CharStream input = new ANTLRInputStream("ON M1==2 && M3 == 5 && (M2 > 1 || M5 <= 5.0) "
                                              + "DO P5:42 P4:10");
        ExprLexer lexer = new ExprLexer(input);
        TokenStream tokens = new CommonTokenStream(lexer);
        ExprParser parser = new ExprParser(tokens);
        parser.addParseListener(new ExprTestListener());
        ExprParser.ExpressionContext uu = parser.expression();
    }

}

Expr测试监听器:

import org.antlr.v4.runtime.ParserRuleContext;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.tree.TerminalNode;
import org.antlr.v4.runtime.tree.ErrorNode;

public class ExprTestListener extends ExprBaseListener {
    @Override public void enterExpression(ExprParser.ExpressionContext ctx)
    {
        System.out.println(ctx);
    }
    @Override public void exitExpression(ExprParser.ExpressionContext ctx)
    {
        System.out.println(ctx);
    }

    @Override public void enterActionexpr(ExprParser.ActionexprContext ctx)
    {
        System.out.println(ctx);
    }
    @Override public void exitActionexpr(ExprParser.ActionexprContext ctx)
    {
        System.out.println(ctx);
    }

    @Override public void enterCondexpr(ExprParser.CondexprContext ctx)
    {
        System.out.println(ctx);
    }
    @Override public void exitCondexpr(ExprParser.CondexprContext ctx)
    {
        System.out.println(ctx);
    }

    @Override public void enterCond(ExprParser.CondContext ctx)
    {
        System.out.println(ctx);
    }
    @Override public void exitCond(ExprParser.CondContext ctx)
    {
        System.out.println(ctx);
    }

    @Override public void enterEveryRule(ParserRuleContext ctx)
    {
        System.out.println(ctx);
    }
    @Override public void exitEveryRule(ParserRuleContext ctx)
    {
        System.out.println(ctx);
    }
    @Override public void visitTerminal(TerminalNode node)
    {
    }
    @Override public void visitErrorNode(ErrorNode node)
    {
    }
}

Expr.g:

grammar Expr;
options
{
  // antlr will generate java lexer and parser
  language = Java;

}
WS      : [ \t\r\n]+ -> skip ;
OP      : '&&' | '||';
COMP    : '==' | '<' | '>' | '<=' | '>=' | '!=';
fragment INT     : [0-9]+;
REAL    : INT '.' INT | INT;

ACTION  : 'P' INT ':' INT;
MEASURE : 'M' INT;

// ***************** parser rules:
cond       : MEASURE COMP REAL;
condexpr   : '(' condexpr ')' | cond OP condexpr | cond;
actionexpr : ACTION actionexpr | ACTION;
expression : 'ON' condexpr 'DO' actionexpr;

我有这个输出:

[]
[]
[29]
[29]
[16 29]
[16 29]
[16 29]
[16 29]
[18 29]
[18 29]
[16 18 29]
[16 18 29]
[16 18 29]
[16 18 29]
[18 18 29]
[18 18 29]
[13 18 18 29]
[13 18 18 29]
[16 13 18 18 29]
[16 13 18 18 29]
[16 13 18 18 29]
[16 13 18 18 29]
[18 13 18 18 29]
[18 13 18 18 29]
[20 18 13 18 18 29]
[20 18 13 18 18 29]
[20 18 13 18 18 29]
[20 18 13 18 18 29]
[18 13 18 18 29]
[18 13 18 18 29]
[13 18 18 29]
[13 18 18 29]
[18 18 29]
[18 18 29]
[18 29]
[18 29]
[29]
[29]
[31]
[31]
[24 31]
[24 31]
[24 31]
[24 31]
[31]
[31]
[]
[]

我发现使用 ANTLR4 很难理解访客。

我有树目标:

  • 获取 MEASURE 和 ACTION 的集合 INT(在两个不同的集合中)
  • 替换一些 OP(例如 != 替换为 )
  • 获取 condexpr (顶部项目)字符串并替换 OP(请参阅我的上一点)

首先我将解释一下您在上面观察到的内容:

首先也是最重要的,请阅读您调用的方法的文档。这Parser.addParseListener http://antlr.org/api/Java/org/antlr/v4/runtime/Parser.html#addParseListener%28org.antlr.v4.runtime.tree.ParseTreeListener%29文档包括以下注释:

这仅适用于高级用户。请将您的 ParseTreeListener 交给 ParseTreeWalker,而不是交给解析器!!!!

实施toString()为了ParserRuleContext类只是在创建上下文时打印规则调用堆栈。当侦听器进入规则时,您将打印一次,当侦听器退出时,您将打印一次。为了actionexpr, cond, and condexpr您再次打印它,每个上下文总共会产生 4 个相同的输出行。

现在关于您的目标的一些注意事项:

  • 代替enterCond and exitCond, the MEASURE可通过致电获取文本ctx.MEASURE().getText().
  • 代替enterActionexpr and exitActionexpr, the ACTION可通过致电获取文本ctx.ACTION().getText().
  • 您可以更改COND通过创建一个新的令牌TerminalNodeImpl and CommonToken获取更新后的令牌,并将其分配给字段中的正确索引CondContext.children使用访问者或听众。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ANTLR 4 和 AST 访客 的相关文章

  • 使用 JPA Criteria API 进行分页的总行数

    我正在系统中为实体实现 高级搜索 功能 以便用户可以使用该实体的属性上的多个条件 eq ne gt lt 等 来搜索该实体 我正在使用 JPA 的 Criteria API 动态生成 Criteria 查询 然后使用setFirstResu
  • JAVA - Xuggler - 组合 MP3 音频文件和 MP4 电影时播放视频

    使用 JAVA 和 Xuggler 以下代码组合 MP3 音频文件和 MP4 电影文件并输出组合的 mp4 文件 我希望在合并音频和视频文件时应自动播放输出视频文件 String inputVideoFilePath in mp4 Stri
  • 如何在不超过最大值的情况下增加变量?

    我正在为学校开发一个简单的视频游戏程序 我创建了一个方法 如果调用该方法 玩家将获得 15 点生命值 我必须将生命值保持在最大值 100 并且由于我目前的编程能力有限 我正在做这样的事情 public void getHealed if h
  • 当从服务类中调用时,Spring @Transactional 不适用于带注释的方法

    在下面的代码中 当方法内部 是从内部调用的方法外部 应该在交易范围内 但事实并非如此 但当方法内部 直接从调用我的控制器class 它受到事务的约束 有什么解释吗 这是控制器类 Controller public class MyContr
  • 我需要什么库才能在 Java 中访问这个 com.sun.image.codec.jpeg?

    我正在用java创建一个图像水印程序 并导入了以下内容 import com sun image codec jpeg JPEGCodec import com sun image codec jpeg JPEGEncodeParam im
  • 使用 AES SecretKey 的 Java KeyStore setEntry()

    我目前正在 Java 中开发一个密钥处理类 特别是使用 KeyStore 我正在尝试使用 AES 实例生成 SecretKey 然后使用 setEntry 方法将其放入 KeyStore 中 我已经包含了代码的相关部分 The KS Obj
  • Hazelcast 分布式锁与 iMap

    我们目前使用 Hazelcast 3 1 5 我有一个简单的分布式锁定机制 应该可以跨多个 JVM 节点提供线程安全性 代码非常简单 private static HazelcastInstance hInst getHazelcastIn
  • 在 Netbeans 8 上配置 JBoss EAP 的问题

    我已经下载了 JBoss EAP 7 并正在 Netbeans 8 上配置它 我已经到达向导 实例属性 其中要求从选择框中选择 域 当我打开选择框时 它是空的 没有什么可以选择的 因此 完成 按钮也处于非活动状态 这使得无法完成配置 我通过
  • 如何使用 Maven 打包并运行具有依赖项的简单命令行应用程序?

    我对 java 和 Maven 都是全新的 所以这可能非常简单 如果我遵循maven2hello world此处的说明 http maven apache org guides getting started maven in Five m
  • 具有 java XSLT 扩展的数组

    我正在尝试使用 java 在 XSLT 扩展中使用数组 我收到以下错误 Caused by java lang ClassCastException org apache xpath objects XObject cannot be ca
  • 欧洲中部时间 14 日 3 月 30 日星期五 00:00:00 至 日/月/年

    我尝试解析格式日期Fri Mar 30 00 00 00 CET 14至 日 月 年 这是我的代码 SimpleDateFormat formatter new SimpleDateFormat dd MM yyyy System out
  • Struts 2 + Sitemesh 3 集成 - FreemarkerDecoratorServlet 中的 NPE

    我将 Struts 2 版本 2 3 14 3 与 Sitemesh 3 版本 3 0 alpha 2 一起使用 并且在某些情况下遇到 NullPointerException 首先 这是我的 web xml 中的 struts2 site
  • 在 Spring 中重构这个的最佳方法?

    private final ExecutorService executorParsers Executors newFixedThreadPool 10 public void parse List
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • Java中的Object类是什么?

    什么是或什么类型private Object obj Object http download oracle com javase 6 docs api java lang Object html是Java继承层次结构中每个类的最终祖先 从
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • 如何从 Maven 存储库引用本机 DLL?

    如果 JAR 附带 Maven 存储库中的本机 DLL 我需要在 pom xml 中放入什么才能将该 DLL 放入打包中 更具体地举个例子Jacob http search maven org artifactdetails 7Cnet s
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • Antlr 解析器运算符优先级

    考虑以下语法 我对运算符优先级有疑问 例如 res 2 a b有一个类似的解析树res 2 a b 我知道问题出在哪里 但我没有想到没有相互左递归的 漂亮 解决方案 你能帮我一点忙吗 该语法与自定义访问者一起使用 grammar Math
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import

随机推荐

  • jquery 中是否有原型序列化()的等效项

    我正在尝试将表单的数据传递给jquery ajax请求 我找到了制作原型的简单方法 formid serialize 这将需要一个字符串 其中包含该表单中的所有元素名称及其值 以方便的方式为 ajax 请求做好准备 这很容易 那么jquer
  • Google Sheets 可安装 onEdit() 触发器无权添加日历事件

    我正在编写附加到 Google 电子表格的脚本 该脚本可以帮助我为员工生成轮班时间表 创建 Google 日历并在人们换班时更新日历 我在电子表格上附加了一个 onEdit 可安装触发器 用于检查用户是否更改了特定范围内的单元格 以交换班次
  • spring-boot:run 和 spring-boot:start 有什么区别

    有什么区别spring boot run and spring boot start 我看到它们都可用Maven 目标 但有什么区别呢 弹簧启动 运行 描述 运行可执行的存档应用程序 弹簧启动 启动 描述 启动一个 Spring 应用程序
  • Knockout获取属性值onClick函数

    具有 attr 值 Qref 的 HTML 视图 这是用于绑定的 HTML 代码 目前我已经硬编码了 Href 属性值
  • Android:文件名包含空格的 ffmpeg

    我想从 Android 应用程序执行 ffmpeg 如下所述 将 FFmpeg 与 Android NDK 结合使用 https stackoverflow com questions 9605757 using ffmpeg with a
  • 核心数据:在索引 x 处获取的对象有一个无序的节名称“xxxxxx”。对象必须按部分名称排序

    我知道我不是第一个问这个问题的人 但我真的很困惑 基本上我有一个带有两个按钮的屏幕 每个按钮根据日期将数据加载到下面的表格视图中 第一次加载第一个表格视图时 默认情况下选择左侧按钮 一切都显示正常 如果我单击右侧按钮并得到一个空白的表格视图
  • 如何从工具提示中删除方形标签并将其信息放在一行中?

    如何从工具提示中删除这个方块 如果我能设法只写一行这样的内容 我会更喜欢 二月 2 var data labels January February March datasets data 1 2 3 var myLineChart new
  • 使用 .save() 传递 url 参数来发布表单数据

    我发布的页面接受 id 电子邮件等参数 我该如何发送 index id 001 email protected cdn cgi l email protection 在backbone js中 model save 您可以将第二个参数中的任
  • 有没有更好的方法来比较字典值

    我目前正在使用以下函数来比较字典值并显示所有不匹配的值 有没有更快或更好的方法来做到这一点 match True for keys in dict1 if dict1 keys dict2 keys match False print ke
  • Tensorflow - h5模型到tflite转换错误

    我使用预训练的 InceptionV3 模型进行了学习迁移 并保存了 h5 模型文件 之后 我就能做出预测 现在 我想使用 TFLiteConverter convert 方法将 h5 模型转换为 tflite 文件 如下所示 conver
  • 无法在 R 上安装包

    当我尝试为 R 安装 Bioconductor 时遇到问题 我到处搜索解决方案 但没有任何东西真正适合我 请问 有什么建议吗 The downloaded binary packages are in var folders 74 y92t
  • 添加任务计划程序

    我正在开发 Apache Cordova 应用程序 我想知道是否可以将任务添加到调度程序设备 我必须在特定时间运行警报和通知 我该怎么做 我考虑过向调度程序设备添加一个任务并委派责任 这个有可能 至少安卓4 4 Thanks 首先 是的 你
  • 如何使用Rubberduck管理本地git存储库

    我在用着橡皮鸭 http rubberduckvba com 版本 2 0 13 与本地 git 存储库结合使用 用于对我的 VBA 项目进行版本控制 目前 每次我使用 Rubberduck 启动时 我都需要重新打开存储库Manage gt
  • SWIG 接口通过函数参数接收 Java 中的不透明结构引用

    我正在尝试使用 SWIG 来使用适用于 Android 的 Spotify API libspotify https developer spotify com technologies libspotify https developer
  • 标记水平 EMA 线(变量)

    这是我使用 atm 的代码 感谢比约恩 米斯蒂安 len1 input 10 minval 1 title Length len2 input 21 minval 1 title Length len3 input 55 minval 1
  • 创建父子数组 PHP

    我有一个平面数组 我试图将其转换为父子数组 Array 0 gt Array parent id gt t3 42yrg7 id gt t1 cze7b2e 1 gt Array parent id gt t3 42yrg7 id gt t
  • 在 React 中自动缩放输入值的宽度

    我想要一个宽度适应其内容的输入 我正在尝试实施这个类似问题的答案 https stackoverflow com a 38867270 5308892 但是使用 React import React useState from react
  • 将 pageToken 与 Google Analytics Reporting API v4 和 Python 结合使用

    我遵循了有关如何使用 GA Reporting API 通过 Python 从 Google Analytics 下载数据的教程 尽管达到了行数限制 但我仍然能够查询所需的数据 我在文档中看到有一个 pageToken 可以避免这个问题 我
  • git 克隆失败并显示“--stdin 需要 git 存储库”

    我对这个问题感到困惑 并被困在这里 不知道为什么会发生 我正在使用 git clone 从 bitbucket 获取我的存储库 例如 git clone 电子邮件受保护 cdn cgi l email protection mycompny
  • ANTLR 4 和 AST 访客

    我正在尝试将 AST 与 ANTLR4 一起使用 并使用以下文件 生成器 java import org antlr v4 runtime ANTLRInputStream import org antlr v4 runtime CharS