4

FParsec でメソッド引数パーサーを実装しようとしています。

FParsec 自体に、この目的に役立つ機能が既に実装されているかどうか疑問に思っていましたか? FParsec は演算子の優先順位を扱うときにツールを提供するため、これにも何かがあるかもしれません。


左中括弧と右中括弧の解析は非常に簡単です。頭痛の種は、発生する可能性のある次の 3 つのケースに対処することです。

メソッドの引数は次のもので構成できます。

  • 引数なし、
  • 一つの引数、
  • いくつかの引数 (すべてカンマ区切り)。最後の引数の前にカンマを付けることはできないことに注意してください!

組み込み機能がない場合、つまり <|> 演算子とストリームコピーを使用して、これを自分で実装する方法については、すでにいくつかの手がかりがありますが、そのような低レベルのものから離れたいと思います可能。

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 に答える