diff --git a/Makefile b/Makefile index 5da844a..5eb5c12 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ LEXER_C = src/lexer/lex.yy.c LEXER_H = src/lexer/lex.yy.h CFILES = $(shell find src -name '*.c') -CFLAGS = -lm -lcjson -lgc -Wall -Wextra -Wno-unused-function -s +CFLAGS = -lm -lcjson -lgc -lgmp -Wall -Wextra -Wno-unused-function -s BINARY = bin/argon all: $(BINARY) diff --git a/src/memory.c b/src/memory.c index 4c2c5d4..733ac12 100644 --- a/src/memory.c +++ b/src/memory.c @@ -1,9 +1,28 @@ #include "memory.h" #include +#include +#include #include // for malloc/free (temp arena fallback) #include -void ar_memory_init() { GC_INIT(); } + +void *gmp_gc_realloc(void *ptr, size_t old_size, size_t new_size) { + (void)old_size; // Ignore old_size, Boehm doesn't need it + return GC_realloc(ptr, new_size); +} + + +void gmp_gc_free(void *ptr, size_t size) { + (void)size; // Boehm GC manages this itself + // No-op — memory will be collected automatically + GC_FREE(ptr); +} + +void ar_memory_init() { + GC_INIT(); + mp_set_memory_functions(GC_malloc, gmp_gc_realloc, gmp_gc_free); +} + void *ar_alloc(size_t size) { return GC_MALLOC(size); } diff --git a/src/parser/number/number.c b/src/parser/number/number.c new file mode 100644 index 0000000..37218b4 --- /dev/null +++ b/src/parser/number/number.c @@ -0,0 +1,14 @@ +#include "number.h" +#include "../../lexer/token.h" +#include "../parser.h" +#include +#include + +ParsedValue *parse_number(Token *token) { + ParsedValue *parsedValue = malloc(sizeof(ParsedValue)); + mpz_t *number = malloc(sizeof(mpz_t)); + mpz_init_set_str(*number, token->value, 10); + parsedValue->type = AST_NUMBER; + parsedValue->data = number; + return parsedValue; +} \ No newline at end of file diff --git a/src/parser/number/number.h b/src/parser/number/number.h new file mode 100644 index 0000000..768314a --- /dev/null +++ b/src/parser/number/number.h @@ -0,0 +1,11 @@ +// parser.h + +#ifndef NUMBER_H +#define NUMBER_H +#include "../parser.h" +#include "../../lexer/token.h" // for Token + +// Function declaration for parsing an identifier +ParsedValue * parse_number(Token * token); + +#endif // NUMBER_H \ No newline at end of file diff --git a/src/parser/parser.c b/src/parser/parser.c index 5b0ab8f..8c5bd3f 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -2,6 +2,7 @@ #include "../dynamic_array/darray.h" #include "../lexer/token.h" #include "assign/assign.h" +#include "number/number.h" #include "identifier/identifier.h" #include "string/string.h" #include @@ -10,7 +11,7 @@ #include #include -const char *ValueTypeNames[] = {"string", "assign", "identifier"}; +const char *ValueTypeNames[] = {"string", "assign", "identifier", "number"}; ParsedValue *parse_token(char *file, DArray *parsed, DArray *tokens, size_t *index, bool inline_flag) { @@ -64,9 +65,18 @@ ParsedValue *parse_token(char *file, DArray *parsed, DArray *tokens, case TOKEN_ASSIGN_PLUS: case TOKEN_ASSIGN_SLASH: case TOKEN_ASSIGN_STAR: - fprintf(stderr, "%s:%u:%u error: syntax error\n", file, token->line, - token->column); + if (parsed->size == 0) { + fprintf(stderr, "%s:%u:%u error: syntax error\n", file, token->line, + token->column); + exit(EXIT_FAILURE); + } + ParsedValue *assigning_to = darray_get(parsed, parsed->size-1); + fprintf(stderr, "%s:%u:%u error: cannot assign to %s\n", file, token->line, + token->column, ValueTypeNames[assigning_to->type]); exit(EXIT_FAILURE); + case TOKEN_NUMBER: + (*index)++; + return parse_number(token); default: fprintf(stderr, "Panic: unreachable\n"); exit(EXIT_FAILURE); @@ -96,5 +106,7 @@ void free_parsed(void *ptr) { case AST_ASSIGN: free_parse_assign(parsed); break; + case AST_NUMBER: + break; } } \ No newline at end of file diff --git a/src/parser/parser.h b/src/parser/parser.h index 80916b0..68d9c0e 100644 --- a/src/parser/parser.h +++ b/src/parser/parser.h @@ -10,7 +10,8 @@ typedef struct LinkedList LinkedList; typedef enum { AST_STRING, AST_ASSIGN, - AST_IDENTIFIER + AST_IDENTIFIER, + AST_NUMBER, } ValueType; extern const char* ValueTypeNames[]; diff --git a/test.ar b/test.ar index 70e857d..52ab0e7 100644 --- a/test.ar +++ b/test.ar @@ -1 +1 @@ -"hello world"=10 \ No newline at end of file +x=10 \ No newline at end of file