Code nach Schleifen und Verzweigungen durchsuchen

  • Themenstarter Themenstarter Grim2011
  • Beginndatum Beginndatum
G

Grim2011

Gast
Hallo zusammen,

ich möchte gerne ein Programm Schreiben welches java-Code durchsucht und als Ergebnis die Mc Cabe-Metrik ausgibt.
Mein Problem hierbei ist dass ich nicht weiss wie ich die (für die Mc Cabe-Metrik notwendige) Anzahl von Schleifen und Verzweigungen des Codes zählen kann.

Wäre dankbar für anregungen aller Art.
 
Danke schonmal für die antwort.
das problem lag ganau darin das ich nicht wusste wie ich auf schleifen oder verzweigungen untersuche. das einige was mir eingefallen wäre wär string in nen array umwandeln und dann auf buchstabenkombinationen wie for,if,etc zu untersuchen.

aber wenns mit regex geht werd ich mir das mal anschauen, kenn regex nämlich noch nicht.
mal sehen ob ich was leicht verständliches finde ;-)
 
ja. mit regex ist das aber schon auch nicht ganz trivial.

die regex
Code:
if\\s*\\(.*?\\)
matcht dir schonmal alle if-sätze aber würde auch
Code:
System.out.println("if (true)");
als einen solchen erkennen. d.h. du musst dem regex schonmal beibringen, dass es kein string sein darf, sondern eben ein keyword. dazu kommt dann noch das escapen von ", das dir die entscheidung zw. string und keyword noch schwerer macht...

vllt bist du mit einem simplen parser doch besser dran...
 
simpler parser?....öhm ich weiss was parsen ist....aber was genau ich mit nem parser anfange weiss ich auch noch nicht :-/
 
musste gerade auf jemanden warten und hatte deshalb etwas langeweile. hier mal ein beispiel. konnte es aber jetzt nicht sonderlich testen, weil ich jetzt los muss. vllt hilfts ja 😉

Java:
import java.util.HashSet;
import java.util.Set;
 
public class Test {
 
    private final static char ESCAPE = '\\';
    private final static char QUALIFIER = '"';
    private final static char OPEN = '(';
    
    public static void main(String[] args)  {
        String code = 
                "String test = \"hallo welt\";\n" +
                "String test2 = \"hallo welt\";\n" +
                "if (test.equals(test2)) {\n" +
                    "System.out.println(\"equals\");\n" +
                "} else if (test == test2)) {\n" +
                    "System.out.println(\"==\");\n" +
                "}\n" +
                "String test3 = \"if (true)\";\n";
        
        Set<String> keywords = new HashSet<String>();
        keywords.add("if");
        keywords.add("for");
        //...
        
        int count = 0;
        StringBuilder sb = new StringBuilder();
        boolean isEscaped = false, isQualified = false;
        for (char c : code.toCharArray()) {
            if (c ==  QUALIFIER && !isEscaped) {
                isQualified = !isQualified;
            } else {
                isEscaped = c == ESCAPE;
                if ((Character.isWhitespace(c) || c == OPEN) && !isQualified) {
                    if (keywords.contains(sb.toString())) count++;
                    sb.setLength(0);
                } else {
                    sb.append(c);
                }
            }
        }
        System.out.println(count);
    }
}

edit: durch verschiedene codeformatierung könnte nach einem keyword natürlich nicht nur whitespace kommen, sondern auch z.b. eine offene klammer. das sollte man natürlich beachten..
 
Zuletzt bearbeitet:
ob das mit dem escapen funzt, hab ich net getestet und die 2 klassenvariablen sollen natürlich final sein 😉
 

Neue Themen


Zurück
Oben