Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.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
如何计算java类文件中的所有运算符和操作数_Java - Fatal编程技术网

如何计算java类文件中的所有运算符和操作数

如何计算java类文件中的所有运算符和操作数,java,Java,如何计算java类文件中的所有运算符和操作数?有人有想法吗?您可以尝试使用类似的库来分析类的字节码 或者使用sourceforge项目(我还没有尝试过): Lachesis Analysis是一个面向对象源代码的软件复杂性度量程序。目前仅提供Java源代码和Java字节代码分析 您可以尝试使用类似的库来分析类的字节码 或者使用sourceforge项目(我还没有尝试过): Lachesis Analysis是一个面向对象源代码的软件复杂性度量程序。目前仅提供Java源代码和Java字节代码分析

如何计算java类文件中的所有运算符和操作数?有人有想法吗?

您可以尝试使用类似的库来分析类的字节码

或者使用sourceforge项目(我还没有尝试过):

Lachesis Analysis是一个面向对象源代码的软件复杂性度量程序。目前仅提供Java源代码和Java字节代码分析


您可以尝试使用类似的库来分析类的字节码

或者使用sourceforge项目(我还没有尝试过):

Lachesis Analysis是一个面向对象源代码的软件复杂性度量程序。目前仅提供Java源代码和Java字节代码分析


使用正则表达式做这种事情是不可靠的。Java的语法非常复杂,必然会有一些棘手的情况会导致正则表达式计算错误

同样,使用字节码分析器也可能会给出错误的结果,因为源代码运算符/操作数与字节码指令之间不一定存在一一对应关系。Java编译器可能以不明显的方式重新组织和重写代码


做这类事情的最好方法是找到一个合适的JavaAST库,用它来解析源代码,然后遍历AST来提取所需的信息。(在这种情况下,需要计算运算符和操作数节点。)

使用正则表达式进行此类操作是不可靠的。Java的语法非常复杂,必然会有一些棘手的情况会导致正则表达式计算错误

同样,使用字节码分析器也可能会给出错误的结果,因为源代码运算符/操作数与字节码指令之间不一定存在一一对应关系。Java编译器可能以不明显的方式重新组织和重写代码

做这类事情的最好方法是找到一个合适的JavaAST库,用它来解析源代码,然后遍历AST来提取所需的信息。(在这种情况下,您需要计算运算符和操作数节点。)

忘记regex(如果不得到诸如注释中的运算符等误报,您将永远无法正确执行该操作),您必须在计算运算符的代码上运行访问者。现在,您可以使用源代码解析器或字节代码解析器来实现这一点

对于源代码解析,我建议使用该项目。在这里,您将创建一个自定义访问者,扩展并覆盖以下几个相关方法:

public void visit(AssignExpr n, A arg) {
    // track the operator here
    super.visit(n, arg); // resume visitor
}
在字节码方面,您可能会使用和扩展来创建访问者。这两个版本应该同样适用。或者可能不是,在编写时(编译器可能添加或删除了一些操作)。

忘记正则表达式(如果没有诸如注释中的运算符之类的误报,您将永远无法正确使用正则表达式),您将不得不在计算运算符的代码上运行访问者。现在,您可以使用源代码解析器或字节代码解析器来实现这一点

对于源代码解析,我建议使用该项目。在这里,您将创建一个自定义访问者,扩展并覆盖以下几个相关方法:

public void visit(AssignExpr n, A arg) {
    // track the operator here
    super.visit(n, arg); // resume visitor
}

在字节码方面,您可能会使用和扩展来创建访问者。这两个版本应该同样适用。也可能不是,正如所写的那样(编译器可能添加或删除了一些操作)。

示例代码可能会有所帮助。你们到底想做什么?我只需要计算Halstead度量,所以我需要计算所有的运算符和Operands@Bragboy-这在不太清楚的情况下肯定会失败。Halstead和Java-这是一篇关于在Java代码中使用Halstead度量的好文章:一个示例代码可能会有所帮助。你们到底想做什么?我只需要计算Halstead度量,所以我需要计算所有的运算符和Operands@Bragboy-这在不太清楚的情况下肯定会失败。Halstead和Java-这是一篇关于在Java代码中使用Halstead度量有意义的好文章:我过去使用ANTLR()来遍历Java AST。这里是它的Java语法:我在过去使用ANTLR()遍历JavaAST。它的Java语法如下: