This commit is contained in:
me 2026-01-09 23:00:57 +02:00
parent 26bb0a8df1
commit 49329273d3
3 changed files with 23 additions and 17 deletions

View file

@ -62,7 +62,7 @@ Environment insert(char* name, int n, Memory memory, Environment env) {
Environment new_env = (Environment) {.next = cell};
return new_env;
}
printf("Error: out of memory.");
fprintf(stderr, "Error: out of memory.");
exit(1);
}
@ -93,7 +93,7 @@ int eval_expr(Expr expr, Memory memory, Environment env) {
case VARIABLE: {
int* result = lookup(expr.data.variable, memory, env);
if (result == NULL) {
printf("Error: variable not found '%s'\n", expr.data.variable);
fprintf(stderr, "Error: variable not found '%s'\n", expr.data.variable);
exit(1);
} else {
return *result;
@ -106,7 +106,7 @@ int eval_expr(Expr expr, Memory memory, Environment env) {
printf("%d\n", arg);
return 0;
} else {
printf("Error: print expects a single argument.\n");
fprintf(stderr, "Error: print expects a single argument.\n");
exit(1);
}
}
@ -116,7 +116,7 @@ int eval_expr(Expr expr, Memory memory, Environment env) {
int arg2 = eval_expr(((Expr*)expr.data.function.args.elements)[1], memory, env);
return arg1 + arg2;
} else {
printf("Error: negate expects a single argument.\n");
fprintf(stderr, "Error: negate expects a single argument.\n");
exit(1);
}
}
@ -125,7 +125,7 @@ int eval_expr(Expr expr, Memory memory, Environment env) {
int arg = eval_expr(((Expr*)expr.data.function.args.elements)[0], memory, env);
return 0 - arg;
} else {
printf("Error: negate expects a single argument.\n");
fprintf(stderr, "Error: negate expects a single argument.\n");
exit(1);
}
}

View file

@ -79,7 +79,7 @@ TokenArray lex(char* txt, unsigned length) {
tokens[tokens_index] = (Token){ .tag = INTEGER, .data.integer = integer, };
++tokens_index;
} else {
printf("unexpected character '%c'", txt[txt_index]);
fprintf(stderr, "unexpected character '%c'", txt[txt_index]);
}
}
}

View file

@ -21,7 +21,7 @@ int maybe_parse_token(TokenArray tokens, unsigned* tokens_index, TokenTag tag) {
void parse_token(TokenArray tokens, unsigned* tokens_index, TokenTag tag) {
if (!(maybe_parse_token(tokens, tokens_index, tag))) {
printf("Parse error: unexpected token. Expected %d\n", tag);
fprintf(stderr, "Parse error: unexpected token. Expected %d\n", tag);
exit(1);
}
}
@ -31,12 +31,12 @@ char* parse_identifier(TokenArray tokens, unsigned* tokens_index) {
Token token = tokens.tokens[*tokens_index];
++(*tokens_index);
if (token.tag != IDENTIFIER) {
printf("Parse error: got wrong token: %d, expected IDENTIFIER\n", token.tag);
fprintf(stderr, "Parse error: got wrong token: %d, expected IDENTIFIER\n", token.tag);
exit(1);
}
return token.data.identifier;
} else {
printf("Parse error: unexpected end of text.\n");
fprintf(stderr, "Parse error: unexpected end of text.\n");
exit(1);
}
}
@ -54,6 +54,7 @@ Expr parse_function(TokenArray tokens, unsigned* tokens_index, char* name) {
}
}
parse_token(tokens, tokens_index, CLOSEPAREN);
return (Expr) {
.tag = FUNCTION,
.data.function = {
@ -88,11 +89,11 @@ Expr parse_expr(TokenArray tokens, unsigned* tokens_index) {
}
}
default:
printf("Parse error: got wrong token: %d, expected IDENTIFIER or INTEGER\n", token.tag);
fprintf(stderr, "Parse error: got wrong token: %d, expected IDENTIFIER or INTEGER\n", token.tag);
exit(1);
}
} else {
printf("Parse error: unexpected end of text.\n");
fprintf(stderr, "Parse error: unexpected end of text.\n");
exit(1);
}
}
@ -102,21 +103,24 @@ StmtArray parse_block(TokenArray tokens, unsigned* tokens_index);
Stmt parse_stmt(TokenArray tokens, unsigned* tokens_index) {
char* identifier = parse_identifier(tokens, tokens_index);
// While
if (is_while(identifier)) {
Expr expr = parse_expr(tokens, tokens_index);
Expr condition = parse_expr(tokens, tokens_index);
StmtArray block = parse_block(tokens, tokens_index);
return (Stmt) {
.tag = WHILE,
.data.While = {
.condition = expr,
.condition = condition,
.block = {
.elements = block.stmts,
.length = block.length,
},
},
};
} else if (maybe_parse_token(tokens, tokens_index, EQUALS)) {
}
// Set
else if (maybe_parse_token(tokens, tokens_index, EQUALS)) {
Expr expr = parse_expr(tokens, tokens_index);
return (Stmt) {
@ -126,7 +130,9 @@ Stmt parse_stmt(TokenArray tokens, unsigned* tokens_index) {
.expr = expr,
},
};
} else {
}
// Expression
else {
Expr expr = parse_function(tokens, tokens_index, identifier);
return (Stmt) {