package orsetto

  1. Overview
  2. Docs
Legend:
Library
Module
Module type
Parameter
Class
Class type

The basic scanner module.

type +'r t

The monad type.

include Cf_monad.Unary.Profile with type +'r t := 'r t

Module inclusions from Cf_monad_core and Cf_seqmonad.

include Cf_monad.Core.Unary.Profile with type 'r t := 'r t
val return : 'r -> 'r t

Use return a to apply the binding to a.

val bind : 'a t -> ('a -> 'b t) -> 'b t

Use bind m f to bind f to the value returned by m.

val map : 'a t -> f:('a -> 'b) -> 'b t

Use map m f to return the result of applying f to the value returned by m.

module Infix : Cf_monad_core.Unary.Infix with type 'r t := 'r t

Open Infix to include the infix monad operators.

val disregard : 'r t -> unit t

Use disregard m to ignore the value returned by m and apply the unit value to the bound function.

include Cf_seqmonad.Functor.Unary with type 'r t := 'r t
val collect : 'r t Seq.t -> (int * 'r list) t

Use collect s to bind in sequence every monad value in the finite sequence s and collect all the returned values. Returns (n, s) where n is the number of values collected and s is the list of values in reverse order, i.e. from last collected to first collected. Never returns and exhausts all memory if s never terminates.

val serial : unit t Seq.t -> unit t

Use serial s to bind in sequence every monad value in the sequence s.

val nil : 'r t

A scanner that never produces any value.

val fin : bool t

A scanner that returns true at the end of the input sequence, otherwise returns false.

Backtracking
type mark

The abstract type representing a resumption point in the input.

val cur : mark t

A scanner that produces a mark captured at the current position.

val mov : mark -> unit t

Use mov mark to resume scanning at the captured mark.

val pos : mark -> unit form

Use pos mark to make a unit value attributed with the position of captured mark. Raises Not_found if mark was captured at the end of the input stream.

Terminal Scanner
val any : symbol form t

The universal symbol scanner. Recognizes any symbol in the input stream and produces its form. Does not produce anything at the end of input.

val one : symbol -> symbol form t

The literal symbol scanner. Use one symbol to make a scanner that recognizes symbol in the input stream and produces its form.

val sat : (symbol -> bool) -> symbol form t

The symbol satisfier scanner. Use sat f to make a scanner that recognizes any symbol for which applying f returns true and produces its form.

val ign : (symbol -> bool) -> unit form t

The ignore scanner. Use ign f to make a scanner that scans the input while applying f to each symbol returns true, then produces a unit form that annotates the span of ignored symbols. Produces an implicit unit form if the end of input has already been reached.

val tok : (symbol -> 'r option) -> 'r form t

The symbolic token scanner. Use tok f to make a scanner that recognizes any symbol for which applying f returns Some v, then produces the form of v.

Scanner Composers
val ntyp : 'r Cf_type.nym -> 'r form t -> Cf_type.opaque form t

The opaque value form scanner composer. Use ntyp n p to make a scanner that encloses the value contained in the form produced by p in an opaque value with the runtime type indicated by n and returns its form in the same position.

val dflt : 'r -> 'r t -> 'r t

The default value scanner. Use dflt v p to produce the output of p or the default value v if p does not produce output.

val opt : 'r t -> 'r option t

The optional scanner composer. Use opt p to make a scanner that produces either Some v if p produces v otherwise None.

val vis : ?a:int -> ?b:int -> ('r -> 'r t) -> 'r -> 'r t

The visitor scanner composer. Use vis ?a ?b f v to compose a scanner that recognizes a sequence of elements in the input stream by applying a visitor function f at each element to obtain its scanner. The first element is visited with the initializer v, and each following element is visited with the value returned by the preceding scanner.

If ~a is used, then it specifies the minimum number of elements to visit. If ~b is used then it specifies the maximum number of elements to visit. Composition raises Invalid_argument if a < 0 or b < a.

val seq : ?a:int -> ?b:int -> 'r t -> 'r list t

The homogenous list scanner composer. Use seq ?a ?b p to create a new scanner that uses p to recognize and produce, in order, each element in a sequence of elements in the input stream.

If ~a is used, then it specifies the minimum number of elements that must be recognized and produced in the output. If ~b is used then it specifies the maximum number of elements to recognize. Composition raises Invalid_argument if a < 0 or b < a.

val alt : 'r t list -> 'r t

The bounded multiple choice scanner. Use alt ps to create a scanner that produces the output from the first scanner ps that produces. If no scanner in ps produces output, then the resulting scanner does not produce.

val altz : 'r t Seq.t -> 'r t

The unbounded multiple choice scanner. Use alt ps to create a scanner that produces the output from the first scanner ps that produces. If no scanner in ps produces output, then the resulting scanner does not produce.

Error Parsers
type exn +=
  1. | Bad_syntax of string form

A distinguished syntax failure exception.

val fail : string -> 'r t

Use fail msg to raise Bad_syntax with msg optionally annotated with the current position.

val or_fail : string -> 'r t -> 'r t

Use or_fail msg p to make a scanner that raises Bad_syntax with msg if p does not recognize its input. It may be convenient to call this function with a pipeline operator, i.e. p |> or_fail "reasons".

val err : ?x:exn -> unit -> 'r t

Use err ~x () to make a scanner that raises x. If ?x is not provided, then it raises Not_found.

val errf : ?xf:(mark -> 'x) -> unit -> 'r t

Use errf ~xf () to make a scanner that captures a mark and applies it to xf to raise an exception. If ?xf is not provided, then raises Not_found.

val req : ?x:exn -> 'r t -> 'r t

Use req ~x p to make a scanner that either produces the output of p or raises x. If p does not produce and ?x is not provided, then it raises Not_found.

val reqf : ?xf:(mark -> 'x) -> 'r t -> 'r t

Use reqf ~xf p to make a scanner that either produces the output of p or captures a mark at the current input and applies it to xf to raise an exception. If ?xf is not provided, then raises Not_found.

val ck : 'r t -> ('r, exn) result t

The error check scanner. Use ck p to create a new scanner that either produces either Ok v if p produces v or Error x if scanning the input with p raises the exception x.

val sync : 'r t -> 'r option t

The error recovery scanner. Use sync p to scan the input with p until it produces or reaches the end of input. Produces Some v if p ever produces v, otherwise produces None if the end of input is reached without p producing a value.

Elaboration
val lift : ?start:position -> 'r t -> symbol Seq.t -> 'r Seq.t

Use lift p s to map s into a persistent sequence of the values produced by p. If ~start is provided, then it specifies the starting position of the first symbol in s.

val of_seq : ?start:position -> 'r t -> symbol Seq.t -> 'r

Use of_seq p s to parse s with p and return the result. Raises Not_found if p does not recognize the entire sequence of s. If ~start is provided, then it specifies the starting position of the first symbol in s.

module Affix : sig ... end

Combinator operators