1

これには本当に簡単な答えがあると確信していますが、私は一日中これを見つめていて、それを理解することができません.

チュートリアルに従って、JSON パーサーを実装しています。自分自身に挑戦するために、numberパーサーを自分で実装しています。

これは私がこれまでに得たものです:

let jnumber =
    let neg = stringReturn "-" -1 <|> preturn 1
    let digit = satisfy (isDigit)
    let digit19 = satisfy (fun c -> isDigit c && c <> '0')
    let digits = many1 digit
    let ``int`` =
        digit
        <|> (many1Satisfy2 (fun c -> isDigit c && c <> '0') isDigit)

問題は、それdigitParser<char,_>であるのに対し、 の 2 番目のオプションはintですParser<string,_>。通常、コンビネータを使用して にdigit変換しParser<char,_>ますか、それとも何か他にすべきことはありますか?

4

1 に答える 1

3

演算子は|>>あなたが探しているものです。FParsecリファレンスを引用します:

val (|>>): Parser<'a,'u> -> ('a -> 'b) -> Parser<'b,'u> 

パーサーp|>> fは、パーサーpを適用し、関数適用fxの結果を返します。ここで、xはpによって返される結果です。

p | >> fは、p >> = fun x-> preturn(fx)の最適化された実装です。

例えば:

let jnumber =
    let neg = stringReturn "-" -1 <|> preturn 1
    let digit = satisfy (isDigit)
    let digit19 = satisfy (fun c -> isDigit c && c <> '0')
    let digits = many1 digit
    (digit |>> string) (* The operator is used here *)
    <|> (many1Satisfy2 (fun c -> isDigit c && c <> '0') isDigit)

この演算子を非常に集中的に使用するJSONの解析に関するFParsecチュートリアルを読むことをお勧めします。

于 2012-09-22T08:07:27.133 に答える