使用ANTLR在Java源代码中查找变量用法/引用?
变量用法基本上是变量在相同范围内声明后的每次出现,其中可以对其应用某些操作.在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"); }
如果您还考虑实例和静态字段而不仅仅是局部变量,则解析部分会变得复杂得多,因为您需要考虑当前类层次结构中的所有类,它们的实例和静态字段,可见性等等.确定给定名称的变量是否存在且是否可见. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |