removed pointer arrays

This commit is contained in:
Lorenzo Torres 2025-12-04 17:03:36 +01:00
parent 387e1f57ac
commit e094049a0d
2 changed files with 29 additions and 7 deletions

View file

@ -100,6 +100,7 @@ static ast_node *parse_call(parser *p)
{ {
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_CALL; node->type = NODE_CALL;
node->position = p->previous->position;
node->expr.call.name = peek(p)->lexeme; node->expr.call.name = peek(p)->lexeme;
node->expr.call.name_len = peek(p)->lexeme_len; node->expr.call.name_len = peek(p)->lexeme_len;
advance(p); advance(p);
@ -182,6 +183,7 @@ static ast_node *parse_factor(parser *p)
{ {
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_INTEGER; node->type = NODE_INTEGER;
node->position = p->previous->position;
node->expr.integer = parse_int(t->lexeme, t->lexeme_len); node->expr.integer = parse_int(t->lexeme, t->lexeme_len);
if (match(p, TOKEN_DOUBLE_DOT)) { if (match(p, TOKEN_DOUBLE_DOT)) {
ast_node *range = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *range = arena_alloc(p->allocator, sizeof(ast_node));
@ -207,6 +209,7 @@ static ast_node *parse_factor(parser *p)
{ {
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_FLOAT; node->type = NODE_FLOAT;
node->position = p->previous->position;
node->expr.flt = parse_float(t->lexeme, t->lexeme_len); node->expr.flt = parse_float(t->lexeme, t->lexeme_len);
return node; return node;
} }
@ -221,6 +224,7 @@ static ast_node *parse_factor(parser *p)
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_IDENTIFIER; node->type = NODE_IDENTIFIER;
node->position = p->previous->position;
node->expr.string.start = t->lexeme; node->expr.string.start = t->lexeme;
node->expr.string.len = t->lexeme_len; node->expr.string.len = t->lexeme_len;
return node; return node;
@ -229,6 +233,7 @@ static ast_node *parse_factor(parser *p)
{ {
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_STRING; node->type = NODE_STRING;
node->position = p->previous->position;
node->expr.string.start = t->lexeme; node->expr.string.start = t->lexeme;
node->expr.string.len = t->lexeme_len; node->expr.string.len = t->lexeme_len;
return node; return node;
@ -237,6 +242,7 @@ static ast_node *parse_factor(parser *p)
{ {
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_CHAR; node->type = NODE_CHAR;
node->position = p->previous->position;
if (t->lexeme_len == 2) if (t->lexeme_len == 2)
{ {
char c; char c;
@ -318,6 +324,7 @@ ast_node *parse_unary(parser *p)
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_UNARY; node->type = NODE_UNARY;
node->position = p->previous->position;
node->expr.unary.operator = op; node->expr.unary.operator = op;
node->expr.unary.right = parse_expression(p); node->expr.unary.right = parse_expression(p);
@ -330,6 +337,7 @@ ast_node *parse_unary(parser *p)
advance(p); advance(p);
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_CAST; node->type = NODE_CAST;
node->position = p->previous->position;
node->expr.cast.type = parse_type(p); node->expr.cast.type = parse_type(p);
advance(p); advance(p);
advance(p); advance(p);
@ -352,6 +360,7 @@ ast_node *parse_term(parser *p)
ast_node *right = parse_factor(p); ast_node *right = parse_factor(p);
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_BINARY; node->type = NODE_BINARY;
node->position = p->previous->position;
node->expr.binary.left = left; node->expr.binary.left = left;
node->expr.binary.right = right; node->expr.binary.right = right;
node->expr.binary.operator = op; node->expr.binary.operator = op;
@ -376,6 +385,7 @@ ast_node *parse_expression(parser *p)
ast_node *right = parse_term(p); ast_node *right = parse_term(p);
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_BINARY; node->type = NODE_BINARY;
node->position = p->previous->position;
node->expr.binary.left = left; node->expr.binary.left = left;
node->expr.binary.right = right; node->expr.binary.right = right;
node->expr.binary.operator = op; node->expr.binary.operator = op;
@ -391,6 +401,7 @@ ast_node *parse_expression(parser *p)
ast_node *index = parse_expression(p); ast_node *index = parse_expression(p);
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_ARRAY_SUBSCRIPT; node->type = NODE_ARRAY_SUBSCRIPT;
node->position = p->previous->position;
node->expr.subscript.expr = left; node->expr.subscript.expr = left;
node->expr.subscript.index = index; node->expr.subscript.index = index;
@ -415,6 +426,7 @@ ast_node *parse_expression(parser *p)
} }
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_ACCESS; node->type = NODE_ACCESS;
node->position = p->previous->position;
node->expr.access.expr = left; node->expr.access.expr = left;
node->expr.access.member = parse_expression(p); node->expr.access.member = parse_expression(p);
@ -442,6 +454,7 @@ ast_node *parse_expression(parser *p)
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_POSTFIX; node->type = NODE_POSTFIX;
node->position = p->previous->position;
node->expr.unary.operator = op; node->expr.unary.operator = op;
node->expr.unary.right = left; node->expr.unary.right = left;
@ -452,6 +465,7 @@ ast_node *parse_expression(parser *p)
if (match(p, TOKEN_LCURLY)) { if (match(p, TOKEN_LCURLY)) {
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_STRUCT_INIT; node->type = NODE_STRUCT_INIT;
node->position = p->previous->position;
if (match(p, TOKEN_RCURLY)) if (match(p, TOKEN_RCURLY))
{ {
@ -569,6 +583,7 @@ ast_node *parse_expression(parser *p)
advance(p); advance(p);
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_BINARY; node->type = NODE_BINARY;
node->position = p->previous->position;
node->expr.binary.left = left; node->expr.binary.left = left;
node->expr.binary.operator = op; node->expr.binary.operator = op;
node->expr.binary.right = parse_expression(p); node->expr.binary.right = parse_expression(p);
@ -592,6 +607,7 @@ static ast_node *parse_compound(parser *p)
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_UNIT; node->type = NODE_UNIT;
node->position = p->previous->position;
if (match(p, TOKEN_RCURLY)) if (match(p, TOKEN_RCURLY))
{ {
@ -642,6 +658,7 @@ static ast_node *parse_for(parser *p)
advance(p); advance(p);
ast_node* node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node* node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_FOR; node->type = NODE_FOR;
node->position = p->previous->position;
snapshot arena_start = arena_snapshot(p->allocator); snapshot arena_start = arena_snapshot(p->allocator);
node->expr.fr.slices = arena_alloc(p->allocator, sizeof(ast_node)); node->expr.fr.slices = arena_alloc(p->allocator, sizeof(ast_node));
@ -793,6 +810,7 @@ static ast_node *parse_while(parser *p)
ast_node *body = parse_compound(p); ast_node *body = parse_compound(p);
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_WHILE; node->type = NODE_WHILE;
node->position = p->previous->position;
node->expr.whle.body = body; node->expr.whle.body = body;
if (flags & LOOP_AFTER) { if (flags & LOOP_AFTER) {
@ -818,6 +836,7 @@ static ast_node *parse_if(parser *p)
ast_node *body = parse_compound(p); ast_node *body = parse_compound(p);
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_IF; node->type = NODE_IF;
node->position = p->previous->position;
node->expr.whle.body = body; node->expr.whle.body = body;
node->expr.whle.condition = condition; node->expr.whle.condition = condition;
return node; return node;
@ -837,11 +856,7 @@ static ast_node *parse_type(parser *p)
/* Array/slice type */ /* Array/slice type */
type = arena_alloc(p->allocator, sizeof(ast_node)); type = arena_alloc(p->allocator, sizeof(ast_node));
type->type = NODE_PTR_TYPE; type->type = NODE_PTR_TYPE;
if (match(p, TOKEN_STAR)) {
type->expr.ptr_type.flags |= PTR_ARRAY;
} else {
type->expr.ptr_type.flags |= PTR_SLICE; type->expr.ptr_type.flags |= PTR_SLICE;
}
type->expr.ptr_type.type = parse_type(p); type->expr.ptr_type.type = parse_type(p);
if (!type->expr.ptr_type.type) { if (!type->expr.ptr_type.type) {
error(p, "expected type."); error(p, "expected type.");
@ -918,6 +933,7 @@ static ast_node *parse_enum(parser *p)
{ {
ast_node *enm = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *enm = arena_alloc(p->allocator, sizeof(ast_node));
enm->type = NODE_ENUM; enm->type = NODE_ENUM;
enm->position = p->previous->position;
if (match_peek(p, TOKEN_IDENTIFIER)) { if (match_peek(p, TOKEN_IDENTIFIER)) {
/* Named enum */ /* Named enum */
enm->expr.enm.name = peek(p)->lexeme; enm->expr.enm.name = peek(p)->lexeme;
@ -975,6 +991,7 @@ static ast_node *parse_struct(parser *p)
{ {
ast_node *structure = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *structure = arena_alloc(p->allocator, sizeof(ast_node));
structure->type = NODE_STRUCT; structure->type = NODE_STRUCT;
structure->position = p->previous->position;
if (match_peek(p, TOKEN_IDENTIFIER)) { if (match_peek(p, TOKEN_IDENTIFIER)) {
/* Named structure */ /* Named structure */
structure->expr.structure.name = peek(p)->lexeme; structure->expr.structure.name = peek(p)->lexeme;
@ -1091,13 +1108,13 @@ static ast_node *parse_statement(parser *p)
if (p->tokens->next && p->tokens->next->type == TOKEN_LPAREN) { if (p->tokens->next && p->tokens->next->type == TOKEN_LPAREN) {
/* Function definition. */ /* Function definition. */
p->tokens = cur; p->tokens = cur;
printf("%d, %.*s\n", p->tokens->position.row, 3, p->tokens->lexeme);
return parse_function(p); return parse_function(p);
} }
p->tokens = cur; p->tokens = cur;
/* Variable declaration. */ /* Variable declaration. */
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_VAR_DECL; node->type = NODE_VAR_DECL;
node->position = p->previous->position;
node->expr.var_decl.type = parse_type(p); node->expr.var_decl.type = parse_type(p);
node->expr.var_decl.name = p->tokens->lexeme; node->expr.var_decl.name = p->tokens->lexeme;
node->expr.var_decl.name_len = p->tokens->lexeme_len; node->expr.var_decl.name_len = p->tokens->lexeme_len;
@ -1127,6 +1144,7 @@ skip_struct:
} }
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_BREAK; node->type = NODE_BREAK;
node->position = p->previous->position;
return node; return node;
} }
else if (match(p, TOKEN_RETURN)) else if (match(p, TOKEN_RETURN))
@ -1146,6 +1164,7 @@ skip_struct:
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_RETURN; node->type = NODE_RETURN;
node->position = p->previous->position;
node->expr.ret.value = expr; node->expr.ret.value = expr;
return node; return node;
} }
@ -1154,6 +1173,7 @@ skip_struct:
/* In this case, this is a label. */ /* In this case, this is a label. */
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_LABEL; node->type = NODE_LABEL;
node->position = p->previous->position;
node->expr.label.name = p->tokens->lexeme; node->expr.label.name = p->tokens->lexeme;
node->expr.label.name_len = p->tokens->lexeme_len; node->expr.label.name_len = p->tokens->lexeme_len;
advance(p); advance(p);
@ -1170,6 +1190,7 @@ skip_struct:
} }
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_GOTO; node->type = NODE_GOTO;
node->position = p->previous->position;
node->expr.label.name = p->tokens->lexeme; node->expr.label.name = p->tokens->lexeme;
node->expr.label.name_len = p->tokens->lexeme_len; node->expr.label.name_len = p->tokens->lexeme_len;
advance(p); advance(p);
@ -1196,6 +1217,7 @@ skip_struct:
ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node));
node->type = NODE_IMPORT; node->type = NODE_IMPORT;
node->position = p->previous->position;
node->expr.import.path = expr; node->expr.import.path = expr;
if (!match(p, TOKEN_SEMICOLON)) if (!match(p, TOKEN_SEMICOLON))

View file

@ -109,7 +109,6 @@ typedef enum {
#define PTR_SLICE 0x0 #define PTR_SLICE 0x0
#define PTR_RAW 0x1 #define PTR_RAW 0x1
#define PTR_ARRAY 0x2
#define LOOP_WHILE 0x1 #define LOOP_WHILE 0x1
#define LOOP_UNTIL 0x2 #define LOOP_UNTIL 0x2
@ -117,6 +116,7 @@ typedef enum {
typedef struct _ast_node { typedef struct _ast_node {
node_type type; node_type type;
source_pos position;
union { union {
struct { struct {
struct _ast_node *type; struct _ast_node *type;