lib/chant/src/parse/unit.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const ast = @import("../ast/root.zig");
3 const assertion = @import("assert.zig");
4 const ctype = @import("type/root.zig");
5 const external = @import("external.zig");
6 const state = @import("state/root.zig");
7 const cursor = state.cursor;
8 const Error = @import("error.zig").Error;
9
10 const Parser = state.Parser;
11
12 pub fn parseTranslationUnit(self: *Parser) Error!ast.TranslationUnit {
13 var declarations = std.ArrayListUnmanaged(ast.Decl).empty;
14 while (cursor.peek(self).kind != .eof) {
15 if (cursor.consume(self, .semicolon)) continue;
16 if (try ctype.consumeAttributeDeclaration(self)) continue;
17 try ctype.skipAttributes(self);
18 if (cursor.consume(self, .semicolon)) continue;
19 if (try assertion.consume(self)) continue;
20 const parsed = try external.parseExternal(self);
21 try declarations.appendSlice(self.arena, parsed);
22 }
23 return .{ .declarations = try declarations.toOwnedSlice(self.arena) };
24 }