From 00945be8de227e2a6f56819e5864b58559e37ee6 Mon Sep 17 00:00:00 2001
From: David Li 
Date: Tue, 7 Nov 2017 19:09:42 -0500
Subject: Parameterize translation on frame type
---
 src/semantic/analysis.rs  | 15 +++++++++------
 src/semantic/translate.rs | 36 ++++++++++++++++++++++++++++++------
 2 files changed, 39 insertions(+), 12 deletions(-)
(limited to 'src/semantic')
diff --git a/src/semantic/analysis.rs b/src/semantic/analysis.rs
index edc229f..cf19351 100644
--- a/src/semantic/analysis.rs
+++ b/src/semantic/analysis.rs
@@ -5,6 +5,7 @@
 
 use ::ast::{self, WithLocation};
 use super::environment;
+use super::frame;
 use super::translate::{self, Translate};
 use super::types::{self, Ty};
 
@@ -25,8 +26,10 @@ pub enum TypeError {
 type TypeEnvironment<'a> = environment::Environment<'a, String, Ty>;
 pub type Result = ::std::result::Result>;
 
-pub fn translate(translate: &mut Translate, program: &ast::Program)
-                 -> Result<(translate::Expression, Ty)> {
+pub fn translate(
+    translate: &mut Translate,
+    program: &ast::Program)
+    -> Result<(translate::Expression, Ty)> {
     let mut venv = TypeEnvironment::new(None);
     let mut tenv = TypeEnvironment::new(None);
     tenv.add_binding("int".into(), Ty::Int);
@@ -65,8 +68,8 @@ fn trans_ty<'a>(
     }
 }
 
-fn trans_decl<'a>(
-    tr: &mut Translate,
+fn trans_decl<'a, F: frame::Frame>(
+    tr: &mut Translate,
     venv: &mut TypeEnvironment<'a>,
     tenv: &mut TypeEnvironment<'a>,
     decl: &WithLocation) -> Result {
@@ -119,8 +122,8 @@ fn trans_decl<'a>(
     }
 }
 
-fn trans_exp<'a>(
-    tr: &mut Translate,
+fn trans_exp<'a, F: frame::Frame>(
+    tr: &mut Translate,
     venv: &mut TypeEnvironment<'a>,
     tenv: &mut TypeEnvironment<'a>,
     exp: &WithLocation)
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 {
+    level_counter: usize,
+    _frametype: ::std::marker::PhantomData,
 }
 
-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 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,
         }
     }
 
-- 
cgit v1.2.3