2013-02-21 13 views
7

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ą.

Odpowiedz

7

Podczas generowania gramatykę, powinny być coraz błąd składni nad wykorzystaniem operatora ^, który został usunięty w antlr 4. ANTLR 4 generuje drzewo wyprowadzenia, której korzenie są domyślnie zdefiniowane przez przepisy w twojej gramatyce. Innymi słowy, dla gramatyki, którą dałeś powyżej węzłów drzewa analizy, będą start i config_options.

Wytworzona config_options zasada zwróci instancję Config_optionsContext, który składa się z następujących metod:

  • KEY() zwraca TerminalNode do KEY tokena.
  • EQUALS() (jednakowa dla EQUALS tokena)
  • PATH() (jednakowa dla PATH tokena)
  • ALPHANUM() (jednakowa dla ALPHANUM tokena)

Można zadzwonić getSymbol() na TerminalNode uzyskać Token instancja.

+0

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

+1

@ user1932405, utwórz dodatkową regułę, 'wartość' na przykład:' config_options: KEY EQUALS value; value: (PATH | ALPHANUM) ('' | '\ r' | 'n') *; ' –

+0

Dobra, dziękuję za to, więc będę musiał stworzyć AST w oparciu o reguły parsowania, a nie żetony. – Har

Powiązane problemy