From 1da6b3db096fc3cdc7b2bb61816dc19848e7e9d6 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Fri, 24 May 2024 23:22:27 +0200 Subject: [PATCH] namespaces --- src/lexer.rs | 2 +- src/parser.rs | 10 ++++++++++ src/transpiler.rs | 16 +++++++++++++++- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/lexer.rs b/src/lexer.rs index e006c09..f0828b9 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -88,7 +88,7 @@ const SYNTAX: [Node; 16] = [ }, Node { token_type: TokenType::Keyword1, - token_regex: Lazy::new(|| Regex::new(r"^(if|for|while|else *if)\b").unwrap()), + token_regex: Lazy::new(|| Regex::new(r"^(namespace|if|for|while|else *if)\b").unwrap()), }, Node { token_type: TokenType::Keyword2, diff --git a/src/parser.rs b/src/parser.rs index 013af82..323a4ae 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -10,6 +10,7 @@ pub enum AstType { StructCall, StructVar, VoidFunctionDeceleration, + Namespace, VariableDeceleration, PointerDeceleration, MutVariableDeceleration, @@ -100,6 +101,15 @@ impl Parser { ast_res.tokens.push(self.tokens[index + 2].clone()); ast_res.ast_type = AstType::StructDeceleration; self.index += 2; + } else if self.tokens.len() - index > 2 + && self.tokens[index].value == "namespace" + && self.tokens[index + 1].token_type == TokenType::Identifier + && self.tokens[index + 2].token_type == TokenType::Curly + { + ast_res.tokens.push(self.tokens[index + 1].clone()); + ast_res.tokens.push(self.tokens[index + 2].clone()); + ast_res.ast_type = AstType::Namespace; + self.index += 2; } else if self.tokens.len() - index > 2 && self.tokens[index].token_type == TokenType::Keyword1 && self.tokens[index + 1].token_type == TokenType::Round diff --git a/src/transpiler.rs b/src/transpiler.rs index 59a9905..864c277 100644 --- a/src/transpiler.rs +++ b/src/transpiler.rs @@ -41,7 +41,6 @@ pub fn transpile_mod(ast: Ast, options: &mut Options, s: &str) -> String { clean_incl(modfile.split(".").collect::>()[0]), options.clone().modnum ); - println!("{}", s.to_string() + modfile); let file_content = fs::read_to_string(s.to_string() + modfile).expect("Error reading file"); let transpiled_code = transpile( file_content, @@ -296,6 +295,21 @@ pub fn transpile(input: String, indent: u32, state: LexerState, options: &mut Op ), ) .as_str(); + } else if ast.ast_type == AstType::Namespace { + let transpiled_code = transpile( + ast.tokens[1].value.clone(), + 0, + LexerState { line: 1, column: 0 }, + &mut Options::default(), + ); + fs::write( + ("wyst_tmp/".to_string() + &ast.tokens[0].value.clone()) + ".rs", + transpiled_code, + ) + .expect("Error writing file"); + result += "mod "; + result += &ast.tokens[0].value.clone(); + result += ";\n"; } // flp else {