From ef6134a278d0ff0fbd6ce04e0b5a2e01c4f8ffc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gustav=20S=C3=B6rn=C3=A4s?= Date: Mon, 11 Jan 2021 03:08:55 +0100 Subject: peek_to with const generics --- src/compiler.rs | 19 ++++++++++++------- src/main.rs | 2 ++ 2 files changed, 14 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/compiler.rs b/src/compiler.rs index 6074660..2a20110 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -133,9 +133,12 @@ impl Compiler { } } - // TODO(ed): Const generics - fn peek_four(&self) -> (Token, Token, Token, Token) { - (self.peek_at(0), self.peek_at(1), self.peek_at(2), self.peek_at(3)) + fn peek_to(&self) -> [Token; N] { + let mut ret = [(); N].map(|_| Token::EOF); + for (i, t) in ret.iter_mut().enumerate() { + *t = self.peek_at(i); + } + ret } fn eat(&mut self) -> Token { @@ -314,15 +317,17 @@ impl Compiler { fn statement(&mut self, block: &mut Block) { self.clear_panic(); - match self.peek_four() { - (Token::Print, _, _, _) => { + let tokens = self.peek_to(); + println!("{:?}", tokens); + match tokens { + [Token::Print, _, _, _] => { self.eat(); self.expression(block); block.add(Op::Print, self.line()); expect!(self, Token::Newline, "Expect newline after expression."); }, - (Token::Identifier(name), Token::Identifier(typ), Token::ColonEqual, _) => { + [Token::Identifier(name), Token::Identifier(typ), Token::ColonEqual, _] => { self.eat(); self.eat(); self.eat(); @@ -334,7 +339,7 @@ impl Compiler { expect!(self, Token::Newline, "Expect newline after expression."); } - (Token::Identifier(name), Token::ColonEqual, _, _) => { + [Token::Identifier(name), Token::ColonEqual, _, _] => { self.eat(); self.eat(); self.define_variable(&name, Type::UnkownType, block); diff --git a/src/main.rs b/src/main.rs index 53e2e08..d249b6c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,5 @@ +#![feature(array_map)] + use std::path::{Path, PathBuf}; mod error; -- cgit v1.2.1