0

菜鸟警报!

好的,我正在尝试在 fparsec 中构建一个简单的数学表达式解析器。现在我想要它做的就是处理像这样的字符串“1+2-3*4/5”并返回一个双精度值作为评估的结果。没有空格、换行符或括号,从左到右的操作顺序很好。

这是我到目前为止所拥有的:

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 回答