Parsec ユーザ定義のエラーメッセージ

Parsec は <?> 演算子でユーザ定義のエラーメッセージを設定できる。次のようにすれば word パーサにユーザ定義のエラーメッセージを設定できる。

word :: Parser String
word = many1 letter <?> "word"

簡単な例を Hugs のコンソールからテストしてみた。

Hugs> :l Text.ParserCombinators.Parsec
Text.ParserCombinators.Parsec> parseTest word "123" where word = many1 letter <?> "word"
parse error at (line 1, column 1):
unexpected "1"
expecting word

expecting の後のエラーメッセージがデフォールトの代わりに word が追加されている。

エラーメッセージはパーサ関数のどのレベルにも設定できる。sentence.hs パーサの word パーサに設定した例が、Parsec, a fast combinator parser に解説してある。

import Text.ParserCombinators.Parsec

sentence    :: Parser [String]
sentence    = do{ words <- sepBy1 word separator
                ; oneOf ".?!"
                ; return words
                }
                
separator   :: Parser ()
separator   = skipMany1 (space <|> char ',')

word :: Parser String
word = many1 (letter <?> "") <?> "word"

実行例:
Text.ParserCombinators.Parsec> :e sentence.hs
Text.ParserCombinators.Parsec> :l sentence.hs
Main> parseTest sentence "hi,123"
parse error at (line 1, column 4):
unexpected "1"
expecting space, "," or word
[PR]
by tnomura9 | 2009-09-30 16:37 | Haskell | Comments(0)
<< Parsec 式の定義 bui... Parsec セパレータ >>