假设我正在定义以下解析器:
let identifier = many1Satisfy isLetter //match an identifier
let parser = identifier //our parser is only to match identifiers
test parser " abc" //the text to parse contains a leading space which should yield us an error
解析时,会出现错误,如预期的那样:
Failure: Error in Ln: 1 Col: 1
abc
^
Unknown Error(s)
我很好奇为什么它不能决定问题是他期待一封信并且找不到一封信。我是否希望自己以某种方式将这些信息添加到解析器中?
答案 0 :(得分:2)
为什么它不能告诉你什么是错的: 我想这是由于“many1Satisfy” - 你看到这个组合器包装另一个解析器,我猜它只是不知道“many1”出现错误的状态而不是错误 - 所以它说“未知错误(s) )“
这应该有效:
let ws = spaces
let identifier = ws >>. (many1Satisfy isLetter) //match an identifier, ignore whitespaces infront
let parser = identifier //our parser is only to match identifiers
test parser " abc"
答案 1 :(得分:0)
空格不是常规字符。在您的情况下,您需要忽略空格,因此您需要使用解析器组合您的解析器,该解析器忽略空格并使用这个新的组合解析器来解析标识符。