diff options
-rw-r--r-- | src/main.c | 14 | ||||
-rw-r--r-- | src/parser/parser.c | 9 |
2 files changed, 19 insertions, 4 deletions
@@ -33,18 +33,26 @@ #include "parser.h" #include "parser/ast.h" -static const char *src = "int x;\nvoid test();\nint main();\n"; +static const char *src = "int x;void **ptr;\nvoid *alloc();void test();\nint main();\n"; static void print_func(struct ast_node *func) { - log_debug("found function \"%.*s\" (return type %s)\n", func->name_len, func->name, func->type->name); + if (func->ptr_levels > 0) { + log_debug("found function \"%.*s\" (returns %d-level pointer to %s)\n", func->name_len, func->name, func->ptr_levels, func->type->name); + } else { + log_debug("found function \"%.*s\" (returns %s)\n", func->name_len, func->name, func->type->name); + } } static void print_var(struct ast_node *var) { - log_debug("found variable \"%.*s\" (type %s)\n", var->name_len, var->name, var->type->name); + if (var->ptr_levels > 0) { + log_debug("found variable \"%.*s\" (%d-level pointer to %s)\n", var->name_len, var->name, var->ptr_levels, var->type->name); + } else { + log_debug("found variable \"%.*s\" (%s)\n", var->name_len, var->name, var->type->name); + } } static void diff --git a/src/parser/parser.c b/src/parser/parser.c index ccdc037..b947ea2 100644 --- a/src/parser/parser.c +++ b/src/parser/parser.c @@ -96,6 +96,7 @@ static bool parse_decl(struct parser *ctx) { struct type *type; + int ptr_levels; struct ast_node *node; /* @@ -112,6 +113,12 @@ parse_decl(struct parser *ctx) } parser_advance(ctx); + ptr_levels = 0; + while (ctx->tok.kind == TOK_ASTERISK) { + ptr_levels++; + parser_advance(ctx); + } + if (ctx->tok.kind != TOK_IDENTIFIER) { tok_error(&ctx->tok, "expected identifier after type\n"); return false; @@ -127,7 +134,7 @@ parse_decl(struct parser *ctx) node->name = ctx->tok.pos; node->name_len = ctx->tok.len; node->type = type; - node->ptr_levels = 0; + node->ptr_levels = ptr_levels; parser_advance(ctx); if (ctx->tok.kind == TOK_LPAREN) { |