From e5d311f91ecda870c8e50d3f9c860b99e244a908 Mon Sep 17 00:00:00 2001 From: Nic Gaffney Date: Sun, 28 Jul 2024 01:33:19 -0500 Subject: Added const, var, and assigning variables. --- src/parser.zig | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'src/parser.zig') diff --git a/src/parser.zig b/src/parser.zig index 18b2348..df0f068 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -20,6 +20,12 @@ pub const NodeExpr = union(enum) { pub const NodeStmt = union(enum) { exit: NodeExit, value: NodeValue, + assign: NodeAssign, +}; + +pub const NodeAssign = struct { + ident: Token, + value: NodeExpr, }; pub const NodeValue = struct { @@ -78,10 +84,37 @@ pub const Parser = struct { .exit => NodeStmt{ .exit = try self.parseExit() }, .constant => NodeStmt{ .value = try self.parseValue(true) }, .variable => NodeStmt{ .value = try self.parseValue(false) }, + .ident => NodeStmt{ .assign = try self.parseAssign() }, else => ParsingError.InvalidStatement, }; } + fn parseAssign(self: *Parser) !NodeAssign { + const ident = try self.tokens.consume(.ident); + var isMutable = false; + var exists = false; + for (self.nodes.items) |item| { + switch (item) { + .value => |v| { + if (std.mem.eql(u8, v.ident.ident, ident.?.ident)) { + isMutable = !v.isConst; + exists = true; + } + }, + else => {}, + } + } + if (!exists) return error.UnknownIdentifier; + if (!isMutable) return error.ImmutableValue; + _ = try self.tokens.consume(.equal); + const expr = try self.parseExpr(); + _ = try self.tokens.consume(.semiCol); + return NodeAssign{ + .ident = ident.?, + .value = expr, + }; + } + fn parseExit(self: *Parser) !NodeExit { _ = try self.tokens.consume(.exit); const expr = try self.parseExpr(); -- cgit v1.2.3