Ejemplo n.º 1
0
void parse_varDef() {
    expression_t expr;
    size_t addr;
    switch(next_token.type) {
        case TT_TYPE_DOUBLE:
        case TT_TYPE_INT:
        case TT_TYPE_STRING:
            var_init();
            parse_type();
            var_set_type(curr_token.type);
            match(TT_IDENTIFICATOR);
            var_set_name(curr_token.str);
            addr = generate_push();
            var_set_addr(addr);
            symbol_t* var = var_finish();
            var_table_add(var);
            parse_varDefFollow(var_table_find(var->name));
            break;
        case TT_TYPE_AUTO:
            var_init();
            match(TT_TYPE_AUTO);
            match(TT_IDENTIFICATOR);
            var_set_name(curr_token.str);
            match_deduction(TT_OP_ASSIGNMENT);
            var_set_initialized();
            addr = generate_push();
            var_set_addr(addr);
            expr = parse_expr();
            switch (expr.type) {
                case DOUBLE_DT:
                case INT_DT:
                case STRING_DT:
                    var_set_type(expr.type);
                    generate_mov(addr, expr.addr);
                    break;
                case DOUBLE_LIT_DT:
                    var_set_type(DOUBLE_DT);
                    generate_mov_double(addr, expr.double_val);
                    break;
                case INT_LIT_DT:
                    var_set_type(INT_DT);
                    generate_mov_int(addr, expr.int_val);
                    break;
                case STRING_LIT_DT:
                    var_set_type(STRING_DT);
                    generate_mov_string(addr, expr.str_val);
                    break;
                default:
                    ;
            }
            var_table_add(var_finish());
            break;
        default:
            error("Syntactic error: Failed to parse the program", ERROR_SYN);
    }
}
Ejemplo n.º 2
0
/** 
 * \ingroup vars
 * \brief   Set the name and value of a variable
 *  
 * Set variable \p var to \p name and \p value.
 *
 * \param var   variable object
 * \param name  string name (null-terminated)
 * \param value string value (null-terminated)
 *  
 * \return \c 0 if successful, non-zero on error
 */ 
int var_set(var_t *var, const char *name, const char *value)
{
    dbg_err_if (var == NULL);
    dbg_err_if (name == NULL);
    dbg_err_if (value == NULL);
    
    dbg_err_if(var_set_name(var, name));
    dbg_err_if(var_set_value(var, value));

    return 0;
err:
    return ~0;
}
Ejemplo n.º 3
0
void parse_paramSpecFollow() {
    switch(next_token.type) {
        case TT_COMMA:
            match(TT_COMMA);
            var_init();
            parse_type();
            var_set_type(curr_token.type);
            match(TT_IDENTIFICATOR);
            var_set_name(curr_token.str);
            var_set_addr(++param_count);
            var_set_initialized();
            func_add_param(var_finish());
            parse_paramSpecFollow();
            break;
        default:
            return;
    }
}
Ejemplo n.º 4
0
void parse_paramSpec() {
    param_count = 0; //initialize param counter
    switch(next_token.type) {
        case TT_TYPE_DOUBLE:
        case TT_TYPE_INT:
        case TT_TYPE_STRING:
            match(next_token.type);
            var_init();
            var_set_type(curr_token.type);
            match(TT_IDENTIFICATOR);
            var_set_name(curr_token.str);
            var_set_addr(++param_count);
            var_set_initialized();
            func_add_param(var_finish());
            parse_paramSpecFollow();
            break;
        default:
            return;
    }
}