有人可以举一个在FParsec中使用chainl1的例子吗?

时间:2012-01-19 18:19:47

标签: f# fparsec

这是所有FParsec中最令人费解的组合......

http://www.quanttec.com/fparsec/reference/primitives.html#members.chainl1

...但是没有关于如何在文档或AFAIK中在互联网上的任何网页上使用它的示例。我有一个似乎需要它的左递归解析,但对于我的生活,我无法弄清楚如何调用它或传递给它的内容。

请帮助:)

2 个答案:

答案 0 :(得分:4)

我有一些漂亮的图表涉及chainl1(来自我自己的C#代码):

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

答案 1 :(得分:2)

我在this unrelated post末尾的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