Entry: Pratt parse, then optional ternary. Recursion is bounded inside `expr_bp`. */
(&mut self)
| 12 | |
| 13 | /* Entry: Pratt parse, then optional ternary. Recursion is bounded inside `expr_bp`. */ |
| 14 | pub(super) fn expr(&mut self) { |
| 15 | self.saw_newline = false; |
| 16 | self.expr_bp(0); |
| 17 | |
| 18 | if !self.saw_newline && matches!(self.peek(), Some(TokenType::If)) { |
| 19 | self.advance(); |
| 20 | self.expr_bp(0); |
| 21 | let jf = self.emit_jump(OpCode::JumpIfFalse); |
| 22 | let jmp = self.emit_jump(OpCode::Jump); |
| 23 | self.patch(jf); |
| 24 | self.chunk.emit(OpCode::PopTop, 0); |
| 25 | self.eat(TokenType::Else); |
| 26 | // Recurse so a chained conditional in the else-branch parses (right-associative). |
| 27 | self.expr(); |
| 28 | self.patch(jmp); |
| 29 | } |
| 30 | } |
| 31 | |
| 32 | pub(super) fn expr_tails(&mut self) { |
| 33 | self.postfix_tail(); |
no test coverage detected