From 9d7e560feb829ecceef180cf56d4aa92729ba028 Mon Sep 17 00:00:00 2001 From: Leo Dev Date: Sun, 12 May 2024 16:18:45 +0200 Subject: [PATCH] angle brackets --- src/lexer.rs | 31 ++++++++++++++++++++++++++++--- src/parser.rs | 7 +++++++ 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/lexer.rs b/src/lexer.rs index 0683904..622e046 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -1,7 +1,6 @@ use regex::Regex; use once_cell::sync::Lazy; use std::fmt; - pub struct LexerState { pub line: usize, pub column: usize @@ -22,6 +21,7 @@ pub enum TokenType { Round, Curly, Square, + Angle, Include, String, Comment, @@ -72,11 +72,11 @@ const SYNTAX: [Node; 14] = [ }, Node { token_type: TokenType::Keyword, - token_regex: Lazy::new(|| Regex::new(r"^(mut|try|catch|return|fn|let)\b").unwrap()) + token_regex: Lazy::new(|| Regex::new(r"^(mut|try|catch|return|fn|let|use)\b").unwrap()) }, Node { token_type: TokenType::Identifier, - token_regex: Lazy::new(|| Regex::new(r"^[._a-zA-Z][a-zA-Z0-9_]*(:?\s*<[._a-zA-Z][a-zA-Z0-9_<>]*>)?").unwrap()) + token_regex: Lazy::new(|| Regex::new(r"^[._a-zA-Z][a-zA-Z0-9_]*").unwrap()) }, Node { token_type: TokenType::Number, @@ -287,6 +287,31 @@ pub fn lex(mut code: &str, use_whitespace: bool, state: LexerState) -> Result { + code = code.strip_prefix(fch.as_str()).expect(""); + if brln > 0 { + brstr += fch.as_str(); + } else { + br_state.line = state.line; + br_state.column = state.column; + } + brtp.push(6); + } + ">" => { + code = code.strip_prefix(fch.as_str()).expect(""); + if brln > 0 && brtp[brln-1] == 6 { + brtp.pop(); + if brln == 1 { + tokens.push(Token { + token_type: TokenType::Angle, + value: brstr.clone(), + column: br_state.column, + line: br_state.line + }); + brstr = String::new(); + } else {brstr += fch.as_str();} + } else {brstr += fch.as_str();} + } "\\" => { brstr += "\\"; code = code.strip_prefix(fch.as_str()).expect(""); diff --git a/src/parser.rs b/src/parser.rs index 54c532c..d97826b 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -92,6 +92,13 @@ impl Parser { ast_res.tokens.push(self.tokens[index+1].clone()); ast_res.ast_type = AstType::VariableDeceleration; self.index += 1; + } else if self.tokens[index+2].token_type==TokenType::Identifier && self.tokens[index+1].token_type==TokenType::Angle { + ast_res.tokens.push(self.tokens[index+2].clone()); + ast_res.tokens[0].value += "<"; + ast_res.tokens[0].value += self.tokens[index+1].value.as_str(); + ast_res.tokens[0].value += ">"; + ast_res.ast_type = AstType::VariableDeceleration; + self.index += 2; } else if self.tokens[index+1].value=="mut" && self.tokens[index+2].token_type==TokenType::Identifier { ast_res.tokens.push(self.tokens[index+2].clone()); ast_res.ast_type = AstType::MutVariableDeceleration;