加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

使用ANTLR在Java源代码中查找变量用法/引用?

发布时间:2020-12-15 02:19:36 所属栏目:Java 来源:网络整理
导读:变量用法基本上是变量在相同范围内声明后的每次出现,其中可以对其应用某些操作.在IntelliJ和 Eclipse等一些IDE中甚至支持可变用法突出显示. 我想知道是否有办法使用ANTLR找到变量用法?我已经通过在Java8.g4上运行ANTLR生成了Lexer,Parser和BaseListener类.
变量用法基本上是变量在相同范围内声明后的每次出现,其中可以对其应用某些操作.在IntelliJ和 Eclipse等一些IDE中甚至支持可变用法突出显示.

我想知道是否有办法使用ANTLR找到变量用法?我已经通过在Java8.g4上运行ANTLR生成了Lexer,Parser和BaseListener类.我可以找到变量声明,但无法在给定的Java源代码中找到变量用法.我怎样才能做到这一点 ?

示例:

int i;    // Variable declaration
i++;      // Variable usage
i = 2;    // Variable usage
foo(i);   // Variable 'i' usage

我能够使用Listener类捕获声明但不能使用它.我在这里解析Java源代码.

解决方法

我假设你只考虑局部变量.

你需要范围并解决这个问题.

范围将代表Java的变量范围.它将保存有关在给定范围内声明哪些变量的信息.当您输入Java范围(块的开始,方法,…)时,您必须创建它,并在离开范围时将其删除.您将保留一堆作用域来表示嵌套的块/作用域(Java不允许在嵌套作用域中隐藏局部变量,但您仍需要跟踪变量何时超出嵌套作用域末尾的作用域).

然后,您需要解析在解析的输入中遇到的每个名称 – 确定名称是否引用变量(使用范围).基本上,它指的是局部变量,只要它是名称的第一部分(在任何.之前),就不会跟随(并匹配局部变量的名称).

解析器不能为您执行此操作,因为名称是否引用变量取决于可用变量:

private static class A {
    B out = new B();
}

private static class B {
    void println(String foo) {
        System.out.println("ha");
    }
}

public static void main(String[] args) {
    {
        A System = new A();
        System.out.println("a");
    }
    System.out.println("b");
}

ha
b

如果您还考虑实例和静态字段而不仅仅是局部变量,则解析部分会变得复杂得多,因为您需要考虑当前类层次结构中的所有类,它们的实例和静态字段,可见性等等.确定给定名称的变量是否存在且是否可见.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读