Esempio n. 1
0
/*
============
PR_Term
============
*/
def_t *PR_Term (void)
{
	def_t	*e, *e2;
	etype_t	t;
	
	if (PR_Check ("!"))
	{
		e = PR_Expression (NOT_PRIORITY);
		t = e->type->type;
		if (t == ev_float)
			e2 = PR_Statement (&pr_opcodes[OP_NOT_F], e, 0);
		else if (t == ev_string)
			e2 = PR_Statement (&pr_opcodes[OP_NOT_S], e, 0);
		else if (t == ev_entity)
			e2 = PR_Statement (&pr_opcodes[OP_NOT_ENT], e, 0);
		else if (t == ev_vector)
			e2 = PR_Statement (&pr_opcodes[OP_NOT_V], e, 0);
		else if (t == ev_function)
			e2 = PR_Statement (&pr_opcodes[OP_NOT_FNC], e, 0);
		else
		{
			e2 = NULL;		// shut up compiler warning;
			PR_ParseError ("type mismatch for !");
		}
		return e2;
	}
	
	if (PR_Check ("("))
	{
		e = PR_Expression (TOP_PRIORITY);
		PR_Expect (")");
		return e;
	}
	
	return PR_ParseValue ();
}
Esempio n. 2
0
/*
============
PR_Term
============
*/
def_t *PR_Term (void)
{
	if (pr_token_type != tt_punct)
		return PR_ParseValue ();

	def_t	*e, *e2;
	etype_t	t;

	if (PR_Check ("!"))
	{
		e = PR_Expression (NOT_PRIORITY);
		t = e->type->type;
		if (t == ev_float)
			e2 = PR_Statement (&pr_opcodes[OP_NOT_F], e, 0);
		else if (t == ev_string)
			e2 = PR_Statement (&pr_opcodes[OP_NOT_S], e, 0);
		else if (t == ev_entity)
			e2 = PR_Statement (&pr_opcodes[OP_NOT_ENT], e, 0);
		else if (t == ev_vector)
			e2 = PR_Statement (&pr_opcodes[OP_NOT_V], e, 0);
		else if (t == ev_function)
			e2 = PR_Statement (&pr_opcodes[OP_NOT_FNC], e, 0);
		else {
			PR_ParseError ("type mismatch for !");
			return NULL;	// shut up compiler
		}
		return e2;
	}

	if (PR_Check ("("))
	{
		e = PR_Expression (TOP_PRIORITY);
		PR_Expect (")");
		return e;
	}

	if (PR_Check("-")) {
		e = PR_Expression (1 /* FIXME, correct? */);
		t = e->type->type;
		if (t == ev_float) {
			eval_t v;
			v._float = 0;
			def_t *imm = PR_GetImmediate (&type_const_float, v);
			e2 = PR_Statement (&pr_opcodes[OP_SUB_F], imm, e);
		} else if (t == ev_vector) {
			eval_t v;
			v.vector[0] = v.vector[1] = v.vector[2] = 0;
			def_t *imm = PR_GetImmediate (&type_const_vector, v);
			e2 = PR_Statement (&pr_opcodes[OP_SUB_V], imm, e);
		} else {
			PR_ParseError ("type mismatch for -");
			return NULL;	// shut up compiler
		}
		return e2;
	}

	if (PR_Check("+")) {
		e = PR_Expression (1 /* FIXME, correct? */);
		t = e->type->type;
		if (t != ev_float && t != ev_vector) {
			PR_ParseError ("type mismatch for +");
			return NULL;	// shut up compiler
		}
		return e;
	}

	PR_ParseError ("syntax error : '%s'", pr_token);
	return NULL;	// shut up compiler
}