2013-04-25 70 views
14

我對Parsec的一個常見問題是,如果它出現在「正確」的位置,它往往會忽略無效輸入。Parsec:消耗所有輸入

舉一個具體的例子,假設我們有integer :: Parser Int,我寫

expression = sepBy integer (char '+') 

(忽略了片刻空白的問題。)

這正確解析像 「123 + 456 + 789」。然而,如果我餵它「123 + 456-789」,它愉快地忽略了非法的「 - 」字符和表達的尾部;我實際上想要一個錯誤消息告訴我關於無效輸入的信息,而不僅僅是讓它默默地忽略那個部分。

我明白爲什麼發生這種情況;我不確定的是如何解決它。使用全部提供的輸入並且只有在全部是有效表達式時纔會成功使用的設計解析器的一般方法是什麼?

回答

26

這其實很簡單 - 只要確保它的後面eof

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

eof輸入的結束一致,即使輸入只是一個字符串,而不是一個文件。

顯然,這隻在分析器的頂層纔有意義。

相關問題