From 16b044a325558990fcfe876aef88791022a8d602 Mon Sep 17 00:00:00 2001 From: mii Date: Wed, 15 Sep 2021 21:48:52 +0900 Subject: [PATCH] Support external function call. --- src/gpsl.rs | 14 +++++++++++++- src/parser.rs | 4 ++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/gpsl.rs b/src/gpsl.rs index 4dcdb4e..75d8b59 100644 --- a/src/gpsl.rs +++ b/src/gpsl.rs @@ -12,6 +12,7 @@ pub struct GPSL { pub l_vars: HashMap, pub assembly: String, pub offset_size: usize, + pub external_func: fn(String, Vec) -> Option } pub struct LocalVariable { @@ -31,12 +32,13 @@ impl VariableStatus { } impl GPSL { - pub fn new(source: Source) -> GPSL { + pub fn new(source: Source, external_func: fn(String, Vec) -> Option) -> GPSL { GPSL { source, l_vars: HashMap::new(), assembly: String::from(""), offset_size: 0, + external_func } } @@ -53,6 +55,16 @@ impl GPSL { pub fn evaluate(&mut self, node: Box) -> Result, String> { match *node { + Node::Call { name, args } => { + let f = self.external_func; + let mut args_value: Vec = vec![]; + for arg in args { + if let Some(val) = self.evaluate(arg).expect("Cannot evaluate") { + args_value.push(val); + } + } + Ok(f(name, args_value)) + } Node::Text { value } => { Ok(Some(Variable::Text { value diff --git a/src/parser.rs b/src/parser.rs index 53029a2..ccc95eb 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -243,10 +243,10 @@ impl Parser { let node = self.tokenizer.expect_ident()?; if self.tokenizer.consume(String::from("(")) { self.tokenizer.expect(String::from(")"))?; - return Ok(Node::Call { + return Ok(Box::new(Node::Call { name: node.clone(), args: vec![], - }) + })) } return Ok(Node::new_lvar_node(node.clone())); }