Read in AST takes Assignable instead of Ident

This commit is contained in:
Erin 2021-10-23 21:53:21 +02:00 committed by ondra05
parent bcd446c5d1
commit ae1416e329
3 changed files with 18 additions and 9 deletions

View file

@ -144,7 +144,7 @@ pub enum StmtKind {
args: Vec<Expr>,
},
Print(Expr),
Read(Ident),
Read(Assignable),
Melo(Ident),
Rlyeh,
Rickroll,

View file

@ -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!(),
}
}
}

View file

@ -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(),
));
}
}