aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2021-01-11 03:30:14 +0100
committerGustav Sörnäs <gustav@sornas.net>2021-01-11 03:30:14 +0100
commitdef028a4d3d410c3088f09cf01e46ec43584934b (patch)
tree28bf18454932a4ec8102a376b167449888be5af5
parent83984ea719f1e613a6382c7e1052738ee94858de (diff)
downloadsylt-min-const-generics.tar.gz
common declaration codemin-const-generics
-rw-r--r--src/compiler.rs40
1 files changed, 20 insertions, 20 deletions
diff --git a/src/compiler.rs b/src/compiler.rs
index a096947..34a8447 100644
--- a/src/compiler.rs
+++ b/src/compiler.rs
@@ -314,6 +314,22 @@ impl Compiler {
// block.add(Op::Assign(self.stack.len() - 1), self.line());
}
+ fn declaration(&mut self, name: &str, typ_str: Option<&str>, block: &mut Block) {
+ self.eat();
+ self.eat();
+ let typ = if let Some(typ) = typ_str {
+ self.eat();
+ Type::try_from(typ.as_ref())
+ } else {
+ Ok(Type::UnkownType)
+ };
+ if typ.is_err() {
+ error!(self, format!("Failed to parse type '{}'.", typ_str.unwrap()));
+ } else {
+ self.define_variable(&name, typ.unwrap(), block);
+ }
+ }
+
fn statement(&mut self, block: &mut Block) {
self.clear_panic();
@@ -321,26 +337,10 @@ impl Compiler {
self.eat();
self.expression(block);
block.add(Op::Print, self.line());
- } else if let [
- Token::Identifier(name),
- Token::Identifier(typ),
- Token::ColonEqual
- ] = self.peek_to() {
- self.eat();
- self.eat();
- self.eat();
- if let Ok(typ) = Type::try_from(typ.as_ref()) {
- self.define_variable(&name, typ, block);
- } else {
- error!(self, format!("Failed to parse type '{}'.", typ));
- }
- } else if let [
- Token::Identifier(name),
- Token::ColonEqual
- ] = self.peek_to() {
- self.eat();
- self.eat();
- self.define_variable(&name, Type::UnkownType, block);
+ } else if let [Token::Identifier(name), Token::Identifier(typ), Token::ColonEqual] = self.peek_to() {
+ self.declaration(&name, Some(&typ), block);
+ } else if let [Token::Identifier(name), Token::ColonEqual] = self.peek_to() {
+ self.declaration(&name, None, block);
} else {
self.expression(block);
block.add(Op::Pop, self.line());