From b24b34cb447df1efeeeeb5c8d1cbef5dfb3070e0 Mon Sep 17 00:00:00 2001 From: Leo dev Date: Sun, 14 Apr 2024 00:11:39 +0200 Subject: [PATCH] better errors --- src/lexer.rs | 8 +-- src/main.rs | 3 +- src/transpiler.rs | 134 +++++++++++++++++++++++++--------------------- 3 files changed, 78 insertions(+), 67 deletions(-) diff --git a/src/lexer.rs b/src/lexer.rs index 4ed6894..2f8b660 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -121,7 +121,7 @@ fn get_second_char(value: &str) -> String { sv2.next().unwrap().to_string() } -pub fn lex(mut code: &str, use_whitespace: bool) -> Vec { +pub fn lex(mut code: &str, use_whitespace: bool) -> Result, (LexerState, Vec)> { let mut state = LexerState { line: 1, column: 1 }; let mut tokens: Vec = Vec::new(); let mut bracket_vec: Vec = Vec::new(); @@ -292,9 +292,9 @@ pub fn lex(mut code: &str, use_whitespace: bool) -> Vec { } } if !is_match { - println!("Error: syntax ->{code}"); - break; + return Err((state, tokens)); + // break; } } - tokens + Ok(tokens) } diff --git a/src/main.rs b/src/main.rs index b7141d2..9a7eb99 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,7 +5,8 @@ use std::fs; fn main() { - let contents = fs::read_to_string("code.ws").expect("cannot read for some reason"); + let code_file = "code.ws"; + let contents = fs::read_to_string(code_file).expect("cannot read for some reason"); let result = transpiler::transpile(contents, 0); println!("{result}") } \ No newline at end of file diff --git a/src/transpiler.rs b/src/transpiler.rs index e45c754..d7dc9c9 100644 --- a/src/transpiler.rs +++ b/src/transpiler.rs @@ -3,73 +3,83 @@ use crate::parser::{Parser, AstType}; pub fn transpile(input: String, indent: u32) -> String { let mut result = String::new(); - let tokens = lex(input.as_str(), false); - println!("\n\n\n\n"); - let mut full_ast = Parser::new(tokens.clone()); - while full_ast.tokens.len() > full_ast.index as usize { - let ast = full_ast.next(); - if ast.ast_type == AstType::FunctionDeceleration { - result += format!("fn {}{} -> {} {}", ast.tokens[1].value, ast.tokens[2].value, ast.tokens[0].value, transpile(ast.tokens[3].value.clone(), indent+1)).as_str(); - } else if ast.ast_type == AstType::VoidFunctionDeceleration { - result += format!("fn {}{} {}", ast.tokens[1].value, ast.tokens[2].value, transpile(ast.tokens[3].value.clone(), indent+1)).as_str(); - } else if ast.ast_type == AstType::VariableDeceleration { - let _o = String::new(); - let mut oy = ast.tokens.clone(); - oy.remove(0); - if oy.len() > 1 { - result += "("; - for t in &oy { - result+=t.value.as_str() - } - result += "): ("; - for t in oy { - if t.value == "," { - result+=", " + let lexer_out = lex(input.as_str(), false); + match lexer_out { + Ok(tokens) => { + println!("\n\n\n\n"); + let mut full_ast = Parser::new(tokens.clone()); + while full_ast.tokens.len() > full_ast.index as usize { + let ast = full_ast.next(); + println!("{ast}"); + if ast.ast_type == AstType::FunctionDeceleration { + result += format!("fn {}{} -> {} {}", ast.tokens[1].value, ast.tokens[2].value, ast.tokens[0].value, transpile(ast.tokens[3].value.clone(), indent+1)).as_str(); + } else if ast.ast_type == AstType::VoidFunctionDeceleration { + result += format!("fn {}{} {}", ast.tokens[1].value, ast.tokens[2].value, transpile(ast.tokens[3].value.clone(), indent+1)).as_str(); + } else if ast.ast_type == AstType::VariableDeceleration { + let _o = String::new(); + let mut oy = ast.tokens.clone(); + oy.remove(0); + if oy.len() > 1 { + result += "("; + for t in &oy { + result+=t.value.as_str() + } + result += "): ("; + for t in oy { + if t.value == "," { + result+=", " + } else { + result+=ast.tokens[0].value.as_str() + } + } + result += ")"; } else { - result+=ast.tokens[0].value.as_str() + result += format!("let {}: {}", ast.tokens[1].value, ast.tokens[0].value).as_str(); + } + } else if ast.ast_type == AstType::MutVariableDeceleration { + let _o = String::new(); + let mut oy = ast.tokens.clone(); + oy.remove(0); + if oy.len() > 1 { + result += "("; + for t in &oy { + result+=t.value.as_str() + } + result += "): ("; + for t in oy { + if t.value == "," { + result+=", " + } else { + result+=ast.tokens[0].value.as_str() + } + } + result += ")"; + } else { + result += format!("let mut {}: {}", ast.tokens[1].value, ast.tokens[0].value).as_str(); + } + } else { + if ast.tokens[0].token_type==TokenType::Newline { + result += (ast.tokens[0].value.as_str().to_owned() + (" ".repeat((indent as usize)*2).as_str())).as_str() + } + else { + result += ast.tokens[0].value.as_str() } } - result += ")"; + + } + result = result.trim_end().to_string(); + if indent > 0 { + result += "\n"; + result += " ".repeat((indent as usize-1)*2).as_str(); + return "{".to_owned()+result.as_str()+"}" } else { - result += format!("let {}: {}", ast.tokens[1].value, ast.tokens[0].value).as_str(); - } - } else if ast.ast_type == AstType::MutVariableDeceleration { - let _o = String::new(); - let mut oy = ast.tokens.clone(); - oy.remove(0); - if oy.len() > 1 { - result += "("; - for t in &oy { - result+=t.value.as_str() - } - result += "): ("; - for t in oy { - if t.value == "," { - result+=", " - } else { - result+=ast.tokens[0].value.as_str() - } - } - result += ")"; - } else { - result += format!("let mut {}: {}", ast.tokens[1].value, ast.tokens[0].value).as_str(); - } - } else { - if ast.tokens[0].token_type==TokenType::Newline { - result += (ast.tokens[0].value.as_str().to_owned() + (" ".repeat((indent as usize)*2).as_str())).as_str() - } - else { - result += ast.tokens[0].value.as_str() + return result } + }, + Err((state, _tokens)) => { + println!("Invalid character at code.ws:{}:{}", state.line, state.column); + return "".to_string(); } - - } - result = result.trim_end().to_string(); - if indent > 0 { - result += "\n"; - result += " ".repeat((indent as usize-1)*2).as_str(); - return "{".to_owned()+result.as_str()+"}" - } else { - return result } + }