From b81e250fab7f54838a9b205e51a49bd5b932c618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edvard=20Th=C3=B6rnros?= Date: Mon, 11 Jan 2021 15:08:35 +0100 Subject: If-statements --- src/compiler.rs | 29 ++++++++++++++++++++++++----- src/tokenizer.rs | 5 +++++ 2 files changed, 29 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/compiler.rs b/src/compiler.rs index 8275618..4bd519d 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -347,6 +347,29 @@ impl Compiler { expect!(self, Token::RightBrace, "Expected '}' at end of block."); } + fn if_statment(&mut self, block: &mut Block) { + expect!(self, Token::If, "Expected 'if' at start of if-statement."); + self.expression(block); + let jump = block.add(Op::Illegal, self.line()); + self.scope(block); + + if Token::Else == self.peek() { + let else_jmp = block.add(Op::Illegal, self.line()); + block.patch(Op::JmpFalse(block.curr()), jump); + + self.eat(); + match self.peek() { + Token::If => self.if_statment(block), + Token::LeftBrace => self.scope(block), + _ => error!(self, "Epected 'if' or '{' after else."), + } + block.patch(Op::Jmp(block.curr()), else_jmp); + } else { + block.patch(Op::JmpFalse(block.curr()), jump); + } + + } + fn statement(&mut self, block: &mut Block) { self.clear_panic(); @@ -381,11 +404,7 @@ impl Compiler { } (Token::If, _, _, _) => { - self.eat(); - self.expression(block); - let jump = block.add(Op::Illegal, self.line()); - self.scope(block); - block.patch(Op::JmpFalse(block.curr()), jump); + self.if_statment(block); } (Token::LeftBrace, _, _, _) => { diff --git a/src/tokenizer.rs b/src/tokenizer.rs index 18e1aa1..8778430 100644 --- a/src/tokenizer.rs +++ b/src/tokenizer.rs @@ -20,6 +20,8 @@ pub enum Token { #[token("if")] If, + #[token("else")] + Else, #[token("for")] For, #[token("in")] @@ -64,8 +66,11 @@ pub enum Token { EqualEqual, #[token("!=")] NotEqual, + #[token("<=>")] AssertEqual, + #[token("")] + Unreachable, #[token("(")] LeftParen, -- cgit v1.2.1