【问题标题】:Can someone give an example of using chainl1 in FParsec?有人可以举一个在 FParsec 中使用 chainl1 的例子吗?
【发布时间】:2012-01-19 18:19:46
【问题描述】:

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

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

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

请帮忙:)

【问题讨论】:

标签: f# fparsec


【解决方案1】:

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

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

【讨论】:

  • 这看起来很不错。我将尝试利用它,并在成功时将其标记为答案:)
【解决方案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

【讨论】:

    猜你喜欢
    • 2016-06-07
    • 2018-02-15
    • 2013-05-06
    • 2015-07-31
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多