我目前正在学习 FParsec 库,但遇到了一个问题。当我想解析一个可选字符串并随后继续正常解析时,FParsec 将在可选解析器上返回致命错误,而不是返回None
正如我所期望的。下面的工作代码示例说明了我的观点:
open System
open FParsec
type AccountEntity =
| Default
| Entity of string
let pEntity =
let isEntityFirstChar c = isLetter c
let isEntityChar c = isLetter c || isDigit c
(many1Satisfy2L isEntityFirstChar isEntityChar "entity") .>> skipString "/"
let pOptEntity =
opt pEntity
|>> (fun optEntity ->
match optEntity with
| Some entity -> Entity entity
| None -> Default)
[<EntryPoint>]
let main argv =
printfn "%A" (run pOptEntity "test/account:subaccount") //works
printfn "%A" (run pOptEntity "account:subaccount") //crashes
Console.ReadLine() |> ignore
0 // return an integer exit code
我期望的行为是pOptEntity
返回一个Default
当未提供实体时。但是,我收到以下错误:
Failure:
Error in Ln: 1 Col: 8
account:subaccount
^
Expecting: '/'
不应该opt
提供我所描述的行为并继续正常解析帐户字符串,还是我以错误的方式处理此问题?我看了一下attempt
但是,那么,我将无法提供我想要的默认实体行为。
非常感谢您的帮助,谢谢。
The opt组合器 http://www.quanttec.com/fparsec/reference/primitives.html#members.opt遵循与以下相同的规则<|>
;如果你看<|>文档 http://www.quanttec.com/fparsec/reference/primitives.html#members.:60::124::62:,它提到如果第一个解析器失败不改变解析器状态,尝试第二个解析器。http://www.quanttec.com/fparsec/users-guide/parsing-alternatives.html http://www.quanttec.com/fparsec/users-guide/parsing-alternatives.html更详细的内容。
在这里,.>>?组合器 http://www.quanttec.com/fparsec/users-guide/parsing-alternatives.html是你想要在你的pEntity
解析器。更换.>>
with .>>?
你会得到一个pEntity
解析器认为,如果它后面没有跟/
, will 回溯到它尝试的开始处并且不消耗输入。这将允许opt
组合器按设计运行。
P.S.我测试了这个,它有效。更换.>>
with .>>?
in pEntity
然后运行代码会产生以下输出:
Success: Entity "test"
Success: Default
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)