aboutsummaryrefslogtreecommitdiffstats
path: root/src/compiler.rs
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2021-01-11 03:08:55 +0100
committerGustav Sörnäs <gustav@sornas.net>2021-01-11 03:08:55 +0100
commitef6134a278d0ff0fbd6ce04e0b5a2e01c4f8ffc5 (patch)
tree9cd166c4e550fa6032d1958397aeaa36edb5e687 /src/compiler.rs
parentdde985c7abb4dbe37281131b8b36a75302e48438 (diff)
downloadsylt-ef6134a278d0ff0fbd6ce04e0b5a2e01c4f8ffc5.tar.gz
peek_to with const generics
Diffstat (limited to 'src/compiler.rs')
-rw-r--r--src/compiler.rs19
1 files changed, 12 insertions, 7 deletions
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);