我必须通过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
有人可以建议什么是获得所需嵌套计数的最佳方法吗?
答案 0 :(得分:1)
您需要解析Java源代码的抽象语法树(AST)。见Java library for code analysis。获得AST后,可以进行搜索以找到嵌套条件的最长路径。
答案 1 :(得分:1)
正如答案所说,你应该依赖AST,而不是手动查看代码。 AST永远不会出错,你自己的阅读能力最常见。
我现在还不知道一个完整的解决方案,但我建议您花些时间查看现有的计算软件指标工具。嵌套深度是一个典型的指标,应该有工具。
如果你找不到任何东西,你至少可以回到编写类似Eclipse插件的东西。在这种情况下,您只需在Eclipse编辑器中加载Java文件,Eclipse就会为您执行所有艰苦的工作,并免费为您提供AST。然后确定给定AST的嵌套深度是一项简单的任务。为此开发原型不应该花费超过几个小时。并且很容易扩展它以涵盖整个项目并让它回答诸如“我们项目中哪个java文件具有最大嵌套深度以及它的深度是多少?”之类的问题。但话又说回来......别人肯定会指出一个已经做到这一点的现有工具还有更多。
答案 2 :(得分:0)
对你的项目知之甚少,我认为一个带有最大值记录的简单堆栈机制可以实现推送{和pop on}。一旦你有了这个基本模型,只需添加一个控制语句的特殊情况和一个线体(这对于if,for,while ......是有效的)。在这些情况下,您将寻找这些关键字,然后是(和a)。一旦遇到这种组合,如果扫描遇到另一个控制语句或分号之前遇到{那么这是其中一个特殊情况你应该推(使用一个特殊标记指示弹出;而不是})。