diff --git a/lc.c b/lc.c index 7eea773..24c098f 100644 --- a/lc.c +++ b/lc.c @@ -72,6 +72,10 @@ void print_ast(ast_node *node, int depth) { printf("Cast: %.*s\n", (int)node->expr.cast.type_len, node->expr.cast.type); print_ast(node->expr.cast.value, depth + 1); break; + case NODE_ACCESS: + printf("Access: %.*s\n", (int)node->expr.access.member_len, node->expr.access.member); + print_ast(node->expr.access.expr, depth + 1); + break; case NODE_BINARY: printf("BinaryOp (%s)\n", get_op_str(node->expr.binary.operator)); print_ast(node->expr.binary.left, depth + 1); diff --git a/parser.c b/parser.c index 5b2b0c0..673e843 100644 --- a/parser.c +++ b/parser.c @@ -233,6 +233,10 @@ ast_node *parse_expression(parser *p) left = node; } + /* + * If after parsing an expression a `[` character + * is found, it should be an array subscript expression. + */ if (match(p, TOKEN_LSQUARE)) { ast_node *index = parse_expression(p); ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); @@ -247,6 +251,25 @@ ast_node *parse_expression(parser *p) return node; } + /* + * If after parsing an expression a `.` character + * is found, it should be a member access expression. + */ + if (match(p, TOKEN_DOT)) { + if (!match_peek(p, TOKEN_IDENTIFIER)) { + error(p, "expected identifier after member access."); + return NULL; + } + ast_node *node = arena_alloc(p->allocator, sizeof(ast_node)); + node->type = NODE_ACCESS; + node->expr.access.expr = left; + node->expr.access.member = p->tokens->lexeme; + node->expr.access.member_len = p->tokens->lexeme_len; + advance(p); + + return node; + } + return left; } diff --git a/parser.h b/parser.h index 746bf54..a34e3bc 100644 --- a/parser.h +++ b/parser.h @@ -128,6 +128,11 @@ typedef struct _ast_node { struct _ast_node *expr; struct _ast_node *index; } subscript; + struct { + struct _ast_node *expr; + char *member; + usize member_len; + } access; struct { struct _ast_node *expr; struct _ast_node *next; diff --git a/test.c b/test.c index 039ccfe..7bde329 100644 --- a/test.c +++ b/test.c @@ -1 +1 @@ -x[4 +x.y