generated from ElnuDev/rust-project
Implement local variable assignment
This commit is contained in:
parent
149842c121
commit
01173d2f7d
4 changed files with 32 additions and 4 deletions
|
@ -2,11 +2,12 @@
|
|||
if True:
|
||||
let x = "3"
|
||||
"Bob will be here in [x] seconds."
|
||||
let x = "2"
|
||||
x = "2"
|
||||
"Bob will be here in [x] seconds."
|
||||
if True:
|
||||
let x = "213"
|
||||
let x = "1"
|
||||
x = "1"
|
||||
let x = "4"
|
||||
"[x]"
|
||||
"Bob will be here in [x] seconds."
|
||||
"Bob will be here in [x] seconds."
|
||||
"Bob" "I will not say anything, [foo]"
|
||||
|
|
|
@ -22,6 +22,7 @@ impl State {
|
|||
self.script.borrow_mut().next(&self.script)
|
||||
}
|
||||
}
|
||||
|
||||
impl Iterator for State {
|
||||
type Item = Event;
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use debug_cell::RefCell;
|
||||
use core::panic;
|
||||
use std::{collections::HashMap, rc::Rc};
|
||||
|
||||
use super::{
|
||||
|
@ -71,7 +72,27 @@ impl CommandContext {
|
|||
if let Token::Keyword(_) = value {
|
||||
todo!("assignment variable interpolation isn't implemented");
|
||||
}
|
||||
todo!("local variable assignment isn't implemented")
|
||||
let mut block_option = Some(self.context.clone());
|
||||
let mut modified = false;
|
||||
while let Some(block) = block_option {
|
||||
let block = block.borrow();
|
||||
block
|
||||
.variables
|
||||
.borrow_mut()
|
||||
.entry(variable.clone())
|
||||
.and_modify(|e| {
|
||||
*e = value.clone();
|
||||
modified = true;
|
||||
});
|
||||
if modified {
|
||||
break;
|
||||
}
|
||||
block_option = block.parent.clone();
|
||||
}
|
||||
if !modified {
|
||||
panic!("undefined variable `{variable}`");
|
||||
}
|
||||
return None;
|
||||
}
|
||||
},
|
||||
Eat { .. } => return None,
|
||||
|
|
|
@ -73,6 +73,11 @@ pub fn parse_command(pair: Pair) -> Command {
|
|||
variable: variable.clone(),
|
||||
value: value.clone(),
|
||||
},
|
||||
[Keyword(variable), Keyword(equals), value] if equals.eq("=") => Assign {
|
||||
assign_type: AssignType::Assign,
|
||||
variable: variable.clone(),
|
||||
value: value.clone()
|
||||
},
|
||||
[Keyword(keyword), Str(food), tail @ ..] if keyword.eq("eat") => Eat {
|
||||
food: food.to_owned(),
|
||||
politely: match tail {
|
||||
|
|
Loading…
Add table
Reference in a new issue