about summary refs log tree commit diff
path: root/src/parser.zig
diff options
context:
space:
mode:
authorBaitinq <[email protected]>2025-01-06 16:29:58 +0100
committerBaitinq <[email protected]>2025-01-06 16:29:58 +0100
commit0915818f656d2fc32350b9a2a887bb21fab29de3 (patch)
tree2e59255d141273c8373e47c7535f1f01dbe4ee9e /src/parser.zig
parentParser: implement parse_identifier (diff)
downloadinterpreter-0915818f656d2fc32350b9a2a887bb21fab29de3.tar.gz
interpreter-0915818f656d2fc32350b9a2a887bb21fab29de3.tar.bz2
interpreter-0915818f656d2fc32350b9a2a887bb21fab29de3.zip
Parser: implement parse_number
Diffstat (limited to 'src/parser.zig')
-rw-r--r--src/parser.zig25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/parser.zig b/src/parser.zig
index 088b98a..c5aa045 100644
--- a/src/parser.zig
+++ b/src/parser.zig
@@ -22,7 +22,7 @@ pub const Node = union(NodeType) {
         expression: *Node,
     },
     NUMBER: struct {
-        value: i32,
+        value: i64,
     },
     IDENTIFIER: struct {
         name: []const u8,
@@ -62,6 +62,18 @@ pub const Parser = struct {
         } };
     }
 
+    fn parse_number(self: *Parser) !Node {
+        const token = self.peek_token() orelse return error.InvalidArgument;
+
+        if (token != .NUMBER) return error.InvalidArgument;
+
+        _ = self.consume_token();
+
+        return Node{ .NUMBER = .{
+            .value = token.NUMBER,
+        } };
+    }
+
     fn consume_token(self: *Parser) ?tokenizer.Token {
         if (self.offset >= self.tokens.len) return null;
 
@@ -88,6 +100,17 @@ test "parse identifier" {
     } }, ident);
 }
 
+test "parse number" {
+    const tokens: []tokenizer.Token = @constCast(&[_]tokenizer.Token{
+        tokenizer.Token{ .NUMBER = 7 },
+    });
+    var parser = Parser.init(tokens);
+    const number = try parser.parse_number();
+    try std.testing.expectEqualDeep(Node{ .NUMBER = .{
+        .value = 7,
+    } }, number);
+}
+
 test "simple e2e" {
     const tokens: []tokenizer.Token = @constCast(&[_]tokenizer.Token{
         tokenizer.Token{ .LET = void{} },