使用FParsec解析方法参数

时间:2011-08-26 03:00:51

标签: f# fparsec

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

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


解析开口和闭合牙箍非常简单。头痛在于处理可能发生的以下3种情况:

方法参数可以包含:

  • 没有参数,
  • 一个论点,
  • 几个参数(所有逗号分隔)。请记住,最后一个参数不能以逗号开头!

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

1 个答案:

答案 0 :(得分:4)

我相信你想使用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