Rozszerzam program BaseClass Listener i próbuję odczytać niektóre wartości, jednak nie ma żadnej hierarchii w takiej kolejności.ANTLR4: Konstrukcja drzewa
ściętego wersję mojego gramatyki jest następujący:
start: config_options+
config_options: (KEY) EQUALS^ (PATH | ALPHANUM) (' '|'\r'|'\n')* ;
KEY: 'key' ;
EQUALS: '=' ;
ALPHANUM: [0-9a-zA-Z]+ ;
Jednak drzewo parse tej realizacji jest płaska na poziomie config_options (poziom Terminal) iethe początek reguła ma wiele dzieci config_options ale RÓWNOŚCI nie jest korzeniem poddrzew z config_options, wszystkie TOKENS mają regułę config_options jako root node. Jak mogę zamiast tego uczynić jeden z terminali węzłem głównym?
W tej konkretnej regule nie chcę, aby jakiekolwiek spacje zostały przechwycone, wiem, że istnieje -> przeskok skierowany do lexera, ale są pewne przypadki, w których chcę tę przestrzeń. tj String ' " '(ALPHANUM |' ')'"'
(Uwaga:^nie wydają się działać)
przykładem dla wejścia wynosi:
key = abcdefg
key = 90weata
key = acbefg9
Wszystko co chcę zrobić, to wydobyć klucz i wartość par. Spodziewam się, że "=" będzie korzeniem, a dwoje dzieci będzie kluczem i wartością.
Jak zdefiniować relację między terminalami? tj. uzyskać dzieci znaku równości. Czy to nie jest prawidłowy pomysł w ANTLR4? Czy istnieje sposób na utworzenie AST zamiast drzewa analizy składniowej? – Har
@ user1932405, utwórz dodatkową regułę, 'wartość' na przykład:' config_options: KEY EQUALS value; value: (PATH | ALPHANUM) ('' | '\ r' | 'n') *; ' –
Dobra, dziękuję za to, więc będę musiał stworzyć AST w oparciu o reguły parsowania, a nie żetony. – Har