2016-01-24 43 views
0

在課堂上,我們通過定義自己的解析器類型來編寫解析器,這給了我們很大的靈活性。例如,如果我們想使代碼和解析出「[在]」爲「@」,我們可以寫使用Text.ParserCombinators編寫解析器

atParser = Parser $ \s -> 
    case s of 
     w:x:y:z:zs -> 
      | (w:x:y:z:[]) == "[at]" = ['@',zs] 
      | otherwise = [] 
     zs -> [] 

但是,我想不出如何實現使用Text.ParserCombinators這種解析器。可能嗎?

感謝

回答

1

我相信你正在尋找的string combinator

λ> :set -package parsec 
package flags have changed, resetting and loading new packages... 

λ> import Text.Parsec 

λ> :t string 
string :: Stream s m Char => String -> ParsecT s u m String 

λ> parse (string "[at]") "" "[at]" 
Right "[at]" 

λ> parse (string "[at]") "" "[at" 
Left (line 1, column 1): 
unexpected end of input 
expecting "[at]" 

λ> parse ('@' <$ string "[at]") "" "[at]" 
Right '@'