ヌーブアラート!
わかりました、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 パーサーによって返された関数をどのように適用するかがわかりません。