program --> "abstract" "syntax" "of" id
definition
"end" [id] ";"
definition --> "is" declaration*
| "extends" id "with" declaration*
declaration --> operator | inclusion | union | line
operator --> id ("," id)* ":" signature ";"
signature --> domain "->" id
domain --> "string"
| "integer"
| "tree"
| [tid ("#" tid)*]
| tid "+"
| tid "*"
| "(" tid ":" tid "->" tid ")"
inclusion --> tid "<" sinclusion ";"
sinclusion --> id
| id "<" sinclusion
union --> id "=" tid ("+" tid)* ";"
Thierry Despeyroux