From c250d98c31e4efd14c09eeb8939d3ca7a1bd96e4 Mon Sep 17 00:00:00 2001 From: Garrit Franke Date: Sat, 5 Dec 2020 16:16:25 +0100 Subject: [PATCH] Implement return generation --- examples/hello_world.sb | 1 - examples_out/out.js | 7 +++++-- src/generator/js.rs | 38 ++++++++++++++++++++++++++++++++++++-- src/parser/node_type.rs | 3 --- 4 files changed, 41 insertions(+), 8 deletions(-) diff --git a/examples/hello_world.sb b/examples/hello_world.sb index 23e8dbd..f8084c3 100644 --- a/examples/hello_world.sb +++ b/examples/hello_world.sb @@ -1,5 +1,4 @@ fn main() { - let x = "Hello World"; return; } diff --git a/examples_out/out.js b/examples_out/out.js index 983f673..3c84eea 100644 --- a/examples_out/out.js +++ b/examples_out/out.js @@ -1,3 +1,6 @@ -function main() {} -function fib() {} +function main() { +return; +} +function fib() { +} main() \ No newline at end of file diff --git a/src/generator/js.rs b/src/generator/js.rs index 90a6ede..526dc45 100644 --- a/src/generator/js.rs +++ b/src/generator/js.rs @@ -23,9 +23,43 @@ fn generate_function(func: Function) -> String { .into_iter() .map(|arg: Variable| format!("{},", arg.name)) .collect(); - let mut raw = format!("function {N}({A}) ", N = func.name, A = arguments); + let mut raw = format!("function {N}({A})", N = func.name, A = arguments); - raw += "{}\n"; + raw += " {\n"; + + for statement in func.statements { + raw += &generate_statement(statement); + } + + raw += "}\n"; raw } + +fn generate_statement(statement: Statement) -> String { + match statement { + Statement::Return(ret) => generate_return(ret), + Statement::Declare(_, _) => todo!(), + Statement::Exp(val) => generate_expression(val), + Statement::Compound(_) => todo!(), + Statement::If(_, _, _) => todo!(), + Statement::While(_, _) => todo!(), + } +} + +fn generate_expression(expr: Expression) -> String { + match expr { + Expression::Int(val) => val.to_string(), + Expression::Variable(val) | Expression::Str(val) => val, + Expression::Char(_) => todo!(), + Expression::FunctionCall(_, _) => todo!(), + Expression::Assign(_, _) => todo!(), + } +} + +fn generate_return(ret: Option) -> String { + match ret { + Some(expr) => format!("return {}\n", generate_expression(expr)), + None => "return;\n".to_string(), + } +} diff --git a/src/parser/node_type.rs b/src/parser/node_type.rs index 008898d..01878bd 100644 --- a/src/parser/node_type.rs +++ b/src/parser/node_type.rs @@ -33,8 +33,5 @@ pub enum Expression { Char(u8), FunctionCall(String, Vec), Variable(String), - VariableRef(String), Assign(String, Box), - AssignPostfix(String, Box), - Ternary(Box, Box, Box), }