From 8b969bfe7d7e9b98af6c780c567155c699cfe3e5 Mon Sep 17 00:00:00 2001 From: Baitinq Date: Mon, 28 Apr 2025 22:12:46 +0200 Subject: Start implementing import functionality --- grammar.ebnf | 4 +++- src/bootstrap/main.src | 2 ++ src/codegen.zig | 1 + src/parser.zig | 21 +++++++++++++++++++++ src/tokenizer.zig | 3 +++ 5 files changed, 30 insertions(+), 1 deletion(-) diff --git a/grammar.ebnf b/grammar.ebnf index 18d71da..70a1bfd 100644 --- a/grammar.ebnf +++ b/grammar.ebnf @@ -1,9 +1,11 @@ Program ::= Statement+ -Statement ::= (AssignmentStatement | ExternDeclaration | FunctionCallStatement | IfStatement | WhileStatement | ReturnStatement) SEMICOLON +Statement ::= (AssignmentStatement | ImportDeclaration | ExternDeclaration | FunctionCallStatement | IfStatement | WhileStatement | ReturnStatement) SEMICOLON AssignmentStatement ::= ("let")? ("*")? Expression EQUALS Expression +ImportDeclaration ::= "import" STRING + ExternDeclaration ::= "extern" IDENTIFIER EQUALS Type FunctionCallStatement ::= (IDENTIFIER | FunctionDefinition) LPAREN FunctionArguments? RPAREN diff --git a/src/bootstrap/main.src b/src/bootstrap/main.src index b953e3d..2ec5202 100644 --- a/src/bootstrap/main.src +++ b/src/bootstrap/main.src @@ -9,6 +9,8 @@ extern fclose = (*i8) => *i8; extern malloc = (i64) => *i8; extern free = (*i8) => void; +import "tokenizer.src"; + let file_size = 0; let file = 0; let buf = 0; diff --git a/src/codegen.zig b/src/codegen.zig index 606557b..f30e9bb 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -116,6 +116,7 @@ pub const CodeGen = struct { .RETURN_STATEMENT => |*return_statement| return try self.generate_return_statement(@ptrCast(return_statement)), .IF_STATEMENT => |*if_statement| return try self.generate_if_statement(@ptrCast(if_statement)), .WHILE_STATEMENT => |*while_statement| return try self.generate_while_statement(@ptrCast(while_statement)), + .IMPORT_DECLARATION => |*import_declaration| return try self.generate_import_declaration(), else => unreachable, } } diff --git a/src/parser.zig b/src/parser.zig index 7ed1cb3..ffc8da5 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -19,6 +19,9 @@ pub const Node = union(enum) { lhs: *Node, rhs: *Node, }, + IMPORT_DECLARATION: struct { + filename: []u8, + }, FUNCTION_CALL_STATEMENT: struct { expression: *Node, arguments: []*Node, @@ -146,6 +149,7 @@ pub const Parser = struct { self.accept_parse(parse_while_statement) orelse self.accept_parse(parse_return_statement) orelse self.accept_parse(parse_assignment_statement) orelse + self.accept_parse(parse_import_declaration) orelse try self.parse_extern_declaration(); _ = try self.parse_token(tokenizer.TokenType.SEMICOLON); @@ -187,6 +191,23 @@ pub const Parser = struct { }); } + // ImportDeclaration ::= "import" STRING + fn parse_import_declaration(self: *Parser) ParserError!*Node { + errdefer if (!self.try_context) std.debug.print("Error parsing import declaration {any}\n", .{self.peek_token()}); + + _ = try self.parse_token(.IMPORT); + + const expr = try self.parse_primary_expression(); + + std.debug.assert(expr.PRIMARY_EXPRESSION == .STRING); + + return self.create_node(.{ + .IMPORT_DECLARATION = .{ + .filename = "", + }, + }); + } + // ExternDeclaration ::= "extern" IDENTIFIER EQUALS Type fn parse_extern_declaration(self: *Parser) ParserError!*Node { errdefer if (!self.try_context) std.debug.print("Error parsing extern declaration {any}\n", .{self.peek_token()}); diff --git a/src/tokenizer.zig b/src/tokenizer.zig index 2b57b8d..ad8ca62 100644 --- a/src/tokenizer.zig +++ b/src/tokenizer.zig @@ -6,6 +6,7 @@ const TokenizerError = error{ pub const TokenType = union(enum) { // Keywords + IMPORT: void, LET: void, EXTERN: void, IF: void, @@ -71,6 +72,8 @@ pub const Tokenizer = struct { if (self.offset >= self.buf.len) return null; + if (self.accept_string("import")) return self.create_token(.{ .IMPORT = void{} }); + if (self.accept_string("let")) return self.create_token(.{ .LET = void{} }); if (self.accept_string("extern")) return self.create_token(.{ .EXTERN = void{} }); if (self.accept_string("if")) return self.create_token(.{ .IF = void{} }); -- cgit 1.4.1