From 49329273d372e48e876f10331be8370b69daaa06 Mon Sep 17 00:00:00 2001 From: me Date: Fri, 9 Jan 2026 23:00:57 +0200 Subject: [PATCH] stderr --- first-interpreter/src/execute.c | 10 +++++----- first-interpreter/src/lex.c | 2 +- first-interpreter/src/parse.c | 28 +++++++++++++++++----------- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/first-interpreter/src/execute.c b/first-interpreter/src/execute.c index 8886234..6252d2b 100644 --- a/first-interpreter/src/execute.c +++ b/first-interpreter/src/execute.c @@ -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); } } diff --git a/first-interpreter/src/lex.c b/first-interpreter/src/lex.c index f2d4457..7218460 100644 --- a/first-interpreter/src/lex.c +++ b/first-interpreter/src/lex.c @@ -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]); } } } diff --git a/first-interpreter/src/parse.c b/first-interpreter/src/parse.c index cbb7ed5..b8f46d8 100644 --- a/first-interpreter/src/parse.c +++ b/first-interpreter/src/parse.c @@ -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,17 +31,17 @@ 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); } } -Expr parse_expr(TokenArray tokens, unsigned* tokens_index) ; +Expr parse_expr(TokenArray tokens, unsigned* tokens_index); Expr parse_function(TokenArray tokens, unsigned* tokens_index, char* name) { parse_token(tokens, tokens_index, OPENPAREN); Expr* exprs = (Expr*)malloc((tokens.length - *tokens_index) * sizeof(Expr)); @@ -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) {