diff --git a/ablescript/src/ast.rs b/ablescript/src/ast.rs index fa30420..a5f1905 100644 --- a/ablescript/src/ast.rs +++ b/ablescript/src/ast.rs @@ -144,7 +144,7 @@ pub enum StmtKind { args: Vec, }, Print(Expr), - Read(Ident), + Read(Assignable), Melo(Ident), Rlyeh, Rickroll, diff --git a/ablescript/src/interpret.rs b/ablescript/src/interpret.rs index 1c7f096..356e9f3 100644 --- a/ablescript/src/interpret.rs +++ b/ablescript/src/interpret.rs @@ -280,14 +280,21 @@ impl ExecEnv { .write_all(include_str!("rickroll").as_bytes()) .expect("Failed to write to stdout"); } - StmtKind::Read(ident) => { + StmtKind::Read(assignable) => { let mut value = 0; for _ in 0..READ_BITS { value <<= 1; value += self.get_bit()? as i32; } - self.get_var_mut(ident)?.value.replace(Value::Int(value)); + match assignable.kind { + AssignableKind::Variable => { + self.get_var_mut(&assignable.ident)? + .value + .replace(Value::Int(value)); + } + AssignableKind::Index { .. } => todo!(), + } } } diff --git a/ablescript/src/parser.rs b/ablescript/src/parser.rs index 1aa4876..a397287 100644 --- a/ablescript/src/parser.rs +++ b/ablescript/src/parser.rs @@ -370,12 +370,14 @@ impl<'source> Parser<'source> { // Read input Token::Read => { - if let Some(Expr { - kind: ExprKind::Variable(ident), - span, - }) = buf - { - break self.semi_terminated(StmtKind::Read(Ident::new(ident, span)))?; + if let Some(Ok(assignable)) = buf.take().map(Assignable::from_expr) { + self.require(Token::Semicolon)?; + break StmtKind::Read(assignable); + } else { + return Err(Error::new( + ErrorKind::UnexpectedToken(Token::Read), + self.lexer.span(), + )); } }