diff options
Diffstat (limited to 'src/semantic/translate.rs')
-rw-r--r-- | src/semantic/translate.rs | 36 |
1 files changed, 30 insertions, 6 deletions
diff --git a/src/semantic/translate.rs b/src/semantic/translate.rs index cc5aec0..179eb62 100644 --- a/src/semantic/translate.rs +++ b/src/semantic/translate.rs @@ -1,4 +1,6 @@ +use super::frame; use super::ir; +use super::temp; #[derive(Debug)] pub enum Expression { @@ -6,18 +8,40 @@ pub enum Expression { Void(ir::Statement), } -pub struct Translate { - +pub struct Translate<F> { + level_counter: usize, + _frametype: ::std::marker::PhantomData<F>, } -pub enum Level { +pub enum Level<'a, F> + where F: 'a + frame::Frame { Top, - Level, + Level { + parent: &'a Level<'a, F>, + frame: F, + unique_id: usize, + }, } -impl Translate { - pub fn new() -> Translate { +impl<F: frame::Frame> Translate<F> { + pub fn new() -> Translate<F> { Translate { + level_counter: 0, + _frametype: ::std::marker::PhantomData, + } + } + + pub fn make_level<'a>( + &mut self, + parent: &'a Level<F>, + name: temp::TempLabel, + formals: Vec<frame::Escape>) -> Level<'a, F> { + let id = self.level_counter; + self.level_counter += 1; + Level::Level { + parent: parent, + frame: F::new(name, formals), + unique_id: id, } } |