summaryrefslogtreecommitdiff
path: root/src/parser.zig
diff options
context:
space:
mode:
authorNic Gaffney <gaffney_nic@protonmail.com>2024-07-28 01:33:19 -0500
committerNic Gaffney <gaffney_nic@protonmail.com>2024-07-28 01:33:19 -0500
commite5d311f91ecda870c8e50d3f9c860b99e244a908 (patch)
treefbd3d8e2a0989522550c11cab56e89d6a211c0b1 /src/parser.zig
parent46e8f2f827bf176a5e480ac9ff96806ced594bde (diff)
downloadcalico-e5d311f91ecda870c8e50d3f9c860b99e244a908.tar.gz
Added const, var, and assigning variables.
Diffstat (limited to 'src/parser.zig')
-rw-r--r--src/parser.zig33
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();