在侦听器中使用 ParserRuleContext 遍历令牌 - ANTLR4

2024-01-04

在使用侦听器迭代令牌时,我想知道如何使用 ParserRuleContext 来查看令牌流中的下一个令牌或接下来的几个令牌?

在下面的代码中,我试图查看当前标记之后直到 EOF 的所有标记:

@Override 
public void enterSemicolon(JavaParser.SemicolonContext ctx) {

    Token tok, semiColon = ctx.getStart();  
    int currentIndex = semiColon.getStartIndex();
    int reqInd = currentIndex+1;
    TokenSource tokSrc= semiColon.getTokenSource();
    CharStream srcStream = semiColon.getInputStream();
    srcStream.seek(currentIndex);

    while(true){

        tok = tokSrc.nextToken() ;
        System.out.println(tok);
        if(tok.getText()=="<EOF>"){break;}
        srcStream.seek(reqInd++);
    }
}

但我得到的输出是:

            .
            .
            .
            .
            .
[@-1,131:130='',<-1>,13:0]
[@-1,132:131='',<-1>,13:0]
[@-1,133:132='',<-1>,13:0]
[@-1,134:133='',<-1>,13:0]
[@-1,135:134='',<-1>,13:0]
[@-1,136:135='',<-1>,13:0]
[@-1,137:136='',<-1>,13:0]
[@-1,138:137='',<-1>,13:0]
[@-1,139:138='',<-1>,13:0]
[@-1,140:139='',<-1>,13:0]
[@-1,141:140='',<-1>,13:0]
[@-1,142:141='',<-1>,13:0]
[@-1,143:142='',<-1>,13:0]
[@-1,144:143='',<-1>,13:0]
[@-1,145:144='',<-1>,13:0]
[@-1,146:145='',<-1>,13:0]
[@-1,147:146='',<-1>,13:0]
[@-1,148:147='',<-1>,13:0]
[@-1,149:148='',<-1>,13:0]
[@-1,150:149='',<-1>,13:0]
[@-1,151:150='',<-1>,13:0]
[@-1,152:151='',<-1>,13:0]
[@-1,153:152='',<-1>,13:0]
[@-1,154:153='',<-1>,13:0]
[@-1,155:154='',<-1>,13:0]
[@-1,156:155='',<-1>,13:0]
[@-1,157:156='',<-1>,13:0]
[@-1,158:157='',<-1>,13:0]
[@-1,159:158='',<-1>,13:0]
[@-1,160:159='',<-1>,13:0]
[@-1,161:160='<EOF>',<-1>,13:0]
[@-1,137:136='',<-1>,13:0]
[@-1,138:137='',<-1>,13:0]
[@-1,139:138='',<-1>,13:0]
[@-1,140:139='',<-1>,13:0]
[@-1,141:140='',<-1>,13:0]
[@-1,142:141='',<-1>,13:0]
[@-1,143:142='',<-1>,13:0]
[@-1,144:143='',<-1>,13:0]
[@-1,145:144='',<-1>,13:0]
[@-1,146:145='',<-1>,13:0]
[@-1,147:146='',<-1>,13:0]
[@-1,148:147='',<-1>,13:0]
[@-1,149:148='',<-1>,13:0]
[@-1,150:149='',<-1>,13:0]
[@-1,151:150='',<-1>,13:0]
[@-1,152:151='',<-1>,13:0]
[@-1,153:152='',<-1>,13:0]
[@-1,154:153='',<-1>,13:0]
[@-1,155:154='',<-1>,13:0]
[@-1,156:155='',<-1>,13:0]
[@-1,157:156='',<-1>,13:0]
[@-1,158:157='',<-1>,13:0]
[@-1,159:158='',<-1>,13:0]
[@-1,160:159='',<-1>,13:0]
[@-1,161:160='<EOF>',<-1>,13:0]
            .
            .
            .
            .

我们看到,虽然我能够遍历所有令牌直到 EOF,但我无法获取令牌的实际内容或类型。我想知道是否有一种巧妙的方法可以使用侦听器遍历来执行此操作。


很难确定,但是

tok = tokSrc.nextToken() ;

似乎正在重新运行词法分析器,从假定的正确标记边界开始,但没有重置词法分析器。词法分析器抛出的错误可能可以解释观察到的行为。

不过,更好的方法是简单地恢复现有的令牌流:

public class Walker implements YourJavaListener {

    CommonTokenStream tokens;

    public Walker(JavaParser parser) {
        tokens = (CommonTokenStream) parser.getTokenStream()
    }

然后访问流以获取所需的令牌:

@Override 
public void enterSemicolon(JavaParser.SemicolonContext ctx) {
    TerminalNode semi = ctx.semicolon(); // adjust as needed for your impl.
    Token tok = semi.getSymbol();
    int idx = tok.getTokenIndex();

    while(tok.getType() != IntStream.EOF) {
        System.out.println(tok);
        tok = tokens.get(idx++);
    }
}

可能满足您最终目的的一种完全不同的方法是直接从父上下文获取一组有限的令牌:

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

在侦听器中使用 ParserRuleContext 遍历令牌 - ANTLR4 的相关文章

随机推荐

  • 如何可靠地找到 UIGestureRecognizer 的正确视图?

    我有一堆 UIView 如下图所示 红色 粉色 半透明 视图位于其他视图之上 红色有一个UISwipeGestureRecognizer 绿色有作为UITapGestureRecognizer 蓝色没有识别器 轻按一下visible绿色的
  • Cython 基于外部值的条件编译

    我尝试从 Cython pxd 有条件地编译 或生成 为 c 代码 我读到我可以 DEF 定义 aa 值 并 IF 根据其值有条件地生成 但是如何从 pxd 文件外部获取该值 具体来说 这两个案例现在对我来说很有趣 为 Cython 提供一
  • 使用 NVIDIA GPU 计算 SDK 4.0 和 microsoft VC++ 2010 Express 无需 GPU 硬件即可执行简单的 CUDA 程序

    我是 GPU 计算新手 但我在某处读到 可以使用模拟器 仿真器在没有 GPU 卡的情况下执行 CUDA 程序 我在 Windows Vista 上安装了 NVIDIA 的 GPU 计算 SDK 4 0 和 Visual C 2010 Exp
  • 如何计算android应用程序的功耗?

    有没有公 式 API或者方法 我想测试不同应用程序的功耗 使用adb工具可以查看每个正在运行的应用程序的功耗 adb shell dumpsys cpuinfo 样本输出 Load 1 12 1 07 1 01 CPU usage from
  • 从文件读取时在 shell 脚本中拆分字符串

    我有一个以下脚本 它应该从 properties 文件中逐行读取 然后根据 分隔符对其进行标记 并将值存储到两个变量中 然后显示它 但我不了解如何对其进行标记 然后将其存储在两个不同的变量中 然后将其用于进一步的目的 以下脚本可以很好地逐行
  • fork进程之间的随机数是相同的

    我正在从管理器进程中分叉多个进程 然后我想为这些分叉进程创建一个随机端口号来侦听 但是 当我随机播种并获得随机数时 我在三个进程之间获得相同的数字 例如 manager int main for int i 0 i lt rCount i
  • 有没有办法使用普通 ADO 从 SQL Server 检索视图定义?

    我使用 ADO 连接成功从 SQL Server 上托管的数据库中提取列定义OpenSchema 调用其各种形式 以便我可以以编程方式在另一个 SQL 数据库中重新创建这些表 到目前为止 一切都很好 与上表的主要交互是使用多个视图进行的 尽
  • 使用 imagejpeg 保存和提供图像文件

    我正在用 PHP 图像处理做一些实验 我正在尝试将一些图像转换为黑白版本 我基本上已经弄清楚了 但有一个小问题 为了减少服务器的压力 我想保存黑白版本 并仅对之前未通过脚本运行的图像运行图像过滤 所以 我有这样的事情
  • 使用代理拦截 C# 中的方法调用

    我想做的是能够拦截对对象方法和属性的调用 以实现横切关注点 我正在使用基于代理的 AOPContextBoundObject 然而 这不适用于递归方法调用 针对目标的第一次调用将被代理拦截并成功调用 允许我在这里进行横切 但是 第一个方法中
  • 无法在嵌入式 ASPX 代码中引用动态对象

    我正在 Page Init 事件期间创建一个 List 成员变量 我在从 aspx 页面中嵌入的 C 代码引用列表中的对象时遇到问题 该错误是运行时绑定程序异常 显示 object 不包含 JobID 的定义 当调用调试器时 我可以看到 f
  • 联合两个选择基于某些列(而不是整行)删除重复项

    我想合并 2 个 select 语句 结果将在记录方面不同 但是我想在第二个 select 语句中省略重复的结果 考虑某些列 select id name type parent from table1 where type 1 union
  • 在闪亮的应用程序上,ggplotly()渲染的大小是plot_ly()的一半。如何解决这个问题?

    当使用 ggplotly 与plot ly 在闪亮的应用程序中生成绘图时 绘图的宽度小于一半 这是为什么 有没有办法修复它 以便 ggplotly 生成与plot ly 或 ggplot2 宽度相同的图 我尝试过使用宽度参数 但这并不能解决
  • 在控制台 .NET Core 应用程序中创建用户

    我有一个 ASP NET Core 1 0 解决方案 包含 3 个项目 Web 控制台应用程序 DataAccessLayer 我使用 ASP NET Core Identity 和 Entity Framework Core SQL Se
  • 使用 iisnode 时保护 CookieSession

    我将节点与 IIS 一起使用iisnode https github com tjanczuk iisnode我在设置 CookieSession 选项时遇到问题secure true 我在 IIS 上使用 HTTPS 并将任何 HTTP
  • 如何更改 MathJax 的字体

    我无法让 MathJax 更改它用来渲染用 AsciiMath 编写的公式的字体 我已经在 StackOverflow 和网络上的其他地方阅读了类似问题的答案 MathJax 样式 https stackoverflow com quest
  • 处理 blob 游戏中的图像

    我设法将图片存储在 Google App 引擎 Blob 中 我可以从仪表板的 Blob 查看器中看到它 也可以使用服务处理程序在我的应用程序中看到它 然而 现在我有了这张图片 我想在将其提供给客户时调整它的大小 问题是我不能这样做 我不能
  • 如何使用 Swift 3 进行 Firebase 数据库查询来获取一些孩子?

    如何在 Firebase 数据库中进行查询以获取控制台中的一些子项 例如 从下面的快照中 我如何进行查询以获取Images where Des 11 我正在使用这段代码 func loadData Ref FIRDatabase datab
  • 可配置的计时器触发器 - Azure Web 作业

    我正在构建一项以固定间隔 例如 1 分钟 触发的工作 我已成功使用触发的网络作业 并在函数中硬编码了时间跨度 public void foo TimerTrigger 00 01 00 TimerInfo timer 现在 如果我想将触发时
  • R:write.table的格式输出

    是否可以使用 write table 格式化输出 我可以使用制表符左对齐列 sep t 并且可以使用两个选项卡增加列之间的间距 sep t t 理想情况下 我希望能够右对齐列并使用比提供的中间间距 通过 t 和 t t 使用类似的东西sep
  • 在侦听器中使用 ParserRuleContext 遍历令牌 - ANTLR4

    在使用侦听器迭代令牌时 我想知道如何使用 ParserRuleContext 来查看令牌流中的下一个令牌或接下来的几个令牌 在下面的代码中 我试图查看当前标记之后直到 EOF 的所有标记 Override public void enter