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
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.
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.
- 1. ANTLR AST Gebäude Problem
- 2. Verwenden eines 2-3-4 Baumes anstelle eines Splay-Baumes
- 3. Erstellen eines Baumes "rückwärts"
- 4. Optionale Rewrite-Regel für AST in ANTLR
- 5. Angemessene Größe eines Baumes und eines Wörterbuchs
- 6. Visualisierung eines mit ANTLR erstellten ASTs (in einer .Net-Umgebung)
- 7. Balancieren eines AVL-Baumes (C++)
- 8. NumberFormatException beim Analysieren eines int
- 9. Traversing eines binären Baumes rekursiv
- 10. Speichern eines Baumes als Vorbestellung
- 11. Überspringe bestimmte Felder beim Parsen eines Dokuments mit RapidJSON
- 12. Aufbau eines Baumes wie Struktur
- 13. Zeichne einen Teil eines Kreises
- 14. Nur einen Teil eines XML-Feeds abrufen
- 15. (Rails) Verwalten eines Baumes ohne Javascript?
- 16. Drucken eines AST mit Variablennamen
- 17. ANTLR AST Regeln scheitern mit RewriteEmptyStreamException
- 18. C# - Seltsames Verhalten beim Analysieren eines XElement
- 19. Seltsame Leerzeichen beim Analysieren eines PDFs
- 20. Traversal eines Baumes, um einen Knoten zu finden
- 21. Warum erhalte ich einen Segmentierungsfehler in meiner Einfügefunktion eines Baumes?
- 22. Traversieren und Filtern eines Baumes in Haskell
- 23. Erstellen eines binären Baumes aus String-Eingabe
- 24. Wie bekommt man alle Blattknoten eines Baumes?
- 25. Erstellen eines dynamischen Baumes in Symfony 2
- 26. Erstellen eines Baumes aus der linken Zeichenkette Darstellung der Darstellung
- 27. Inorder Traversal eines B-Baumes (C++)
- 28. Bearbeiten eines Baumes in F # mit Fortsetzungen
- 29. Prolog: Aufbau eines vollständig ausgeglichenen Baumes
- 30. Algorithmus zum Auffinden von Symmetrien eines Baumes
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
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. –
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