J'ai essayé de faire une méthode qui trouvera toutes les conditions du fichier .java (je suppose que ce fichier ne contient que des instructions correctes). Il devrait compter tout "si", mais pas ce qui est entouré de commentaires ou treaded comme chaîne. J'ai essayé de résoudre ce problème avec StringTokenizer, mais je ne sais pas comment ligne élidé après "//" signe et les chaînes entourées de "". Est-il possible de réaliser ce problème de cette façon, du tout?Recherche de conditions dans le fichier .java
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;
}
Pour répondre à la question que vous avez posée, oui, c'est possible. Comment un compilateur fonctionnerait-il autrement? –
Je vous suggère d'utiliser StringBuilder comme StringBuffer a été déprécié il y a plus de dix ans. N'utilisez pas 'startsWith' car vous pourriez avoir un jeton' iffy'. Si le code ne fonctionne pas comme prévu, je vous suggère de parcourir le code dans votre débogueur. note: vous pouvez avoir du code dans les commentaires –
Pour couvrir tous les cas de frontière, vous devrez faire une analyse lexicale Java complète, puis compter la fréquence d'apparition du mot-clé "si". (Un cas de frontière en dehors des cas que vous avez mentionnés sont des échappements unicode. '\ u0069f' est aussi un" si "). – Henry