diff --git a/.gitignore b/.gitignore deleted file mode 100644 index ce77e4e..0000000 --- a/.gitignore +++ /dev/null @@ -1,38 +0,0 @@ -# Generated by Cargo -# will have compiled files and executables -debug/ -target/ -test/ -.vscode/ -.idea/ - -# Remove Cargo.lock from gitignore if creating an executable, leave it for libraries -# More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html -Cargo.lock - -# These are backup files generated by rustfmt -**/*.rs.bk - -# MSVC Windows builds of rustc generate these, which store debugging information -*.pdb - - -# Added by cargo -/target - -#MacOS -.DS_Store - -#Wyst files for testing -*.wst - - -# Wyst build output taht contains rust files -/build - -# Wyst compiled output -out - -/log.txt -/lsp.log - diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 13566b8..0000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Editor-based HTTP Client requests -/httpRequests/ -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 51986f9..0000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 35eb1dd..0000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/wyst.iml b/.idea/wyst.iml deleted file mode 100644 index cf84ae4..0000000 --- a/.idea/wyst.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 36979dc..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "rust-analyzer.linkedProjects": [ - "./Cargo.toml" - ], - "rust-analyzer.showUnlinkedFileNotification": false, - "cSpell.enabled": false -} \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml deleted file mode 100644 index 91bbbb6..0000000 --- a/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "wyst" -version = "0.1.0" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] -rand = "0.8.5" -serde_json = "1.0" -serde = "1.0.203" -serde_derive = "1.0.203" -lsp-types = "0.97.0" -zip = "2.1.3" -dirs = "5.0.1" -pest = "2" -pest_derive = "2.1" -clap = "3" -hex = "0.4" -regex = "1.10.5" diff --git a/README.md b/README.md index 0fc0d3b..772cd4c 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@

Wyst

-

Wyst is a programing language that has similar syntax to C and transpiles to Rust

+

Wyst is a programing language that is inspired by C and transpiles to Go

```c #include @@ -14,7 +14,4 @@ int main() { printf("Hello, World!"); return 0; } -``` - -# Alpha -We are on pure alpha. if you would like to contribute please open a new issue. +``` \ No newline at end of file diff --git a/lib/README.md b/lib/README.md deleted file mode 100644 index d41d038..0000000 --- a/lib/README.md +++ /dev/null @@ -1,4 +0,0 @@ -# Wyst stdlib - -## > [!NOTE] -> any changes made here should be documented before pushed to master diff --git a/lib/stdio.h b/lib/stdio.h deleted file mode 100644 index e69de29..0000000 diff --git a/lib/stdio.rs b/lib/stdio.rs deleted file mode 100644 index 78021bc..0000000 --- a/lib/stdio.rs +++ /dev/null @@ -1,7 +0,0 @@ -#[macro_export] - -macro_rules! _0x7072696e7466 { - ($($arg:tt)*) => { - print!($($arg)*) - }; -} diff --git a/lib/stdlib.h b/lib/stdlib.h deleted file mode 100644 index e69de29..0000000 diff --git a/lib/stdlib.rs b/lib/stdlib.rs deleted file mode 100644 index 49d1a2c..0000000 --- a/lib/stdlib.rs +++ /dev/null @@ -1,23 +0,0 @@ -use std::alloc::{alloc, Layout}; -use std::ptr::null_mut; - -// Malloc -pub fn _0x6d616c6c6f63(size: usize) -> *mut u8 { - if size == 0 { - return null_mut(); - } - - // Create a memory layout for the requested size - let layout = Layout::from_size_align(size, std::mem::align_of::()).unwrap(); - - // Allocate the memory - unsafe { - let ptr = alloc(layout); - if ptr.is_null() { - // Allocation failed - null_mut() - } else { - ptr - } - } -} diff --git a/src/compiler.rs b/src/compiler.rs deleted file mode 100644 index b4270d9..0000000 --- a/src/compiler.rs +++ /dev/null @@ -1,90 +0,0 @@ -use std::str; -use std::{fs, path::Path, process::Command}; - -use crate::{ - transpiler::{State, Transpiler}, - utils::{Problem, ProblemCap, ProblemType}, -}; - -pub fn transpile_file(input_file: String, output_file: String, is_main: bool) -> u8 { - let mut ecode: u8 = 0; - let mut trsp = Transpiler { - ..Default::default() - }; - if let Ok(file_contents) = fs::read_to_string(input_file) { - let mut module_code = String::new(); - let mut output_code = String::new(); - match trsp.transpile_code(file_contents, 0) { - Ok(rcode) => output_code += rcode.as_str(), - Err(e) => { - ecode = 1; - println!("{e}") - } - } - if is_main { - for module in trsp.clone().mod_manager.modules { - module_code += "mod "; - module_code += module.rs_mod.as_str(); - module_code += ";\n"; - } - } - output_code = format!( - "{module_code}\n{output_code}\nfn main() {}{}{}", - "{_0x", - hex::encode("main"), - "();}" - ); - if let Ok(_) = fs::write(Path::new("build").join(output_file), output_code) { - trsp.problems.append(&mut trsp.mod_manager.write()); - } - } else { - trsp.problems.push(ProblemCap::Error(Problem { - problem_msg: "File not found".to_string(), - problem_type: ProblemType::FileNotFound, - state: State { - line: 0, - column: 0, - file: None, - }, - })) - } - for p in trsp.problems { - match p { - ProblemCap::Error(problem) => { - ecode = 1; - if problem.state.file == None { - println!( - "\x1b[31;1m{:?}\x1b[0;1m: {}", - problem.problem_type, problem.problem_msg, - ) - } else { - println!( - "\x1b[31;1mError\x1b[0;1m: {}\x1b[0m\n{}:{}: {:?}", - problem.problem_msg, - problem.state.line, - problem.state.column, - problem.problem_type, - ) - } - } - } - } - ecode -} - -pub fn compile_rust(exe_file: String) { - let output = Command::new("rustc") - .arg(Path::new("build").join("main.rs")) - .arg("-o") - .arg(exe_file.clone()) - .output() - .expect("Error compiling rust: "); - if &output.stderr.len() == &0 { - println!("Compiled successfully: \x1b[34;4m{}", exe_file.clone()); - } else { - println!( - "{}", - str::from_utf8(&output.stderr).expect("Error encoding stderr") - ); - } -} diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index 1653dc2..0000000 --- a/src/main.rs +++ /dev/null @@ -1,88 +0,0 @@ -use std::str; -use std::thread::sleep; -use std::time::Duration; -use std::{fs, io::Read, process}; -mod compiler; -mod transpiler; -mod utils; - -use clap::{App, Arg}; -use compiler::{compile_rust, transpile_file}; -use utils::match_code; - -fn main() { - let matches = App::new("Wyst") - .version("0.51") - .author("Orus") - .about("The wyst compiler") - .arg( - Arg::with_name("file") - .required_unless_one(&["stdio", "hex", "logo"]) - .help("Sets the input file to use"), - ) - .arg( - Arg::with_name("output") - .short('o') - .long("output") - .takes_value(true) - .help("Specifies the output binary file name"), - ) - .arg( - Arg::with_name("build") - .short('b') - .long("build") - .help("Puts the rust files in the build directory"), - ) - .arg( - Arg::with_name("stdio") - .short('s') - .long("stdio") - .help("LSP Mode"), - ) - .arg( - Arg::with_name("hex") - .short('h') - .long("hex") - .takes_value(true) - .help("Turn an identifier into hex"), - ) - .arg(Arg::with_name("logo").long("logo").hide(true)) - .get_matches(); - if matches.is_present("logo") { - println!("{}", utils::LOGO); - let mut byte = [4; 4]; - std::io::stdin().read_exact(&mut byte).unwrap(); - let egg = str::from_utf8(&byte).unwrap().to_string(); - let mut counter: u8 = 30; - if egg == "logo" { - loop { - if counter == 35 { - counter = 30; - } - println!("\x1B[2J\x1B[{}m{}", counter, utils::LOGO); - sleep(Duration::from_millis(400)); - counter += 1; - } - } - } else if matches.is_present("stdio") { - println!( - "{:?}", - match_code("void testme(int x) {}\ntest".to_string(), 1, 3).unwrap() - ); - } else if matches.is_present("hex") { - let ident = matches.value_of("hex").unwrap().to_string(); - println!("_0x{}", hex::encode(ident)); - } else { - let file = matches.value_of("file").unwrap().to_string(); - let output = matches.value_of("output").unwrap_or("out").to_string(); - if let Ok(_) = fs::create_dir("build") {} - let ecode = transpile_file(file, "main.rs".to_string(), true); - if ecode == 0 { - compile_rust(output); - } - if !matches.is_present("build") { - fs::remove_dir_all("build").expect("Error removing build"); - } - process::exit(ecode as i32); - } -} diff --git a/src/transpiler.rs b/src/transpiler.rs deleted file mode 100644 index 0a58e59..0000000 --- a/src/transpiler.rs +++ /dev/null @@ -1,436 +0,0 @@ -use crate::utils::{ModManager, ProblemCap}; -use pest::iterators::{Pair, Pairs}; -use serde::{Deserialize, Serialize}; - -// The Parser -use pest::{error::Error, Parser}; -use pest_derive::Parser; -#[derive(Parser)] -#[grammar = "wyst.pest"] -pub struct WystParser; - -#[derive(Deserialize, Serialize, Debug, Clone)] -pub struct State { - pub line: u32, - pub column: u32, - pub file: Option, -} - -#[derive(Debug, Clone)] -#[allow(dead_code)] -pub struct Transpiler { - pub problems: Vec, - pub state: State, - pub inject: Inject, - pub mod_manager: ModManager, -} -#[derive(Debug, Clone)] -#[allow(dead_code)] -pub struct Inject { - pub state: State, - pub inject: bool, -} - -impl Default for Inject { - fn default() -> Self { - Inject { - inject: false, - state: State { - line: 0, - column: 0, - file: None, - }, - } - } -} - -impl Default for Transpiler { - fn default() -> Self { - Transpiler { - inject: Inject::default(), - problems: Vec::new(), - mod_manager: ModManager::new(), - state: State { - line: 1, - column: 0, - file: None, - }, - } - } -} - -pub fn to_indexable(pairs: Pairs) -> Vec> { - let mut arr: Vec> = Vec::new(); - for pair in pairs { - arr.push(pair) - } - arr -} - -impl Transpiler { - pub fn encode_ident(&mut self, ident: &str) -> String { - match WystParser::parse(Rule::def_identifier, ident) { - Ok(parsed) => { - let mut output = String::new(); - for pair in parsed { - let tokens = to_indexable(pair.clone().into_inner()); - for t in tokens { - match t.as_rule() { - Rule::identifier => { - let ident = t.as_str().trim(); - let mut ident_rs = String::from("_0x"); - let ident_chars: Vec = ident.chars().collect(); - for i in 0..ident_chars.len() { - let current = ident_chars[i]; - if ident_chars.len() > i + 1 { - let next = ident_chars[i + 1]; - if current == '.' { - ident_rs += "._0x"; - } else if current == ':' && next == ':' { - ident_rs += "::_0x"; - } else { - if current != ':' && current != '.' { - ident_rs += - hex::encode(current.to_string()).as_str(); - } - } - } else { - if current == '.' { - ident_rs += "._0x"; - } else { - ident_rs += hex::encode(current.to_string()).as_str(); - } - } - } - if self.mod_manager.macros.contains(&ident_rs) { - output += ident_rs.as_str(); - output += "!"; - } else { - output += match ident { - "void" => "()", - "int" => "i32", - "float" => "f64", - "Vec" => "Vec", - "bool" => "bool", - _ => { - if self.mod_manager.map.contains_key(ident) { - self.mod_manager.map.get(ident).unwrap() - } else { - ident_rs.as_str() - } - } - }; - } - } - Rule::def_identifier => { - output += "<"; - output += self.encode_ident(t.as_str()).as_str(); - output += ">"; - } - _ => {} - } - } - } - output - } - Err(_) => String::new(), - } - } - pub fn transpile_pairs(&mut self, pairs: Pairs) -> String { - let mut res = String::new(); - for pair in pairs { - res += self.transpile(pair).as_str(); - } - res - } - pub fn transpile_vec(&mut self, pairs: Vec>) -> String { - let mut res = String::new(); - for pair in pairs { - res += self.transpile(pair).as_str(); - } - res - } - pub fn transpile(&mut self, pair: Pair) -> String { - let mut res = String::new(); - let tokens = to_indexable(pair.clone().into_inner()); - match pair.as_rule() { - Rule::func_def => { - res += format!( - "pub fn {}({}) -> {} {}\n", - self.transpile(tokens[1].clone()), - self.transpile_pairs(tokens[2].clone().into_inner()) - .as_str() - .replace("let mut", ""), - self.transpile(tokens[0].clone()), - self.transpile(tokens[3].clone()) - ) - .as_str(); - } - Rule::ptr_fn_def => { - res += format!( - "pub fn {}({}) -> &mut {} {}\n", - self.transpile(tokens[1].clone()), - self.transpile_pairs(tokens[2].clone().into_inner()) - .as_str() - .replace("let mut", ""), - self.transpile(tokens[0].clone()), - self.transpile(tokens[3].clone()) - ) - .as_str(); - } - Rule::var_def_ptr => { - res += format!( - "let mut {}: &mut {}", - self.transpile(tokens[1].clone()), - self.transpile(tokens[0].clone()) - ) - .as_str(); - } - Rule::var_def => { - if tokens.len() == 1 { - res += self.transpile(tokens[0].clone()).as_str(); - } else { - res += format!( - "let mut {}: {}", - self.transpile(tokens[1].clone()), - self.transpile(tokens[0].clone()) - ) - .as_str(); - } - } - Rule::var_def_set => { - res += format!( - "{} = {}", - self.transpile(tokens[0].clone()), - self.transpile(tokens[1].clone()), - ) - .as_str(); - } - Rule::curly => { - res += "{"; - res += &self.transpile_pairs(pair.clone().into_inner()); - res += "}"; - } - Rule::code_expr => { - res += &self.transpile_pairs(pair.clone().into_inner()); - } - - Rule::include_global => { - res += "#[allow(unused_imports)]\nuse "; - res += self - .mod_manager - .add(&mut self.clone(), tokens[0].as_str().to_string(), true) - .as_str(); - res += "::*;\n"; - } - Rule::include => { - res += "#[allow(unused_imports)]\nuse "; - res += self - .mod_manager - .add(&mut self.clone(), tokens[0].as_str().to_string(), false) - .as_str(); - res += "::*;\n"; - } - - Rule::identifier | Rule::def_identifier => { - res += self.encode_ident(pair.as_str().trim()).as_str(); - } - - Rule::call => { - res += " "; - res += self.transpile(tokens[0].clone()).as_str(); - res += self.transpile(tokens[1].clone()).as_str(); - } - - Rule::round => { - res += "("; - res += self.transpile_pairs(pair.into_inner()).as_str(); - res += ")"; - } - - Rule::expr => { - res += self.transpile_pairs(pair.into_inner()).as_str(); - } - - Rule::term => { - res += self.transpile_pairs(pair.into_inner()).as_str(); - } - - Rule::struct_def => { - res += "struct "; - res += self.transpile(tokens[0].clone()).as_str(); - res += "{"; - res += self.transpile(tokens[1].clone()).as_str(); - res += "}"; - } - - Rule::semicolon => { - res += ";\n"; - } - - Rule::string => { - res += pair.as_str(); - } - - Rule::map => { - self.mod_manager.map.insert( - tokens[0].as_str().to_string(), - tokens[2].as_str().to_string(), - ); - } - - Rule::enum_def => { - res += format!( - "enum {} {}{}{}", - self.transpile(tokens[0].clone()), - "{", - self.transpile_pairs(tokens[1].clone().into_inner()), - "}\n" - ) - .as_str(); - } - - Rule::ecall => { - res += self.transpile(tokens[0].clone()).as_str(); - if tokens.len() > 1 { - let mut params = tokens.clone(); - params.remove(0); - res += "("; - res += self.transpile_vec(params).as_str(); - res += ")"; - } - } - - Rule::comma => { - res += ","; - } - - Rule::ptr_set => { - res += format!( - "*{} = {}", - self.transpile(tokens[0].clone()), - self.transpile(tokens[1].clone()), - ) - .as_str(); - } - - Rule::int => { - res += " "; - res += pair.as_str(); - res += " "; - } - - Rule::refrence => { - res += "&mut "; - res += self.transpile(tokens[0].clone()).as_str(); - } - - Rule::return_stm => { - res += "return "; - res += self.transpile(tokens[0].clone()).as_str(); - } - - Rule::if_stm => { - res += "if "; - res += self.transpile_pairs(pair.into_inner()).as_str(); - } - - Rule::else_if_stm => { - res += "else if "; - res += self.transpile_pairs(pair.into_inner()).as_str(); - } - - Rule::else_stm => { - res += "else "; - res += self.transpile_pairs(pair.into_inner()).as_str(); - } - - Rule::bool => { - res += pair.as_str(); - } - - Rule::operator => { - res += pair.as_str(); - } - - Rule::if_operator => { - res += pair.as_str(); - } - - Rule::if_expr => { - res += self.transpile_pairs(pair.into_inner()).as_str(); - } - - Rule::namespace_def => { - res += "mod "; - res += self.transpile_pairs(pair.into_inner()).as_str(); - } - - Rule::top_code => { - res += "{"; - res += self.transpile_pairs(pair.into_inner()).as_str(); - res += "}"; - } - - Rule::top_expr => { - res += self.transpile_pairs(pair.into_inner()).as_str(); - } - - Rule::impl_def => { - res += "impl "; - res += self.transpile_pairs(pair.into_inner()).as_str(); - } - - Rule::match_name => { - let to_match = tokens[0].clone().as_str(); - let match_id = tokens[1].clone().as_str(); - res += "\n"; - res += self.encode_ident(to_match).as_str(); - res += " { - for i in 0..tokens.len() { - let token = tokens[i].clone(); - if i % 2 == 0 { - res += self.transpile(token).as_str(); - } else { - res += token.as_str(); - } - } - } - - _ => { - println!("\x1b[33mNot Handled: {}\x1b[0m", pair); - res += " "; - res += pair.as_str(); - res += " "; - } - } - res - } - pub fn transpile_code(&mut self, code: String, indent: usize) -> Result> { - let mut res = String::new(); - match WystParser::parse(Rule::top_expr, &code) { - Ok(parsed) => { - for pair in parsed { - res += self.transpile_pairs(pair.into_inner()).as_str(); - } - } - Err(e) => { - return Err(e); - } - } - if indent > 0 { - res += " ".repeat(indent * 2).as_str(); - } - - if indent > 0 { - res += "\n"; - res += " ".repeat((indent - 1) * 2).as_str(); - } - Ok(res) - } -} diff --git a/src/utils.rs b/src/utils.rs deleted file mode 100644 index 41b3a40..0000000 --- a/src/utils.rs +++ /dev/null @@ -1,273 +0,0 @@ -use crate::transpiler::{Rule, State, Transpiler, WystParser}; -use dirs::home_dir; -use pest::Parser; -use rand::random; -use regex::Regex; -use serde::{Deserialize, Serialize}; -use std::collections::HashMap; -use std::fs; -use std::path::Path; - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub enum ProblemType { - VariableNotFound, - FileNotFound, - HeaderSyntaxError, - SyntaxError, -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub enum ProblemCap { - Error(Problem), -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct Problem { - pub problem_type: ProblemType, - pub problem_msg: String, - pub state: State, -} - -#[derive(Debug, Clone)] -pub struct Module { - pub rs_mod: String, - pub file_path: String, - pub code: String, -} - -#[derive(Debug, Clone)] -pub struct ModManager { - pub modules: Vec, - pub macros: Vec, - pub map: HashMap, -} - -impl ModManager { - pub fn new() -> ModManager { - ModManager { - modules: Vec::new(), - macros: Vec::new(), - map: HashMap::new(), - } - } - pub fn check(&mut self, path: String) -> Option { - for module in self.modules.clone() { - if module.file_path == path { - return Some(module); - } - } - None - } - pub fn add(&mut self, root: &mut Transpiler, file_path: String, global: bool) -> String { - let mut problems: Vec = Vec::new(); - let mod_name = format!("mod_{}", self.modules.len()); - let home_dirpb = home_dir().unwrap(); - let home_dir = home_dirpb.to_str().unwrap(); - let mut file_path = file_path; - if global { - let mut tmp = Path::new(home_dir) - .join("wyst") - .join("lib") - .join(file_path.clone()) - .to_str() - .unwrap() - .to_string(); - if !Path::new(&tmp).exists() { - tmp = Path::new("lib") - .join(file_path) - .to_str() - .unwrap() - .to_string(); - } - file_path = tmp; - } - if let Some(modl) = self.check(file_path.clone()) { - return modl.rs_mod; - } - if let Ok(code) = fs::read_to_string(file_path.clone()) { - match file_path.rsplit_once('.').unwrap_or(("", "")).1 { - "rs" => match WystParser::parse(Rule::rust_code, &code) { - Ok(parsed) => { - self.modules.push(Module { - rs_mod: mod_name.clone(), - file_path: file_path.clone(), - code: code.clone(), - }); - for pair in parsed { - for p in pair.into_inner() { - if p.as_rule() == Rule::rust_macro_lint { - self.macros.push(p.into_inner().as_str().to_string()); - } - } - } - } - Err(_) => {} - }, - "h" => { - file_path = file_path.rsplit_once('.').unwrap_or(("", "")).0.to_string(); - file_path += ".rs"; - let parsed = WystParser::parse(Rule::header_expr, &code).unwrap(); - for pair in parsed { - root.transpile_pairs(pair.into_inner()); - } - self.map.extend(root.mod_manager.map.clone().into_iter()); - if let Ok(code1) = fs::read_to_string(file_path.clone()) { - let parsed = WystParser::parse(Rule::rust_code, &code1).unwrap(); - self.modules.push(Module { - rs_mod: mod_name.clone(), - file_path: file_path.clone(), - code: code1.clone(), - }); - for pair in parsed { - for p in pair.into_inner() { - if p.as_rule() == Rule::rust_macro_lint { - self.macros.push(p.into_inner().as_str().to_string()); - } - } - } - } else { - problems.push(ProblemCap::Error(Problem { - problem_msg: format!("Sub Header not found '{}'", file_path), - problem_type: ProblemType::FileNotFound, - state: State { - line: 0, - column: 0, - file: None, - }, - })) - } - } - _ => {} - } - } else { - problems.push(ProblemCap::Error(Problem { - problem_msg: format!("File not found '{}'", file_path), - problem_type: ProblemType::FileNotFound, - state: State { - line: 0, - column: 0, - file: None, - }, - })) - } - mod_name - } - pub fn write(&mut self) -> Vec { - let mut problems: Vec = Vec::new(); - for module in self.modules.clone() { - let file_path = module.file_path; - match file_path.rsplit_once('.').unwrap_or(("", "")).1 { - "wst" => { - let mut trsp = Transpiler { - mod_manager: self.clone(), - ..Default::default() - }; - let rust_code = trsp.transpile_code(module.code, 0).expect(""); - fs::write( - Path::new("build").join((module.rs_mod + ".rs").as_str()), - rust_code, - ) - .expect("Error writing rust file: "); - problems.append(&mut trsp.problems); - self.modules = trsp.mod_manager.modules; - } - - "rs" => fs::write( - Path::new("build").join((module.rs_mod + ".rs").as_str()), - &module.code, - ) - .unwrap(), - - _ => {} - } - } - problems - } -} -#[derive(Debug, Clone)] -#[allow(dead_code)] -pub struct MatchError { - msg: String, -} - -pub fn match_code(code: String, line: usize, column: usize) -> Result { - let re_include = Regex::new(r#"\#\s*include\s*(<|\")([a-zA-Z0-9_.-]*)$"#).unwrap(); - let re_ident = Regex::new(r#"(\:\:|[_a-zA-Z])(\:\:|[_a-zA-Z0-9])*$"#).unwrap(); - let mut lines: Vec<&str> = code.split("\n").collect(); - if lines.len() >= line { - let result = &lines[line][..column]; - if let Some(caps) = re_include.captures(&result) { - let match_id: u16 = random(); - return Ok(format!("", &caps[0], match_id)); - } else if let Some(caps) = re_ident.captures(&result) { - let match_id: u16 = random(); - let match_line = format!("", &caps[0], match_id); - lines[line] = match_line.as_str(); - let mut trsp = Transpiler::default(); - match trsp.transpile_code(lines.join("\n"), 0) { - Ok(rs_code) => { - return Ok(rs_code); - } - Err(_) => { - return Err(MatchError { - msg: "Syntax error".to_string(), - }); - } - } - } - } - Err(MatchError { - msg: "last resort empty".to_string(), - }) -} - -pub const LOGO: &str = r#" - - - @@ @@@ @ - @@@@ @@@@@ @@@@ - @@@@ @@@@@@@@@@@@@@@@@@@ @@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@ - @@@ @@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@ @@@ - @@@@@@@@@@@@@@@ @@@@@@ @@@@@@@@@@@@@@@ - @@@@@@@@@@@@ @ @@@@@@@@@@@@ - @@@@@@@@@@@@@@@ @@@@@@@@@@ @@ - @@@@@@@@@@@@@ @@@@@@@@@@@@@ - @@@@@@@@@@ @@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@ @@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@ @@@@@ - @@@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@@@@ @@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@ - @@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@ -@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ @@@@@@@@@@ @@@@@@@@@@@ -@@@@@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@@@@ @@@@@@@@@@@ - @@@@@@@@ @@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@ - @@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@ - @@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@ - @@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@ - @@@@@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@ @@@@@@@@ - @@@@@@@@@ @@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ @@@@@@@@@ - @@@@@@@@@@@ @@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@ @@@@@@@@@@ - @@@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@@ - @@@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@@@@@@ @@@@@@@@@ - @@@@@@@@@@ @ @@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@ - @@@ @@@@@@@@@ @@@ @@@@ @@@@@@@@@ @@@ - @@@@@@@@ @@@ @@@ @@@@@@@@ - @@@@@@@@@ @@@@ @@@@ @@@@@@@@@ - @@@ @@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@ @@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ - @@@@ @@@@@@@@@@@@@@@@@@@ @@@@ - @@@@ @@@@@ @@@@ - @@ @@@ @@ - - -"#; diff --git a/src/wyst.pest b/src/wyst.pest deleted file mode 100644 index 0c1de27..0000000 --- a/src/wyst.pest +++ /dev/null @@ -1,121 +0,0 @@ -WHITESPACE = _{ ("//" ~ (!"\n" ~ ANY)*) | ("/*" ~ (!"*/" ~ ANY)*) | " " | "\t" | "\n" } - -// [chars] -comma = {","} -semicolon = {";"} -dot = {"."} - -// [literals] -filepath = { ("/"|('a'..'z' | 'a'..'z' | '0'..'9' | "_" | "-" | "."))+ } -include = { "#" ~ "include" ~ "\"" ~ filepath ~ "\"" } -include_global = { "#" ~ "include" ~ "<" ~ filepath ~ ">" } -round = { "(" ~ ((expr ~ comma)* ~ expr?) ~ ")" } -curly = { "{" ~ (code_expr)* ~ "}" } -escape = { "\\" ~ ANY } -raw_string = { (!("\\" | "\"") ~ ANY)+ } -string = { "\"" ~ (raw_string | escape )* ~ "\"" } -char = { "'" ~ (escape | ANY) ~ "'" } -bool = @{"true" | "false"} -keyword = @{"struct"|"return"} -map = { "#" ~ "map" ~ identifier ~ comma ~ identifier } -match_name = { "" } - -// [numbers] -hex = @{ "0" ~ ("x"|"X") ~ ('0'..'9' | 'a'..'f' | 'A'..'F')*} -float = @{ ('0'..'9')* ~ "." ~ ('0'..'9')+ } -int = @{ '0'..'9'+ } - -// [identifiers] -identifier = @{ !(hex|float|int) ~ ("." | "::" | "_" | 'a'..'z' | 'A'..'Z') ~ ( "." | "::" | "_" | 'a'..'z' | 'A'..'Z' | int )*} -def_identifier = {identifier ~ ("<" ~ ((def_identifier ~ comma)* ~ def_identifier?) ~ ">")?} - -// [definitions] -round_def = { "(" ~ ((var_def ~ comma)* ~ var_def?) ~ ")" } -curly_def = { "{" ~ (var_def ~ semicolon)* ~ "}" } -var_def = { (def_identifier ~ identifier) | var_def_ptr } -var_def_ptr = { def_identifier ~ "*" ~ identifier } -var_def_set = { var_def ~ "=" ~ expr } -var_set = { def_identifier ~ "=" ~ expr } -func_def = { def_identifier ~ identifier ~ round_def ~ curly } -struct_def = { "struct" ~ identifier ~ curly_def } -ecall = { identifier ~ ( "(" ~ ((def_identifier ~ comma)* ~ def_identifier?) ~ ")" )? } -ecurly = { "{" ~ ((ecall ~ comma)* ~ ecall?) ~ "}" } -enum_def = { "enum" ~ identifier ~ ecurly } -top_code = {"{"~ top_expr ~"}"} -namespace_def = {"namespace" ~ identifier ~ top_code} -impl_def = {"impl" ~ identifier ~ top_code} - -// [Ptr] -ptr_fn_def = { def_identifier ~ "*" ~ identifier ~ round_def ~ curly } -ptr_set = { "*" ~ identifier ~ "=" ~ expr } -refrence = { "&" ~ identifier } - -// [Operators] -if_operator = {"&&"|"||"} -operator = {"=="|"+"|"-"|"!="|">"|"<"|">="|"<="} -if_expr = {expr ~ (if_operator ~ (("("~if_expr*~")")|expr))*} -operation = {(term ~ operator)+ ~ term} - -// [Statement] -return_stm = { "return" ~ expr } -if_stm = { "if" ~ if_expr ~ curly } -else_if_stm = { "else" ~ "if" ~ if_expr ~ curly } -else_stm = { "else" ~ curly } - -rust_macro_lint = { "macro_rules" ~ "!" ~ identifier } -rust_code = { (rust_macro_lint | ANY)* } - -call = {identifier ~ round} - -term = { - call | - round | - char | - hex | - float | - int | - bool | - identifier | - string | - refrence | - match_name -} - -expr = { - operation | - (term ~ dot ~ identifier ~ round?) | - term -} - -code_expr = { - (( - return_stm | - var_def_set| - var_def | - var_set | - ptr_set | - expr - ) ~ semicolon) | - if_stm | - else_if_stm | - else_stm -} - -top_expr = { - ( - func_def | - namespace_def | - include | - include_global | - ptr_fn_def | - struct_def | - enum_def | - map | - impl_def | - match_name - )* -} - -header_expr = { - map* -}