Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Sexplib0.Sexp_grammarSourceRepresentation of S-expression grammars
This module defines a representation for s-expression grammars. Using ppx_sexp_conv and [@@deriving sexp_grammar] produces a grammar that is compatible with the derived of_sexp for a given type.
As with other derived definitions, polymorphic types derive a function that takes a grammar for each type argument and produces a grammar for the monomorphized type.
Monomorphic types derive a grammar directly. To avoid top-level side effects, [@@deriving sexp_grammar] wraps grammars in the Lazy constructor as needed.
This type may change over time as our needs for expressive grammars change. We will attempt to make changes backward-compatible, or at least provide a reasonable upgrade path.
type grammar = | Any of stringaccepts any sexp; string is a type name for human readability
*)| Boolaccepts the atoms "true" or "false", modulo capitalization
*)| Characcepts any single-character atom
*)| Integeraccepts any atom matching ocaml integer syntax, regardless of bit width
*)| Floataccepts any atom matching ocaml float syntax
*)| Stringaccepts any atom
*)| Option of grammaraccepts an option, both None vs Some _ and () vs (_).
| List of list_grammaraccepts a list
*)| Variant of variantaccepts clauses keyed by a leading or sole atom
*)| Union of grammar listaccepts a sexp if any of the listed grammars accepts it
*)| Tagged of grammar with_tagannotates a grammar with a client-specific key/value pair
*)| Tyvar of stringName of a type variable, e.g. Tyvar "a" for 'a. Only meaningful when the body of the innermost enclosing defn defines a corresponding type variable.
| Tycon of string * grammar list * defn listType constructor applied to arguments, and its definition.
For example, writing Tycon ("tree", [ Integer ], defns) represents int tree, for whatever tree is defined as in defns. The following defines tree as a binary tree with the parameter type stored at the leaves.
let defns =
[ { tycon = "tree"
; tyvars = ["a"]
; grammar =
Variant
{ name_kind = Capitalized
; clauses =
[ { name = "Node"
; args = Cons (Recursive ("node", [Tyvar "a"]), Empty)
}
; { name = "Leaf"
; args = Cons (Recursive ("leaf", [Tyvar "a"]), Empty)
}
]
}
}
; { tycon = "node"
; tyvars = ["a"]
; grammar = List (Many (Recursive "tree", [Tyvar "a"]))
}
; { tycon = "leaf"
; tyvars = ["a"]
; grammar = [Tyvar "a"]
}
]
;;To illustrate the meaning of Tycon with respect to defns, and to demonstrate one way to access them, it is equivalent to expand the definition of "tree" one level and move the defns to enclosed recursive references:
Tycon ("tree", [ Integer ], defns)
-->
Variant
{ name_kind = Capitalized
; clauses =
[ { name = "Node"
; args = Cons (Tycon ("node", [Tyvar "a"], defns), Empty)
}
; { name = "Leaf"
; args = Cons (Tycon ("leaf", [Tyvar "a"], defns), Empty)
}
]
}This transformation exposes the structure of a grammar with recursive references, while preserving the meaning of recursively-defined elements.
*)| Recursive of string * grammar listType constructor applied to arguments. Used to denote recursive type references. Only meaningful when used inside the defns of a Tycon grammar, to refer to a type constructor in the nearest enclosing defn list.
| Lazy of grammar lazy_tLazily computed grammar. Use Lazy to avoid top-level side effects. To define recursive grammars, use Recursive instead.
Grammar of a sexp.
and list_grammar = | Emptyaccepts an empty list of sexps
*)| Cons of grammar * list_grammaraccepts a non-empty list with head and tail matching the given grammars
*)| Many of grammaraccepts zero or more sexps, each matching the given grammar
*)| Fields of recordaccepts sexps representing fields of a record
*)Grammar of a list of sexps.
and case_sensitivity = | Case_insensitiveComparison is case insensitive. Used for custom parsers.
*)| Case_sensitiveComparison is case sensitive. Used for polymorphic variants.
*)| Case_sensitive_except_first_characterComparison is case insensitive for the first character and case sensitive afterward. Used for regular variants.
*)Case sensitivity options for names of variant constructors.
Grammar of variants. Accepts any sexp matching one of the clauses.
Grammar of a single variant clause. Accepts sexps based on the clause_kind.
Grammar of a single variant clause's contents. Atom_clause accepts an atom matching the clause's name. List_clause accepts a list whose head is an atom matching the clause's name and whose tail matches args. The clause's name is matched modulo the variant's name_kind.
Grammar of a record. Accepts any list of sexps specifying each of the fields, regardless of order. If allow_extra_fields is specified, ignores sexps with names not found in fields.
Grammar of a record field. A field must show up exactly once in a record if required, or at most once otherwise. Accepts a list headed by name as an atom, followed by sexps matching args.
Grammar tagged with client-specific key/value pair.
Grammar of a recursive type definition. Names the tycon being defined, and the tyvars it takes as parameters. Specifies the grammar of the tycon. The grammar may refer to any of the tyvars, and to any of the tycons from the same set of Recursive definitions.
Top-level grammar type. Has a phantom type parameter to associate each grammar with the type its sexps represent. This makes it harder to apply grammars to the wrong type, while grammars can still be easily coerced to a new type if needed.
This reserved key is used for all tags generated from doc comments.
This reserved key can be used to associate a type name with a grammar.
This reserved key indicates that a sexp represents a key/value association. The tag's value is ignored.
This reserved key indicates that a sexp is a key in a key/value association. The tag's value is ignored.
This reserved key indicates that a sexp is a value in a key/value association. The tag's value is ignored.
When the key is set to Atom "false" for a variant clause, that clause should not be suggested in auto-completion based on the sexp grammar.