【问题标题】:Applying a function returned from a subparser with fparsec使用 fparsec 应用从子解析器返回的函数
【发布时间】:2015-05-31 08:13:46
【问题描述】:

新手警报!

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

【问题讨论】:

    标签: f# fparsec


    【解决方案1】:

    像往常一样,我在发布问题后(经过 3 小时的搜索)立即找到了答案。

    我刚刚更改了这一行:

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

    到这里:

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

    但是,我刚刚意识到我的表达式是向后解析的。回到绘图板。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多