【发布时间】:2018-08-10 01:00:26
【问题描述】:
我正在尝试使用 FParsec 解析 TOML 多行字符串,但我遇到了关闭分隔符 (""") 的问题。我有以下解析器:
let controlChars =
['\u0000'; '\u0001'; '\u0002'; '\u0003'; '\u0004'; '\u0005'; '\u0006'; '\u0007';
'\u0008'; '\u0009'; '\u000a'; '\u000b'; '\u000c'; '\u000d'; '\u000e'; '\u000f';
'\u0010'; '\u0011'; '\u0012'; '\u0013'; '\u0014'; '\u0015'; '\u0016'; '\u0017';
'\u0018'; '\u0019'; '\u001a'; '\u001b'; '\u001c'; '\u001d'; '\u001e'; '\u001f';
'\u007f']
let nonSpaceCtrlChars =
Set.difference (Set.ofList controlChars) (Set.ofList ['\n';'\r';'\t'])
let multiLineStringContents : Parser<char,unit> =
satisfy (isNoneOf nonSpaceCtrlChars)
let multiLineString : Parser<string,unit> =
optional newline >>. manyCharsTill multiLineStringContents (pstring "\"\"\"")
|> between (pstring "\"\"\"") (pstring "\"\"\"")
let test parser str =
match run parser str with
| Success (s1, s2, s3) -> printfn "Ok: %A %A %A" s1 s2 s3
| Failure (f1, f2, f3) -> printfn "Fail: %A %A %A" f1 f2 f3
当我针对这样的输入测试 multiLineString 时:
test multiLineString "\"\"\"x\"\"\""
解析器失败并出现以下错误:
失败:“Ln 中的错误:1 Col:8 “”“x”“” ^ 注意:错误发生在输入流的末尾。期望:'"""'
我对此感到困惑。 manyCharsTill multiLineStringContents (pstring "\"\"\"") 解析器不会停在""" 处,以便between 解析器找到它吗?为什么解析器会吃掉所有输入,然后 between 解析器会失败?
这似乎是一个相关的帖子:How to parse comments with FParsec
但我看不出那个解决方案与我在这里所做的有什么不同,真的。
【问题讨论】: