diff options
Diffstat (limited to 'clox/src/compiler.c')
-rw-r--r-- | clox/src/compiler.c | 57 |
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}, |