菜鸟警报!
好的,我正在尝试在 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解析器返回的函数。