diff --git a/src/lexer.rs b/src/lexer.rs index ef7f8d5..3834498 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -69,7 +69,7 @@ const SYNTAX: [Node; 12] = [ }, Node { token_type: TokenType::Identifier, - token_regex: Lazy::new(|| Regex::new(r"^[._a-zA-Z][a-zA-Z0-9_]*").unwrap()) + token_regex: Lazy::new(|| Regex::new(r"^[._a-zA-Z][a-zA-Z0-9_]*(:?<[._a-zA-Z][a-zA-Z0-9_<>]*>)?").unwrap()) }, Node { token_type: TokenType::Ptr, diff --git a/src/main.rs b/src/main.rs index e311b1d..6af6f8a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,7 +4,7 @@ mod parser; use parser::Parser; fn main() { - let input = "int main() {}"; + let input = "int x"; println!("\n\n\n\n"); let tokens = lex(input, false); let mut ast = Parser::new(tokens.clone()); diff --git a/src/parser.rs b/src/parser.rs index 81b40eb..dab7f6a 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -46,7 +46,7 @@ impl Parser { let token = &self.tokens[index]; match token.token_type { TokenType::Identifier => { - if self.tokens[index+1].token_type==TokenType::Identifier && self.tokens[index+2].token_type==TokenType::Round && self.tokens[index+3].token_type==TokenType::Curly { + if self.tokens.len()-index > 2 && self.tokens[index+1].token_type==TokenType::Identifier && self.tokens[index+2].token_type==TokenType::Round && self.tokens[index+3].token_type==TokenType::Curly { ast_res.tokens.push(self.tokens[index].clone()); ast_res.tokens.push(self.tokens[index+1].clone()); ast_res.tokens.push(self.tokens[index+2].clone()); @@ -65,6 +65,10 @@ impl Parser { ast_res.tokens.push(ntk.clone()); ast_res.ast_type = AstType::VariableDecleration; self.index += 1; + } else if ntk.token_type==TokenType::Keyword { + ast_res.tokens.push(ntk.clone()); + ast_res.ast_type = AstType::VariableDecleration; + self.index += 1; } else if ntk.token_type==TokenType::Angle { ast_res.tokens.push(ntk.clone()); self.index += 1;