2015-07-29 18 views
9

Boşluk ve yorumlarla nasıl baş edersiniz? Sözdizimsel analiz aşamasında genellikle kopan parçalar mı? Belgemde her yerde ayrıştıracağım yorumları etkinleştirmek istiyorum. Bunları tek seçenek olarak tanımladığım her temel ayrıştırıcısına ekliyor mu?parsec: Dilbilgisinde her yere yorum/boşluk yazmanın kolay bir yolu var mı?

+8

Bunu yapmanın en yaygın (kitaplıktan bağımsız) yolu, gerçek ayrıştırmadan önce yalnızca bir belirteç adımına sahip olmak ve tüm boşlukları ve yorumları atmaktır. – Cubic

cevap

8

o Text.Parsec.Token yapılır böylece her belirteç boşluk ve onu takip yorumlarınızı tüketmek sahip olmaktır.

Bu lexeme combinator yardımı aracılığıyla yapılır: Bir ayrıştırıcı p çalışır

lexeme p = do { x <- p; whitespace; return x } 

, onu ve p döndü ne olursa olsun döner aşağıdaki boşluk tüketir.

Eğer makeTokenParser(link) kaynağına baktığınızda lexeme bağdaştırıcının kullanılarak sarılır belirteç ayrıştırıcıları, örneğin çoğunun görürsünüz: dışarı lexeme(link) noktası için bu yaklaşımı, yorum Kullanılması

symbol name 
    = lexeme (string name) 

ayrıştırıcınızın açık bir şekilde beyaz boşluk tüketmesi gereken zamanın, ilk belirtecin önündeki herhangi bir beyaz alanı atlamak için girdinin başında olduğunu unutmayın.

7

bir “belirteç ayrıştırıcı” tanımlamak için parsekten yeteneklerini kullanmalıdır. Buradaki fikir, dilinizin özelliklerini LanguageDef'da tanımlamanız ve sonra elde edilen TokenParser türetilmiş ayrıştırıcıları kullanmanızdır. identifier, integer vb tüm sondaki boşluğu yutar birine gelebilecek tüm ayrıştırıcı açmak için TokenParser den lexeme fonksiyonunu alabilir.

fazla ayrıntı için makeTokenParser bakınız.

bir örnek yazdım this code olduğunu. Bu iyi bir öğretici olarak yetiştirmek şekilde belki gerçek dünya-kod değil, ama ben lang = makeTokenParser... tanımlamak ve aşağıdaki ayrıştırıcıları içinde whiteSpace lang, parens lang gibi ayrıştırıcıları nasıl kullandığını görebilirsiniz. parseTime, bir "normal" çözümleyici etrafında lexeme kullanıyorum bir örnektir.

+0

Jetonu nasıl kullanacağınıza dair bir örnek var mı? – mb14

İlgili konular