Movatterモバイル変換


[0]ホーム

URL:


packagereparse-lwt

  1. Overview
  2. Docs

You can search for identifiers within the package.

in-package search v0.2.0

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.

Reparse Documentation

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

Dependencies (5)

  1. reparse= version
  2. cstruct>= "6.0.0"
  3. lwt>= "5.4.1"
  4. ocaml>= "4.10.0"
  5. dune>= "2.9"

Dev Dependencies (1)

  1. odocwith-doc

Used by

None

Conflicts

None


[8]ページ先頭

©2009-2025 Movatter.jp