Skip to content
This repository was archived by the owner on May 24, 2022. It is now read-only.

Commit 228f858

Browse files
committed
Finish Compare operations
1 parent ce05ee5 commit 228f858

File tree

9 files changed

+210
-37
lines changed

9 files changed

+210
-37
lines changed

Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,13 @@ OBJECTS := $(addprefix $(BUILD_DIR)/objects/, $(notdir $(SOURCES:.c=.o)))
1919
default: clean $(BUILD_DIR)/$(NAME)
2020

2121
$(BUILD_DIR)/$(NAME): $(OBJECTS)
22-
@ printf "%8s %-40s %s\n" $(CC) $@ "-I $(HEADER_DIR) $(CFLAGS) $(LDFLAGS)"
22+
@ printf "%8s %-16s %s\n" $(CC) $@ "-I $(HEADER_DIR) $(CFLAGS) $(LDFLAGS)"
2323
@ mkdir -p $(BUILD_DIR)
2424
@ $(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@
2525
@ rm -rf $(BUILD_DIR)/objects
2626

2727
$(BUILD_DIR)/objects/%.o: $(SOURCE_DIR)/%.c $(HEADERS)
28-
@ printf "%8s %-40s %s\n" $(CC) $< "-I $(HEADER_DIR) $(CFLAGS)"
28+
@ printf "%8s %-16s %s\n" $(CC) $< "-I $(HEADER_DIR) $(CFLAGS)"
2929
@ mkdir -p $(BUILD_DIR)/objects
3030
@ $(CC) -c $(CFLAGS) -I $(HEADER_DIR) -o $@ $<
3131

includes/chunk.h

+8
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,20 @@
77
typedef enum
88
{
99
OP_CONSTANT,
10+
OP_TRUE,
11+
OP_FALSE,
12+
OP_EQUAL,
13+
OP_GREATER,
14+
OP_GREATER_EQUAL,
15+
OP_LESS,
16+
OP_LESS_EQUAL,
1017
OP_ADD,
1118
OP_SUBTRACT,
1219
OP_MULTIPLY,
1320
OP_DIVIDE,
1421
OP_MODULO,
1522
OP_EXPONENT,
23+
OP_NOT,
1624
OP_NEGATE,
1725
OP_RETURN
1826
} OpCode;

includes/value.h

+25-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,30 @@
33

44
#include "common.h"
55

6-
typedef double Value;
6+
typedef enum
7+
{
8+
VALUE_BOOLEAN,
9+
VALUE_NUMBER
10+
} value_t;
11+
12+
typedef struct
13+
{
14+
value_t t;
15+
union
16+
{
17+
bool boolean;
18+
double number;
19+
} as;
20+
} Value;
21+
22+
#define IS_BOOL(value) ((value).t == VALUE_BOOLEAN)
23+
#define IS_NUMBER(value) ((value).t == VALUE_NUMBER)
24+
25+
#define AS_BOOL(value) ((value).as.boolean)
26+
#define AS_NUMBER(value) ((value).as.number)
27+
28+
#define BOOL_VAL(value) ((Value){VALUE_BOOLEAN, {.boolean = value}})
29+
#define NUMBER_VAL(value) ((Value){VALUE_NUMBER, {.number = value}})
730

831
typedef struct
932
{
@@ -16,5 +39,6 @@ void initValueArr(ValueArr *arr);
1639
void writeValueArr(ValueArr *arr, Value value);
1740
void freeValueArr(ValueArr *arr);
1841
void printValue(Value value);
42+
bool valuesEqual(Value a, Value b);
1943

2044
#endif

includes/vm.h

-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
#include "chunk.h"
55
#include "value.h"
66

7-
#define STACK_MAX 256
8-
97
typedef struct
108
{
119
Chunk *chunk;

src/compiler.c

+47-11
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ typedef enum
2929
PREC_FACTOR, // / * %
3030
PREC_POWER, // ^
3131
PREC_UNARY, // - !
32-
PREC_CALL, // . ()
32+
PREC_CALL, // -> ()
3333
PREC_PRIMARY
3434
} Precedence;
3535

@@ -167,6 +167,24 @@ static void binary()
167167
// Emit the operator instruction.
168168
switch (operator_t)
169169
{
170+
case TOKEN_NOT_EQUAL:
171+
emit_bs(OP_EQUAL, OP_NOT);
172+
break;
173+
case TOKEN_EQUAL:
174+
emit_b(OP_EQUAL);
175+
break;
176+
case TOKEN_GREATER:
177+
emit_b(OP_GREATER);
178+
break;
179+
case TOKEN_GREATER_EQUAL:
180+
emit_b(OP_GREATER_EQUAL);
181+
break;
182+
case TOKEN_LESS:
183+
emit_b(OP_LESS);
184+
break;
185+
case TOKEN_LESS_EQUAL:
186+
emit_b(OP_LESS_EQUAL);
187+
break;
170188
case TOKEN_PLUS:
171189
emit_b(OP_ADD);
172190
break;
@@ -186,6 +204,21 @@ static void binary()
186204
}
187205
}
188206

207+
static void literal()
208+
{
209+
switch (parser.previous.t)
210+
{
211+
case TOKEN_FALSE:
212+
emit_b(OP_FALSE);
213+
break;
214+
case TOKEN_TRUE:
215+
emit_b(OP_TRUE);
216+
break;
217+
default:
218+
return; // Unreachable.
219+
}
220+
}
221+
189222
static void expression()
190223
{
191224
parsePrecedence(PREC_ASSIGNMENT);
@@ -200,7 +233,7 @@ static void grouping()
200233
static void number()
201234
{
202235
double value = strtod(parser.previous.start, NULL);
203-
emitConstant(value);
236+
emitConstant(NUMBER_VAL(value));
204237
}
205238

206239
static void power()
@@ -219,6 +252,9 @@ static void unary()
219252
// Emit the operator instruction.
220253
switch (opearator_t)
221254
{
255+
case TOKEN_NOT:
256+
emit_b(OP_NOT);
257+
break;
222258
case TOKEN_MINUS:
223259
emit_b(OP_NEGATE);
224260
break;
@@ -239,19 +275,19 @@ ParseRule rules[] = {
239275
[TOKEN_STAR] = {NULL, binary, PREC_FACTOR},
240276
[TOKEN_PERCENT] = {NULL, binary, PREC_FACTOR},
241277
[TOKEN_CARET] = {unary, power, PREC_POWER},
242-
[TOKEN_NOT] = {NULL, NULL, PREC_NONE},
243-
[TOKEN_NOT_EQUAL] = {NULL, NULL, PREC_NONE},
278+
[TOKEN_NOT] = {unary, NULL, PREC_NONE},
279+
[TOKEN_NOT_EQUAL] = {NULL, binary, PREC_EQUALITY},
244280
[TOKEN_ASSIGN] = {NULL, NULL, PREC_NONE},
245-
[TOKEN_EQUAL] = {NULL, NULL, PREC_NONE},
246-
[TOKEN_GREATER] = {NULL, NULL, PREC_NONE},
247-
[TOKEN_GREATER_EQUAL] = {NULL, NULL, PREC_NONE},
248-
[TOKEN_LESS] = {NULL, NULL, PREC_NONE},
249-
[TOKEN_LESS_EQUAL] = {NULL, NULL, PREC_NONE},
281+
[TOKEN_EQUAL] = {NULL, binary, PREC_EQUALITY},
282+
[TOKEN_GREATER] = {NULL, binary, PREC_COMPARISON},
283+
[TOKEN_GREATER_EQUAL] = {NULL, binary, PREC_COMPARISON},
284+
[TOKEN_LESS] = {NULL, binary, PREC_COMPARISON},
285+
[TOKEN_LESS_EQUAL] = {NULL, binary, PREC_COMPARISON},
250286
[TOKEN_IDENTIFIER] = {NULL, NULL, PREC_NONE},
251287
[TOKEN_STRING_LITERAL] = {NULL, NULL, PREC_NONE},
252288
[TOKEN_NUMBER_LITERAL] = {number, NULL, PREC_NONE},
253-
[TOKEN_FALSE] = {NULL, NULL, PREC_NONE},
254-
[TOKEN_TRUE] = {NULL, NULL, PREC_NONE},
289+
[TOKEN_TRUE] = {literal, NULL, PREC_NONE},
290+
[TOKEN_FALSE] = {literal, NULL, PREC_NONE},
255291
[TOKEN_EOF] = {NULL, NULL, PREC_NONE},
256292
};
257293

src/debug.c

+16
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,20 @@ int disassembleInstruction(Chunk *chunk, int offset)
4545
{
4646
case OP_CONSTANT:
4747
return constantInstruction("const", chunk, offset);
48+
case OP_TRUE:
49+
return simpleInstruction("true", offset);
50+
case OP_FALSE:
51+
return simpleInstruction("false", offset);
52+
case OP_EQUAL:
53+
return simpleInstruction("eq", offset);
54+
case OP_GREATER:
55+
return simpleInstruction("gt", offset);
56+
case OP_LESS:
57+
return simpleInstruction("lt", offset);
58+
case OP_GREATER_EQUAL:
59+
return simpleInstruction("ge", offset);
60+
case OP_LESS_EQUAL:
61+
return simpleInstruction("le", offset);
4862
case OP_ADD:
4963
return simpleInstruction("add", offset);
5064
case OP_SUBTRACT:
@@ -57,6 +71,8 @@ int disassembleInstruction(Chunk *chunk, int offset)
5771
return simpleInstruction("mod", offset);
5872
case OP_EXPONENT:
5973
return simpleInstruction("exp", offset);
74+
case OP_NOT:
75+
return simpleInstruction("not", offset);
6076
case OP_NEGATE:
6177
return simpleInstruction("neg", offset);
6278
case OP_RETURN:

src/scanner.c

+2
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,8 @@ Token scanToken()
246246
return makeToken(TOKEN_SEMICOLON);
247247
case '!':
248248
return makeToken(match('=') ? TOKEN_NOT_EQUAL : TOKEN_NOT);
249+
case '=':
250+
return makeToken(match('=') ? TOKEN_EQUAL : TOKEN_ASSIGN);
249251
case '<':
250252
{
251253
token_t t = TOKEN_LESS;

src/value.c

+25-1
Original file line numberDiff line numberDiff line change
@@ -30,5 +30,29 @@ void freeValueArr(ValueArr *arr)
3030

3131
void printValue(Value value)
3232
{
33-
printf("%g", value);
33+
switch (value.t)
34+
{
35+
case VALUE_BOOLEAN:
36+
printf(AS_BOOL(value) ? "true" : "false");
37+
break;
38+
case VALUE_NUMBER:
39+
printf("%g", AS_NUMBER(value));
40+
break;
41+
}
42+
}
43+
44+
bool valuesEqual(Value a, Value b)
45+
{
46+
if (a.t != b.t)
47+
return false;
48+
49+
switch (a.t)
50+
{
51+
case VALUE_BOOLEAN:
52+
return AS_BOOL(a) == AS_BOOL(b);
53+
case VALUE_NUMBER:
54+
return AS_NUMBER(a) == AS_NUMBER(b);
55+
default:
56+
return false; // Unreachable.
57+
}
3458
}

0 commit comments

Comments
 (0)