2013-02-21 4 views
7

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.

Antwort

7

Wenn Sie Ihre Grammatik generieren, sollten Sie einen Syntaxfehler über die Verwendung des ^ Betreiber bekommen, die in ANTLR entfernt wurde 4. ANTLR 4 erzeugt Parse-Bäume, die Wurzeln, die von den Regeln implizit definiert werden in deiner Grammatik. Mit anderen Worten, für die Grammatik, die Sie oben angegeben haben, sind die Knoten start und config_options.

Die erzeugte config_options Regel wird eine Instanz von Config_optionsContext Rückkehr, die die folgenden Verfahren enthält:

  • KEY() eine TerminalNode für die KEY Token zurückgibt.
  • EQUALS() (gleiche gilt für die EQUALS Token)
  • PATH() (gleiche gilt für die PATH Token)
  • ALPHANUM() (gleiche gilt für die ALPHANUM Token)

Sie getSymbol() auf einem TerminalNode nennen können die Token zu erhalten Beispiel.

+0

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

+1

@ user1932405, erstellen Sie eine zusätzliche Regel, 'value' zum Beispiel:' config_options: KEY EQUALS value; Wert: (PATH | ALPHANUM) ('' | '\ r' | '\ n') *; ' –

+0

Oh okay, Danke dafür, also muss ich AST basierend auf Parse-Regeln und nicht Token erstellen. – Har