Exemple #1
0
    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();
        }
    }
Exemple #2
0
    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();
        }
    }
Exemple #3
0
    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);
    }
Exemple #4
0
    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.");
        }
    }
Exemple #5
0
    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();
        }
    }
Exemple #6
0
    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();
        }
    }
Exemple #7
0
    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.");
        }
    }