2013-04-25 8 views
14

私がParsecでよく抱える問題の1つは、「正しい」場所に入力された無効な入力を無視する傾向があることです。具体的な例として Parsec:すべての入力を消す

は、我々は integer :: Parser Intがあると、私は(今のところ空白の問題を無視します。)

これは正しく "123 + 456 + 789" のようなものを解析し

expression = sepBy integer (char '+') 

を書きます。しかし、 "123 + 456-789"と入力すると、不正な " - "文字とその末尾の部分を気前よく無視します。私は実際にその部分を無視しているだけでなく、無効な入力について私に知らせるエラーメッセージがほしいと思っていました。

私は理解していますなぜこれが起こりますか。私はそれを修正する方法についてはわからない。 をすべて消費するパーサーを設計する一般的な方法は何ですかすべてが有効な式である場合にのみ入力され、成功しますか?

答えて

26

それは実際にはかなり簡単です - ちょうどそれはeofが続いています確認してください。

parse (expression <* eof) "<interactive>" "123+456-789" 

eofは入力だけでなく文字列のファイルであっても、入力の終わりと一致します。

明らかに、これはパーサの最上位レベルでのみ意味があります。

関連する問題