From 9c77c42ee2cec671fee358fa0caa3daa263a23ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=B6=E5=A1=9A=E5=A4=AA=E6=99=BA?= Date: Sat, 27 Jul 2024 14:35:25 +0900 Subject: [PATCH] Implement instruction of `fn`, `return` and `back` --- src/main.rs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/main.rs b/src/main.rs index 3026bf7..d145220 100644 --- a/src/main.rs +++ b/src/main.rs @@ -76,6 +76,29 @@ fn parse_program(source: String) -> Block { } else if code == "break" { program.push(Instruction::Break) } + if code.starts_with("fn") { + let name = + code[2..code.find("(").expect("チノちゃん「うるさいですね...」")].to_string(); + let args: Vec = code[code.find("(").expect("チノちゃん「うるさいですね...」") + ..code.find(")").expect("チノちゃん「うるさいですね...」")] + .to_string() + .split(",") + .into_iter() + .map(String::from) + .collect(); + let code_inner = parse_program( + code[code.find("{").expect("チノちゃん「うるさいですね...」") + 1 + ..code.rfind("}").expect("チノちゃん「うるさいですね...」")] + .to_string(), + ); + program.push(Instruction::Function(name, args, code_inner)) + } else if code.starts_with("return") { + program.push(Instruction::Return(Some(parse_expr( + code[6..code.len()].trim().to_string(), + )))); + } else if code == "back" { + program.push(Instruction::Return(None)); + } } program }