diff options
author | Ben Bridle <ben@derelict.engineering> | 2025-03-08 16:48:33 +1300 |
---|---|---|
committer | Ben Bridle <ben@derelict.engineering> | 2025-03-08 16:48:33 +1300 |
commit | 53dffaf3fe18f70151b23418ff80ae8904fae779 (patch) | |
tree | 7c2754b89e2b337eed613326fc300292347ec104 /src | |
parent | e1dea1faf3e29655c008bf139d2a9acf3229df53 (diff) | |
download | assembler-53dffaf3fe18f70151b23418ff80ae8904fae779.zip |
Make Tokeniser::eat_until even more general
The eat_until method of Tokeniser has been renamed to track_until, and
it no longer consumes characters by itself. The predicate closure is no
longer limited to checking one character at a time, it can look ahead
for multi-character sequences when used with the new eat_if method.
Diffstat (limited to 'src')
-rw-r--r-- | src/tokeniser.rs | 21 |
1 files changed, 9 insertions, 12 deletions
diff --git a/src/tokeniser.rs b/src/tokeniser.rs index 3608e9e..e09a439 100644 --- a/src/tokeniser.rs +++ b/src/tokeniser.rs @@ -139,20 +139,17 @@ impl Tokeniser { return token; } - /// Consume and return all characters up to and including the delimiter. + /// Return all characters found until the predicate returns true. /// Returns None if end of source is reached before delimiter is found. - pub fn eat_until(&mut self, mut predicate: impl FnMut(&char) -> bool) -> Option<String> { - let mut token = String::new(); - while let Some(c) = self.eat_char() { - match predicate(&c) { - true => { - self.end = self.prev; - return Some(token); - } - false => token.push(c), - } + pub fn track_until(&mut self, mut predicate: impl FnMut(&mut Self) -> bool) -> Option<String> { + let start = self.mark; + let mut end = self.mark; + while !predicate(self) { + self.peek_char()?; + end = self.mark; } - return None; + self.end = self.prev; + return Some(self.get_chars(&start, &end).iter().collect()); } /// Returns true if the remainder of the line is whitespace. |