atom : literal | IDENTIFIER | LPAREN expression RPAREN ; primary : atom (trailer)*; trailer : LPAREN expression_list? RPAREN | LBRACK expression RBRACK | TOK_DOT IDENTIFIER ; expression_list : expression (TOK_COMMA expression)*; u_expr : primary | TOK_MINUS u_expr | TOK_PLUS u_expr; m_expr : u_expr ((TOK_MUL|TOK_DIV|TOK_MOD) u_expr )*; a_expr : m_expr ((TOK_PLUS|TOK_MINUS) m_expr)*; comparison : a_expr ((comp_operator) a_expr)?; comp_operator : TOK_GT | TOK_LT | TOK_EQ_EQ | TOK_GT_EQ | TOK_LT_EQ | TOK_DIFF; not_test: comparison | TOK_KW_NOT not_test; and_test: not_test ( TOK_KW_AND not_test )*; or_test: and_test ( TOK_KW_OR and_test )*; expression : or_test; directive_stmt : include_directive TOK_SEMICOLON; include_directive : TOK_KW_INCLUDE STRING_LITERAL; end_stmt: TOK_KW_END; simple_stmt : expression_stmt | return_stmt | break_stmt | continue_stmt ; expression_stmt : expression (TOK_EQ expression)?; target : primary; return_stmt : TOK_KW_RETURN expression?; break_stmt : TOK_KW_BREAK; continue_stmt : TOK_KW_CONTINUE; compound_stmt : if_stmt | while_stmt | for_stmt | func_declaration | class_declaration ; statement : (simple_stmt | compound_stmt) TOK_SEMICOLON; statement_list : statement+; if_stmt : TOK_KW_IF expression TOK_KW_THEN statement_list? (end_stmt | (TOK_KW_ELSE (statement_list? end_stmt))); while_stmt : TOK_KW_WHILE expression TOK_KW_THEN statement_list? end_stmt; for_stmt: TOK_KW_FOR expression_stmt TOK_KW_TO expression TOK_KW_THEN statement_list? end_stmt; func_declaration : TOK_KW_FUNCTION IDENTIFIER LPAREN parameter_list? RPAREN statement_list? end_stmt; parameter_list : IDENTIFIER (TOK_COMMA IDENTIFIER)*; class_declaration : TOK_KW_CLASS IDENTIFIER inheritance? statement_list? end_stmt; class_name_list : IDENTIFIER (TOK_COMMA IDENTIFIER)*; inheritance : TOK_KW_INHERIT LBRACE class_name_list RBRACE; file_input : directive_stmt* statement* ; literal : (int_literal | double_literal | string_literal | char_literal); int_literal : INT_LITERAL; double_literal : DOUBLE_LITERAL; string_literal : STRING_LITERAL; char_literal : CHAR_LITERAL; LPAREN : '('; RPAREN : ')'; LBRACK : '['; RBRACK : ']'; LBRACE : '{'; RBRACE : '}'; TOK_PLUS: '+'; TOK_MINUS : '-'; TOK_MOD : '%'; TOK_MUL : '*'; TOK_DIV : '/'; TOK_EQ : '='; TOK_EQ_EQ : '=='; TOK_LT : '<'; TOK_GT : '>'; TOK_LT_EQ : '<='; TOK_GT_EQ : '>='; TOK_DIFF: '!='; TOK_DOT : '.'; TOK_KW_NOT : 'KhongPhai'; TOK_KW_AND : 'Va'; TOK_KW_OR : 'Hoac'; TOK_KW_END : 'Het'; TOK_KW_RETURN : 'TraVe'; TOK_KW_BREAK : 'NgungLap'; TOK_KW_CONTINUE : 'QuayLen'; TOK_KW_IF : 'Neu'; TOK_KW_THEN : 'Thi'; TOK_KW_ELSE : 'KhongThi'; TOK_KW_FOR : 'Voi'; TOK_KW_TO : 'Den'; TOK_KW_WHILE : 'Khi'; TOK_KW_INCLUDE : 'SuDung'; TOK_KW_FUNCTION : 'HamSo'; TOK_KW_CLASS : 'Lop'; TOK_KW_INHERIT : 'KeThua'; TOK_COMMA : ','; TOK_SEMICOLON : ';'; IDENTIFIER : LETTER (LETTER|DIGIT)*; fragment LETTER : 'A'..'Z' | 'a'..'z' | '_'; fragment DIGIT : '0' | NZ_DIGIT; fragment NZ_DIGIT: '1'..'9'; CHAR_LITERAL : '\'' (EscapeSequence | ~('\''|'\\')) '\''; INT_LITERAL : NZ_DIGIT DIGIT* | '0'; DOUBLE_LITERAL : ('0' | NZ_DIGIT DIGIT*) '.' DIGIT*; fragment EscapeSequence : '\\' ('b'|'t'|'n'|'r'|'\''|'\\'|'\"'); STRING_LITERAL : '"' ( EscapeSequence | ~('\\'|'"') )* '"'; WS : (' '|'\r'|'\t'|'\n'|'\u000C') ; COMMENT : '/*'.* '*/' ; LINE_COMMENT : '//' ~('\n'|'\r')* '\r'? '\n' ;