summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.c10
-rw-r--r--src/parser/parser.c21
2 files changed, 26 insertions, 5 deletions
diff --git a/src/main.c b/src/main.c
index 645656c..c06d83e 100644
--- a/src/main.c
+++ b/src/main.c
@@ -33,7 +33,7 @@
#include "parser.h"
#include "parser/ast.h"
-static const char *src = "void test();\nint main();";
+static const char *src = "int x;\nvoid test();\nint main();\n";
static void
print_func(struct ast_node *func)
@@ -42,6 +42,12 @@ print_func(struct ast_node *func)
}
static void
+print_var(struct ast_node *var)
+{
+ log_debug("found variable \"%.*s\" (type %s)\n", var->name_len, var->name, var->type->name);
+}
+
+static void
print_syms(struct hashmap *syms)
{
struct list *list;
@@ -55,6 +61,8 @@ print_syms(struct hashmap *syms)
while (node != (struct ast_node *)list) {
if (node->kind == NOK_FUNCTION) {
print_func(node);
+ } else if (node->kind == NOK_VARIABLE) {
+ print_var(node);
}
node = (struct ast_node *)node->hashmap_entry.list_entry.next;
diff --git a/src/parser/parser.c b/src/parser/parser.c
index 4f8543c..ccdc037 100644
--- a/src/parser/parser.c
+++ b/src/parser/parser.c
@@ -79,6 +79,20 @@ parse_func_decl(struct parser *ctx, struct ast_node *func)
}
static bool
+parse_var_decl(struct parser *ctx, struct ast_node *var)
+{
+ var->kind = NOK_VARIABLE;
+
+ /*
+ * TODO: Parse initial value.
+ */
+
+ hashmap_add(ctx->syms, &var->hashmap_entry);
+ parser_advance(ctx);
+ return true;
+}
+
+static bool
parse_decl(struct parser *ctx)
{
struct type *type;
@@ -118,12 +132,11 @@ parse_decl(struct parser *ctx)
parser_advance(ctx);
if (ctx->tok.kind == TOK_LPAREN) {
return parse_func_decl(ctx, node);
+ } else if (ctx->tok.kind == TOK_SEMICOLON) {
+ return parse_var_decl(ctx, node);
}
- /*
- * TODO: Parse variable declarations.
- */
- tok_error(&ctx->tok, "expected \"(\" after identifier\n");
+ tok_error(&ctx->tok, "expected \"(\" or \";\" after identifier\n");
free(node);
return false;
}