0

ヌーブアラート!

わかりました、fparsec で簡単な数式パーサーを構築しようとしています。今私がやりたいことは、この "1+2-3*4/5" のような文字列を処理し、評価の結果として double を返すことだけです。スペース、改行、または括弧は使用せず、左から右への操作順序で問題ありません。

これが私がこれまでに持っているものです:

let number = many1 digit |>> fun ds -> int <| String.Concat(ds)

let op : Parser<int -> int -> int, unit> =
    charReturn '+' (+) <|>
    charReturn '-' (-) <|>
    charReturn '*' (*) <|>
    charReturn '/' (/)

let expression, expressionImpl = createParserForwardedToRef()
do expressionImpl :=
    choice[
        attempt(number .>> op >>. expression);
        number]

let test p str =
    match run (p .>> eof) str with
    | Success(result, _, _) -> printfn "Success: %A" result
    | Failure(result, _, _) -> printfn "Failure: %A" result

[<EntryPoint>]
let main argv = 

    test expression "1+1/2*3-4"
    Console.Read() |> ignore

    0

式パーサーの最初の選択では、op パーサーによって返された関数をどのように適用するかがわかりません。

4

1 に答える 1

0

いつものように、質問を投稿した直後 (3 時間検索した後) に答えを見つけます。

この行を変更しました:

attempt(number .>> op >>. expression);

これに:

attempt(pipe3 number op expression (fun x y z -> y x z));

ただし、式が逆方向に解析されることに気付きました。ふりだしに戻る。

于 2015-05-31T00:13:46.417 に答える