2016-01-05 25 views
7

/ için bir .g4 dilbilgisi sahibiyim, burada lexer satır devamı tokens'larını atlıyor - ayrıştırmak onları ayırmıyor ve bir seçenek değil. Bu neden oluyorBelirsiz kod dilbilgilerime aykırı

LINE_CONTINUATION : ' ' '_' '\r'? '\n' -> skip; 

sorun, sürekli çizgi 1. sütun başlar ne zaman, ayrıştırıcı patlarsa olmasıdır: Burada söz konusu lexer kuralıdır

Sub Test() 
Debug.Print "Some text " & _ 
vbNewLine & "Some more text"  
End Sub 

Ben Hey biliyorum" düşündüm! Alt çizgiden önce fazladan bir boşluk eklemek için ANTLR'yi beslediğim dizeyi önceden işleyeceğim ve kabul etmek için dilbilgisini değiştireceğim! "

Yani böyle kuralı değiştirdi:

LINE_CONTINUATION : WS? WS '_' NEWLINE -> skip; 
NEWLINE : WS? ('\r'? '\n') WS?; 
WS : [ \t]+; 

... ve test Yukarıdaki kod bana bu ayrıştırıcı hata verdi: şimdi benim tek çözüm söylemektir için

extraneous input 'vbNewLine' expecting WS

benim kullanıcılar kodlarını uygun şekilde girebilir. Bu dilbilgisi kuralını düzeltebileceğim bir yol var mı?

+0

Neden WS'ye LINE_CONTINUATION eklemiyorsunuz? –

+0

@IraBaxter 'WS' birçok yerde kullanılmaktadır. Ne demek istiyorsun? –

+1

Temel olarak çizgi devamının beyaz boşluk gibi görünmesini istiyorsunuz. Tamam, daha sonra satır devam etmesinin sözdizimini WS belirtecine ekleyin. –

cevap

4

(Full VBA.g4 grammar file on GitHub) Temelde satır devam boşluk gibi muamele görmek istiyorum.

Tamam, daha sonra satır devam etmesinin sözdizimi tanımını WS belirtecine ekleyin. Daha sonra WS hat devamını alacak ve herhangi bir yerde LINECONTINUATION gerekmiyor.

//LINE_CONTINUATION : ' ' '_' '\r'? '\n' -> skip; 
NEWLINE : WS? ('\r'? '\n') WS?; 
WS : ([ \t]+)|(' ' '_' '\r'? '\n'); 
+0

Ben lanetleneceğim. İşe yaradı! –

+0

Çok hızlı konuştu. OP * 'deki özel durum için çalıştı. * Bu yüzden, WS' kuralını WS 'ye çevirmeyi denedim: [\ t] + (' _ '' \ r '?' \ N ') ?; '' ve şimdi de '' Option Base 1 '' '' 'seçeneğine bölündü' 'Option Base 1' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'bölündü. Anlamıyorum, çünkü anladığım kadarıyla * aynı * bir veya daha fazla boşluk/sekme ile eşleşmeli ... bir ipucu var mı? –

+1

Sanırım farklı şeyler tanımlayabilirdim: HWS = [\ t \] +; ENDLINE = \ r? \ N; NEWLINE = HWS? BİTİŞ ÇİZGİSİ; WS = HWS (ENDLINE HWS?)? ; Bu son bit, "devam eden hattın girintisi vardır". Geri kalan sadece anlamak daha kolay hale getirmek için faktoring. (HWS == "yatay beyaz boşluk"). –