2015-05-30 2 views
0

Noob alert!Применение функции, возвращаемой из подпараметра с помощью 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)); 

Однако, я просто понял, что мои выражения синтаксических назад. Вернуться к доске для рисования.