Skip to content

Commit

Permalink
Parser: update lexer
Browse files Browse the repository at this point in the history
  • Loading branch information
Ernest1338 committed Jan 5, 2025
1 parent 37c8f21 commit 96640c4
Showing 1 changed file with 13 additions and 13 deletions.
26 changes: 13 additions & 13 deletions src/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,25 +73,15 @@ impl FromStr for Token {
/// Parses a string into a Token, if possible
fn from_str(s: &str) -> Result<Token, ()> {
// Helper for parsing keywords followed by whitespace
fn parse_keyword(s: &str, keyword: &str, token: Token) -> Option<Token> {
fn parse_keyword(s: &str, keyword: &str, token: &Token) -> Option<Token> {
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::<i64>() {
return Ok(Token::Number(number));
}
}
}

// Keywords and types
let keywords = [
("let", Token::Let),
Expand All @@ -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::<i64>() {
return Ok(Token::Number(number));
}
}
}

// String literal
if let Some(stripped) = s.strip_prefix('"') {
if let Some(end_quote) = stripped.find('"') {
Expand Down

0 comments on commit 96640c4

Please sign in to comment.