【问题标题】:How to parse a fixed string with FParsec如何使用 FParsec 解析固定字符串
【发布时间】:2021-11-07 21:10:57
【问题描述】:

我正在尝试使用 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后跟空格的要求:

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'

我在这里做错了什么?还是我完全误解了解析?

【问题讨论】:

    标签: parsing f# fparsec


    【解决方案1】:

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

    做你想做的事情的一种方法是像这样使用notFollowedBy anyChar

    let jnull : Parser<_,unit> = 
      (stringReturn "null" JNull) >>. notFollowedBy anyChar 
    
    run jnull "null"  // Success
    run jnull "nulls" // Error
    

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

    【讨论】:

    • 一个更简单的方法是使用eof,它只在输入结束时成功。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多