Reparse –用于OCaml的综合解析器组合器

2020-12-04 20:52:47

计算器是解析器的世界。这是Reparse中的一种实现,支持+,-,*和/。

模块P =重新解析。解析器打开P.Infix类型expr = | int int | expr * expr的加|子expr * expr |多个expr * expr | expr的Div * expr let skip_spaces = P.skip P.space let binop exp1 op exp2 f = P.map3(fun e1 _ e2-> f e1 e2)exp1(skip_spaces *> P. char op< * skip_spaces )exp2 let integer = let + d = Int中的P位(int_of_string d)let factor expr = P.any [P. char'(' *> skip_spaces *> expr< * * skip_spaces < * P. char')' ; skip_spaces *>整数< * skip_spaces]在let div = binop中让条件项= P.recur(有趣的条件-> let mult = binop系数&* 39; *'项(fun e1 e2-> Mult(e1,e2))系数(< |> div< |>中的系数(fun e1 e2-> Div(e1,e2))项)expr = P.recur(fun expr- > let因子= let项中的factor expr,let let =项中的术语factor' +' expr(fun e1 e2-> let sub = binop项中的Add(e1,e2))& P.any [add; sub; term]中的#39;-&#39 expr(fun e1 e2-> Sub(e1,e2)))let rec eval = function |诠释->我加(e1,e2)->评估e1 +评估e2 |子(e1,e2)->评估e1-评估e2 |多(e1,e2)->评估e1 *评估e2 | Div(e1,e2)->评估e1 /评估e2(*测试AST *)令r =令实际= P.parse_string expr" 1 * 2-4 + 3" in let expect = Bool中的Sub(Mult(Int 1,Int 2),Add(Int 4,Int 3))。equal(expected = Actual)true(*运行并测试评估器。*)let exp_result = let v =等于22 v的eval(P.parse_string expr" 12 + 1 * 10")

< expr> :: =<条款> " +" < expr> | <条款> < term> :: =<要素> " *" <条款> | <要素> < factor> :: ="("< expr>")" |整数