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] "
.
我正在尝试使用 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] "
.