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



我正在尝试用FParsec解析固定字符串。例如,从文档中解析null

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

则在CCD_ 3上运行CCD_

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

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

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

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

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解析器将成功。这里,这意味着只有当其余部分不能使用anyChar解析时,即它为空时,notFollowedBy anyChar才会成功。

最新更新