add not operator
This commit is contained in:
parent
1d774c6011
commit
c5d704a34f
4 changed files with 26 additions and 3 deletions
17
README.md
17
README.md
|
@ -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
|
||||||
|
|
|
@ -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{};
|
||||||
|
|
|
@ -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,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in a new issue