diff options
| author | Nic Gaffney <gaffney_nic@protonmail.com> | 2024-07-28 01:33:19 -0500 |
|---|---|---|
| committer | Nic Gaffney <gaffney_nic@protonmail.com> | 2024-07-28 01:33:19 -0500 |
| commit | e5d311f91ecda870c8e50d3f9c860b99e244a908 (patch) | |
| tree | fbd3d8e2a0989522550c11cab56e89d6a211c0b1 /src/parser.zig | |
| parent | 46e8f2f827bf176a5e480ac9ff96806ced594bde (diff) | |
| download | calico-e5d311f91ecda870c8e50d3f9c860b99e244a908.tar.gz | |
Added const, var, and assigning variables.
Diffstat (limited to 'src/parser.zig')
| -rw-r--r-- | src/parser.zig | 33 |
1 files changed, 33 insertions, 0 deletions
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(); |
