2017-12-30 32 views
0

Ich brauche javaparser zu unkorrekte Form der for-loop in das richtige Formular zu analysieren. Meine Schleife hat 5 Argumente:Wie man eine For-Schleife mit Javaparser analysieren?

  1. Index der Schleife (i);
  2. Anfangswert des Index. Es kann ein anderer Wert (z. B. k) oder ein int-Wert (10) sein.
  3. Wert der Schleifeninvariante (3);
  4. Bedingung der Invariante (>, <,> = oder < =);
  5. Operation, die nach jedem Durchlauf der Schleife ausgeführt wird (- oder + wird in i-- oder i ++ geändert).

enter image description here

Ich habe zwei Klassen erstellt. Der erste ist mit der unkorrekten Schleife und der zweite ist mit der richtigen Schleife (nach dem Parsen). Ich entschied mich zuerst, diese zwei Klassen zu schreiben, um zu prüfen, wie der Code vor und nach dem Parsing aussehen sollte, und dann den Code für das Parsing zu schreiben. Aber ich bin mir nicht sicher, ob es ein guter Anfang ist und ich meine For-Loop-Korrektur dargestellt habe. Klären: Ich möchte den Code von Class.java zu Classtered.java analysieren.

Die erste Klasse mit uncorrect Schleife:

public class Class { 
public static void main(String[] args) { 
    test1(); 
    test2(); 
} 

public static void test1() { 
    FOR(i, 10, 3, >, -); 
    System.out.println("FOR(i, 10, 3, >, -) test passed"); 
} 

public static void test2() { 
    FOR(j, 0, 10, <=, +); 
    System.out.println("FOR(j, 0, 10, <=, +) test passed"); 
} 
} 

Die zweite Klasse mit der richtigen Schleife:

public class ClassAltered { 
    public static void main(String[] args) { 
     test1(); 
     test2(); 
    } 

    public static void test1() { 
     for(int i=10; i > 3; i--); 
     System.out.println("FOR(i, 10, 3, >, -) test passed"); 
    } 

    public static void test2() { 
     for(int j=0; j<= 10; j++); 
     System.out.println("FOR(j, 0, 10, <=, +) test passed"); 
    } 
} 
+0

Um zu verdeutlichen, versuchen Sie, Code plötzlich in Java zu parsen? – MartinByers

+0

Ich möchte den Code von Class.java zu Classtered.java analysieren. Aber zuerst möchte ich diese zwei Klassen richtig schreiben. – Viola

+0

Die erste Sache, die ich sagen werde ist: Nennen Sie nie eine Klasse "Klasse", aus zwei Gründen, erstens beschreibt nicht, was es tut/darstellt, zweitens gibt es bereits eine java.lang.Class, so kann Verwirrung verursachen. – MartinByers

Antwort

1

Dies ist möglich, aber weit über den Durchschnitt Aufgabe.

Sie können dies nicht mit "normal" javaparser tun, weil javaparser analysiert Java-Syntax und FOR(i, 10, 3, >, -); ist nicht Java-Syntax. Also "normal" javaparser wird nicht in der Lage sein, dies zu analysieren.

Was Sie tun müssen, ist Ihre eigene Gabel/Version von javaparser zu erstellen und die java.jj Grammatik zu ändern, um Ihre "inkorrekt für" Aussage aufzunehmen. Prüfen this fragment für das, was ein normales ForStatement wie folgt aussieht:

Statement ForStatement(): 
{ 
    VariableDeclarationExpr varExpr = null; 
    Expression expr = null; 
    NodeList<Expression> init = emptyList(); 
    NodeList<Expression> update = emptyList(); 
    Statement body; 
    JavaToken begin; 
} 
{ 
    "for" {begin=token();} "(" 

    (
     LOOKAHEAD(VariableDeclarationExpression() ":") 
     varExpr = VariableDeclarationExpression() ":" expr = Expression() 
    | 
    [ init = ForInit() ] ";" [ expr = Expression() ] ";" [ update = ForUpdate() ] 
) 

    ")" body = Statement() 

    { 
    if (varExpr != null) { 
     return new ForeachStmt(range(begin, token()),varExpr, expr, body); 
    } 
    return new ForStmt(range(begin, token()),init, expr, update, body); 
    } 
} 

Es ist nicht allzu schwer, werden Sie wahrscheinlich in der Lage dieses entsprechend genau das zu tun, werden Sie nicht viel brauchen von JavaCC Wissen.

Als nächstes, wenn die Grammatik fertig ist, erhalten Sie eine javaparser, die in der Lage sein wird, "falsche" for-Schleifen zu parsen. Das Ergebnis ist ein AST mit etwa IncorrectForStmt (Sie müssen diese Klasse implementieren).

Im Test müssen Sie den Quellcode analysieren und dann den resultierenden AST analysieren, um IncorrectForStmt zu lokalisieren. Um dies zu überprüfen, müssen Sie die Unterknoten IncorrectForStmt überprüfen.

+0

danke für die Antwort, aber ich bin sicher, dass es getan werden kann, ohne die eigene Grammatik zu erstellen. – Viola

+0

[Ich bin ein Beitrag zu JavaParser] Lexicore hat recht, der korrekte Weg ist, JavaParser zu forken. Wir denken darüber nach, wie man JavaParser leichter erweiterbar machen kann, aber momentan ist dies der einzige Weg, dies zu tun. Das heißt, ich frage mich, warum einige eindeutig nicht Java-Code mit Java-Code gemischt wurde. Ich denke, es wurde von einem Tool generiert, also würde ich versuchen, das Problem zu lösen, BEVOR Sie seltsamen Java-Code in Java bekommen. Sicher, Sie können auch ein paar Kerben machen, die nach "FOR" in Großbuchstaben suchen, aber Sie würden etwas Sprödes bekommen. –

+0

@Viola Ich bin mir ziemlich sicher, dass es nicht ohne eine eigene Grammatik gemacht werden kann. JavaParser ist JavaCC-basiert und zwingt Sie so ziemlich in Grammatiken. – lexicore

1

[Ich bin der Betreuer von JavaParser] Sie könnten eine Suche/Ersetzung mit regulären Ausdrücken verwenden, wodurch JavaParser insgesamt vermieden wird. Nicht schön, aber wenn die Syntax einfach ist, wird es die meiste Zeit funktionieren.

Verwandte Themen