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); } }
string Plugin::getName() { try{ return string(func_get_name()); } catch(...){ throw; } }
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); } }