我正在尝试使用 FParsec 实现方法参数解析器。
我想知道 FParsec 本身是否有一些已经实现的功能可以帮助我实现这个目的?我问这个是因为 FParsec 在处理运算符优先级时提供了工具,所以也可能有一些东西。
解析左括号和右括号非常简单。头疼的问题在于处理以下可能发生的 3 种情况:
方法参数可以包括:
如果没有任何内置功能,即使用 <|> 运算符和流复制,我已经有了一些关于如何自己实现这一点的线索,但我想远离那种低级的东西,如果可能的。
我相信你想用sepBy
.
type AST =
| Arguments of AST list
| Argument of string * string
let parseArguments =
spaces
>>. pchar '('
>>. spaces
>>. sepBy parseArgument (pchar ',')
.>> spaces
.>> pchar ')'
|>> Arguments
Run Code Online (Sandbox Code Playgroud)
上面的代码是正确的,虽然它不能编译。我将在此处发布我的编译版本,以便如果有人只是想毫不费力地试用代码,他们可以这样做。
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
Run Code Online (Sandbox Code Playgroud)