muldiv_expr() { variable(); KurumiToken op = get_current_token(); bool loop_flag = true; while (op != null && loop_flag) { switch (op.to_operator_type()) { case KurumiOperatorType.MUL: case KurumiOperatorType.DIV: next(); variable(); expression.add(op, storage); break; default: loop_flag = false; break; } op = get_current_token(); } }
equals_expr() { addsub_expr(); KurumiToken op = get_current_token(); bool loop_flag = true; while (op != null && loop_flag) { switch (op.to_operator_type()) { case KurumiOperatorType.LTHAN: case KurumiOperatorType.GTHAN: case KurumiOperatorType.LOREQ: case KurumiOperatorType.GOREQ: case KurumiOperatorType.NOTEQ: case KurumiOperatorType.EQUAL: next(); addsub_expr(); expression.add(op, storage); break; default: loop_flag = false; break; } op = get_current_token(); } }
call_args() { int count = 0; next(); KurumiToken token = get_current_token(); OperatorType t = token.to_operator_type(); while (token != null && t != OperatorType.RBRACKET && t != OperatorType.ENDLINE) { count += 1; equals_expr(); token = get_current_token(); t = token.to_operator_type(); if (t == OperatorType.COMMA) { next(); } } next(); return(count); }
lexpr() { KurumiToken current = get_current_token(); switch (current.type) { case TokenType.Identifier: KurumiKeyword keyword = current.is_keyword(); if (keyword == KurumiKeyword.UNKNOWN) { KurumiToken n = get_current_token(1); if (n == null) { return; } OperatorType type = n.to_operator_type(); if (type == OperatorType.COLON) { KurumiNumber number = goto_storage.get(current.data); number.number = expression.size(); next(); next(); } else if (type == OperatorType.LBRACKET) { function_call(current, 0); } else { rexpr(); } } else { keyword_expression(keyword); } break; case TokenType.Operator: next(); return; default: throw new Exception("Identifier or Keyword is expected in the left-sided expression."); } }
rexpr() { KurumiToken current = get_current_token(); while (current != null) { OperatorType type = current.to_operator_type(); bool v1 = current.type == TokenType.Operator && (type == OperatorType.ENDLINE || type == OperatorType.COLON); bool v2 = current.is_keyword() == KurumiKeyword.END; if (v1 || v2) { break; } int assigment_count = 0; assign_expr(ref assigment_count); current = get_current_token(); } }
assign_expr(ref int assigment_count) { equals_expr(); KurumiToken op = get_current_token(); bool loop_flag = true; while (op != null && loop_flag) { switch (op.to_operator_type()) { case KurumiOperatorType.ASSIGN: if (++assigment_count > 1) { expression.dublicate_top(); } next(); assign_expr(ref assigment_count); expression.add(op, storage); break; case KurumiOperatorType.ADDASSIGN: case KurumiOperatorType.SUBASSIGN: case KurumiOperatorType.MULASSIGN: case KurumiOperatorType.DIVASSIGN: if (++assigment_count > 1) { expression.dublicate_top(); } next(); expression.dublicate_top(2); assign_expr(ref assigment_count); expression.add(op, storage); expression.add(new KurumiCommand(KurumiCommandType.ASSIGN)); break; default: loop_flag = false; break; } op = get_current_token(); } }
variable() { KurumiToken token = get_current_token(); switch (token.type) { case TokenType.Operator: { switch (token.to_operator_type()) { case OperatorType.LBRACKET: next(); equals_expr(); KurumiToken rbracket = get_current_token(); if (rbracket == null || rbracket.type != TokenType.Operator || rbracket.to_operator_type() != OperatorType.RBRACKET) { throw new Exception("Expression right bracket not found: " + token.get_token_info()); } next(); break; case OperatorType.ADD: next(); break; case OperatorType.SUB: next(); expression.add(new KurumiNumber(0)); variable(); expression.add(token, storage); break; case OperatorType.ASSIGN: next(); rexpr(); expression.add(token, storage); break; default: throw new Exception("Expression error: " + token.get_token_info()); } break; } case TokenType.Identifier: next(); KurumiToken n = get_current_token(); if (n.to_operator_type() == OperatorType.LBRACKET) { function_call(token, 1); } else { expression.add(token, storage); } break; case TokenType.Number: case TokenType.String: next(); expression.add(token, storage); break; default: throw new Exception("Expression end in unknown token."); } }