aboutsummaryrefslogtreecommitdiffstats
path: root/clox/src/compiler.c
diff options
context:
space:
mode:
Diffstat (limited to 'clox/src/compiler.c')
-rw-r--r--clox/src/compiler.c57
1 files changed, 47 insertions, 10 deletions
diff --git a/clox/src/compiler.c b/clox/src/compiler.c
index 81e1616..ab8fe7d 100644
--- a/clox/src/compiler.c
+++ b/clox/src/compiler.c
@@ -132,6 +132,24 @@ 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;
@@ -149,6 +167,22 @@ static void binary() {
}
}
+static void literal() {
+ switch (parser.previous.type) {
+ case TOKEN_FALSE:
+ emitByte(OP_FALSE);
+ break;
+ case TOKEN_NIL:
+ emitByte(OP_NIL);
+ break;
+ case TOKEN_TRUE:
+ emitByte(OP_TRUE);
+ break;
+ default:
+ return; /* Unreachable */
+ }
+}
+
static void expression() { parsePrecedence(PREC_ASSIGNMENT); }
static void number() {
@@ -164,6 +198,9 @@ static void unary() {
// Emit the operator instruction.
switch (operatorType) {
+ case TOKEN_BANG:
+ emitByte(OP_NOT);
+ break;
case TOKEN_MINUS:
emitByte(OP_NEGATE);
break;
@@ -189,31 +226,31 @@ ParseRule rules[] = {
[TOKEN_SEMICOLON] = {NULL, NULL, PREC_NONE},
[TOKEN_SLASH] = {NULL, binary, PREC_FACTOR},
[TOKEN_STAR] = {NULL, binary, PREC_FACTOR},
- [TOKEN_BANG] = {NULL, NULL, PREC_NONE},
- [TOKEN_BANG_EQUAL] = {NULL, NULL, PREC_NONE},
+ [TOKEN_BANG] = {unary, 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},
[TOKEN_AND] = {NULL, NULL, PREC_NONE},
[TOKEN_CLASS] = {NULL, NULL, PREC_NONE},
[TOKEN_ELSE] = {NULL, NULL, PREC_NONE},
- [TOKEN_FALSE] = {NULL, NULL, PREC_NONE},
+ [TOKEN_FALSE] = {literal, NULL, PREC_NONE},
[TOKEN_FOR] = {NULL, NULL, PREC_NONE},
[TOKEN_FUN] = {NULL, NULL, PREC_NONE},
[TOKEN_IF] = {NULL, NULL, PREC_NONE},
- [TOKEN_NIL] = {NULL, NULL, PREC_NONE},
+ [TOKEN_NIL] = {literal, NULL, PREC_NONE},
[TOKEN_OR] = {NULL, NULL, PREC_NONE},
[TOKEN_PRINT] = {NULL, NULL, PREC_NONE},
[TOKEN_RETURN] = {NULL, NULL, PREC_NONE},
[TOKEN_SUPER] = {NULL, NULL, PREC_NONE},
[TOKEN_THIS] = {NULL, NULL, PREC_NONE},
- [TOKEN_TRUE] = {NULL, NULL, PREC_NONE},
+ [TOKEN_TRUE] = {literal, NULL, PREC_NONE},
[TOKEN_VAR] = {NULL, NULL, PREC_NONE},
[TOKEN_WHILE] = {NULL, NULL, PREC_NONE},
[TOKEN_ERROR] = {NULL, NULL, PREC_NONE},