我想使用ANTLR4从java源文件中提取所有方法名和变量名
基本上,我想提取所有变量名,而不考虑它们的名称 范围以及源代码中的所有函数/方法名称 对于给定的输入我想使用ANTLR4从java源文件中提取所有方法名和变量名,java,extract,antlr,grammar,antlr4,Java,Extract,Antlr,Grammar,Antlr4,基本上,我想提取所有变量名,而不考虑它们的名称 范围以及源代码中的所有函数/方法名称 对于给定的输入 class temp{ int a; public static void main(String args[]){ int b = 0; temp ob = new temp(); temp.printob(); } void printob(){ System.out.print("-"); } } 输出应该类似于:
class temp{
int a;
public static void main(String args[]){
int b = 0;
temp ob = new temp();
temp.printob();
}
void printob(){
System.out.print("-");
}
}
输出应该类似于:
变量={a”,“b”,“ob”}
方法={“main”,“printob”}
实现这一点的一种方法是对所述语言的语法规范(在本例中为Java)进行微小的更改 我们可以做的是创建一个全局arraylist并将所有标识符插入其中 在语法中,对于每个使用标识符的规则,例如
methodcall : return_types IDENTIFIER LEFTPAREN params RIGHTPAREN;
我们将进行以下更改(其中我们的全局arraylist称为all_标识符)
类似地,添加上述代码,对于每个具有标识符的规则,我们将能够提取所有方法和变量名(如果您希望它们位于不同的arraylist中,请创建两个arraylist,一个用于方法调用,一个用于变量声明)
补充说明:
当我最初发布这个问题时,我想找到一种方法,将所有方法调用名和所有变量名更改为一些预定义的名称,以使代码正常化。
例如,在代码中,我想更改int a,b,c;比如int-varbl,varbl,varbl;同样地,对于方法,我想将所有方法名称都更改为mthd
所以我找到的最好的方法是,
1.确定所有规则,在这些规则中我们要更改某些标识符
2.在每个规则的“添加类似代码”部分(此步骤需要完成,因为令牌对象本身不可编辑,所以我们键入cast将其转换为CommonToken对象,这使我们能够使用setText()方法设置测试。)
三,。现在,所有令牌将从其原始形式更改为我们正在设置的值
对于方法名和变量名的分离,您可能需要更改语法,以便变量标识符和方法标识符可以区分 实现这一点的一种方法是对所述语言的语法规范(在本例中为Java)进行微小的更改 我们可以做的是创建一个全局arraylist并将所有标识符插入其中 在语法中,对于每个使用标识符的规则,例如
methodcall : return_types IDENTIFIER LEFTPAREN params RIGHTPAREN;
我们将进行以下更改(其中我们的全局arraylist称为all_标识符)
类似地,添加上述代码,对于每个具有标识符的规则,我们将能够提取所有方法和变量名(如果您希望它们位于不同的arraylist中,请创建两个arraylist,一个用于方法调用,一个用于变量声明)
补充说明:
当我最初发布这个问题时,我想找到一种方法,将所有方法调用名和所有变量名更改为一些预定义的名称,以使代码正常化。
例如,在代码中,我想更改int a,b,c;比如int-varbl,varbl,varbl;同样地,对于方法,我想将所有方法名称都更改为mthd
所以我找到的最好的方法是,
1.确定所有规则,在这些规则中我们要更改某些标识符
2.在每个规则的“添加类似代码”部分(此步骤需要完成,因为令牌对象本身不可编辑,所以我们键入cast将其转换为CommonToken对象,这使我们能够使用setText()方法设置测试。)
三,。现在,所有令牌将从其原始形式更改为我们正在设置的值
对于方法名和变量名的分离,您可能需要更改语法,以便变量标识符和方法标识符可以区分 ANTLR是一个解析器生成器,因此您不能直接将其用于此任务,但您肯定可以使用它生成一个程序来完成此任务。这需要以ANTLR格式编写语法定义。提供了您需要的所有详细信息,包括完整的正式语法(尽管可能不是您可以直接使用的形式)。但是,对于这个所谓的问题,不清楚你真正的问题是什么。我对ANTLR是新手,所以基本上我想知道什么是正确的方法,以及如何使用ANTLR来实现这一点。如果你能更清楚地说明这一点,那就太好了。谢谢。像ANTLR这样的解析器生成器是一种为其他程序生成源代码的程序。基本上,您输入描述所需程序必须解析的语言(即Java)的ANTLR输入,它生成一个程序来进行解析。但是Java是一个相当复杂的语法,我会向新手推荐的不仅仅是ANTLR本身,而且(似乎)更一般地是整个解析器生成器。我们关注的是特定的、范围很窄的编程问题,而不是基础广泛的“如何”问题。谢谢。不管怎样,我找到了一种方法来完成它。ANTLR是一个解析器生成器,因此您不能直接使用它来完成此任务,但您肯定可以使用它来生成一个程序来完成此任务。这需要写一个语法
{
CommonToken tkn_tmp = $IDENTIFIER;
tkn_tmp.setText("varbl");
// or if it's a method rule
//tkn_tmp.setText("mthd");
}