From 59ba0f61b4e90a3fca1e1993816b626d0d16cff1 Mon Sep 17 00:00:00 2001 From: adnanioricce Date: Sat, 23 Nov 2024 19:52:48 -0300 Subject: [PATCH] [Chapter23&Conditionals] - Adding control flow --- clox/chunk.h | 3 ++ clox/clox | Bin 77840 -> 79856 bytes clox/compiler.c | 140 +++++++++++++++++++++++++++++++++++++++++++++++- clox/compiler.o | Bin 29192 -> 32944 bytes clox/debug.c | 15 ++++++ clox/debug.o | Bin 9856 -> 10864 bytes clox/vm.c | 20 ++++++- clox/vm.o | Bin 21968 -> 23184 bytes 8 files changed, 175 insertions(+), 3 deletions(-) diff --git a/clox/chunk.h b/clox/chunk.h index 5a6f6ce..eab0802 100644 --- a/clox/chunk.h +++ b/clox/chunk.h @@ -20,6 +20,9 @@ typedef enum { OP_LESS, OP_NEGATE, OP_PRINT, + OP_JUMP, + OP_JUMP_IF_FALSE, + OP_LOOP, OP_RETURN, OP_ADD, OP_SUBTRACT, diff --git a/clox/clox b/clox/clox index 7730a19c9a66a06ae9bb5ff62cb27c68ae55f79a..c10b3854e21aa34bb516b827ca0ef47b33d4d45b 100755 GIT binary patch delta 29703 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 y-`JkaV&(w0tnydt7V=esKf|nQ-R27a)Rl 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 Hu=M{A;NVVc delta 25576 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 zecf32;VSlp^count - loopStart + 2; + if (offset > UINT16_MAX) error("Loop body too large."); + + emitByte((offset >> 8) & 0xff); + emitByte(offset & 0xff); +} + +static int emitJump(uint8_t instruction) { + emitByte(instruction); + emitByte(0xff); + emitByte(0xff); + return currentChunk()->count - 2; +} + static uint8_t makeConstant(Value value) { int constant = addConstant(currentChunk(), value); if (constant > UINT8_MAX) { @@ -140,6 +157,18 @@ static void emitConstant(Value value) { emitBytes(OP_CONSTANT, makeConstant(value)); } +static void patchJump(int offset) { + // -2 to adjust for the bytecode for the jump offset itself. + int jump = currentChunk()->count - offset - 2; + + if (jump > UINT16_MAX) { + error("Too much code to jump over."); + } + + currentChunk()->code[offset] = (jump >> 8) & 0xff; + currentChunk()->code[offset + 1] = jump & 0xff; +} + static void initCompiler(Compiler* compiler) { compiler->localCount = 0; compiler->scopeDepth = 0; @@ -243,6 +272,15 @@ static void defineVariable(uint8_t global) { emitBytes(OP_DEFINE_GLOBAL, global); } +static void and_(bool canAssign) { + int endJump = emitJump(OP_JUMP_IF_FALSE); + + emitByte(OP_POP); + parsePrecedence(PREC_AND); + + patchJump(endJump); +} + static void binary(bool canAssign) { TokenType operatorType = parser.previous.type; ParseRule* rule = getRule(operatorType); @@ -305,12 +343,87 @@ static void expressionStatement() { emitByte(OP_POP); } +static void forStatement() { + beginScope(); + consume(TOKEN_LEFT_PAREN, "Expect '(' after 'for'."); + if (match(TOKEN_SEMICOLON)) { + // No initializer. + } else if (match(TOKEN_VAR)) { + varDeclaration(); + } else { + expressionStatement(); + } + + int loopStart = currentChunk()->count; + int exitJump = -1; + if (!match(TOKEN_SEMICOLON)) { + expression(); + consume(TOKEN_SEMICOLON, "Expect ';' after loop condition."); + + // Jump out of the loop if the condition is false. + exitJump = emitJump(OP_JUMP_IF_FALSE); + emitByte(OP_POP); // Condition. + } + if (!match(TOKEN_RIGHT_PAREN)) { + int bodyJump = emitJump(OP_JUMP); + int incrementStart = currentChunk()->count; + expression(); + emitByte(OP_POP); + consume(TOKEN_RIGHT_PAREN, "Expect ')' after for clauses."); + + emitLoop(loopStart); + loopStart = incrementStart; + patchJump(bodyJump); + } + statement(); + emitLoop(loopStart); + + if (exitJump != -1) { + patchJump(exitJump); + emitByte(OP_POP); // Condition. + } + + endScope(); +} + +static void ifStatement() { + consume(TOKEN_LEFT_PAREN, "Expect '(' after 'if'."); + expression(); + consume(TOKEN_RIGHT_PAREN, "Expect ')' after condition."); + + int thenJump = emitJump(OP_JUMP_IF_FALSE); + emitByte(OP_POP); + statement(); + + int elseJump = emitJump(OP_JUMP); + patchJump(thenJump); + emitByte(OP_POP); + + if (match(TOKEN_ELSE)) statement(); + patchJump(elseJump); +} + static void printStatement() { expression(); consume(TOKEN_SEMICOLON, "Expect ';' after value."); emitByte(OP_PRINT); } +static void whileStatement() { + int loopStart = currentChunk()->count; + consume(TOKEN_LEFT_PAREN, "Expect '(' after 'while'."); + expression(); + consume(TOKEN_RIGHT_PAREN, "Expect ')' after condition."); + + int exitJump = emitJump(OP_JUMP_IF_FALSE); + emitByte(OP_POP); + statement(); + emitLoop(loopStart); + + patchJump(exitJump); + emitByte(OP_POP); +} + static void synchronize() { parser.panicMode = false; @@ -349,6 +462,18 @@ static void statement() { if (match(TOKEN_PRINT)) { printStatement(); } + else if (match(TOKEN_FOR)) { + forStatement(); + + } + else if (match(TOKEN_IF)) { + ifStatement(); + + } + else if (match(TOKEN_WHILE)) { + whileStatement(); + + } else if (match(TOKEN_LEFT_BRACE)) { beginScope(); block(); @@ -369,6 +494,17 @@ static void number(bool canAssign) { emitConstant(NUMBER_VAL(value)); } +static void or_(bool canAssign) { + int elseJump = emitJump(OP_JUMP_IF_FALSE); + int endJump = emitJump(OP_JUMP); + + patchJump(elseJump); + emitByte(OP_POP); + + parsePrecedence(PREC_OR); + patchJump(endJump); +} + static void string(bool canAssign) { emitConstant(OBJ_VAL(copyString(parser.previous.start + 1, parser.previous.length - 2))); @@ -458,7 +594,7 @@ ParseRule rules[] = { [TOKEN_IDENTIFIER] = {variable, NULL, PREC_NONE}, [TOKEN_STRING] = {string, NULL, PREC_NONE}, [TOKEN_NUMBER] = {number, NULL, PREC_NONE}, - [TOKEN_AND] = {NULL, NULL, PREC_NONE}, + [TOKEN_AND] = {NULL, and_, PREC_AND}, [TOKEN_CLASS] = {NULL, NULL, PREC_NONE}, [TOKEN_ELSE] = {NULL, NULL, PREC_NONE}, [TOKEN_FALSE] = {literal, NULL, PREC_NONE}, @@ -466,7 +602,7 @@ ParseRule rules[] = { [TOKEN_FUN] = {NULL, NULL, PREC_NONE}, [TOKEN_IF] = {NULL, NULL, PREC_NONE}, [TOKEN_NIL] = {literal, NULL, PREC_NONE}, - [TOKEN_OR] = {NULL, NULL, PREC_NONE}, + [TOKEN_OR] = {NULL, or_, PREC_OR}, [TOKEN_PRINT] = {NULL, NULL, PREC_NONE}, [TOKEN_RETURN] = {NULL, NULL, PREC_NONE}, [TOKEN_SUPER] = {NULL, NULL, PREC_NONE}, diff --git a/clox/compiler.o b/clox/compiler.o index 1827e1eef3bc357dd02857c3bcec95fd8a6504a0..e4cd0d025036500ecc920b7e08635f01f976a57c 100644 GIT binary patch literal 32944 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 OS{UXJcai=}=l?J4byctc literal 29192 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 diff --git a/clox/debug.c b/clox/debug.c index b144bfc..b4f6f73 100644 --- a/clox/debug.c +++ b/clox/debug.c @@ -29,6 +29,15 @@ static int byteInstruction(const char* name, Chunk* chunk, return offset + 2; } +static int jumpInstruction(const char* name, int sign, + Chunk* chunk, int offset) { + uint16_t jump = (uint16_t)(chunk->code[offset + 1] << 8); + jump |= chunk->code[offset + 2]; + printf("%-16s %4d -> %d\n", name, offset, + offset + 3 + sign * jump); + return offset + 3; +} + int disassembleInstruction(Chunk* chunk, int offset) { printf("%04d ", offset); @@ -81,6 +90,12 @@ int disassembleInstruction(Chunk* chunk, int offset) { return simpleInstruction("OP_NOT", offset); case OP_PRINT: return simpleInstruction("OP_PRINT", offset); + case OP_JUMP: + return jumpInstruction("OP_JUMP", 1, chunk, offset); + case OP_JUMP_IF_FALSE: + return jumpInstruction("OP_JUMP_IF_FALSE", 1, chunk, offset); + case OP_LOOP: + return jumpInstruction("OP_LOOP", -1, chunk, offset); case OP_RETURN: return simpleInstruction("OP_RETURN", offset); default: diff --git a/clox/debug.o b/clox/debug.o index 4ce44ec529516c9cc3a0e58ca2313c1396592e61..0707a88a482a6e223dd7e60c12f2e5e8b3cec9e3 100644 GIT binary patch literal 10864 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 C{HlHc literal 9856 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 diff --git a/clox/vm.c b/clox/vm.c index 45d1c08..cea6b29 100644 --- a/clox/vm.c +++ b/clox/vm.c @@ -72,6 +72,8 @@ static void concatenate() { static InterpretResult run() { #define READ_BYTE() (*vm.ip++) #define READ_CONSTANT() (vm.chunk->constants.values[READ_BYTE()]) +#define READ_SHORT() \ + (vm.ip += 2, (uint16_t)((vm.ip[-2] << 8) | vm.ip[-1])) #define READ_STRING() AS_STRING(READ_CONSTANT()) #define BINARY_OP(valueType, op) \ do { \ @@ -183,6 +185,21 @@ static InterpretResult run() { printf("\n"); break; } + case OP_JUMP: { + uint16_t offset = READ_SHORT(); + vm.ip += offset; + break; + } + case OP_JUMP_IF_FALSE: { + uint16_t offset = READ_SHORT(); + if (isFalsey(peek(0))) vm.ip += offset; + break; + } + case OP_LOOP: { + uint16_t offset = READ_SHORT(); + vm.ip -= offset; + break; + } case OP_RETURN: { // printValue(pop()); // printf("\n"); @@ -191,10 +208,11 @@ static InterpretResult run() { } } +#undef READ_BYTE +#undef READ_SHORT #undef READ_CONSTANT #undef READ_STRING #undef BINARY_OP -#undef READ_BYTE } InterpretResult interpret(const char* source) { Chunk chunk; diff --git a/clox/vm.o b/clox/vm.o index 08ee2e505709932418616b569df0bdf207d49f91..2712f7b791d63bec132a2721ec9f7d7df660eb1f 100644 GIT binary patch literal 23184 zcmcJX2{=?=`1r4-kZRDr36&^GY12xXj4UZ>RkDmN24fVJQcRhKqKFnn`@SzK6-uNO zrP3n4EizHjLZbZ7x%V7yC-eM&&;R%Q&-2XOdp_qq?|I+%toNE)%e9@ZsGvaMq(Duk zT636El*63Xdvp5Moa#mOq?~w?_l}aEJV_Q$@|Y+2#*^5U^CXKaB~GuT-15kuN+DW2 zDYsHenQ>o*sH8*HRqfKDg2-|Oo^aw9l~c5xg-r&NyN;ximWekRAzzmQ`XQqD09 zukqkXl?NHnYQ;QIXGCVM*aTcv0m>DR0(T~`FqW&qlZeNGEH75<051};IlM?2Lt_(R zC7v{vG3^0Ql3NMtQMg=k=Vk|xMXVdUNNTRiGtB12PK7!RSURQV8a!ztO|sr7@)QcC zltetRRY00ZXJR|i+9a?|I+AoF%-xwk&CPK;w)bb?xJPEgkCvp18lQMQoK~@T~5(S=QmMV@{WG0CB zU!9Kv9a)JBu&C4l)S@I=l00UZNWz;?k<_WF{t?gp5ijeFG6)~SKQdE+m&}u7-++O?3BQ;@BH@--F=E9IT^43+Wf{D$VS=_u4nXTi4 z6&pN+#5$n0DyueSq;#Pa#LZl_wedDZBWY0}$xKQ!Ix9T-f17%YI4cf#QagY#NzYZz zB`R9n1K7y9L|-C*_TX$B0`d~zS64CYHDr)fSrK$+EHlFu3Y$SEGR8=GI`}r0t(S8t zlb2Nv#%CTHpF9co445G4Ql~SZd(vB7Zgu0IB3T4jU2G*^$*xndmfW$GPJ;GXO1|1k zezt0p*?}r_S6qd~=M>uX3`K14^+!{}b21A}8U-G2?q~6Bt_bRDpxD z2zVI>Ob7RPI50~{R3;}%q6VAc#{FALQ#j(;^_Zdcu%Ws6iXw1IHWyTH9d3*dcB#OU zBmYnkb8fmt28@Npb@(lHN(FQ1h%|)hhI$+ri|CwxW`a!ncXKo2Tv#J^F7l^hNVl7C zi>vftLy>l?ql_8aEe0P{WgCpwlSH_iwOWj^Qv}WE{`<<&;6`|IhKr#nCn+mBpX{;4 zKs96H(_d|vn8k+wnz-sGj;UhXCc^FaUlSAIcKnx>Vkig=g(YnodO-ynI;_Pe+8NqW zW`rix)7$%4CcN$B%K0&J9LBQgKu%T+I)sVC0}ys5mY}OR;uKgwch|+g3!*?l8?MdA zuFBEpT zk%CUP;V$IRT`2aI<4m7Kpu4J2UYbHzlU{^5!d=-(ux>K$=(8=y?r5^%zwX@ofnzfp z=xM|5aiGaIusLm4VvU^MgB-d8#lCVD&?iFZ&QGTI=xWl7Fh{!cS{b`D4~)rwdS@yd z{_9TDckE6i(9?$925q}z!nji|#~sL_J5cN^X9<1$gzi)_?$Fhw7h#TchXc%Dua=}q ztkowTjI1^mP1$`VwkNXdAd7dDzjnxIaW7yV*m>avY_9Oc1b0jcI5g9HtF)scPim>C z%G$gF6^iB_V1>D6a*GW?0;-gG&83jfdRz~LeMU~2S>NH z2e)>stRJv}sk^N z)0(s9pS@O=2$ZsG!y`9qw9$PC4kyepTIL0$af~7}!2(QcZy}Y6;AjVqU|Hp=U^t

(gId)wPBs?we4K0q_?Cdk=p(hr&qu)5 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 Vvb4^&>U%pf^(&c6%Qsp7{{X+V1~vcy delta 8943 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 E4+0V?iU0rr