diff --git a/tokenize.l b/tokenize.l index 0f01fee..fb238ee 100644 --- a/tokenize.l +++ b/tokenize.l @@ -274,6 +274,23 @@ eval_add(struct ast *a, struct env *e) NULL)); } +/* inv */ +struct ast * +eval_inv(struct ast *a, struct env *e) +{ + assert(a != NULL && + a->next != NULL); + struct ast *op = eval(a->next, e); + assert(op != NULL && + op->type == AST_TOK && + op->v.token->type == NUM); + return make_ast(AST_TOK, + make_token(NUM, + 0 - + op->v.token->v.num, + NULL)); +} + struct ast * eval_sym(struct ast *a, struct env *e) { @@ -281,6 +298,8 @@ eval_sym(struct ast *a, struct env *e) return eval_def(a, e); else if (strcmp(a->v.token->v.str, "lm") == 0) { } else if (strcmp(a->v.token->v.str, "if") == 0) { + } else if (strcmp(a->v.token->v.str, "inv") == 0) { + return eval_inv(a, e); } else if (strcmp(a->v.token->v.str, "add") == 0) { return eval_add(a, e); } else if (strcmp(a->v.token->v.str, "q") == 0) {