diff options
author | Flavian Kaufmann <flavian@flaviankaufmann.ch> | 2025-05-20 08:34:38 +0200 |
---|---|---|
committer | Flavian Kaufmann <flavian@flaviankaufmann.ch> | 2025-05-20 08:34:38 +0200 |
commit | cc383b7b2d89f05b724460b4d5cb385525911671 (patch) | |
tree | c1320029f44df17374581f833150ffb4bf5f465d | |
parent | e2276bb3feba22cf131debbca881d3e4d0ba705d (diff) | |
download | imp-cc383b7b2d89f05b724460b4d5cb385525911671.tar.gz imp-cc383b7b2d89f05b724460b4d5cb385525911671.zip |
zero initialize unknown variable
-rw-r--r-- | ast.c | 20 |
1 files changed, 10 insertions, 10 deletions
@@ -130,15 +130,6 @@ void free_ast(ASTNode *node) { free(node); } -static int env_lookup(Env *env, const char *name) { - for (Env *e = env; e; e = e->next) { - if (strcmp(e->name, name) == 0) - return e->val; - } - fprintf(stderr, "Undefined variable %s\n", name); - exit(EXIT_FAILURE); -} - static void env_update(Env **env, const char *name, int val) { for (Env *e = *env; e; e = e->next) { if (strcmp(e->name, name) == 0) { @@ -153,6 +144,15 @@ static void env_update(Env **env, const char *name, int val) { *env = e; } +static int env_lookup(Env **env, const char *name) { + for (Env *e = *env; e; e = e->next) { + if (strcmp(e->name, name) == 0) + return e->val; + } + env_update(env, name, 0); + return env_lookup(env, name); +} + void env_print(Env *env) { Env *e = env; while (e) { @@ -164,7 +164,7 @@ void env_print(Env *env) { static int eval_aexpr(Env **env, ASTNode *node) { switch (node->type) { case NT_INT: return node->u.d_int.val; - case NT_VAR: return env_lookup(*env, node->u.d_var.name); + case NT_VAR: return env_lookup(env, node->u.d_var.name); case NT_AOP: { int aexp1 = eval_aexpr(env, node->u.d_aop.aexp1); int aexp2 = eval_aexpr(env, node->u.d_aop.aexp2); |