Add support for variables in interpreter
This commit is contained in:
parent
520357d930
commit
1ed2ac97cc
4 changed files with 136 additions and 63 deletions
27
src/compiler/symtab.rs
Normal file
27
src/compiler/symtab.rs
Normal file
|
@ -0,0 +1,27 @@
|
|||
use crate::compiler::value::Value;
|
||||
use std::collections::HashMap;
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct SymTab<'source> {
|
||||
pub locals: HashMap<&'source str, Value>,
|
||||
pub parent: Option<Box<SymTab<'source>>>,
|
||||
}
|
||||
|
||||
impl<'source> SymTab<'source> {
|
||||
pub fn get(&mut self, symbol: &str) -> &mut Value {
|
||||
if let Some(val) = self.locals.get_mut(symbol) {
|
||||
val
|
||||
} else if let Some(parent) = &mut self.parent {
|
||||
parent.get(symbol)
|
||||
} else {
|
||||
panic!("No symbol {} found!", symbol);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new_global() -> SymTab<'source> {
|
||||
SymTab {
|
||||
locals: HashMap::new(),
|
||||
parent: None,
|
||||
}
|
||||
}
|
||||
}
|
Reference in a new issue