Syntax tree quotations in user syntax¶
Syntax tree quotations in user syntax
The quotation kit “q_ast.cmo
” allows to use syntax tree
quotations in user syntax. It fully works only in “strict” mode. In
“transitional” mode, there is no way to use antiquotations, which
restricts its utility.
If this kit is loaded, when a quotation of syntax tree is found, the current OCaml language parser is called. Then, the resulting tree is reified (except the antiquotations) to represent the syntax tree of the syntax tree.
Antiquotations
The OCaml langage parser used, and its possible extensions, must have
been built to allow the places of the antiquotations. The symbols
enclosed by the meta-symbol “V
” (see the chapter about
extensible grammars, section “symbols”), define
where antiquotations can take place.
There is no need to specify antiquotations for the main types defined
in the AST tree module (“MLast
”): “expr
”, “patt
”,
“expr
”, “str_item
”, “sig_item
”, and so on. All syntax
parts of these types are automatically antiquotable.
For example, in Camlp5 sources, the grammar rule defining the “let..in” statement is:
"let"; r = V (FLAG "rec") "flag" "opt";
l = V (LIST1 let_binding SEP "and"); "in"; x = expr
All symbols of these rules, except the keywords, are antiquotable:
- The “rec” flag, because enclosed by the “V” meta symbol. The two
strings which follow it gives the possible antiquotation kinds:
“flag” (the normal antiquotation kind) and “opt” (kept by backward
compatibility, but not recommended). It is therefore possible to
antiquote it as: “
$flag:...$
” or “$opt:...$
” where the “...
” is an expression or a pattern depending on the position of the enclosing quotation - The binding list is also antiquotable, since it is also enclosed
by the “V” meta symbol. Its antiquotation kind is “list” (the
default when the meta symbol parameter is a list). It is therefore
possible to write “
$list:...$
” at the place of the binding list. - The expression after the “in” is also antiquotable, because it
belongs to the main types defined in the module “
MLast
”.
In that example, the variable “r
” is of type
“Ploc.vala bool
”, the variable “r
” of type
“Ploc.vala (list (patt * expr))
” and the variable “x
” of
type “MLast.expr
”.
… to be completed …