Может кто-нибудь привести пример использования chainl1 в FParsec?

Это самый загадочный комбинатор во всех FParsec...

http://www.quanttec.com/fparsec/reference/primitives.html

... но нет примера того, как использовать его в документации или, AFAIK, на любых веб-страницах в Интернете. У меня есть леворекурсивный разбор, который, кажется, требует этого, но я не могу понять, как это назвать или что передать ему.

Пожалуйста помоги:)

2 ответа

Решение

У меня есть несколько красивых диаграмм с участием chainl1 (из моего собственного кода C#) здесь:

http://lorgonblog.wordpress.com/2007/12/04/monadic-parser-combinators-part-three/

Я собрал простой анализатор выражений в FParsec в конце этого поста. Вот выдержка с использованием chainl1 сделать синтаксический анализатор для связанного операторного выражения из анализаторов для операнда и оператора.

(* fop : (double -> double -> double) -> (env -> double) -> (env -> double) -> env -> double *)
let fop op fa fb env = fa env |> op <| fb env
(* Parse single operators - return function taking two operands and giving the result *)
let (addop : Parser<_,unit>) = 
    sym "+" >>% fop (+)
    <|> ( sym "-" >>% fop (-) )
(* term, expr - chain of operators of a given precedence *)
let term = chainl1 atom mulop
let expr = chainl1 term addop
Другие вопросы по тегам