F# FParsec特殊字符之间的字符串列表

F# FParsec特殊字符之间的字符串列表,f#,fparsec,F#,Fparsec,当试图解析{asdc,456,ghji,abc}时,我运行 run specialListParser "{asdc,456,ghji,abc}" 解析器失败,原因是 错误发生在输入流的末尾。 应为:任何不在“,”,“,”或“}”中的字符 我基于以下内容定义了解析器: let str:Parser=manychars(noneOf“,”) 让逗号=pstring“,” 让listParser=sepBy str逗号 让specialListParser=between(pstring“{”)(

当试图解析
{asdc,456,ghji,abc}
时,我运行

run specialListParser "{asdc,456,ghji,abc}"
解析器失败,原因是

错误发生在输入流的末尾。
应为:任何不在“,”,“,”或“}”中的字符

我基于以下内容定义了解析器:

let str:Parser=manychars(noneOf“,”)
让逗号=pstring“,”
让listParser=sepBy str逗号
让specialListParser=between(pstring“{”)(pstring“}”)listParser

我遗漏了什么?

看起来您的
str
解析器正在使用最后的
}
,因此
之间的
永远看不到它。将
str
解析器更改为
manychars(noneOf“,}”)
,它应该可以工作


或者,
noneOf[',';'}']
也会起作用,并且可能会更明确地说明您的意图。

“不起作用”并不能很好地描述问题。请比“不起作用”更具体一些。您收到了什么错误消息?尝试从中实现
test
功能,然后运行
testspeciallistparser“{def,ghi,jkl}”
。它输出的是什么?基本上,您还没有提供一个示例来演示您的精确问题,在您告诉我们更多信息之前,很难给您提供有用的答案。现在我看到了您的错误消息,我能够自己重现问题并解决它。@rumnn感谢您的回复。您的建议解决了成功的场景,但它并没有给出负面场景(解析器应该抛出错误)。我不理解您所说的“它没有给出负面场景”是什么意思。你能换个说法吗?或者给出一个输入示例,其中解析器应该抛出一个错误,但没有抛出?@rumn请忽略我之前的评论。
let str : Parser<_> = many1Chars (noneOf ",")
let comma = pstring ","
let listParser = sepBy str comma

let specialListParser = between (pstring "{") (pstring "}") listParser