我想使用 ANTLR4 从 java 源文件中提取所有方法名称和变量名称



基本上我想提取所有变量名,无论它们如何 范围。以及源代码中的所有函数/方法名称。

对于给定的输入,

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。

我们可以做的是创建一个全局数组列表并将所有标识符插入其中。

在语法中,对于每个规则,例如,只要使用标识符,

methodcall : return_types IDENTIFIER LEFTPAREN params RIGHTPAREN;

我们将进行以下更改(其中我们的全局数组列表称为all_identifiers)

methodcall : return_types IDENTIFIER LEFTPAREN params RIGHTPAREN{
all_identifiers.add($IDENTIFIER);
}; 

类似地添加上面的代码,对于每个具有标识符的规则,我们将能够提取所有方法和变量名称(如果您希望它们在不同的数组列表中创建两个 arraylist,一个用于方法调用,一个用于变量声明)

附加说明:

当我最初发布这个问题时,我想找到一种方法将所有方法调用名称和所有变量名称更改为一些预定义的名称以规范化代码。 例如,在代码中,我想更改 int a,b,c;像int varbl,varbl,varbl;同样,对于方法,我想将所有方法名称更改为 mthd。

所以我发现实现这一目标的最好方法是, 1. 确定所有规则,我们想要更改某些标识符 2.在每个规则中添加类似的代码部分(此步骤需要作为令牌对象完成,它本身不可编辑,因此我们将其键入CommonToken对象,这使我们能够使用setText()方法设置测试。

{
CommonToken tkn_tmp = $IDENTIFIER;
tkn_tmp.setText("varbl"); 
// or if it's a method rule 
//tkn_tmp.setText("mthd");
}

3.现在,所有令牌将从其原始形式更改为我们设置的值。

  1. 在此之后,您需要通过语法解析输入代码,解析树以及解析器文本将被更新(以及令牌开始和令牌结束指针)

还有另一种方法可以实现相同的目的,即按顺序遍历所有令牌并在arrylist中添加添加令牌,并检查令牌类型。如果令牌类型为"标识符",请将文本更改为所需的任何文本,然后像往常一样将其追加到数组列表中。

对于方法名称和变量名称的分离,您可能需要更改语法,以便变量标识符和方法标识符可微分。

最新更新