2011-12-05 14 views
12

Bir Delphi ayrıştırıcısı yazmayı öğrenmek için Parsec kullanmayı öğrenmeye çalışıyorum, ancak LanguageDef'i tanımlamak için takılıp kalıyorum.Parsec'teki çok sayıda yorum bloğu nasıl tanımlanır

Delphi'de iki tür yorum bloğu vardır, (* comments *) ve { comments }. Fakat commentStart türleri & commentEnd of LanguageDef, String değil [String], bu yüzden yalnızca birini veya diğerini koyabilirdim.

Kendi whiteSpace çözümleyicimi yapmaya çalıştım, ancak aslında makeTokenParser ürününe aktardığımdan emin değilim.

Herhangi bir yardım için teşekkür ederiz.

Teşekkür


John ve Chris anlamak ve sorunu aşmanın bana yardımcı oldu, ama çözüm makeTokenParser sağlar ayrıştırıcıları çok sayıda değiştirilmesi gerekiyor, bu yüzden tam olarak arzu değil

.

Daha iyi bir çözüm bulabilirsem, tekrar göndereceğim.

+0

, ama Mike Lischke olarak bilinen bir açık kaynak Delphi ayrıştırıcı ve lexer, yapılan [DCC] (http://www.soft-gems.net/index.php?option=com_content&task=view&id=25&Itemid=33). –

cevap

5

Text.ParserCombinators.Parsec.Language dosyamdan okuma yaptığım bu, LanguageDef aracılığıyla doğrudan yapılamaz.

Kendi whiteSpace ayrıştırıcınızı yazmak için doğru yolda olduğunuzu düşünüyorum. Başarıyla kullanmak için, makeTokenParser tarafından oluşturulan whiteSpace ayrıştırıcısının üzerine yazmak gerekir. makeTokenParser tarafından oluşturulan TokenParser, bir ayrıştırıcı içeren her alanın bir kaydıdır. şöyle yerini bu alanlardan biriyle kaydının yeni bir kopyasını oluşturabilirsiniz: Ben bu sorunuza cevap vermez biliyorum

-- ask GCHi for the type actual type signature constraints 
-- Type sig is approx. fixWhiteSpace :: TokenParser -> Parser -> TokenParser 
fixWhiteSpace originalTokenParser myWhiteSpaceParser = 
    originalTokenParser {whiteSpace = myWhiteSpaceParser} 
+0

Hızlı bir deneme yaptım, işe yaramadı, ama başka bir şey yanlış yapabilirim. Biraz daha zaman harcayacağım. Sadece 'whiteSpace' ile tanımlanan "originalTokenParser" öğesinde başka bir ayrıştırıcı varsa, onaylamak için bu çözümleyici "fixWhiteSpace" uyguladığımda otomatik olarak "myWhiteSpaceParser" kullanır mı? – ePak

+1

@epak: Hayır. Tüm değerler değişmezdir, bu nedenle "newParser = fixWhiteSpace blach" ifadesinin tanımlanması, originalTokenParser'ı etkilemez. –

+0

@ChrisKuklewicz: Bunu benim için açtığın için teşekkürler ve aslında bu temel sorun. “Lexeme” ayrıştırıcısı “whiteSpace” cinsinden tanımlanmıştır ve “identifier” dahil olmak üzere bir çok daha fazla ayrıştırıcı “lexeme” cinsinden tanımlanmıştır. Bir kez 'tanımlayıcı' ayrıştırıcısını 'lexeme' tanımımı ile değiştirdim ve @John'un önerdiği gibi whiteSpace ', çok sayıda yorum bloğu türünü ele alırdı. – ePak

İlgili konular