Ejemplo n.º 1
0
Archivo: expr.c Proyecto: Dasio/IFJ
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];
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
Archivo: expr.c Proyecto: Dasio/IFJ
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;
}