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.
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
@ user1932405, creare una regola aggiuntiva, ad esempio 'valore':' config_options: valore KEY EQUALS; valore: (PATH | ALPHANUM) ('' | '\ r' | '\ n') *; ' –
Oh okay, grazie per questo, quindi devo creare AST basato su regole di analisi e non token. – Har