aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/codegen.zig1
-rw-r--r--src/compile.zig2
-rw-r--r--src/lexer.zig2
-rw-r--r--src/main.zig2
-rw-r--r--src/parse.zig2
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,
};