packagereparse-lwt
Reparse Lwt_stream.t input support
Install
Dune Dependency
Authors
Maintainers
Sources
reparse-v3.1.0.tbz
sha256=60e57fdac0ae0b68b41a0cb5bd50327c84b306d40f74e9c21925c08049703e1d
sha512=329be459bbf3f354119298fcf4ac22c1a400b9acd213267e732b76bcf2add81eb80c713aec2b007ba9a47ace075a67467c10e305fad7fd2a63a5456f668b35ab
Description
char Lwt_stream.t parsing support for 'reparse'
Published:14 Jul 2021
README
Reparse
Reparse is a monadic, recursive descent based, comprehensive parser construction library for ocaml.
Getting Started
$ opam install reparse
Addreparse
to dune,
(executable # or library (name hello_world) (public_name hello_world) (libraries reparse))
Example - Calculator
Acalculator is thehello world
of parsers. Here is an implementation inReparse
which supports+,-,*
and/
operations.
# #require "reparse";;
open Reparse.Stringtype expr = | Int of int | Add of expr * expr | Sub of expr * expr | Mult of expr * expr | Div of expr * exprlet skip_spaces = skip spacelet binop : 'a t -> char -> 'b t -> ('a -> 'b -> 'c) -> 'c t = fun exp1 op exp2 f -> (exp1, skip_spaces *> char op <* skip_spaces, exp2) <$$$> fun e1 _ e2 -> f e1 e2let integer : expr t = let+ d = skip_spaces *> digits <* skip_spaces in Int (int_of_string d)let factor : expr t -> expr t = fun expr -> any [ char '(' *> skip_spaces *> expr <* skip_spaces <* char ')'; integer ]let term : expr t -> expr t = fun factor -> recur (fun term -> let mult = binop factor '*' term (fun e1 e2 -> Mult (e1, e2)) in let div = binop factor '/' term (fun e1 e2 -> Div (e1, e2)) in mult <|> div <|> factor)let expr : expr t = recur (fun expr -> let factor = factor expr in let term = term factor in let add = binop term '+' expr (fun e1 e2 -> Add (e1, e2)) in let sub = binop term '-' expr (fun e1 e2 -> Sub (e1, e2)) in any [ add; sub; term ] <?> "expr")let rec eval : expr -> int = function | Int i -> i | Add (e1, e2) -> eval e1 + eval e2 | Sub (e1, e2) -> eval e1 - eval e2 | Mult (e1, e2) -> eval e1 * eval e2 | Div (e1, e2) -> eval e1 / eval e2
# let ast = parse (create_input_from_string "1*2-4+3") expr ;;val ast : (expr * int, string) result = Ok (Sub (Mult (Int 1, Int 2), Add (Int 4, Int 3)), 7)# eval @@ Result.get_ok (parse (create_input_from_string "12+1*10") expr);;Line 1, characters 9-72:Error: This expression has type expr * int but an expression was expected of type expr
More Examples
sectionYPositions = computeSectionYPositions($el), 10)" x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)" >
On This Page