summaryrefslogtreecommitdiff
path: root/src/parser.zig
diff options
context:
space:
mode:
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();