diff options
-rw-r--r-- | src/tokenizer.rs | 33 |
1 files changed, 26 insertions, 7 deletions
diff --git a/src/tokenizer.rs b/src/tokenizer.rs index 03e09e3..2476112 100644 --- a/src/tokenizer.rs +++ b/src/tokenizer.rs @@ -1,6 +1,13 @@ use std::mem::take; use crate::*; +#[derive(PartialEq)] +enum StringLiteral { + None, + Raw, + NullTerminated, +} + pub struct TokenIterator { /// The characters that comprise the program souce code. chars: Vec<char>, @@ -13,8 +20,8 @@ pub struct TokenIterator { skip_whitespace: bool, /// The name of the most recently defined label. label: String, - /// If true, each individual character is tokenised as a ByteLiteral - parse_string_literal: bool, + /// If not None, each individual character will be tokenised as a ByteLiteral. + parse_string_literal: StringLiteral, /// The address of the first character of the current token. @@ -37,7 +44,7 @@ impl TokenIterator { i: 0, addr: CharAddress::zero(), skip_whitespace: true, - parse_string_literal: false, + parse_string_literal: StringLiteral::None, label: String::new(), start: CharAddress::zero(), end: CharAddress::zero(), @@ -65,7 +72,9 @@ impl TokenIterator { /// Mark the current character as being the first character of a new token. fn mark_start(&mut self, c:char) { if c == '"' { - self.parse_string_literal = true; + self.parse_string_literal = StringLiteral::NullTerminated; + } else if c == '\'' { + self.parse_string_literal = StringLiteral::Raw; } else { self.start=self.addr; self.end=self.addr; @@ -89,9 +98,19 @@ impl Iterator for TokenIterator { while let Some(c) = self.chars.get(self.i) { let c = *c; // Parse individual characters from a string literal - if self.parse_string_literal { - if c == '"' { - self.parse_string_literal=false; + if self.parse_string_literal != StringLiteral::None { + if c == '"' && self.parse_string_literal == StringLiteral::NullTerminated { + self.parse_string_literal = StringLiteral::None; + let token = SyntacticToken { + r#type: SyntacticTokenType::ByteLiteral(0), + source_location: SourceLocation { + source: c.to_string(), start:self.addr, end:self.addr }, + error: None, + }; + self.next(c); + return Some(token); + } else if c == '\'' && self.parse_string_literal == StringLiteral::Raw { + self.parse_string_literal = StringLiteral::None; self.next(c); continue } else { |