static inline int precedence(ExprTokenVector *expr_token_vector) { assert(expr_token_vector); find_top_most_term(expr_token_vector); int index_1 = token_to_index(top_most_term->token); // top most term on expr. stack int index_2 = token_to_index(temp_expr_token.token); // input return precedence_table[index_1][index_2]; }
vector<int> do_one_search(string query_string, float* idf, int top_k, int length){ list<int> q = token_to_index(query_string); vector<int> res; if (q.size() == 0) { return res; } list<int>::const_iterator iter = q.begin(); int *query = new int[q.size()]; int k = 0; while (iter != q.end()) { query[k++] = *iter; iter++; } vector<int> result = fast_cosine_score(query, q.size(), idf, top_k); for (int i = top_k - length; top_k - length < result.size() && i < top_k && i < result.size(); ++i) { res.push_back(result[i]); } return res; }
DataType expr() { int action; instr_counter = 0; bool end_of_eval = true; return_value_data_type = EXPR_ERROR; assert(activeContext); if (activeContext == mainContext) MY_OFFSET = activeContext->locCount + 1; else MY_OFFSET = activeContext->locCount + 2; token++; if(token->type != TT_leftBrace && token->type != TT_not && token->type != TT_minus && !(token->type >= TT_identifier && token->type <= TT_bool)) { setError(ERR_SyntaxExpr); return EXPR_ERROR; } ExprTokenVector *expr_token_vector = ExprTokenVectorInit(32); assert(tokenVector); convert_to_ExprToken(TokenVectorLast(tokenVector), expr_token_vector); // add $ to expr. stack ExprTokenVectorAppend(expr_token_vector, temp_expr_token); // first token, (empty = $) // [$, , , , , ] while (end_of_eval) { convert_to_ExprToken(token, expr_token_vector); if(getError()) { ExprTokenVectorFree(expr_token_vector); return EXPR_ERROR; } AFTER_REDUCE: action = precedence(expr_token_vector); /* vypisy */ //static const char *actions[] = {"shift", "reduce", "handle", "error"}; //ExprTokenVectorPrint(expr_token_vector); //fprintf(stderr, " %s\n", actions[action]); switch(action) { case ERROR: if (top_most_term->token->type == TT_empty && token_to_index(temp_expr_token.token) == TT_empty && expr_token_vector->used != 3) { end_of_eval = false; break; } setError(ERR_PrecedenceTable); ExprTokenVectorFree(expr_token_vector); return EXPR_ERROR; case SHIFT: ExprTokenVectorAppend(expr_token_vector, temp_expr_token); if (top_most_term != ExprTokenVectorLast(expr_token_vector)) top_most_term[1].handle_start = true; break; case HANDLE: ExprTokenVectorAppend(expr_token_vector, temp_expr_token); break; case REDUCE: reduce(expr_token_vector); if(getError()) { ExprTokenVectorFree(expr_token_vector); return EXPR_ERROR; } goto AFTER_REDUCE; break; } if (token_to_index(token) != TT_empty) token++; } /*for (int i = TT_unaryMinus; i <= TT_inequality; i++) { printf("%d\n", i); print_type_table(i); }*/ Instruction *last = InstructionVectorLast(tape); if (instr_counter == 0) { b = (++top_most_term)->E; b.initialized = true; a.offset = MY_OFFSET++; //fprintf(stderr,"EXPR_PUSH a.offset = %ld b.var_type = %d b.offset= %ld b.data_type= %d\n",a.offset,b.var_type,b.offset,b.data_type); generateInstruction(PUSH, &a, &b, &c); // b = pushed operand, a = local dst } else if (last->instr == Instr_CALL) { b.var_type = LOCAL; b.data_type = return_value_data_type; b.offset = MY_OFFSET - 1; a.offset = MY_OFFSET - 1; generateInstruction(PUSH, &a, &b, &c); // b = pushed operand, a = local dst } ExprTokenVectorFree(expr_token_vector); return return_value_data_type; }