From 96640c4a9a4c8275fca85465563ef4054be6ead3 Mon Sep 17 00:00:00 2001 From: Ernest Gupik Date: Sun, 5 Jan 2025 23:50:31 +0100 Subject: [PATCH] Parser: update lexer --- src/parser.rs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/parser.rs b/src/parser.rs index 0785dfd..da0cb95 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -73,25 +73,15 @@ impl FromStr for Token { /// Parses a string into a Token, if possible fn from_str(s: &str) -> Result { // Helper for parsing keywords followed by whitespace - fn parse_keyword(s: &str, keyword: &str, token: Token) -> Option { + fn parse_keyword(s: &str, keyword: &str, token: &Token) -> Option { if s.starts_with(keyword) && s[keyword.len()..].starts_with(|c: char| c.is_whitespace()) { - Some(token) + Some(token.clone()) } else { None } } - // Parse numeric tokens - if let Some(c) = s.chars().next() { - if c.is_ascii_digit() { - let number_str: String = s.chars().take_while(|ch| ch.is_ascii_digit()).collect(); - if let Ok(number) = number_str.parse::() { - return Ok(Token::Number(number)); - } - } - } - // Keywords and types let keywords = [ ("let", Token::Let), @@ -103,11 +93,21 @@ impl FromStr for Token { ]; for &(keyword, ref token) in &keywords { - if let Some(parsed_token) = parse_keyword(s, keyword, token.clone()) { + if let Some(parsed_token) = parse_keyword(s, keyword, token) { return Ok(parsed_token); } } + // Parse numeric tokens + if let Some(c) = s.chars().next() { + if c.is_ascii_digit() { + let number_str: String = s.chars().take_while(|ch| ch.is_ascii_digit()).collect(); + if let Ok(number) = number_str.parse::() { + return Ok(Token::Number(number)); + } + } + } + // String literal if let Some(stripped) = s.strip_prefix('"') { if let Some(end_quote) = stripped.find('"') {