a..b // [1]
c .. x // [2]
1..2 // [3]
3 .. 4 // [4]
gibi dize birlikte ifadeleri için kullanılacak ANTLR3 lexer içinde '..'
bir belirteç oluşturmak istiyorum
,
DOTDOTSEP : '..'
;
sorundur zaten bir kural olduğunu:
FLOAT : INT (('.' INT (('e'|'E') INT)? 'f'?) | (('e'|'E') INT)? ('f'))
;
Ve örnekte
[3]1..2
yukarıdaki i
FLOAT
olarak eşleşiyor (Neden ilk
.
'u izlediğinden bu yana bir INT değil, başka bir
.
olduğundan emin değilim).
Lexer kurallarının önceliğini değiştirmenin bir yolu olup olmadığını merak ediyorum, bu nedenle DOTDOTSEP
önce eşleşti ve ardından FLOAT
.
Görünüşe göre here Görünüşe göre, "The rule having the greatest count is the winner.",
'u kaybediyorum ama etrafta bir yol olup olmadığını merak ediyorum.
P.S. INT ... aşağıda
fragment DIGIT
: '0'..'9'
;
INT : DIGIT+
;
Edit tanımlanır. Biraz daha fazla test yapmam, bana FLOAT
kuralı ile doğrudan eşleşmesi kadar basit olmadığını düşünmemi sağlıyor. (Soruyu değiştirecektim ama şimdi cevaplarım var, ben yapmayacağım.) Sorun hala (inanıyorum) hala lexer kurallarının önceliğinde yatıyor, bu yüzden soru hala aynı kalıyor.
, sadece biraz daha ince ayar gerekli:
Muhtemel bir çözüm aşağıdaki tanımlamaktır. Bulmadığım bağlantı ama harika görünüyor; Sadece okumam gereken bir şey, o yüzden şimdi bunu yapmaktan vazgeçtim. Teşekkürler. – tjm
Şimdi güzelce gidiyorum, bununla gelebilecek herkes için sadece birkaç not. ANTLRWorks v1.4'te, yorumlayıcı yüklemelerle başa çıkamaz, bu nedenle (o zaman beni yavaşlattı) hatalar var gibi görünüyor ve ayrıca $ settype (TYPE); $ type = TYPE; ' – tjm
@tjm, ANTLR örneğini biraz düzenledim. Şimdi v3 uyumlu mu? –