From e0a60ddc2cf3b2ccc3dff8e5af873b215cde7045 Mon Sep 17 00:00:00 2001 From: Luna Date: Tue, 27 Aug 2019 11:58:32 -0300 Subject: [PATCH] add SlashEqual operator --- examples/hello.v | 1 + src/parser.zig | 13 +++++++++++++ src/scanner.zig | 3 +++ src/tokens.zig | 1 + 4 files changed, 18 insertions(+) diff --git a/examples/hello.v b/examples/hello.v index 55702b0..8b3f3bf 100644 --- a/examples/hello.v +++ b/examples/hello.v @@ -60,6 +60,7 @@ fn main(a int) int { str.len += 1 str.len -= 1 str.len *= 1 + str.len /= 1 } fn (v Typ) voidfunc() {} diff --git a/src/parser.zig b/src/parser.zig index f510aab..12efaa5 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -703,6 +703,7 @@ pub const Parser = struct { if (self.compareAnyOf(&[_]TokenType{ .ColonEqual, .Equal, .PlusEqual, .MinusEqual, .StarEqual, + .SlashEqual, })) { return try self.finishAssignment(expr, mutable); } @@ -725,15 +726,27 @@ pub const Parser = struct { .PlusEqual => .Plus, .MinusEqual => .Minus, .StarEqual => .Star, + .SlashEqual => .Slash, + else => unreachable, }; + // we create new_lexeme so that + // the AST printer properly prints + // x += 1 + // as + // (set x (+ x 1)) + // and not + // (set x (+= x 1)) const new_lexeme: []const u8 = switch (op.ttype) { .ColonEqual => ":=", .Equal => "=", + .PlusEqual => "+", .MinusEqual => "-", .StarEqual => "*", + .SlashEqual => "/", + else => unreachable, }; diff --git a/src/scanner.zig b/src/scanner.zig index 219203c..368efc5 100644 --- a/src/scanner.zig +++ b/src/scanner.zig @@ -315,7 +315,10 @@ pub const Scanner = struct { '/' => blk: { var next = self.peekNext(); + switch (next) { + '=' => return self.makeToken(.SlashEqual), + '/' => blk2: { while (self.peek() != '\n' and !self.isAtEnd()) { _ = self.advance(); diff --git a/src/tokens.zig b/src/tokens.zig index b8f2d1c..8ff6121 100644 --- a/src/tokens.zig +++ b/src/tokens.zig @@ -31,6 +31,7 @@ pub const TokenType = enum { MinusEqual, ColonEqual, StarEqual, + SlashEqual, // comparison ones EqualEqual,