Exemplo n.º 1
0
/* Program extracts from Chapter 13 of
Exemplo n.º 2
0
uint16_t expr_evaluate(struct expr* e, uint16_t(*labelreplace)(bstring label), void(*errexit)(int code, void* data))
{
	uint16_t t;

	switch (e->type)
	{
		case EXPR_NUMBER:
			return (uint16_t)(intptr_t)e->data;
		case EXPR_LABEL:
			if (labelreplace == NULL)
			{
				errexit(EXPR_EXIT_LABEL_NOT_FOUND, (bstring)e->data);
				return 0;
			}
			else
				return labelreplace((bstring)e->data);
		case EXPR_EXPR:
			switch (e->op)
			{
				case EXPR_OP_ADD:
					return recursive_evaluate(e->a) + recursive_evaluate(e->b);
				case EXPR_OP_SUBTRACT:
					return recursive_evaluate(e->a) - recursive_evaluate(e->b);
				case EXPR_OP_MULTIPLY:
					return recursive_evaluate(e->a) * recursive_evaluate(e->b);
				case EXPR_OP_DIVIDE:
					t = recursive_evaluate(e->b);
					if (t == 0)
						errexit(EXPR_EXIT_DIVIDE_BY_ZERO, expr_representation(e->b));
					return recursive_evaluate(e->a) / t;
				case EXPR_OP_MODULUS:
					t = recursive_evaluate(e->b);
					if (t == 0)
						errexit(EXPR_EXIT_DIVIDE_BY_ZERO, expr_representation(e->b));
					return recursive_evaluate(e->a) % t;
				case EXPR_OP_EQUALS:
					return recursive_evaluate(e->a) == recursive_evaluate(e->b);
				case EXPR_OP_NOT_EQUALS:
					return recursive_evaluate(e->a) != recursive_evaluate(e->b);
				case EXPR_OP_LESS_THAN:
					return recursive_evaluate(e->a) < recursive_evaluate(e->b);
				case EXPR_OP_LESS_EQUALS:
					return recursive_evaluate(e->a) <= recursive_evaluate(e->b);
				case EXPR_OP_GREATER_THAN:
					return recursive_evaluate(e->a) > recursive_evaluate(e->b);
				case EXPR_OP_GREATER_EQUALS:
					return recursive_evaluate(e->a) >= recursive_evaluate(e->b);
				case EXPR_OP_AND:
					return recursive_evaluate(e->a) & recursive_evaluate(e->b);
				case EXPR_OP_BOR:
					return recursive_evaluate(e->a) | recursive_evaluate(e->b);
				case EXPR_OP_XOR:
					return recursive_evaluate(e->a) ^ recursive_evaluate(e->b);
				default:
					return 0;
			}
		default:
			return 0;
	}
}