Type ::= Atomic (Union | Intersection)? Union ::= ('|' Atomic)+ Intersection ::= ('&' Atomic)+ Atomic ::= Identifier (Generic | Array)? | '(' Type ')' Array? Generic ::= '<' Type (',' Type)* '>' Array ::= ('[' ']')+ Identifier ::= ('\'? Word)+ Word ::= [a-zA-Z_#x7F-#x10FFFF][0-9a-zA-Z_#x7F-#x10FFFF]*