GReQLJavaChecker

Aus JACK Wiki
Wechseln zu: Navigation, Suche

Der GReQLJavaChecker ermöglicht statische Checks auf Programmcode und verwendet dazu Abfragen auf dem Syntaxgraphen. Um einen statischen Check mit dem Checker durchzuführen, müssen die zu untersuchenden Dateien in der Liste "Source Files" ausgewählt werden und eine einzelne Datei mit Prüfregeln ("Rule File") angegeben werden. Die Regeln werden in dieser Datei im XML-Format organisiert und verwenden die Sprache GReQL für Abfragen auf dem Syntaxbaum.

Beispiele und Eigenschaften von Regeln

Zwei beispielhafte Abfragen in dieser Sprache sehen so aus:

1  <rule type="absence" points="2">
2    <query>from u : V{CompilationUnit}, x : V{WhileStatement} with
3              not isEmpty(u -->* x -->{WhileStatementBody}&amp;{EmptyStatement}) or
4              (not isEmpty(u -->* x -->{WhileStatementBody}&amp;{Block}) and
5              isEmpty(u -->* x -->{WhileStatementBody}&amp;{Block} -->{Child}))
6           report u.name as "name", x.line as "line" end</query>
7     <feedback>In der Datei {name} besteht die while-Schleife in Zeile {line} nur aus einer
8              Abbruchbedingung und ist dadurch sinnlos.</feedback>
9  </rule>
1  <rule type="presence" points="4">
2    <query>from t : V{TypeDeclaration}, m : V{MethodDeclaration} with
3              t.name="Miniprojekt2" and
4              t -->{TypeDeclarationBodyDeclarations2} m and
5              hasSignature(m, "public static String geometrie1(int)")
6           report 0 end</query>
7    <feedback prefix="Signaturcheck">Die Methode "public static String geometrie1(int laenge)" in
8              der Klasse "Miniprojekt2" fehlt. Hast du die vorgegebene Methodensignatur veraendert?</feedback>
9  </rule>

Die obere Regel ist vom Typ "absence", d.h. sie definiert einen Codestruktur, die nicht in der untersuchten Lösung vorkommen soll. Als Abfrage wird eine Struktur aus Elementen des Syntaxbaums definiert. Als Meldung wird ein String definiert, der zur Fehlerliste hinzugefügt wird, wenn die in der Abfrage definierte Struktur gefunden wird. Dabei dienen {name} und {line} als Platzhalter für Werte, die in der Abfrage in der report-Klausel ausgegeben wurden. Die zweite Regel ist vom Typ "presence" und definiert folglich eine Codestruktur, die in der untersuchten Lösung vorkommen soll. D.h., in diesem Fall wird die definierte Fehlermeldung ausgegeben, wenn die in der Abfrage definierte Struktur nicht auftritt. Folglich können in dieser Regel auch keine Platzhalter in der Ausgabe verwendet werden.

Die Funktion hasSignature ist eine spezielle, von JACK bereitgestellte Erweiterung der GReQL-Syntax, die eine bequeme Überprüfung von Methodensignaturen ermöglicht. Wie im Beispiel dargestellt, braucht die übergebene Zeichenkette keine vollständige Methodensignatur zu sein, sondern es reicht die Angabe der zu überprüfenden Bestandteile. D.h., Namen der Methodenparameter können ebenso entfallen wie Modifier oder der Rückgabetyp. Es ist allerdings nicht möglich, nur Modifier anzugeben und keinen Rückgabetyp.

→ Weitere Beispiele: GReQL Regeln

Auswertung eines Regelsatzes

Bei der Durchführung des statischen Checks wird zunächst der abstrakte Syntaxgraph der abgegebenen Lösung erzeugt und anschließend alle Regeln angewendet. Alle erzeugten Fehlernachrichten werden als Ausgabe des statischen Tests gesammelt. Die vergebene Punktzahl ergibt sich aus den Punkten der einzelnen Regeln, wobei die Gesamtsumme der Punkte in der Regeldatei stets auf 100 normiert wird. D.h., im oben gezeigten Beispiel erhält eine korrekte Lösung 100 Punkte, während eine Lösung, die die erste Regel verletzt, nur 67 Punkte erhält. Tritt während des Checks ein technischer Fehler auf, wird der Check abgebrochen und die Lösung mit einem "internal error" als fehlerhaft markiert.

Tools

GReQL-Referencecard