如何在java中查找嵌套条件计数

时间:2011-10-21 05:53:18

标签: java code-analysis

我必须通过java代码读取java文件,并确定其中if语句的最大嵌套计数。

例如:

if (someCondition)
{
  if (someCondition)
     {
      // Expression
     }
}

在这种情况下,程序应显示greatest nested if depth is 2.

现在的问题是if之后大括号的位置是不确定的。

例如,它可以像:

Curly brace start and end comes in same line
if (someCondition){}

OR
Curly brace start in next line
if (someCondition)
{
}

OR
Conditions without curly brace
if (someCondition)
   if (someCondition) // Single line without curly brace

有人可以建议什么是获得所需嵌套计数的最佳方法吗?

3 个答案:

答案 0 :(得分:1)

您需要解析Java源代码的抽象语法树(AST)。见Java library for code analysis。获得AST后,可以进行搜索以找到嵌套条件的最长路径。

答案 1 :(得分:1)

正如答案所说,你应该依赖AST,而不是手动查看代码。 AST永远不会出错,你自己的阅读能力最常见。

我现在还不知道一个完整的解决方案,但我建议您花些时间查看现有的计算软件指标工具。嵌套深度是一个典型的指标,应该有工具。

如果你找不到任何东西,你至少可以回到编写类似Eclipse插件的东西。在这种情况下,您只需在Eclipse编辑器中加载Java文件,Eclipse就会为您执行所有艰苦的工作,并免费为您提供AST。然后确定给定AST的嵌套深度是一项简单的任务。为此开发原型不应该花费超过几个小时。并且很容易扩展它以涵盖整个项目并让它回答诸如“我们项目中哪个java文件具有最大嵌套深度以及它的深度是多少?”之类的问题。但话又说回来......别人肯定会指出一个已经做到这一点的现有工具还有更多。

答案 2 :(得分:0)

I82很多答案一定会让你到那里,但感觉有点像作弊。

对你的项目知之甚少,我认为一个带有最大值记录的简单堆栈机制可以实现推送{和pop on}。一旦你有了这个基本模型,只需添加一个控制语句的特殊情况和一个线体(这对于if,for,while ......是有效的)。在这些情况下,您将寻找这些关键字,然后是(和a)。一旦遇到这种组合,如果扫描遇到另一个控制语句或分号之前遇到{那么这是其中一个特殊情况你应该推(使用一个特殊标记指示弹出;而不是})。