From ec29bfb9563bcec1cc2a054cc2c1942fd5c65cb1 Mon Sep 17 00:00:00 2001 From: Mustafa Quraish Date: Wed, 2 Feb 2022 03:03:01 -0500 Subject: Add support for pointers! (tests missing) This commit adds initial support for taking pointers / dereferencing. The type system is still a bit of a hot mess, so all type information is actually not looked at, but the functionality still seems to be there. Still need to add some tests for pointers/dereferencing to ensure that it works in some edge cases as well. --- src/parser.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) (limited to 'src/parser.c') diff --git a/src/parser.c b/src/parser.c index a9a26e3..5123189 100644 --- a/src/parser.c +++ b/src/parser.c @@ -323,7 +323,7 @@ Node *parse_factor(Lexer *lexer) { // TODO: Parse more complicated things Token token = Lexer_peek(lexer); - Node *expr; + Node *expr = NULL; if (token.type == TOKEN_MINUS) { Lexer_next(lexer); expr = Node_new(OP_NEG); @@ -348,9 +348,17 @@ Node *parse_factor(Lexer *lexer) Lexer_next(lexer); expr = Node_new(OP_ADDROF); expr->unary_expr = parse_factor(lexer); + if (!is_lvalue(expr->unary_expr->type)) + die_location(token.loc, "Cannot take address of non-lvalue"); + } else if (token.type == TOKEN_STAR) { + Lexer_next(lexer); + expr = Node_new(OP_DEREF); + // TODO: IMPORTANT: Make sure the `unary_expr` is a pointer type. For this + // to work, we need to to be able to evaluate the type for complex expressions, + // which we do not support as of now. + expr->unary_expr = parse_factor(lexer); } else { die_location(token.loc, ": Expected token found in parse_factor: `%s`", token_type_to_str(token.type)); - exit(1); } return expr; } @@ -410,7 +418,7 @@ Node *parse_expression(Lexer *lexer) Node *node = parse_conditional_exp(lexer); // FIXME: This is a hack to handle assignment expressions // and can probably be done properly. - if (node->type == AST_LOCAL_VAR || node->type == AST_GLOBAL_VAR) { + if (is_lvalue(node->type)) { Token token = Lexer_peek(lexer); if (token.type == TOKEN_ASSIGN) { Lexer_next(lexer); -- cgit v1.2.3