
BLOCK_COMMENT     ::= '/*' ([^ '*'])*  '*' ('*' | (~['*', '/'] (~['*'])* '*'))* '/'
LINE_COMMENT      ::= '//' ([^'\n', '\r'])*

COMPILE_UNIT      ::= MODULE IMPORT (CLASS | INTERFACE)+
MODULE            ::= 'module' ID ('.' ID)* ';'
IMPORT            ::= 'import' '{' (ID ('.' ID)+ ';')* '}'
CLASS             ::= ['export'] 'class' ID ['extends' ID] ['conforms' ID+] '{'
                        (FIELD | METHOD | CONSTRUCTOR)*
                        ( ACCESS ':' (FIELD | METHOD | CONSTRUCTOR)* )*
                      '}'
INTERFACE         ::= ['export'] 'interface' ID ['conforms' ID+] '{'
                         ID '(' ID ':' TYPE (',' ID ':' TYPE)+ ')' [':' TYPE] ';'
                      '}'
FIELD             ::= ['forward'] FIELD_ID ':' TYPE ['=' EXPRESSION] ';'
METHOD            ::= ID '(' ID (',' ID)* ')' [':' TYPE] BLOCK
STATEMENT         ::= WHILE | IF| COND | FOR | SYNCHRONIZED | TRY | BREAK | EMPTY | EXPSTATEMENT | BLOCK | LOCAL | RETURN | THROW
RETURN            ::= 'return' [EXPRESSION] ';'
THROW             ::= 'throw' EXPRESSION ';'
WHILE             ::= 'while' EXPRESSION BLOCK
IF                ::= 'if' EXPRESSION BLOCK ['else' BLOCK]
COND              ::= 'cond' '{' (EXPRESSION BLOCK)+ ['else' BLOCK] '}'
SELECT            ::= 'select' EXPRESSION '{' (case EXPRESSION_LIST BLOCK)* ['else' BLOCK] '}'
FOR               ::= 'for' (VARIABLE_DECLARATION | EXPRESSION_STATEMENT) EXPRESSION ';' EXPRESSION BLOCK
SYNCHRONIZED      ::= 'synchronized' EXPRESSION BLOCK
TRY               ::= 'try' BLOCK ('rec' ID ':' TYPE BLOCK)* 'fin' BLOCK
BREAK             ::= 'break' ';'
CONTINUE          ::= 'continue' ';'
EMPTY             ::= ';'
EXPSTATEMENT      ::= EXPRESSION ';'
BLOCK             ::= '{' STATEMENT* '}'
LOCAL             ::= ID ':' TYPE  ['=' EXPRESSION] ';'
TYPE              ::= 'byte' | 'short' | 'char' | 'int' | 'long' | 'float' | 'double' | 'boolean' | 'void' | ID | ('[]')* TYPE
EXPRESSION        ::= EXPRESSION BINARY_OPERATOR EXPRESSION | 
                      EXPRESSION ASSIGN_OPERATOR EXPRESSION |
                      UNARY_OPERATOR EXPRESSION |
                      EXPRESSION ('.' ID ['('[EXPRESSION (',' EXPRESSION)*]')'])* |
                      'new' TYPE '[' EXPRESSION_LIST ']'
                      'new' TYPE ['(' [EXPRESSION_LIST] ')']
                      ID '::' ID ['(' [EXPRESSION_LIST] ')'] |
                      EXPRESSION ('[' EXPRESSION ']')* |
                      '(' EXPRESSION ')' |
                      ID ['(' [EXPRESSION_LIST] ')'] |
                      EXPRESSION 'is' TYPE | 
                      EXPRESSION '$' TYPE |
                      'self' |
                      LITERAL
EXPRESSION_LIST   ::= EXPRESSION (',' EXPRESSION)*
LITERAL           ::= INTEGER | FLOAT | CHARACTER | STRING | BOOLEAN | LIST | NIL
UNARY_OPERATOR    ::= '!' | '-' | '+' | '~'
BINARY_OPERATOR   ::= '+' | '-' | '*' | '/' | '%' | '<' | '>' | '<=' | '>=' | '<<' || '>>' | '>>>' | '^' | '&' | '||' | '&&' 
ASSIGN_OPERATOR   ::= '=' | '+=' | '-=' | '*=' | '/=' | '%='
ID                ::= ('a'..'z', 'A'..'Z', '_') ('a'..'z', 'A'..'Z', '0'..'9', '_')*
FIELD_ID          ::= '@' ID