int main(){ struct Variable var; var_init(&var, "lol", "lolllvm", V_INT); assert (strcmp("lol", var_get_name(&var)) == 0); assert (strcmp("lolllvm", var_get_llvm_name(&var)) == 0); assert (var_is_int(&var) != 0); assert (var_is_float(&var) == 0); assert (var_get_type(&var) == V_INT); assert (var_is_special(&var) == 0); var_init(&var, "lol", "lolllvm", V_FLOAT|V_SPECIAL); var_info(&var); assert (var_is_int(&var) == 0); assert (var_is_float(&var) != 0); assert (var_get_type(&var) == V_FLOAT); assert (var_is_special(&var) != 0); var_set_value(&var, -131); assert (var_get_value(&var) == -131); var_set_value(&var, 1.234); assert (((var_get_value(&var)) - 1.234) < 0.00001); assert (var_get_value(&var) != 1); var_set_modified(&var, V_MODIFIED); assert (var_is_modified(&var) != 0); var_set_modified(&var, V_NULL); assert (var_is_modified(&var) == 0); var_set_type(&var, V_FLOAT); assert (var_is_int(&var) == 0); assert (var_is_float(&var) != 0); assert (var_get_type(&var) == V_FLOAT); var_set_special(&var, V_SPECIAL); assert (var_is_special(&var) != 0); var_set_type(&var, V_INT); assert (var_is_int(&var) != 0); assert (var_is_float(&var) == 0); assert (var_get_type(&var) == V_INT); var_set_access(&var, V_NULL); assert (var_is_writable(&var) == 0); var_set_access(&var, V_WRITABLE); assert (var_is_writable(&var) != 0); var.flags |= 1; assert (var_is_declared(&var) != 0); /* var_set_nb_args(&var, 13); */ /* assert (var_get_nb_args(&var) == 13); */ printf("Tests OK (sauf get_nb_args)\n"); }
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); } }
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; } }
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; } }