diff options
| author | Edvard Thörnros <edvard.thornros@gmail.com> | 2021-03-08 17:11:34 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-03-08 17:11:34 +0100 |
| commit | c61fb2a37fee54b7eb42da074e8c1b42aa6a42f1 (patch) | |
| tree | 8002080789ac944ec018050c1be9941455fdd9eb /src/compiler.rs | |
| parent | 61aa7ebf79b2e7102be033f74bb1fafbfcdb3080 (diff) | |
| parent | a40b38b048cf064927c21bc967b49600c891a483 (diff) | |
| download | sylt-c61fb2a37fee54b7eb42da074e8c1b42aa6a42f1.tar.gz | |
Merge pull request #98 from FredTheDino/boolean-ops
boolean ops
Diffstat (limited to 'src/compiler.rs')
| -rw-r--r-- | src/compiler.rs | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/src/compiler.rs b/src/compiler.rs index dc3bd96..2aad62b 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -182,7 +182,8 @@ macro_rules! push_scope { nextable_enum!(Prec { No, Assert, - Bool, + BoolOr, + BoolAnd, Comp, Term, Factor, @@ -615,7 +616,8 @@ impl Compiler { | Token::NotEqual => Prec::Comp, - Token::And | Token::Or => Prec::Bool, + Token::And => Prec::BoolAnd, + Token::Or => Prec::BoolOr, Token::AssertEqual => Prec::Assert, @@ -656,6 +658,9 @@ impl Compiler { | Token::NotEqual => self.binary(block), + Token::And | Token::Or + => self.binary_bool(block), + Token::LeftBracket => self.index(block), _ => { return false; }, @@ -741,6 +746,34 @@ impl Compiler { add_op(self, block, op); } + fn binary_bool(&mut self, block: &mut Block) { + let op = self.eat(); + + match op { + Token::And => { + add_op(self, block, Op::Copy); + let jump = add_op(self, block, Op::Illegal); + + self.parse_precedence(block, self.precedence(op.clone()).next()); + + block.patch(Op::JmpFalse(block.curr()), jump); + } + + Token::Or => { + add_op(self, block, Op::Copy); + let skipp = add_op(self, block, Op::Illegal); + let jump = add_op(self, block, Op::Illegal); + block.patch(Op::JmpFalse(block.curr()), skipp); + + self.parse_precedence(block, self.precedence(op.clone()).next()); + + block.patch(Op::Jmp(block.curr()), jump); + } + + _ => { error!(self, "Illegal operator"); } + } + } + fn binary(&mut self, block: &mut Block) { let op = self.eat(); |
