Exemple #1
0
void parse_funcBody(symbol_t* funcRef) {
    symbol_t* func;
    switch(next_token.type) {
        case TT_SEMICOLON:
            match(TT_SEMICOLON);
            break;
        case TT_BLOCK_START:
            func = func_table_find(func_get_name());
            func->def = true; //function is defined
            func->addr = get_code_seg_top();
            var_table_scope_enter();
            init_new_stack_frame(param_count);
            if (funcRef->paramList) {
                unode_str_t* paramIter = funcRef->paramList->front;
                while (paramIter) {
                    var_table_add(&(paramIter->item));
                    paramIter = paramIter->next;
                }
            }
            parse_block(false);
            generate_no_return_exception();
            break;
        default:
            error("Syntactic error: Failed to parse the program", ERROR_SYN);
    }
}
Exemple #2
0
string Plugin::getName()
{ 
	try{
		return string(func_get_name());
	}
	catch(...){
		throw;
	}
		
}
Exemple #3
0
void parse_stmt() {
    switch(next_token.type) {
        case TT_TYPE_DOUBLE:
        case TT_TYPE_INT:
        case TT_TYPE_STRING:
        case TT_TYPE_AUTO:
            parse_varDef();
            match(TT_SEMICOLON);
            break;
        case TT_IDENTIFICATOR:
            parse_asgn();
            match(TT_SEMICOLON);
            break;
        case TT_KW_RETURN:
            match(TT_KW_RETURN);
            expression_t expr = parse_expr();
            switch (expr.type) {
                case DOUBLE_DT:
                case DOUBLE_LIT_DT:
                    if (func_get_return_type() != DOUBLE_DT &&
                        func_get_return_type() != INT_DT)
                        error("Variable with bad type in a return statement",
                            ERROR_TYPE_COMPAT);
                    break;
                case INT_DT:
                case INT_LIT_DT:
                    if (func_get_return_type() != DOUBLE_DT &&
                        func_get_return_type() != INT_DT)
                        error("Variable with bad type in a return statement",
                            ERROR_TYPE_COMPAT);
                    break;
                case STRING_DT:
                case STRING_LIT_DT:
                    if (func_get_return_type() != STRING_DT)
                        error("Variable with bad type in a return statement",
                            ERROR_TYPE_COMPAT);
                    break;
                default:
                    ;
            }
            match(TT_SEMICOLON);
            if (str_equal(func_get_name(), "main"))
                generate_halt();
            else {
                switch (expr.type) {
                    case DOUBLE_DT:
                        if(func_get_return_type() == DOUBLE_DT) {
                            generate_return(expr.addr, func_get_param_count());
                        } else {
                            size_t conv_expr = generate_double_to_int(expr.addr);
                            generate_return(conv_expr, func_get_param_count());
                        }
                        break;
                    case INT_DT:
                        if(func_get_return_type() == INT_DT) {
                            generate_return(expr.addr, func_get_param_count());
                        } else {
                            size_t conv_expr = generate_int_to_double(expr.addr);
                            generate_return(conv_expr, func_get_param_count());
                        }
                        break;
                    case STRING_DT:
                        generate_return(expr.addr, func_get_param_count());
                        break;
                    case DOUBLE_LIT_DT:
                        if(func_get_return_type() == DOUBLE_DT)
                            generate_return_double(expr.double_val, func_get_param_count());
                        else
                            generate_return_double((int)expr.double_val, func_get_param_count());
                        break;
                    case INT_LIT_DT:
                        if(func_get_return_type() == INT_DT)
                            generate_return_int(expr.int_val, func_get_param_count());
                        else
                            generate_return_int((double)expr.int_val, func_get_param_count());
                        break;
                    case STRING_LIT_DT:
                        generate_return_string(expr.str_val, func_get_param_count());
                        break;
                    default:
                        ;
                }
            }
            break;
        case TT_KW_COUT:
            parse_coutStmt();
            match(TT_SEMICOLON);
            break;
        case TT_KW_CIN:
            parse_cinStmt();
            match(TT_SEMICOLON);
            break;
        case TT_BLOCK_START:
            parse_block(true);
            break;
        case TT_KW_IF:
            parse_ifClause();
            break;
        case TT_KW_FOR:
            parse_forClause();
            break;
        default:
            error("Syntactic error: Failed to parse the program", ERROR_SYN);
    }
}