Ich erweitere den baseClass Listener und versuche einige Werte einzulesen, aber in der Reihenfolge scheint es keine Hierarchien zu geben.ANTLR4: Baumkonstruktion
eine abgespeckte Version meiner Grammatik ist wie folgt:
start: config_options+
config_options: (KEY) EQUALS^ (PATH | ALPHANUM) (' '|'\r'|'\n')* ;
KEY: 'key' ;
EQUALS: '=' ;
ALPHANUM: [0-9a-zA-Z]+ ;
jedoch der Parsing-Baum dieser Umsetzung auf Ebene Konfigurationsoptionen flach ist (Terminal-Ebene) iethe Regel Start hat viele Kinder von Konfigurationsoptionen, aber EQUALS ist nicht die Wurzel der Teilbäume von config_options, alle TOKENS haben die Regel config_options als Root-Knoten. Wie kann ich eines der Terminals stattdessen zu einem Root-Knoten machen?
In dieser speziellen Regel möchte ich keinen der Räume erfasst werden, ich weiß, dass es die -> überspringen für den Lexer gerichtet gibt, aber es gibt einige Fälle, in denen ich den Raum wollen. dh in String ' " '(ALPHANUM |' ')'"'
(Anmerkung: die^scheint nicht zu funktionieren)
ein Beispiel für die Eingabe ist:
key = abcdefg
key = 90weata
key = acbefg9
Alles, was ich tun möchte, ist die Schlüssel-Wert-Paare zu extrahieren. Ich würde erwarten, dass das '=' die Wurzel wäre und die zwei Kinder der Schlüssel und der Wert wären.
Wie können Sie eine Beziehung zwischen Terminals definieren? d. h. die Kinder des Gleichheitszeichens bekommen. Oder ist das keine gültige Idee in ANTLR4? Gibt es eine Möglichkeit, einen AST anstelle eines Syntaxbaums zu erstellen? – Har
@ user1932405, erstellen Sie eine zusätzliche Regel, 'value' zum Beispiel:' config_options: KEY EQUALS value; Wert: (PATH | ALPHANUM) ('' | '\ r' | '\ n') *; ' –
Oh okay, Danke dafür, also muss ich AST basierend auf Parse-Regeln und nicht Token erstellen. – Har