2012-12-08 12 views
5

C stili tek satır açıklamalarını anlayan küçük bir dil için bir dilbilgisi yazdım. İşte Tek satırlı C stili yorumların Antlr ile ayrıştırılması

// this is a comment 

comment senaryosunun son ve zaman dışında antlr v3.0.1 eserlerin

SINGLELINE_COMMENT 
: '/' '/' (options {greedy=false;} : ~('\r' | '\n'))* ('\r' | '\n')+ {$channel=HIDDEN;}; 

    WS  :  (' '|'\r'|'\t'|'\u000C'|'\n')+ {$channel=HIDDEN;}; 

Bu hemen hemen türünü kullanarak, bu dil için yazdığı gramer bir parçasıdır hiçbir NL/CR orada sona eriyor, ben antlr dan (zamanında) rahatsız edici bir mesaj aldım:

line 1:20 required (...)+ loop did not match anything at character '<EOF>' 
Bu mesajdan kurtulmak nasıl

? (..)+ ifadesine EOF belirtecini eklemeyi denedim, ancak bu çalışmaz.

+0

Bunun hakkında emin değilim, ancak yeni satırı isteğe bağlı yaparsa ne olur, yani '+' öğesini bir '?'? ya da belki bir '' '? – nijoakim

+0

Açgözlü seçenekleri dışarıda bırakma (yalnızca + için görünüyorlar) ve artı bir soru işaretiyle değiştirmeye ne dersiniz? –

cevap

4

greedy=... seçeneğine ihtiyacınız yoktur: Kuralınızda .* veya .+ varsa, genellikle buna ihtiyacınız vardır. Zaten WS kural gizli kanalda satır sonu karakter koyarak konum beri, kendi SINGLELINE_COMMENT kaldırabilirsiniz: Genel olarak

SINGLELINE_COMMENT 
: '//' ~('\r' | '\n')* {$channel=HIDDEN;} 
; 

WS 
: (' '|'\r'|'\t'|'\u000C'|'\n')+ {$channel=HIDDEN;} 
; 
+0

İyi çalışıyor, teşekkürler! – insitu

2

, bir sürü yer alacağı "hayır sonlandırma NL" sorunu çözme Bu kenar durum için hitap edecek dolambaçlı dilbilgisi değişir. Girdi akışının sonuna sadece bir NL eklemek her zaman daha kolaydır, yani bir sonlandırıcı NL'ye sahip olduğunuzu ve dilbilgisinde endişelenmeyeceğinizi garanti edebilirsiniz. UNIX bu konuda doğru ve Windows değil.

Özel sorununuz için çözüm değil, ancak kuralı orijinal olarak kodlama biçiminiz bu sorunu ortaya çıkarır.