如何使用 FParsec 解析固定字符串

How to parse a fixed string with FParsec

我正在尝试使用 FParsec 解析固定字符串。例如 parsing null from the documentation:

open FParsec

type Json = JNull
let jnull : Parser<_>  = stringReturn "null" JNull

然后 运行在 "null" 上宁 jnull 给出了预期的结果

> run jnull "null";;
val it : ParserResult<Json,unit> = Success: JNull

但是如果我 运行 它在 "nulls" 它也会成功

> run jnull "nulls";;
val it : ParserResult<Json,unit> = Success: JNull

然后我尝试添加要求 null 后面应该跟一个 space:

let jnull : Parser<_>  = stringReturn "null" JNull >>. spaces

然而,这给了我和以前一样的结果。

我也试过用manyMinMaxSatisfyL:

let jnull: Parser<_> =
        manyMinMaxSatisfyL 4 4 isLower "should be null"
        >>. pstring "null"
        >>. spaces

这个在 "nulls" 上失败了,但在 "null" 上也失败了:

> run jnull "nulls";;
val it : ParserResult<unit,unit> =
  Failure:
Error in Ln: 1 Col: 5
nulls
    ^
Expecting: 'null'

> run jnull "null";; 
val it : ParserResult<unit,unit> =
  Failure:
Error in Ln: 1 Col: 5
null
    ^
Note: The error occurred at the end of the input stream.
Expecting: 'null'

我在这里做错了什么?还是我完全误解了有关解析的某些内容?

一般来说,解析器总是会消耗一些输入,产生一个结果,然后将其余的输入留给以后处理。这使得组合它们成为可能,但这意味着编写一个消耗整个输入的解析器很棘手。

一种方法是像这样使用 notFollowedBy anyChar

let jnull : Parser<_,unit> = 
  (stringReturn "null" JNull) >>. notFollowedBy anyChar 

run jnull "null"  // Success
run jnull "nulls" // Error

如果使用作为参数给出的解析器无法解析输入的其余部分,则 notFollowedBy 解析器成功。在这里,这意味着 notFollowedBy anyChar 只有在无法使用 anyChar 解析其余部分时才会成功,即它是空的。