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