From 9630b53836c0717a7ac0ab86dda3a4efb5bf9fb9 Mon Sep 17 00:00:00 2001
From: David Li
Date: Tue, 28 Nov 2017 20:16:25 -0500
Subject: Translate function calls
---
src/semantic/translate.rs | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
(limited to 'src/semantic/translate.rs')
diff --git a/src/semantic/translate.rs b/src/semantic/translate.rs
index 08e600f..4d51e60 100644
--- a/src/semantic/translate.rs
+++ b/src/semantic/translate.rs
@@ -38,10 +38,10 @@ impl Translate {
}
}
- pub fn make_level(
+ pub fn make_level>(
&mut self,
parent: LevelRef,
- formals: Vec) -> LevelRef {
+ formals: I) -> LevelRef {
let id = self.level_counter;
self.level_counter += 1;
Rc::new(RefCell::new(Level::Level {
@@ -78,4 +78,28 @@ impl Translate {
}
}
}
+
+ pub fn call>(&mut self, target: Expression, parameters: I) -> Expression {
+ Expression::Exp(ir::Expression::Call(
+ Box::new(match target {
+ Expression::Exp(e) => e,
+ Expression::Void(_) => panic!("Can't call Void expression"),
+ }), parameters.into_iter().map(|p| match p {
+ Expression::Exp(e) => e,
+ Expression::Void(_) => panic!("Can't evaluate Void expression"),
+ }).collect()))
+ }
+}
+
+impl Level {
+ pub fn to_exp(&self) -> Expression {
+ match self {
+ &Level::Top => {
+ panic!("Function defined in top level frame")
+ }
+ &Level::Level { ref frame, .. } => {
+ Expression::Exp(frame.to_exp())
+ }
+ }
+ }
}
--
cgit v1.2.3