summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Bridle <ben@derelict.engineering>2025-03-08 16:46:18 +1300
committerBen Bridle <ben@derelict.engineering>2025-03-08 16:46:18 +1300
commite1dea1faf3e29655c008bf139d2a9acf3229df53 (patch)
tree8915ca698ba940ae4562d907b5f42376d644ab3e
parenta319d78739b2efccd9f0688c6c0f070ed085f8a1 (diff)
downloadassembler-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.rs20
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() {