如何使用 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
解析其余部分时才会成功,即它是空的。
我正在尝试使用 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
解析其余部分时才会成功,即它是空的。