use super::frame; use super::ir; use super::temp; #[derive(Debug)] pub enum Expression { Exp(ir::Expression), Void(ir::Statement), } pub struct Translate { level_counter: usize, _frametype: ::std::marker::PhantomData, } pub enum Level<'a, F> where F: 'a + frame::Frame { Top, Level { parent: &'a Level<'a, F>, frame: F, unique_id: usize, }, } impl Translate { pub fn new() -> Translate { Translate { level_counter: 0, _frametype: ::std::marker::PhantomData, } } pub fn make_level<'a>( &mut self, parent: &'a Level, name: temp::TempLabel, formals: Vec) -> Level<'a, F> { let id = self.level_counter; self.level_counter += 1; Level::Level { parent: parent, frame: F::new(name, formals), unique_id: id, } } pub fn make_num(&mut self, num: u64) -> Expression { Expression::Exp(ir::Expression::Const(num)) } }