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/main.rs | 2 +-
src/semantic/analysis.rs | 15 +++++++++------
src/semantic/translate.rs | 36 ++++++++++++++++++++++++++++++------
3 files changed, 40 insertions(+), 13 deletions(-)
diff --git a/src/main.rs b/src/main.rs
index a8114ac..e4b0cd5 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -13,7 +13,7 @@ fn main() {
let stdin = io::stdin();
let mut handle = stdin.lock();
loop {
- let mut translate = semantic::translate::Translate::new();
+ let mut translate = semantic::translate::Translate::::new();
let mut input = String::new();
print!("taiga> ");
io::stdout().flush().unwrap();
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