2011-05-03 12 views
8

ANTLR dilbilgisi içinde ISO 8601 tarihlerini ayrıştırmak istiyorum.ANTLR 3'te sabit sayıda karakter nasıl eşleştirilir?

2001-05-03 

benim dilbilgisi dosyasında aşağıdaki girdileri var: Ben bu işe yararken ben DIGIT*

ile DIGIT+ ve sıfır veya daha fazla olan bir veya daha fazla maç biliyorum

date : FOUR_DIGIT ('-')? TWO_DIGIT ('-')? TWO_DIGIT ; 

FOUR_DIGIT 
    : TWO_DIGIT TWO_DIGIT ; 

TWO_DIGIT 
    : DIGIT DIGIT ; 

DIGIT : ('0'..'9') ; 

var Ben tam olarak eşleştirmek istiyorum basit bir sözdizimi 2 DIGIT?

+1

sadece ileride sürecek olanlar için ayrıştırıcıda ayrıştırma tarihlerini terk ettim ve çakışan kadar bitmeyen tarihleri ​​ayrıştırmak için bir yol bulabilene kadar tarihleri ​​doğrudan kod içinde ayrıştırmaya karar verdim DIGIT 'kalıpları ile başlayan diğer terimlerle. –

cevap

3

Ben ANTLR 3 *, + ve ? dışında hiçbir nicelik vardır eminim. DIGIT DIGIT DIGIT DIGIT, istediğiniz davranışı elde etmenin en makul yolu gibi görünüyor.

7

Jarrod Roberson http://www.antlr.org/wiki/display/ANTLR3/Grammars Bkz yazdı:

bu ben tam olarak 2 HANE eşleştirmek istediğiniz belirtmek için daha basit bir sözdizimi vardır, işe yararken?

Hayır, DIGIT DIGIT tam olarak iki basamağa eşleme yapmanın tek yoludur. ANTLR, ne yazık ki DIGIT{2} gibi bir desteğini desteklemiyor.

+0

Ayı kaldırdım, bir şey satın almadı, çünkü günleri aynı şekilde kısıtlamaya çalışmakla çarpışıyor. Ayrıca 00 'geçerli bir ay olmaz. –

+0

Anladım. Evet, bu daha iyi görünüyor: sadece tarihleri ​​"gevşek" ile eşleştirin ve daha sonraki bir aşamada geçerli bir tarih olup olmadığını kontrol edin. –

+0

Belki biliyorsunuz, ancak 4 (ve 2) basamaklı sayının artık FOUR_DIGIT (veya TWO_DIGIT) olarak simgeleneceğini anlayın. Böylece, ayrıştırıcı kurallarınızdan DIGIT + 'yi çağırmak, hiçbir zaman dört ya da iki ardışık rakamı eşleştiremez. –

İlgili konular