BNF for XRel.jj

NON-TERMINALS

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>