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

时间:2017-05-15 12:54:18

标签: 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("-");
}
        }

输出应该是这样的:

  

variables = {“a”,“b”,“ob”}

     

methods = {“main”,“printob”}

1 个答案:

答案 0 :(得分:-1)

实现此目标的一种方法是对这种语言(在本例中为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.确定所有规则,我们要在其中更改一些标识符 2.在每个规则中添加相似的代码部分(此步骤需要完成,因为令牌对象本身不可编辑,因此我们将其强制类型转换为CommonToken对象,这使我们能够使用setText()方法设置测试。)

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

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

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

还有另一种方法可以实现此目的,方法是依次迭代所有令牌,并在添加列表中添加添加令牌,然后检查令牌类型。如果令牌类型为“标识符”,则将文本更改为所需的文本,然后照常将其添加到数组列表中。

要分离方法名和变量名,您可能需要更改语法,以便区分变量标识符和方法标识符。