2015-05-30 32 views
0

Noob警報!使用fparsec從子分析器返回的函數

好吧,我試圖在fparsec中構建一個簡單的數學表達式解析器。現在我想要做的就是處理這樣的「1 + 2-3 * 4/5」字符串,並返回一個雙倍的評價結果​​。沒有空格,換行符或者parens,並且從左到右的操作順序沒問題。

這是我到目前爲止有:

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 

在表達式解析器的第一選擇,我不知道如何申請由運解析器返回的功能。

回答

0

像往常一樣,我發現問題後發現答案(3小時後)。

我只是改變這一行:

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

這樣:

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

然而,我才意識到,我的表情解析倒退。回到繪圖板。