首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >从ANTLR AST中识别Java变量

从ANTLR AST中识别Java变量
EN

Stack Overflow用户
提问于 2014-06-13 07:02:54
回答 1查看 611关注 0票数 1

我想列出使用ANTLR4在Java源代码中使用的所有变量。对于下面的源,结果应该是a,b,i

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Item {}
class First {
    public static void main(String[] args) {
        int a = 3;
        int b;
        b = a + 1;
        Item i = new Item();
        i = new Item();
        System.out.println(b);
    }
}

使用官方语法,我可以像这样提取AST:(查看更大)

问题是,我不知道如何区分变量和System,因为它们都被标记为expression -> primary

我想这是一个常见的问题,但我找不到合适的答案。有谁可以帮我?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-13 07:15:39

只需从enterVariableDeclarator(...)中重写JavaBaseListener方法,以获得文本variableDeclaratorId匹配的信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Main {

    public static void main(String[] args) throws Exception {

        final String source = "class Item {}\n" +
                "class First {\n" +
                "    public static void main(String[] args) {\n" +
                "        int a = 3;\n" +
                "        int b;\n" +
                "        b = a + 1;\n" +
                "        Item i = new Item();\n" +
                "        i = new Item();\n" +
                "        System.out.println(b);\n" +
                "    }\n" +
                "}";

        final JavaLexer lexer = new JavaLexer(new ANTLRInputStream(source));
        final JavaParser parser = new JavaParser(new CommonTokenStream(lexer));
        final List<String> variables = new ArrayList<>();

        ParseTreeWalker.DEFAULT.walk(new JavaBaseListener() {
            // variableDeclarator
            //     :   variableDeclaratorId ('=' variableInitializer)?
            //     ;
            @Override
            public void enterVariableDeclarator(@NotNull JavaParser.VariableDeclaratorContext ctx) {
                variables.add(ctx.variableDeclaratorId().getText());
            }
        }, parser.compilationUnit());

        System.out.printf("variable=%s", variables);
    }
}

将印刷:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
variable=[a, b, i]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24208450

复制
相关文章
flutter的列表下拉刷新
flutter的列表下拉刷新需要借助一个组件来实现,这个组件的名字是RefreshIndicator,直译过来就是刷新指示灯。
挥刀北上
2021/01/07
4.8K0
flutter的列表下拉刷新
模板代码 - 列表和下拉刷新
摘要总结:本篇文章主要介绍了如何使用ViewStub和ViewStubCompat实现多布局,以便在不同的屏幕尺寸和分辨率下达到较好的展示效果。同时,还介绍了如何使用ViewStub和ViewStubCompat实现内边距和圆角,以及自定义属性在布局中的使用。
用户1172465
2018/01/05
2.9K0
【Flutter】ListView 列表高级功能 ( RefreshIndicator 下拉刷新组件 )
使用 Flutter 提供的 RefreshIndicator 组件 , 可以实现下拉刷新的功能 ;
韩曙亮
2023/03/29
2K0
【Flutter】ListView 列表高级功能 ( RefreshIndicator 下拉刷新组件 )
微信小程序列表数据的局部刷新
本文由来源 17,由 system_mush 整理编辑,其版权均为 17 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。
Java架构师必看
2020/04/10
2.6K0
RecyclerView 刷新列表数据的 notifyDataSetChanged() 为什么是昂贵的?
当列表数据变更时,调用 notifyDataSetChanged() 是最省事的。无需关心变更的细节,一股脑统统刷一遍就完事了。但这样做也是最昂贵的。读完这一篇源码走查就知道为啥它这么昂贵了。
Rouse
2021/05/28
3.4K0
RecyclerView 刷新列表数据的 notifyDataSetChanged() 为什么是昂贵的?
​借助云开发数据库实现小程序列表上拉刷新功能丨云开发101
上一期101专栏中,我们介绍了如何借助云开发数据库实现小程序的列表触底自动加载功能,相对应的,小程序列表上拉刷新又该如何实现呢?本期专栏就来为大家解答。
腾讯云开发TCB
2019/10/08
6040
微信小程序----列表下拉刷新上拉加载(MUI下拉刷新和上拉加载更多)
效果图 原理 利用微信小程序的onPullDownRefresh函数(下拉刷新监听函数)和onReachBottom函数(上拉加载监听函数)监听页面的下拉和上拉动态,从而对页面数据进行修改! 页
Rattenking
2021/02/01
1.9K0
微信小程序----列表下拉刷新上拉加载(MUI下拉刷新和上拉加载更多)
MariaDB数据库刷新权限表命令
当授权或者修改用户权限时,往往不会马上生效的这是因为数据库没有马上去更新权限相关的表,而是在内存中所以一般都会使用更新权限表,来实现马上更新
用户9006224
2022/12/21
1K0
Java常用数据库列表
MySQL是一种开源的关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,现在由Oracle公司负责维护和支持。MySQL是最流行的数据库之一,被广泛用于各种应用程序和网站开发。 MySQL具有以下特点:
ha_lydms
2023/08/10
5520
Java常用数据库列表
JS/JQuery页面刷新、局部刷新
//div的局部刷新 $(".dl").load(location.href+" .dl"); //全页面的刷新方法 window.location.reload()刷新当前页面. parent.location.reload()刷新父亲对象(用于框架) opener.location.reload()刷新父窗口对象(用于单开窗口) top.location.reload()刷新最顶端对象(用于多开窗口)
小语雀网
2022/05/06
5.8K0
php案例之数据库选择列表
作者:陈业贵 华为云享专家 51cto(专家博主 明日之星 TOP红人) 阿里云专家博主 文章目录 cyg.php check.php 效果: ---- cyg.php <style> body{ background:#ccc; }</style> <b>数据库选择列表<b><br> <form action="check.php" method="POST">//提交到check.php <select name="database" size="10"> <option value="0"
贵哥的编程之路
2022/09/23
6260
php案例之数据库选择列表
数据库Mongodb-用户权限列表
Mongodb用户权限列表 read 允许用户读取指定数据库 readWrite 允许用户读写指定数据库 dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile userAdmin 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 clusterAdmin 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限 readAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读权限 r
cwl_java
2021/08/30
7520
EasyDSS前端界面在页面缩小时内置列表仍需手动刷新的优化
RTMP协议的视频平台EasyDSS除了直播外,还支持点播,转码、上传一体化设计,使音视频资源转码后可立即面向互联网进行发布,在线上教育领域已经能够成熟落地。在开发以及功能的更新过程中,EasyDSS内还运用了很多其他层面的开发技巧,我们也会不定期在博客更新,欢迎大家了解测试。
TSINGSEE青犀视频
2021/09/07
4090
Power BI 异步刷新-查询刷新历史与手动停止刷新
有朋友在评论区提出,如果是手动刷新或者计划刷新,是否知道了requestid就同样可以手动停止呢?
陈学谦
2022/04/08
4.6K0
Power BI 异步刷新-查询刷新历史与手动停止刷新
刷新.NET
.NET Core 发布的那一天起,它在完成自我刷新的过程,一切为了适应未来,云原生。不仅仅跨平台那么简单。
李明成
2020/02/12
6210
UI 刷新
与屏幕刷新相关的有很多,比如刷新流程,屏幕缓存,周期刷新,vsync信号,SurfaceFlinger。
Yif
2020/04/25
2.1K0
5.5 PowerBI技巧-定时刷新与增量刷新
加入 PowerBI自己学 知识星球 可以:下载源文件,边学边练;遇到问题,提问交流,有问必答。
PowerBI自己学_轻松
2025/02/26
1690
5.5 PowerBI技巧-定时刷新与增量刷新
下拉刷新
getMeasuredHeight():获取测量完的高度,只要在onMeasure方法执行完,就可以用
六月的雨
2022/01/17
2.2K0
金蝶KIS&K3助记码SQL数据库批量刷新
金蝶KIS&K3助记码SQL数据库批量刷新 用的次数不多,就没有写入存储过程或者触发里面了,可以自行实现。 第一步选择对应账套的数据库,执行下面的命令,这个是一个函数。 go if exists (select * from sysobjects where name='fun_getPY' and xtype='Fn') begin drop function fun_getPY end go create function fun_getPY(@str nvarchar(4000)) re
landv
2018/06/26
7660
uni-app下拉刷新加载刷新数据
onPullDownRefresh 监听该页面用户下拉刷新事件 需要在 pages.json 里 开启 enablePullDownRefresh
达达前端
2019/10/14
7.4K0

相似问题

每晚刷新postgres数据库

20

在数据库刷新期间保留现有登录

10

SSMS数据库节点刷新导致恢复失败

10

如何在刷新数据库后保存并还原权限

10

通过每日数据库刷新撤销Server登录访问

20
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文