summaryrefslogtreecommitdiff
path: root/src/semantic/translate.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/semantic/translate.rs')
-rw-r--r--src/semantic/translate.rs36
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,
}
}