[wg-camlp4] A new branch to experiment with extension points

Alain Frisch alain.frisch at lexifi.com
Fri Mar 1 18:51:45 GMT 2013


On 03/01/2013 06:52 PM, Leo White wrote:
> The standard way to define a delimiter like "(:", in keeping with how
> the rest of OCaml is parsed, is to make it a single token from the lexer.

Agreed!

>
> 1. Extensions:
>
>      (: ident expr_opt )
>    Used as a structure item, signature item, expression or type expression.
>
> 2. Attributes:
>
>      [: ident expr_opt ]
>
>    Attached postfix to structure items, signature items, expressions or
>    type expressions.
>
> 3. With Attributes
>
>      with ident ( expr), ident, ident (expr)
>    Attached postfix to structure items or signature items.

This looks good to me.

We also need attributes on individual types in a type declaration.

Also, I think it make sense for structure/signature items, to consider 
that attributes are "between" items, to support things like ocamldoc 
section headers.

I've started to work on a change to the Parsetree (unfinished, not 
committed yet):

http://alain.frisch.fr/split_type_decls.txt

where each declared type in a type declaration become a full 
structure/signature item with a marker telling if this is the first type 
in the declaration or not (similar to the representation of signatures 
in the Types module).  This puts some extra invariants in the Parsetree 
(a Pstr_type Prec_nextmust follow another Pstr_type ..., maybe with 
attributes in between), but then we don't need to distinguish 
syntactically attributes on a declared type and attributes on the whole 
declarations, which would be hard to explain to users.

The goal is to be able to write (keeping my original syntax for 
attributes in structure items):

===============================================
..(:doc 2 "My section header")

type t = {...} ..(:id expr) ..(:id expr)
and  s = {...} ..(:id expr)

..(:doc 2 "Another section header")
===============================================

Here we have the following sequence of structure items:

  Pstr_attribute "doc"
  Pstr_type (Prec_first, ...)
  Pstr_attributes "id"
  Pstr_attributes "id"
  Pstr_type (Prec_next, ...)
  Pstr_attributes "id"
  Pstr_attributes "doc"



Independently of the syntax, I'd be interested to get feedback on these 
two proposals:

  -  splitting declarations of mutually recursive types into single 
declarations in the Parsetree, and

  -  having attributes as standalone items within signatures and 
structures (so also between types in a single recursive declaration) 
instead of having them attached to other items.


Alain


More information about the wg-camlp4 mailing list