【问题标题】:Parsing method arguments with FParsec使用 FParsec 解析方法参数
【发布时间】:2011-08-26 03:00:51
【问题描述】:

我正在尝试使用 FParsec 实现方法参数解析器。

我想知道 FParsec 本身是否有一些已经实现的功能可以帮助我实现这个目的?我问这个是因为 FParsec 在处理运算符优先级时提供了工具,所以这也可能有一些东西。


解析左大括号和右大括号非常简单。头疼的地方在于处理以下三种可能发生的情况:

方法参数可以包括:

  • 没有参数,
  • 一个论点,
  • 几个参数(全部以逗号分隔)。请记住,最后一个参数前面不能有逗号!

如果没有任何内置功能,即使用 运算符和流复制,我已经有一些关于如何自己实现这一点的线索,但我想远离那种低如果可能的话,水平的东西。

【问题讨论】:

    标签: f# fparsec


    【解决方案1】:

    我相信你想使用sepBy

    type AST =
    | Arguments of AST list
    | Argument of string * string
    
    let parseArguments =
        spaces 
        >>. pchar '(' 
        >>. spaces 
        >>. sepBy parseArgument (pchar ',') 
        .>> spaces 
        .>> pchar ')' 
        |>> Arguments
    

    由 devoured_elysium 编辑:

    上面的代码是正确的,虽然它没有编译。我将在此处发布我的编译版本,以便如果有人只想尝试代码而不费吹灰之力,他们可以做到。

    type AST =
    | Arguments of AST list
    | Argument of string
    
    let parseArguments =
        spaces 
        >>. pchar '(' 
        >>. spaces 
        >>. sepBy (many1Satisfy isLetter |>> Argument) (pchar ',')
        .>> spaces 
        .>> pchar ')'
        |>> Arguments
    
    test parseArguments "(a,b,c)" //succeed
    test parseArguments "(a,b,c,)" //fail
    

    【讨论】:

    • 如果我没记错的话,这并不是我想要的。 sepBy 将接受“a,b,c”,这在我的语言中将被视为无效语法!
    • 你是对的。我查看了错误的文档描述。
    猜你喜欢
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多