aboutsummaryrefslogtreecommitdiff
path: root/src/parser/parser.c
diff options
context:
space:
mode:
authorhachem <im@hachem.wtf>2026-08-30 03:38:46 +0200
committerhachem <im@hachem.wtf>2026-08-30 03:38:46 +0200
commit2e7cab34d22a0174909030942671e95d5a3c769f (patch)
treefe2d5a54f20b7908936c8dc9151023e440168d46 /src/parser/parser.c
parent5767110816ca9452ef77d15245d1a747bfdd896b (diff)
add: top level data declarations
Diffstat (limited to 'src/parser/parser.c')
-rw-r--r--src/parser/parser.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/src/parser/parser.c b/src/parser/parser.c
index 5845ad4..4fb85ef 100644
--- a/src/parser/parser.c
+++ b/src/parser/parser.c
@@ -58,6 +58,25 @@ static bool parse_const(struct Parser* parser, struct Program* program)
return true;
}
+static bool parse_data(struct Parser* parser, struct Program* program)
+{
+ struct DataDecl decl;
+
+ if (!consume(parser, TOKEN_IDENTIFIER, "expected data name after 'data'"))
+ return false;
+ decl.name = parser->previous;
+
+ if (!consume(parser, TOKEN_EQUAL, "expected '=' after data name"))
+ return false;
+
+ if (!consume(parser, TOKEN_STRING, "expected string value after '='"))
+ return false;
+ decl.value = parser->previous;
+
+ add_data(program, decl);
+ return true;
+}
+
bool parse_program(struct Lexer* lexer, struct Program* out)
{
struct Parser parser;
@@ -75,6 +94,12 @@ bool parse_program(struct Lexer* lexer, struct Program* out)
if (!parse_const(&parser, out))
return false;
}
+ else if (check(&parser, TOKEN_DATA))
+ {
+ advance_parser(&parser);
+ if (!parse_data(&parser, out))
+ return false;
+ }
else
{
error_at(&parser, parser.current, "expected a top-level declaration");