MCPcopy Create free account
hub / github.com/dylan-sutton-chavez/edge-python / infix_bp

Method infix_bp

compiler/src/modules/parser/expr.rs:57–113  ·  view source on GitHub ↗
(&mut self, min_bp: u8)

Source from the content-addressed store, hash-verified

55 }
56
57 pub(super) fn infix_bp(&mut self, min_bp: u8) {
58 while let Some(tok) = self.peek() {
59 if tok == TokenType::Is {
60 if 7 < min_bp { break; }
61 self.advance();
62 if self.eat_if(TokenType::Not) {
63 self.expr_bp(8);
64 self.chunk.emit(OpCode::IsNot, 0);
65 } else {
66 self.expr_bp(8);
67 self.chunk.emit(OpCode::Is, 0);
68 }
69 continue;
70 }
71
72 if tok == TokenType::Not {
73 if 7 < min_bp { break; }
74 self.advance();
75 self.eat(TokenType::In);
76 self.expr_bp(8);
77 self.chunk.emit(OpCode::NotIn, 0);
78 continue;
79 }
80
81 let Some((l_bp, r_bp, op)) = Self::binding_power(&tok) else { break };
82 if l_bp < min_bp { break; }
83 self.advance();
84
85 if matches!(op, OpCode::And | OpCode::Or) {
86 let jump_op = if op == OpCode::And { OpCode::JumpIfFalseOrPop } else { OpCode::JumpIfTrueOrPop };
87 let jmp = self.emit_jump(jump_op);
88 self.expr_bp(r_bp);
89 self.patch(jmp);
90 continue;
91 }
92
93 self.expr_bp(r_bp);
94
95 if matches!(op, OpCode::Eq | OpCode::NotEq | OpCode::Lt | OpCode::Gt | OpCode::LtEq | OpCode::GtEq)
96 && let Some(next_tok) = self.peek()
97 && matches!(next_tok, TokenType::Less | TokenType::Greater | TokenType::LessEqual | TokenType::GreaterEqual | TokenType::EqEqual | TokenType::NotEqual)
98 {
99 let ver = self.increment_version(super::SSA_TMP_CMP);
100 let tmp = self.push_ssa_name(super::SSA_TMP_CMP, ver);
101 self.chunk.emit(OpCode::StoreName, tmp);
102 self.chunk.emit(OpCode::LoadName, tmp);
103 self.chunk.emit(op, 0);
104 let jmp = self.emit_jump(OpCode::JumpIfFalseOrPop);
105 self.chunk.emit(OpCode::LoadName, tmp);
106 self.infix_bp(min_bp);
107 self.patch(jmp);
108 return;
109 }
110
111 self.chunk.emit(op, 0);
112 }
113 }
114

Callers 3

parse_argsMethod · 0.80
expr_tailsMethod · 0.80
expr_bpMethod · 0.80

Calls 10

advanceMethod · 0.80
eat_ifMethod · 0.80
expr_bpMethod · 0.80
emitMethod · 0.80
eatMethod · 0.80
emit_jumpMethod · 0.80
patchMethod · 0.80
increment_versionMethod · 0.80
push_ssa_nameMethod · 0.80
peekMethod · 0.45

Tested by

no test coverage detected