2016-12-06 3 views
1

Ich bin auf der Suche nach einer Möglichkeit, Kommentare beim Parsen zu vermeiden. Hier ist mein Problem.Rascal holen Methoden ohne Kommentare

Zuerst hole mir alle Methoden von einem M3-Modell, etwa so:

public set[loc] getMethodLocations(M3 model){ 
    locations = { <x,y> | <x,y> <- [email protected], 
    x.scheme=="java+class", 
    y.scheme=="java+method" || 
    y.scheme=="java+constructor" }; 
    set[loc] methodLocations = { a | a <- range(locations) }; 
    return methodLocations; 
} 

Dann habe ich über die abgerufenen Orte wiederholen will, etwa so:

set[loc] AllMethodsAsLoc = getMethodLocations(model); 

for(methodAsLoc <- AllMethodsAsLoc) { 
    MethodDec m = parse(#MethodDec, methodAsLoc); 
}; 

Mein Problem ist, dass das Parsing scheint mit einem ParseError fehlzuschlagen, wenn eine abgerufene Methode Kommentare am Ort hat. Wie kann ich beim Abrufen keine Kommentare hinzufügen oder wie kann ich Kommentare während des Parsens ignorieren?

Ich bin neu hier und lerne, bitte entschuldige meine Unwissenheit.

Jede Hilfe wird geschätzt.

Rob

Antwort

1

Ausgezeichnete Frage. Da MethodDec kein "Start" Nicht-Terminal ist, akzeptiert es keine Leerzeichen oder Kommentare vor und nach dem eigentlichen MethodDec. Entweder sollten wir das Leerzeichen irgendwie abschneiden, oder wir könnten ein neues Nicht-Terminal erstellen, das das Layout akzeptieren kann.

Die letztgenannte Lösung ist die bessere IMHO:

start syntax MyTop = MethodDec method; 

start[MyTop] theTop = parse(start[MyTop], methodAsLoc); 
MyTop t = theTop.top 
MethodDec dec = t.method; 

// or more directly 
dec = parse(start[MyTop], methodAsLoc).top.method; 
+0

Danke jurgnv. Das war genau die Lösung, die ich brauchte. Wunderbar. – Rob

+1

Für diejenigen, die lesen und später verwenden. Bedenken Sie, dass diese Lösung nur für Methoden funktioniert. Das Code-Beispiel ruft auch Konstruktoren ab, daher musste ich auch Folgendes hinzufügen, um auch Konstruktoren zu verarbeiten: 'Syntax MyMethod = MethodDec | ConstrDec; ' und die Lösung für das Problem von @jurgenv: 'Start-Syntax MyTop = MyMethod Methode;' Deklarieren Sie Variable und verwenden Sie es mit dem Parsen wie folgt: 'MyMethod m = parse (#start [MyTop], Methode) .top.method;' – Rob

Verwandte Themen