add not operator

This commit is contained in:
Luna 2019-06-02 00:02:37 -03:00
parent 1d774c6011
commit c5d704a34f
4 changed files with 26 additions and 3 deletions

View File

@ -1,5 +1,18 @@
# jorts # jorts
an interpreter for the lox language from https://craftinginterpreters.com a compiler for the lox language from https://craftinginterpreters.com
this is a learning project. this is a learning project. the implemtation is based heavily off the C part
of the book, but also the Java part for the scanner.
## notes
- jorts' lox bytecode is not compatible with any implementation.
## how do?
```
zig build run
```
and play around with it

View File

@ -18,6 +18,8 @@ const AllOpcodes = struct {
pub Nil: u8 = 8, pub Nil: u8 = 8,
pub True: u8 = 9, pub True: u8 = 9,
pub False: u8 = 10, pub False: u8 = 10,
pub Not: u8 = 11,
}; };
pub const OpCode = AllOpcodes{}; pub const OpCode = AllOpcodes{};

View File

@ -75,7 +75,7 @@ var rules = []ParseRule{
ParseRule{ .infix = Compiler.binary, .precedence = .Factor }, ParseRule{ .infix = Compiler.binary, .precedence = .Factor },
// as the token enum says, those are 1/2 char tokens. // as the token enum says, those are 1/2 char tokens.
ParseRule{}, ParseRule{ .prefix = Compiler.unary },
// this is specifically for the != operator // this is specifically for the != operator
ParseRule{ .precedence = .Equality }, ParseRule{ .precedence = .Equality },
ParseRule{}, ParseRule{},
@ -236,6 +236,7 @@ pub const Compiler = struct {
switch (ttype) { switch (ttype) {
.MINUS => try self.emitByte(OpCode.Negate), .MINUS => try self.emitByte(OpCode.Negate),
.BANG => try self.emitByte(OpCode.Not),
else => unreachable, else => unreachable,
} }
} }

View File

@ -16,6 +16,10 @@ pub const InterpretResult = error{
RuntimeError, RuntimeError,
}; };
fn isFalsey(val: value.Value) bool {
return val.vtype == .Nil or (val.vtype == .Bool and !val.as.Bool);
}
pub const VM = struct { pub const VM = struct {
chk: *Chunk = undefined, chk: *Chunk = undefined,
src: []const u8, src: []const u8,
@ -170,6 +174,9 @@ pub const VM = struct {
chunk.OpCode.Subtract => try self.doSub(), chunk.OpCode.Subtract => try self.doSub(),
chunk.OpCode.Multiply => try self.doMul(), chunk.OpCode.Multiply => try self.doMul(),
chunk.OpCode.Divide => try self.doDiv(), chunk.OpCode.Divide => try self.doDiv(),
chunk.OpCode.Not => blk: {
try self.push(values.BoolVal(isFalsey(self.pop())));
},
chunk.OpCode.Negate => blk: { chunk.OpCode.Negate => blk: {
var val = self.peek(0); var val = self.peek(0);
if (val.vtype != .Bool) { if (val.vtype != .Bool) {