[Fix] - Fix from Chapter18; Adding missing parsing and values
This commit is contained in:
parent
5c4267262b
commit
8d0feaf157
BIN
clox/clox
BIN
clox/clox
Binary file not shown.
@ -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},
|
||||
|
BIN
clox/compiler.o
BIN
clox/compiler.o
Binary file not shown.
BIN
clox/debug.o
BIN
clox/debug.o
Binary file not shown.
1
clox/tests/chapter18_expr_tests.lox
Normal file
1
clox/tests/chapter18_expr_tests.lox
Normal file
@ -0,0 +1 @@
|
||||
!(5 - 4 > 3 * 2 == !nil)
|
@ -42,4 +42,3 @@ bool valuesEqual(Value a, Value b) {
|
||||
default: return false; // Unreachable.
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
BIN
clox/value.o
BIN
clox/value.o
Binary file not shown.
@ -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;
|
||||
|
BIN
clox/vm.o
BIN
clox/vm.o
Binary file not shown.
Loading…
Reference in New Issue
Block a user