From 61b54e8f6b177f33a1428ab6a3622503a63cc1d6 Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Tue, 9 Jun 2026 14:02:53 -0700 Subject: Identifiers work! --- src/lexer.rs | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'src/lexer.rs') diff --git a/src/lexer.rs b/src/lexer.rs index 0724df2..2e43914 100644 --- a/src/lexer.rs +++ b/src/lexer.rs @@ -20,6 +20,7 @@ pub enum SymbolType<'a> { Output, Show, Equals, + Period, Token(&'a str), Literal(&'a str), Text(&'a str), @@ -78,13 +79,20 @@ pub struct Lexer<'a> { pos: Position, } -fn is_valid_token_char( c: char ) -> bool { +fn is_valid_token_char( c: char, first: bool ) -> bool { if c.is_whitespace() { return false; } - match c { - 'a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '-' => true, - _ => false + if first { + match c { + 'a'..'z' | 'A'..'Z' | '_' => true, + _ => false + } + } else { + match c { + 'a'..'z' | 'A'..'Z' | '0'..'9' | '_' => true, + _ => false + } } } @@ -214,13 +222,18 @@ impl<'a> Lexer<'a> { self.next(); return Some(Symbol::new(SymbolType::Equals, self.pos, self.pos)); } + Some('.') => { + self.next(); + return Some(Symbol::new(SymbolType::Period, self.pos, self.pos)); + } _ => {} } let start = self.cur_index(); let start_pos = self.pos.clone(); - - while self.next().is_some_and(|ch| is_valid_token_char(ch) ) && - !self.is_end_tag() {} + + let mut first = true; + while self.next().is_some_and(|ch| is_valid_token_char(ch, first) ) && + !self.is_end_tag() { first = false; } let end = self.cur_index(); let end_pos = self.pos.clone(); let s = &self.data[start..end]; -- cgit v1.2.3