summaryrefslogtreecommitdiff
path: root/src/lexer.rs
diff options
context:
space:
mode:
authorMike Buland <mike@xagasoft.com>2026-06-09 14:02:53 -0700
committerMike Buland <mike@xagasoft.com>2026-06-09 14:02:53 -0700
commit61b54e8f6b177f33a1428ab6a3622503a63cc1d6 (patch)
tree1a8af5f0f40dd72a43f98a5e6e3bdce8a7c45366 /src/lexer.rs
parentf724cea337965419618d7d587015c9593a67834d (diff)
downloadcrimtag-61b54e8f6b177f33a1428ab6a3622503a63cc1d6.tar.gz
crimtag-61b54e8f6b177f33a1428ab6a3622503a63cc1d6.tar.bz2
crimtag-61b54e8f6b177f33a1428ab6a3622503a63cc1d6.tar.xz
crimtag-61b54e8f6b177f33a1428ab6a3622503a63cc1d6.zip
Identifiers work!
Diffstat (limited to 'src/lexer.rs')
-rw-r--r--src/lexer.rs27
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
81fn is_valid_token_char( c: char ) -> bool { 82fn 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];