diff options
author | Ben Bridle <ben@derelict.engineering> | 2025-03-08 16:46:18 +1300 |
---|---|---|
committer | Ben Bridle <ben@derelict.engineering> | 2025-03-08 16:46:18 +1300 |
commit | e1dea1faf3e29655c008bf139d2a9acf3229df53 (patch) | |
tree | 8915ca698ba940ae4562d907b5f42376d644ab3e | |
parent | a319d78739b2efccd9f0688c6c0f070ed085f8a1 (diff) | |
download | assembler-e1dea1faf3e29655c008bf139d2a9acf3229df53.zip |
Add Tokeniser::eat_if method
This method is used for consuming a multi-character sequence only if
that sequence matches a passed string.
-rw-r--r-- | src/tokeniser.rs | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/src/tokeniser.rs b/src/tokeniser.rs index 2214f42..3608e9e 100644 --- a/src/tokeniser.rs +++ b/src/tokeniser.rs @@ -93,6 +93,26 @@ impl Tokeniser { return option; } + /// Consume next characters if they match a pattern. + pub fn eat_if(&mut self, pattern: &str) -> Option<String> { + // Check that next characters match the pattern. + for (i, c) in pattern.chars().enumerate() { + if let Some(d) = self.chars.get(self.mark.i + i) { + if c == *d { + continue; + } + } + return None; + } + // Consume the next characters. + self.prev = self.mark; + for c in pattern.chars() { + self.mark.advance(c); + self.mark_end(); + } + return Some(pattern.to_string()); + } + /// Consume whitespace. pub fn eat_whitespace(&mut self) { while let Some(c) = self.peek_char() { |