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