2017-03-05 4 views
0

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; 
} 
+0

Pour répondre à la question que vous avez posée, oui, c'est possible. Comment un compilateur fonctionnerait-il autrement? –

+0

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 –

+2

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

Répondre

0

Pas besoin de l'implémenter vous-même. Ce que vous faites est la mise en œuvre des bases d'un analyseur. Bien qu'il soit bon d'avoir une idée de ce qui se passe lors de l'analyse, je suggère d'utiliser une bibliothèque telle que https://github.com/javaparser/javaparser. S'amuser.

+0

Je suppose que c'est les devoirs –

+0

Oui, c'est ... et je ne sais pas comment faire face à J'ai besoin de quelques conseils sur les constructions que je pourrais utiliser La solution finie n'est pas appropriée, je pense. :(Nous supposons que "si" a une syntaxe correcte, donc seulement des commentaires et différents styles de programmation eg (if() ou if() etc.) sont problématiques .. Regex plutôt pas aussi travailler là? :( – maniekoo

+0

Dans ce cas, vous devez aller 'char' par' char' imho, pour garder une trace si le 'if' potentiellement trouvé dans également un contexte valide (pas un commentaire - multiligne ou non, ne faisant pas partie d'un autre mot, qu'il s'agisse d'une variable, d'une fonction/méthode ou d'un type) Les accolades et parenthèses d'ouverture peuvent être suivies d'un espace 'et ainsi de suite.C'est un peu compliqué tbh Eh bien, j'espère que vous obtenez/inspiré.Bonne chance. – Brian