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.rs28
1 files changed, 26 insertions, 2 deletions
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<F: frame::Frame> Translate<F> {
}
}
- pub fn make_level(
+ pub fn make_level<I: Iterator<Item=frame::Escape>>(
&mut self,
parent: LevelRef<F>,
- formals: Vec<frame::Escape>) -> LevelRef<F> {
+ formals: I) -> LevelRef<F> {
let id = self.level_counter;
self.level_counter += 1;
Rc::new(RefCell::new(Level::Level {
@@ -78,4 +78,28 @@ impl<F: frame::Frame> Translate<F> {
}
}
}
+
+ pub fn call<I: Iterator<Item=Expression>>(&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<F: frame::Frame> Level<F> {
+ 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())
+ }
+ }
+ }
}