aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlavian Kaufmann <flavian@flaviankaufmann.ch>2025-05-20 08:34:38 +0200
committerFlavian Kaufmann <flavian@flaviankaufmann.ch>2025-05-20 08:34:38 +0200
commitcc383b7b2d89f05b724460b4d5cb385525911671 (patch)
treec1320029f44df17374581f833150ffb4bf5f465d
parente2276bb3feba22cf131debbca881d3e4d0ba705d (diff)
downloadimp-cc383b7b2d89f05b724460b4d5cb385525911671.tar.gz
imp-cc383b7b2d89f05b724460b4d5cb385525911671.zip
zero initialize unknown variable
-rw-r--r--ast.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/ast.c b/ast.c
index 760f259..29fe64c 100644
--- a/ast.c
+++ b/ast.c
@@ -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);