about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-04-28 22:12:46 +0200
committerBaitinq <[email protected]>2025-04-28 22:12:46 +0200
commit8b969bfe7d7e9b98af6c780c567155c699cfe3e5 (patch)
treee37cd9b9c8ea36ad869afd0e6e7c0b047456ed8b
parentBootstrap: Iterate chars (diff)
downloadinterpreter-import.tar.gz
interpreter-import.tar.bz2
interpreter-import.zip
Start implementing import functionality import
-rw-r--r--grammar.ebnf4
-rw-r--r--src/bootstrap/main.src2
-rw-r--r--src/codegen.zig1
-rw-r--r--src/parser.zig21
-rw-r--r--src/tokenizer.zig3
5 files changed, 30 insertions, 1 deletions
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{} });