【发布时间】:2017-03-05 11:54:04
【问题描述】:
我试图创建一个方法来查找 .java 文件中的所有 if 条件(我假设该文件只包含正确的 if 指令)。 它应该计算所有“如果”,但不包括那些被 cmets 环绕或被踩为字符串的“如果”。 我试图用StringTokenizer解决这个问题,但我不知道“//”符号后的省略线和用“”包围的字符串。有没有可能以这种方式实现这个问题?
public int getIfCount()
{
int counter = 0;
String t = "";
try
{
FileReader file = new FileReader(path);
StringBuffer sb = new StringBuffer();
int tmp;
while ((tmp = file.read()) != -1)
{
sb.append((char)tmp);
}
t = sb.toString();
StringTokenizer stk = new StringTokenizer(t);
String token;
while (stk.hasMoreTokens())
{
token = stk.nextToken();
if (token.contains("/*"))
{
while (stk.hasMoreTokens())
{
if (stk.nextToken().contains("*/"))
break;
}
}
else if (token.contains("//"))
{
while (stk.hasMoreTokens() && stk.nextToken() != "\n")
{
if (stk.nextToken().endsWith("\n"))
break;
}
}
else if (token.contains("\""))
{
if (!token.endsWith("\""))
while (stk.hasMoreTokens())
{
if(stk.nextToken().contains("\""))
break;
}
}
else if (token.startsWith("if"))
counter++;
}
}
catch (FileNotFoundException e)
{
System.out.println("This file does not exist!");
}
catch (IOException e)
{
System.out.println("ERROR");
}
return counter;
}
【问题讨论】:
-
回答您提出的问题,是的,有可能。否则编译器将如何工作?
-
我建议您使用 StringBuilder,因为 StringBuffer 在十多年前已被弃用。不要使用
startsWith,因为您可能拥有iffy令牌。如果代码没有达到您的预期,我建议您在调试器中逐步执行代码。注意:你可以在 cmets 中有代码 -
要涵盖所有边界情况,您需要进行完整的 Java 词法分析,然后计算关键字“if”出现的频率。 (除了您提到的情况外,边界情况是 unicode 转义。
\u0069f也是“如果”)。 -
StringTokenizer也已过时(他们推荐String.split())(当然,如果您愿意,可以使用过时的课程;就我而言,我总是尝试学习新课程)。 -
我认为您使用
StringTokenizer会使事情复杂化(String.split()也会如此)。有些人写if(i > 0),而另一些人在if后面加一个空格。我什至可以写i++;if(i > 0),而if不会在你的令牌的开头。同样在"My string"中,引号将出现在不同的标记中,但在"a"+x+"b"中,您突然在一个标记中包含四个引号。不要忘记字符串中的\"。我认为您需要其他方式将输入拆分为令牌。
标签: java stringtokenizer