FParsec 在空格分隔列表的末尾失败,需要列表的另一个元素

FParsec failing at the end of a spaces separated list, expecting another element of the list

我正在尝试使用 FParsec 来解析 [string] 形式的零个或多个元素的列表,其中中间的字符串可以是任何内容(] 除外,以便从末尾消除歧义的字符串)。这是我的代码:

let parseArgumentList : Parser<string list, unit> =
    let parseArgument = (skipChar '[') >>. (manySatisfy (fun x -> x <> ']')) .>> (skipChar ']')
    sepBy (parseArgument) (spaces)


[<EntryPoint>]
let main argv =
    let parserResult = run parseArgumentList "[testString] [testString]"

    printfn "%A" parserResult
    0

这里的输出是:

Failure:
Error in Ln: 1 Col: 26
[testString] [testString]
                         ^
Note: The error occurred at the end of the input stream.
Expecting: '['

就好像解析器期待另一组括号而不是在 sepBy 中出现 2 次时终止。我通过将 spaces 更改为 (skipChar ' ') >>. spaces 来测试它,果然它解析得很好。然而,我不愿意删除参数之间没有空格的选项。任何想法或建议将不胜感激。

我认为使用 sepEndBy 而不是 sepBy 会达到你想要的效果:

let parseArgumentList =
    sepEndBy parseArgument spaces

来自 FParser doc:解析器 sepEndBy p sep 解析 p 的零次或多次出现,并且 可选地以 结尾 sep. (强调已添加。)

运行 您的测试输入会产生预期的结果:

Success: ["testString"; "testString"]

请注意,此解决方案还具有消耗尾随空格的好处(如果有的话)。例如。当输入为"[testString] [testString] ".