我正在尝试使用 FParsec 解析 int32,但有一个额外的限制,即该数字必须小于某个最大值。他们是一种无需编写我自己的自定义解析器(如下所示)即可执行此操作的方法和/或我的自定义解析器(如下所示)是实现要求的适当方式。
我问是因为大多数内置库函数似乎都围绕满足某些谓词的char而不是任何其他类型。
let pRow: Parser<int> =
let error = messageError ("int parsed larger than maxRows")
let mutable res = Reply(Error, error)
fun stream ->
let reply = pint32 stream
if reply.Status = Ok && reply.Result <= 1000000 then
res <- reply
res
更新
以下是基于以下评论中给出的方向的更合适的 FParsec 解决方案的尝试:
let pRow2: Parser<int> =
pint32 >>= (fun x -> if x <= 1048576 then (preturn x) else fail "int parsed larger than maxRows")
这是正确的方法吗?