| Program | ::= | ( TypeDecl )* ImportSt ( ExportTp )? ( SwitchCase )? <EOF> |
| TypeDecl | ::= | <TYPE> Identifier "=" TypeExpr ";" |
| ImportSt | ::= | <IMPORT> TypeExpr ";" |
| ExportTp | ::= | <EXPORT> TypeExpr ";" |
| SwitchCase | ::= | <SWITCH> "(" Identifier ")" "{" ( Case )* ( ( ( <CASEDEFAULT> ) ":" StatementList ) )? "}" |
| Case | ::= | <CASE> TypeExpr ":" StatementList |
| StatementList | ::= | ( "{" ( Statement )* "}" | ";" | Statement ) |
| Statement | ::= | <PRINT> "(" ValueExpr ")" ";" |
| ValueExpr | ::= | ( ValueTerm ( "," ValueTerm )* ) |
| ValueTerm | ::= | ( ( Label "[" "]" ) | ( Label "[" ValueExpr "]" ) | ( Identifier ) | "(" ValueExpr ")" | "()" | Literal ) |
| TypeExpr | ::= | ( CommaSeq ( "|" CommaSeq )* ) |
| CommaSeq | ::= | ( UnaryOp ( "," UnaryOp )* ) |
| UnaryOp | ::= | ( ( TermExpr ( ( ( "*" ) | ( "+" ) | ( "?" ) ) )? ) ( ( <AS> Identifier ) )? ) |
| TermExpr | ::= | ( ( Label "[" "]" ) | ( Label "[" TypeExpr "]" ) | ( Identifier ) | "(" TypeExpr ")" | "()" | PrimitiveType | Literal ) |
| Literal | ::= | ( <STRING_LITERAL> ) |
| PrimitiveType | ::= | <STRING> |
| Label | ::= | ( <ANYTAG> | <IDENTIFIER> ) |
| Identifier | ::= | <IDENTIFIER> |