diff options
Diffstat (limited to 'src/lexer.rs')
| -rw-r--r-- | src/lexer.rs | 27 |
1 files changed, 20 insertions, 7 deletions
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> { | |||
| 20 | Output, | 20 | Output, |
| 21 | Show, | 21 | Show, |
| 22 | Equals, | 22 | Equals, |
| 23 | Period, | ||
| 23 | Token(&'a str), | 24 | Token(&'a str), |
| 24 | Literal(&'a str), | 25 | Literal(&'a str), |
| 25 | Text(&'a str), | 26 | Text(&'a str), |
| @@ -78,13 +79,20 @@ pub struct Lexer<'a> { | |||
| 78 | pos: Position, | 79 | pos: Position, |
| 79 | } | 80 | } |
| 80 | 81 | ||
| 81 | fn is_valid_token_char( c: char ) -> bool { | 82 | fn is_valid_token_char( c: char, first: bool ) -> bool { |
| 82 | if c.is_whitespace() { | 83 | if c.is_whitespace() { |
| 83 | return false; | 84 | return false; |
| 84 | } | 85 | } |
| 85 | match c { | 86 | if first { |
| 86 | 'a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '-' => true, | 87 | match c { |
| 87 | _ => false | 88 | 'a'..'z' | 'A'..'Z' | '_' => true, |
| 89 | _ => false | ||
| 90 | } | ||
| 91 | } else { | ||
| 92 | match c { | ||
| 93 | 'a'..'z' | 'A'..'Z' | '0'..'9' | '_' => true, | ||
| 94 | _ => false | ||
| 95 | } | ||
| 88 | } | 96 | } |
| 89 | } | 97 | } |
| 90 | 98 | ||
| @@ -214,13 +222,18 @@ impl<'a> Lexer<'a> { | |||
| 214 | self.next(); | 222 | self.next(); |
| 215 | return Some(Symbol::new(SymbolType::Equals, self.pos, self.pos)); | 223 | return Some(Symbol::new(SymbolType::Equals, self.pos, self.pos)); |
| 216 | } | 224 | } |
| 225 | Some('.') => { | ||
| 226 | self.next(); | ||
| 227 | return Some(Symbol::new(SymbolType::Period, self.pos, self.pos)); | ||
| 228 | } | ||
| 217 | _ => {} | 229 | _ => {} |
| 218 | } | 230 | } |
| 219 | let start = self.cur_index(); | 231 | let start = self.cur_index(); |
| 220 | let start_pos = self.pos.clone(); | 232 | let start_pos = self.pos.clone(); |
| 221 | 233 | ||
| 222 | while self.next().is_some_and(|ch| is_valid_token_char(ch) ) && | 234 | let mut first = true; |
| 223 | !self.is_end_tag() {} | 235 | while self.next().is_some_and(|ch| is_valid_token_char(ch, first) ) && |
| 236 | !self.is_end_tag() { first = false; } | ||
| 224 | let end = self.cur_index(); | 237 | let end = self.cur_index(); |
| 225 | let end_pos = self.pos.clone(); | 238 | let end_pos = self.pos.clone(); |
| 226 | let s = &self.data[start..end]; | 239 | let s = &self.data[start..end]; |
