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ı?
cevap
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.
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.
Jetonu nasıl kullanacağınıza dair bir örnek var mı? – mb14
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