@@ -642,6 +642,31 @@ static void ifStatement(Scanner *scanner) {
642642 patchJump (elseJump );
643643}
644644
645+ static void ifExpression (Scanner * scanner , bool canAssign ) {
646+ TRACELN (" compiler.ifExpression()" );
647+
648+ consume (scanner , TOKEN_LEFT_PAREN , "Expect '(' after 'if'." );
649+ expression (scanner );
650+ consume (scanner , TOKEN_RIGHT_PAREN , "Expect ')' after condition." );
651+
652+ int thenJump = emitJump (OP_JUMP_IF_FALSE );
653+ emitByte (OP_POP );
654+ expression (scanner );
655+
656+ int elseJump = emitJump (OP_JUMP );
657+
658+ patchJump (thenJump );
659+ emitByte (OP_POP );
660+
661+ if (match (scanner , TOKEN_ELSE )) {
662+ expression (scanner );
663+ } else {
664+ emitByte (OP_NIL );
665+ }
666+
667+ patchJump (elseJump );
668+ }
669+
645670static void printStatement (Scanner * scanner ) {
646671 TRACELN (" compiler.printStatement()" );
647672
@@ -1121,7 +1146,7 @@ ParseRule rules[] = {
11211146 [TOKEN_FALSE ] = {literal , NULL , PREC_NONE },
11221147 [TOKEN_FOR ] = {NULL , NULL , PREC_NONE },
11231148 [TOKEN_FUN ] = {NULL , NULL , PREC_NONE },
1124- [TOKEN_IF ] = {NULL , NULL , PREC_NONE },
1149+ [TOKEN_IF ] = {ifExpression , NULL , PREC_NONE },
11251150 [TOKEN_NIL ] = {literal , NULL , PREC_NONE },
11261151 [TOKEN_OR ] = {NULL , or_ , PREC_OR },
11271152 [TOKEN_QUESTION_QUESTION ] = {NULL , nullish , PREC_OR },
0 commit comments