我想使用 ANTLR4 从 java 源文件中提取所有方法名称和变量名称
I want to extract all method names and variable names from a java source file using ANTLR4
Basically I want to extract all variable names, irrespective of their
scope. And all function/method names inside the source code.
对于给定的输入,
class temp{
int a;
public static void main(String args[]){
int b = 0;
temp ob = new temp();
temp.printob();
}
void printob(){
System.out.print("-");
}
}
输出应该是这样的:
variables = {"a","b","ob"}
methods = {"main","printob"}
实现此目的的一种方法是在这种情况下对所述语言的语法规范进行小的更改 Java。
我们可以做的是创建一个全局数组列表并将所有标识符插入其中。
在语法中,对于每个使用标识符的规则,例如,
methodcall : return_types IDENTIFIER LEFTPAREN params RIGHTPAREN;
我们将进行以下更改(我们的全局数组列表被称为 all_identifiers)
methodcall : return_types IDENTIFIER LEFTPAREN params RIGHTPAREN{
all_identifiers.add($IDENTIFIER);
};
类似地添加上面的代码,对于每个具有标识符的规则,我们将能够提取所有方法和变量名称(如果您希望它们在不同的数组列表中,请创建两个数组列表,一个用于方法调用,一个用于变量声明)
补充说明:
当我最初发布这个问题时,我想找到一种方法将所有方法调用名称和所有变量名称更改为一些预定义的名称以规范化代码。
例如在代码中我想改变 int a,b,c;像 int varbl,varbl,varbl;同样对于方法,我想将所有方法名称更改为 mthd.
所以我发现实现这一目标的最佳方法是,
1.识别所有规则,这里我们要改变一些Identifier
2. 在每个规则中添加类似的代码部分(此步骤需要完成,因为令牌对象本身不可编辑,因此我们将其类型转换为 CommonToken 对象,这使我们能够使用 setText() 方法设置测试。)
{
CommonToken tkn_tmp = $IDENTIFIER;
tkn_tmp.setText("varbl");
// or if it's a method rule
//tkn_tmp.setText("mthd");
}
3。现在所有的代币都会从原来的形式变成我们设置的值。
- 在此之后您需要通过语法解析输入代码,解析树和解析器文本将被更新(连同标记开始和标记结束指针)
还有另一种方法可以实现相同的目的,即依次遍历所有标记并在 arrylist 中添加添加标记,并检查标记类型。如果令牌类型是标识符,则将文本更改为您想要的任何内容,然后像往常一样将其附加到数组列表中。
为了分离方法名称和变量名称,您可能需要更改语法,以便变量标识符和方法标识符是可区分的。
Basically I want to extract all variable names, irrespective of their scope. And all function/method names inside the source code.
对于给定的输入,
class temp{
int a;
public static void main(String args[]){
int b = 0;
temp ob = new temp();
temp.printob();
}
void printob(){
System.out.print("-");
}
}
输出应该是这样的:
variables = {"a","b","ob"}
methods = {"main","printob"}
实现此目的的一种方法是在这种情况下对所述语言的语法规范进行小的更改 Java。
我们可以做的是创建一个全局数组列表并将所有标识符插入其中。
在语法中,对于每个使用标识符的规则,例如,
methodcall : return_types IDENTIFIER LEFTPAREN params RIGHTPAREN;
我们将进行以下更改(我们的全局数组列表被称为 all_identifiers)
methodcall : return_types IDENTIFIER LEFTPAREN params RIGHTPAREN{
all_identifiers.add($IDENTIFIER);
};
类似地添加上面的代码,对于每个具有标识符的规则,我们将能够提取所有方法和变量名称(如果您希望它们在不同的数组列表中,请创建两个数组列表,一个用于方法调用,一个用于变量声明)
补充说明:
当我最初发布这个问题时,我想找到一种方法将所有方法调用名称和所有变量名称更改为一些预定义的名称以规范化代码。 例如在代码中我想改变 int a,b,c;像 int varbl,varbl,varbl;同样对于方法,我想将所有方法名称更改为 mthd.
所以我发现实现这一目标的最佳方法是, 1.识别所有规则,这里我们要改变一些Identifier 2. 在每个规则中添加类似的代码部分(此步骤需要完成,因为令牌对象本身不可编辑,因此我们将其类型转换为 CommonToken 对象,这使我们能够使用 setText() 方法设置测试。)
{
CommonToken tkn_tmp = $IDENTIFIER;
tkn_tmp.setText("varbl");
// or if it's a method rule
//tkn_tmp.setText("mthd");
}
3。现在所有的代币都会从原来的形式变成我们设置的值。
- 在此之后您需要通过语法解析输入代码,解析树和解析器文本将被更新(连同标记开始和标记结束指针)
还有另一种方法可以实现相同的目的,即依次遍历所有标记并在 arrylist 中添加添加标记,并检查标记类型。如果令牌类型是标识符,则将文本更改为您想要的任何内容,然后像往常一样将其附加到数组列表中。
为了分离方法名称和变量名称,您可能需要更改语法,以便变量标识符和方法标识符是可区分的。