4

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

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


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

方法参数可以包括:

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

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

4

1 回答 1

5

相信你想用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
于 2011-08-26T03:12:14.660 回答