Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我想使用ANTLR4从java源文件中提取所有方法名和变量名_Java_Extract_Antlr_Grammar_Antlr4 - Fatal编程技术网

我想使用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()方法设置测试。)

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

  • 在此之后,您需要通过语法解析输入代码,解析树以及解析器文本将被更新(以及令牌开始和令牌结束指针)
  • 还有另一种方法可以实现同样的效果,那就是按顺序迭代所有令牌,并在arrylist中添加令牌,然后检查令牌类型。如果标记类型为Identifier,则将文本更改为您想要的任何内容,然后像往常一样将其附加到数组列表中


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

    实现这一点的一种方法是对所述语言的语法规范(在本例中为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()方法设置测试。)

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

  • 在此之后,您需要通过语法解析输入代码,解析树以及解析器文本将被更新(以及令牌开始和令牌结束指针)
  • 还有另一种方法可以实现同样的效果,那就是按顺序迭代所有令牌,并在arrylist中添加令牌,然后检查令牌类型。如果标记类型为Identifier,则将文本更改为您想要的任何内容,然后像往常一样将其附加到数组列表中


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

    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");
     }