2013-02-21 16 views
7

Sto estendendo il Listener di baseClass e sto tentando di leggere alcuni valori, tuttavia non sembra che ci sia alcun ordine gerarchico nell'ordine.ANTLR4: costruzione di alberi

Un abbattuto versione della mia grammatica è la seguente:

start: config_options+ 
config_options: (KEY) EQUALS^ (PATH | ALPHANUM) (' '|'\r'|'\n')* ; 

KEY: 'key' ; 
EQUALS: '=' ; 
ALPHANUM: [0-9a-zA-Z]+ ; 

Tuttavia l'albero di analisi di questa implementazione è piatta a livello opzioni_configurazione (livello Terminal) iethe inizio regola ha molti figli di opzioni_configurazione ma EQUALS non è la radice dei sottoalberi di config_options, tutti i TOKENS hanno la regola config_options come nodo radice. Come posso rendere invece uno dei terminali un nodo radice?

In questa particolare regola non voglio che nessuno degli spazi sia catturato, so che c'è il -> skip diretto per il lexer tuttavia ci sono alcuni casi in cui voglio lo spazio. cioè in stringa ' " '(Alfanum |' ')'"'

(Nota: il^non sembra funzionare)

un esempio per l'input è:

key = abcdefg

key = 90weata

key = acbefg9

Tutto quello che voglio fare è estrarre i coppie chiave-valore. Mi aspetterei che il '=' sarebbe la radice ei due figli sarebbero la chiave e il valore.

risposta

7

Quando si genera la grammatica, si dovrebbe essere sempre un errore di sintassi sopra l'uso del ^ dell'operatore, che è stato rimosso in ANTLR ANTLR 4. 4 genera alberi di analisi, le cui radici sono implicitamente definito dalle regole nella tua grammatica. In altre parole, per la grammatica che hai dato sopra i nodi dell'albero di analisi saranno start e config_options.

Il config_options regola generato restituirà un'istanza di Config_optionsContext, che contiene i seguenti metodi:

  • KEY() restituisce un TerminalNode per la KEY token.
  • EQUALS() (stesso per il EQUALS Token)
  • PATH() (stesso per il PATH Token)
  • ALPHANUM() (stesso per il ALPHANUM Token)

Si può chiamare getSymbol() su un TerminalNode per ottenere il Token esempio.

+0

Come saresti in grado di definire una relazione tra i terminali? ottengo i bambini del segno di uguale. O non è un'idea valida in ANTLR4? C'è un modo per creare un AST invece di un albero di analisi? – Har

+1

@ user1932405, creare una regola aggiuntiva, ad esempio 'valore':' config_options: valore KEY EQUALS; valore: (PATH | ALPHANUM) ('' | '\ r' | '\ n') *; ' –

+0

Oh okay, grazie per questo, quindi devo creare AST basato su regole di analisi e non token. – Har