2009-07-22 16 views
1

Ich benutze ANTLR 3, um einen AST zu erstellen. Ich möchte zwei AST-Analysatoren haben, einen für den Produktionscode und einen für das bereits vorhandene Eclipse-Plugin. Das Plugin benötigt jedoch nicht alle Informationen in der Baumstruktur. Nach was ich suche, ist eine Weise, den Baum zu analysieren, ohne alle Zweige in der Grammatik zu spezifizieren. Gibt es einen Weg dazu?Überspringe einen Teil eines Baumes beim Analysieren eines ANTLR AST

Antwort

2

Vielleicht haben Sie das bereits herausgefunden, aber ich habe in meinen Baumgrammatiken . oder .* verwendet, um entweder einen bestimmten Knoten oder eine beliebige Anzahl von Knoten zu überspringen.

Zum Beispiel habe ich eine DSL, die Funktionsdeklarationen erlaubt, und eine meiner Baumgrammatiken kümmert sich nur um Namen und Argumente, aber nicht den Inhalt (der beliebig lang sein könnte). Ich überspringe die Verarbeitung des Codeblocks .* als Platzhalter verwenden:

^(Function type_specifier? variable_name formal_parameters implemented_by? .*) 

Ich weiß nicht, über die Laufzeit-Performance-Hit, wenn überhaupt, aber ich bin nicht dieses Konstrukt in allen Bereichen, in denen die Leistung ist ein ist Problem für meine Bewerbung.

1

Ich weiß nicht, was genau Sie tun möchten, aber ich habe eine boolesche Flagge im Tree Walker eingerichtet, als ich das letzte Mal auf dieses Problem stieß. Zum Beispiel:

@members 
{ 
    boolean executeAction = true; 
} 
... 

equation: 
@init{ 
    if(executeAction){ 
     //do your things 
    } 
} 
@after{ 
    if(executeAction){ 
     //do your things 
    } 
} 
    exp { if(executeAction){/* Do your things */} } EQU exp 
; 
exp: 
@init{ 
    if(executeAction){ 
     //do your things 
    } 
} 
@after{ 
    if(executeAction){ 
     //do your things 
    } 
} 
    integer OPE integer 
; 

... 

Auf diese Weise können Sie die Ausführung einfach ein- oder ausschalten. Sie müssen nur alle Codes in eine if-Anweisung einfügen.

Die Sache ist, dass es in Antlr nicht so etwas gibt, das die folgenden Regeln überspringen nennt. Sie sind sowieso durchzugehen. Also können wir es nur manuell machen.

+0

Das möchte ich nicht machen. Was ich brauche, ist einfach eine Verzweigung in der Baumstruktur zu überspringen, ohne genau anzugeben, wie diese Verzweigung aussieht. – Jorn

+0

Meinen Sie, dass Sie eine Regel definieren möchten, ohne anzugeben, wie sie in ihrem Lexer und Parser zusammengesetzt ist? Wenn dies der Fall ist, dann ist es unmöglich in Antlr. Wenn Sie jedoch davon sprechen, einen Walker zu erstellen, der nur die Regeln enthält, die angezeigt werden sollen, können Sie den Baum immer neu schreiben, um den gewünschten Baum zu fälschen. –

+0

Wie würdest du diesen Baum umschreiben? Eine andere Grammatik erstellen, die den ersten Baum in einen anderen verwandelt? Vielleicht ändern Sie den ANTLRInputStream so, dass nur die Tokens angezeigt werden, die ich brauche. – Jorn

Verwandte Themen