aboutsummaryrefslogtreecommitdiff
path: root/src/parse.zig
diff options
context:
space:
mode:
authorMathias Magnusson <mathias@magnusson.space>2025-07-22 21:25:21 +0200
committerMathias Magnusson <mathias@magnusson.space>2025-07-22 21:25:21 +0200
commit86532befde8205b440ae0d630fa8feb94afe27da (patch)
tree06b41a90b3ed009f4155c3475fcf4eee19028142 /src/parse.zig
parent7f86e0dc92670dd5da34cd22c36aba18fa58ec6d (diff)
downloadhuginn-86532befde8205b440ae0d630fa8feb94afe27da.tar.gz
move testing source code to own file
Diffstat (limited to 'src/parse.zig')
-rw-r--r--src/parse.zig27
1 files changed, 19 insertions, 8 deletions
diff --git a/src/parse.zig b/src/parse.zig
index efb5c8e..26f32e9 100644
--- a/src/parse.zig
+++ b/src/parse.zig
@@ -151,7 +151,18 @@ pub const Expr = struct {
const ParseError = error{ OutOfMemory, ExpectedRightParen, UnexpectedToken, InvalidAssignTarget };
-pub fn block(allocator: Allocator, lexer: *Lexer) !Block {
+pub fn file(allocator: Allocator, lexer: *Lexer) !Block {
+ var stmts: std.ArrayList(Stmt) = .init(allocator);
+ while (lexer.peek().type != .eof) {
+ try stmts.append(try statement(allocator, lexer));
+ }
+ return .{
+ .loc = stmts.items[0].loc.combine(stmts.getLast().loc),
+ .stmts = try stmts.toOwnedSlice(),
+ };
+}
+
+fn block(allocator: Allocator, lexer: *Lexer) !Block {
const left_curly = try mustEat(lexer, .left_curly);
var stmts: std.ArrayList(Stmt) = .init(allocator);
while (lexer.peek().type != .right_curly) {
@@ -164,7 +175,7 @@ pub fn block(allocator: Allocator, lexer: *Lexer) !Block {
};
}
-pub fn statement(allocator: Allocator, lexer: *Lexer) ParseError!Stmt {
+fn statement(allocator: Allocator, lexer: *Lexer) ParseError!Stmt {
switch (lexer.peek().type) {
.let => {
const let = lexer.next();
@@ -217,11 +228,11 @@ pub fn statement(allocator: Allocator, lexer: *Lexer) ParseError!Stmt {
}
}
-pub fn expression(allocator: Allocator, lexer: *Lexer) ParseError!*Expr {
+fn expression(allocator: Allocator, lexer: *Lexer) ParseError!*Expr {
return parseComparisons(allocator, lexer);
}
-pub fn parseComparisons(allocator: Allocator, lexer: *Lexer) ParseError!*Expr {
+fn parseComparisons(allocator: Allocator, lexer: *Lexer) ParseError!*Expr {
const lhs = try parseTerms(allocator, lexer);
const op: Expr.Type.BinOp.Op = switch (lexer.peek().type) {
@@ -240,7 +251,7 @@ pub fn parseComparisons(allocator: Allocator, lexer: *Lexer) ParseError!*Expr {
});
}
-pub fn parseTerms(allocator: Allocator, lexer: *Lexer) !*Expr {
+fn parseTerms(allocator: Allocator, lexer: *Lexer) !*Expr {
var lhs = try parseIf(allocator, lexer);
while (true) {
const op: Expr.Type.BinOp.Op = switch (lexer.peek().type) {
@@ -259,7 +270,7 @@ pub fn parseTerms(allocator: Allocator, lexer: *Lexer) !*Expr {
return lhs;
}
-pub fn parseIf(allocator: Allocator, lexer: *Lexer) !*Expr {
+fn parseIf(allocator: Allocator, lexer: *Lexer) !*Expr {
switch (lexer.peek().type) {
.@"if" => {
const @"if" = lexer.next();
@@ -282,7 +293,7 @@ pub fn parseIf(allocator: Allocator, lexer: *Lexer) !*Expr {
}
}
-pub fn parseInvocations(allocator: Allocator, lexer: *Lexer) !*Expr {
+fn parseInvocations(allocator: Allocator, lexer: *Lexer) !*Expr {
var proc = try parsePrimaryExpr(allocator, lexer);
while (true) {
if (lexer.peek().type != .left_paren) break;
@@ -297,7 +308,7 @@ pub fn parseInvocations(allocator: Allocator, lexer: *Lexer) !*Expr {
return proc;
}
-pub fn parsePrimaryExpr(allocator: Allocator, lexer: *Lexer) !*Expr {
+fn parsePrimaryExpr(allocator: Allocator, lexer: *Lexer) !*Expr {
const token = lexer.next();
return allocate(Expr, allocator, switch (token.type) {
.left_paren => {