2013-02-21 24 views
7

Temel Sınıf Dinleyicisi'ni genişletiyorum ve bazı değerlerde okumaya çalışıyorum, ancak sırayla herhangi bir hiyerarşi yok gibi görünüyor. aşağıdaki gibiANTLR4: Ağaç yapısı

A benim dilbilgisi sürümünü olduğunu kesmek: Bu uygulama ayrıştırma ağacı yaplandrma_seçenekleri seviyede (Terminal seviye) de düz Ancak

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

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

iethe kuralı başlangıç ​​yaplandrma_seçenekleri pek çok çocuğu var ama EŞİTTİR config_options altturallarının kökünü değil, tüm TOKENS'lerin root node olarak config_options kuralı vardır. Terminallerden birini kök düğüm yerine nasıl yapabilirim?

Bu özel kuralda, yakalanacak alanlardan herhangi birini istemiyorum, biliyorum - lexer için yöneltilmiş atlama - ancak alanın olmasını istediğim bazı durumlar var. String yani ' ' "(ALPHANUM |' ')'"'

(Not:^çalışmak görünmüyor) girişi için

bir örnek:

anahtar = abcdefg

anahtar = 90weata

anahtar = acbefg9

yapmak istediğim tüm anahtar ve değer çiftlerini almak olduğunu. '=' Kökü olacağını ve iki çocuğun anahtar ve değer olacağını umuyorum. Eğer dilbilgisi oluşturduğunuzda

cevap

7

, sen antlr 4. ANTLR 4'te çıkarıldı ^ operatörü kullanımı konusunda bir sözdizimi hatası alıyorum olmalıdır ayrıştırma ağaçları, örtük kurallar tarafından tanımlanır köklerini oluşturur dilbilgisinde Başka bir deyişle, yukarıda verdiğiniz dilbilgisi için ağaç düğümleri start ve config_options olacaktır.

oluşturulan config_options kural aşağıdaki yöntemleri içeren, Config_optionsContext bir örneğini döndürür:

  • KEY()KEY belirteci için bir TerminalNode döndürür. (EQUALS simgesi için aynı)
  • EQUALS()
  • ( PATH simgesi için aynı)
  • PATH()

Sen Token almak için bir TerminalNode üzerinde getSymbol() çağırabilir (ALPHANUM belirteci için aynı)

  • ALPHANUM() örneği.

  • +0

    Terminaller arasındaki ilişkiyi nasıl tanımlarsınız? Yani eşittir çocukların çocukları olsun. Yoksa bu ANTLR4'te geçerli bir fikir değil mi? Ayrıştırma ağacı yerine AST oluşturmanın bir yolu var mı? – Har

    +1

    @ user1932405, ekstra bir kural oluşturmak için, 'value' örneğin: 'config_options: KEY EQUALS değeri; value: (PATH | ALPHANUM) ('' | '\ r' | '\ n') *; ' –

    +0

    Tamam, Bunun için teşekkürler, bu yüzden AST'yi parse kurallarına göre değil, belirteçlere göre oluşturmalıyım. – Har

    İlgili konular