diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/codegen.zig | 1 | ||||
-rw-r--r-- | src/compile.zig | 2 | ||||
-rw-r--r-- | src/lexer.zig | 2 | ||||
-rw-r--r-- | src/main.zig | 2 | ||||
-rw-r--r-- | src/parse.zig | 2 |
5 files changed, 8 insertions, 1 deletions
diff --git a/src/codegen.zig b/src/codegen.zig index 0696d3a..bb244da 100644 --- a/src/codegen.zig +++ b/src/codegen.zig @@ -522,6 +522,7 @@ const Context = struct { const reg = try self.register_allocator.allocate(bin_op.dest); switch (bin_op.op) { .add => try self.emit(.add(reg, lhs, rhs)), + .sub => try self.emit(.sub(reg, lhs, rhs)), } } diff --git a/src/compile.zig b/src/compile.zig index c723842..2bf404d 100644 --- a/src/compile.zig +++ b/src/compile.zig @@ -33,6 +33,7 @@ pub const Instr = struct { const Op = enum { add, + sub, }; pub fn sources(self: BinOp) Sources { @@ -116,6 +117,7 @@ const CompileContext = struct { .rhs = rhs, .op = switch (binop.op) { .plus => .add, + .minus => .sub, }, }, }, diff --git a/src/lexer.zig b/src/lexer.zig index 8586765..608b755 100644 --- a/src/lexer.zig +++ b/src/lexer.zig @@ -9,6 +9,7 @@ pub const Token = struct { right_paren, integer_literal, plus, + minus, invalid, eof, }; @@ -44,6 +45,7 @@ pub fn next(self: *Self) ?Token { ')' => self.create(.right_paren), '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' => self.integerLiteral(), '+' => self.create(.plus), + '-' => self.create(.minus), ' ' => { self.last_end = self.pos; continue :s (self.eat() orelse return self.create(.eof)); diff --git a/src/main.zig b/src/main.zig index ef90c79..85fedcd 100644 --- a/src/main.zig +++ b/src/main.zig @@ -32,7 +32,7 @@ pub fn main() !void { // try stdout.print("{s}\n", .{line.items}); // } - const source = "17216961135462248174 + 4095 + 4294967295 + 2147483647"; + const source = "17216961135462248174 + 4095 - 4294967295 + 2147483647"; // var lexer = Lexer{ .source = source }; // while (true) { // const token = lexer.next().?; diff --git a/src/parse.zig b/src/parse.zig index 2149cd7..24d6e42 100644 --- a/src/parse.zig +++ b/src/parse.zig @@ -23,6 +23,7 @@ pub const Expr = struct { const Op = enum { plus, + minus, }; }; }; @@ -38,6 +39,7 @@ pub fn addExpr(allocator: Allocator, lexer: *Peekable(Lexer)) !*Expr { const token: Lexer.Token = if (lexer.peek()) |t| t else break; const op: Expr.Type.BinOp.Op = switch (token.type) { .plus => .plus, + .minus => .minus, else => break, }; |