/* ============ 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 (); }
/* ============ 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 }