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)* ";"