diff options
| author | Gustav Sörnäs <gustav@sornas.net> | 2021-01-11 03:08:55 +0100 |
|---|---|---|
| committer | Gustav Sörnäs <gustav@sornas.net> | 2021-01-11 03:08:55 +0100 |
| commit | ef6134a278d0ff0fbd6ce04e0b5a2e01c4f8ffc5 (patch) | |
| tree | 9cd166c4e550fa6032d1958397aeaa36edb5e687 | |
| parent | dde985c7abb4dbe37281131b8b36a75302e48438 (diff) | |
| download | sylt-ef6134a278d0ff0fbd6ce04e0b5a2e01c4f8ffc5.tar.gz | |
peek_to with const generics
| -rw-r--r-- | rust-toolchain | 1 | ||||
| -rw-r--r-- | src/compiler.rs | 19 | ||||
| -rw-r--r-- | src/main.rs | 2 |
3 files changed, 15 insertions, 7 deletions
diff --git a/rust-toolchain b/rust-toolchain new file mode 100644 index 0000000..bf867e0 --- /dev/null +++ b/rust-toolchain @@ -0,0 +1 @@ +nightly 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<const N: usize>(&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; |
