diff --git a/clox/clox b/clox/clox index 109e9f2..72d7760 100755 Binary files a/clox/clox and b/clox/clox differ diff --git a/clox/compiler.c b/clox/compiler.c index aafb558..67e1ab2 100644 --- a/clox/compiler.c +++ b/clox/compiler.c @@ -135,10 +135,17 @@ static void binary() { parsePrecedence((Precedence)(rule->precedence + 1)); switch (operatorType) { + case TOKEN_BANG_EQUAL: emitBytes(OP_EQUAL, OP_NOT); break; + case TOKEN_EQUAL_EQUAL: emitByte(OP_EQUAL); break; + case TOKEN_GREATER: emitByte(OP_GREATER); break; + case TOKEN_GREATER_EQUAL: emitBytes(OP_LESS, OP_NOT); break; + case TOKEN_LESS: emitByte(OP_LESS); break; + case TOKEN_LESS_EQUAL: emitBytes(OP_GREATER, OP_NOT); break; case TOKEN_PLUS: emitByte(OP_ADD); break; case TOKEN_MINUS: emitByte(OP_SUBTRACT); break; case TOKEN_STAR: emitByte(OP_MULTIPLY); break; case TOKEN_SLASH: emitByte(OP_DIVIDE); break; + default: return; // Unreachable. } } @@ -211,13 +218,13 @@ ParseRule rules[] = { [TOKEN_SLASH] = {NULL, binary, PREC_FACTOR}, [TOKEN_STAR] = {NULL, binary, PREC_FACTOR}, [TOKEN_BANG] = {unary, NULL, PREC_NONE}, - [TOKEN_BANG_EQUAL] = {NULL, NULL, PREC_NONE}, + [TOKEN_BANG_EQUAL] = {NULL, binary, PREC_EQUALITY}, [TOKEN_EQUAL] = {NULL, NULL, PREC_NONE}, - [TOKEN_EQUAL_EQUAL] = {NULL, NULL, PREC_NONE}, - [TOKEN_GREATER] = {NULL, NULL, PREC_NONE}, - [TOKEN_GREATER_EQUAL] = {NULL, NULL, PREC_NONE}, - [TOKEN_LESS] = {NULL, NULL, PREC_NONE}, - [TOKEN_LESS_EQUAL] = {NULL, NULL, PREC_NONE}, + [TOKEN_EQUAL_EQUAL] = {NULL, binary, PREC_EQUALITY}, + [TOKEN_GREATER] = {NULL, binary, PREC_COMPARISON}, + [TOKEN_GREATER_EQUAL] = {NULL, binary, PREC_COMPARISON}, + [TOKEN_LESS] = {NULL, binary, PREC_COMPARISON}, + [TOKEN_LESS_EQUAL] = {NULL, binary, PREC_COMPARISON}, [TOKEN_IDENTIFIER] = {NULL, NULL, PREC_NONE}, [TOKEN_STRING] = {NULL, NULL, PREC_NONE}, [TOKEN_NUMBER] = {number, NULL, PREC_NONE}, diff --git a/clox/compiler.o b/clox/compiler.o index 7f30988..541d9fb 100644 Binary files a/clox/compiler.o and b/clox/compiler.o differ diff --git a/clox/debug.o b/clox/debug.o index 1431a55..e37916e 100644 Binary files a/clox/debug.o and b/clox/debug.o differ diff --git a/clox/tests/chapter18_expr_tests.lox b/clox/tests/chapter18_expr_tests.lox new file mode 100644 index 0000000..bbc9553 --- /dev/null +++ b/clox/tests/chapter18_expr_tests.lox @@ -0,0 +1 @@ +!(5 - 4 > 3 * 2 == !nil) diff --git a/clox/value.c b/clox/value.c index 19b7c0b..f1f3727 100644 --- a/clox/value.c +++ b/clox/value.c @@ -42,4 +42,3 @@ bool valuesEqual(Value a, Value b) { default: return false; // Unreachable. } } - diff --git a/clox/value.h b/clox/value.h index ee41d23..c8af524 100644 --- a/clox/value.h +++ b/clox/value.h @@ -37,6 +37,7 @@ typedef struct { Value* values; } ValueArray; +bool valuesEqual(Value a, Value b); void initValueArray(ValueArray* array); void writeValueArray(ValueArray* array, Value value); void freeValueArray(ValueArray* array); diff --git a/clox/value.o b/clox/value.o index 2a9e016..1d7ac1d 100644 Binary files a/clox/value.o and b/clox/value.o differ diff --git a/clox/vm.c b/clox/vm.c index 4d4d599..8e70669 100644 --- a/clox/vm.c +++ b/clox/vm.c @@ -83,6 +83,12 @@ static InterpretResult run() { case OP_NIL: push(NIL_VAL); break; case OP_TRUE: push(BOOL_VAL(true)); break; case OP_FALSE: push(BOOL_VAL(false)); break; + case OP_EQUAL: { + Value b = pop(); + Value a = pop(); + push(BOOL_VAL(valuesEqual(a, b))); + break; + } case OP_GREATER: BINARY_OP(BOOL_VAL, >); break; case OP_LESS: BINARY_OP(BOOL_VAL, <); break; case OP_ADD: BINARY_OP(NUMBER_VAL, +); break; diff --git a/clox/vm.o b/clox/vm.o index 287fae9..0873f42 100644 Binary files a/clox/vm.o and b/clox/vm.o differ