about summary refs log tree commit diff
path: root/src/tokenizer.zig
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-01-06 00:37:42 +0100
committerBaitinq <[email protected]>2025-01-06 00:48:47 +0100
commit1e15bc57d33f6481d40f61a0ee6c62cbfdc9c5be (patch)
tree76b43cf2d070b6e2c72ed5cdffaf0003e0106465 /src/tokenizer.zig
parentFile reading (diff)
downloadpry-lang-1e15bc57d33f6481d40f61a0ee6c62cbfdc9c5be.tar.gz
pry-lang-1e15bc57d33f6481d40f61a0ee6c62cbfdc9c5be.tar.bz2
pry-lang-1e15bc57d33f6481d40f61a0ee6c62cbfdc9c5be.zip
Add tokenizer test
Diffstat (limited to 'src/tokenizer.zig')
-rw-r--r--src/tokenizer.zig67
1 files changed, 64 insertions, 3 deletions
diff --git a/src/tokenizer.zig b/src/tokenizer.zig
index a69b4eb..f2b013e 100644
--- a/src/tokenizer.zig
+++ b/src/tokenizer.zig
@@ -1,3 +1,5 @@
+const std = @import("std");
+
 pub const Tokenizer = struct {
     buf: []u8,
     offset: u32,
@@ -7,10 +9,69 @@ pub const Tokenizer = struct {
     }
 
     pub fn next(_: *Tokenizer) ?Token {
-        return Token.HI;
+        return null;
+        // return Token{
+        //     .LET = void{},
+        // };
     }
 };
 
-pub const Token = enum {
-    HI,
+const TokenType = enum {
+    // Keywords
+    LET,
+    PRINT,
+
+    // Identifiers
+    IDENTIFIER,
+
+    // Literals
+    NUMBER,
+    STRING,
+
+    // Operators
+    EQUALS,
+
+    // Punctuation
+    SEMICOLON,
+    LPAREN,
+    RPAREN,
 };
+
+pub const Token = union(TokenType) {
+    LET: void,
+    PRINT: void,
+    IDENTIFIER: []u8,
+    NUMBER: i64,
+    STRING: []u8,
+    EQUALS: void,
+    SEMICOLON: void,
+    LPAREN: void,
+    RPAREN: void,
+};
+
+test "simple" {
+    const buf =
+        \\ let i = 2;
+        \\
+        \\ print(i);
+    ;
+
+    var tokenizer = try Tokenizer.init(@constCast(buf));
+
+    var token_list = std.ArrayList(Token).init(std.testing.allocator);
+    while (tokenizer.next()) |token| {
+        try token_list.append(token);
+    }
+    try std.testing.expectEqualSlices(Token, &.{
+        Token{ .LET = void{} },
+        Token{ .IDENTIFIER = @constCast("i") },
+        Token{ .EQUALS = void{} },
+        Token{ .NUMBER = 2 },
+        Token{ .SEMICOLON = void{} },
+        Token{ .PRINT = void{} },
+        Token{ .LPAREN = void{} },
+        Token{ .IDENTIFIER = @constCast("i") },
+        Token{ .RPAREN = void{} },
+        Token{ .SEMICOLON = void{} },
+    }, token_list.items);
+}