2013-02-22 17 views
8

'a uyarlıyor Kendime bir program yazarak 48 saat içinde geçiyorum.Haskell Parsec, oneOf'u [String]

symbol :: Parser Char 
symbol = oneOf "!#$%&|*+-/:<=>[email protected]^_~" 

Bu semboller için harikadır, ancak anahtar kelime listemiz varsa ne olur? (örn. struct, int)

Tek tek listelere uyarlanabilir mi? İdeal olarak aşağıda tarif ettiğim şey bu.

keywords :: Parser String 
keywords = oneOf ["struct","int",..etc] 

Ya Text.Parsec.Char ithalat ve anahtar kelimeler listesinin üzerine mapM dizeye denemeliyim?

Ben tokenize etmeye çalışıyorum ve sadece bu yoldan gitmiş olanlardan en iyi uygulamaların ne olduğunu bilmek istedim.

divOrMod = string "div" 
       <|> string "mod" 
bu genel formu aşağıdaki türü vardır the choice combinator olduğu

http://hackage.haskell.org/packages/archive/parsec/3.0.0/doc/html/Text-Parsec-Char.html

+0

Hey, bu eğitici hakkında bazı sorularım var ... sakıncası yoksa size sorabilir miyim? – hashcode55

cevap

11

: Temelde

choice :: Stream s m t => [ParsecT s u m a] -> ParsecT s u m a 

, Verdiğiniz

belgeler böyle bir şey kullanmak demek o parserlerin bir listesi ve biri başarılı olana kadar bunları çalışır. choice, (<|>) kullanılarak uygulanır, bu nedenle bu yaklaşımla aynıdır. Senin durumunda

, anahtar kelimeler ancak başka ayrıştırıcıları bir listesini eşleştirmek için, sadece String s'lik bir liste üzerinde string harita ve o zaman bizim choice kullanabilirsiniz.

Diğer taraftan, mapM string, tamamen farklı bir şey yapardı; bu, parserlerin tüm numaralı sırasının sırayla başarılı olmasını beklerdi.

+1

keys = ["class", "constructor" ...] keywords = choice $ harita dize tuşları. Parsec'in daha yeni bir sürümünü mi kullanıyorum? –

+1

@Dave öğesinden kaynaklanan (Text.Parsec.Prim.Stream s0 m0 Char) için bir örnek yok: Açık bir tip imza vermeyi deneyin. –

+0

ah görüyorum. Teşekkürler! :) –