added escape sequences

This commit is contained in:
Moritz Gmeiner 2024-09-02 03:10:00 +02:00
commit ca6e092b38
2 changed files with 48 additions and 6 deletions

View file

@ -238,23 +238,63 @@ impl Lexer {
} }
fn try_parse_string(&mut self) { fn try_parse_string(&mut self) {
// first '"' already consumed
// advance until second " // advance until second "
while self.advance() != '"' { /* while self.advance() != '"' {
if self.source_is_empty() { if self.source_is_empty() {
self.errors.push(LexerError::UnterminatedStringLiteral { self.errors.push(LexerError::UnterminatedStringLiteral {
code_pos: self.code_pos, code_pos: self.code_pos,
}); });
return; return;
} }
} */
let mut s = String::new();
let starting_pos = self.code_pos;
loop {
if self.source_is_empty() {
self.errors.push(LexerError::UnterminatedStringLiteral {
code_pos: starting_pos,
});
return;
} }
let string_literal: Box<str> = self.source[self.start + 1..self.current - 1] match self.advance() {
.iter() '"' => break,
.collect(); '\\' => {
// escape sequence -> handle later
if self.source_is_empty() {
self.errors.push(LexerError::UnterminatedStringLiteral {
code_pos: starting_pos,
});
return;
}
match self.advance() {
'n' => s.push('\n'),
'r' => s.push('\r'),
'\\' => s.push('\\'),
c => self.errors.push(LexerError::InvalidEscapeSequence {
code_pos: self.code_pos,
c,
}),
}
}
c => {
s.push(c);
}
}
}
// let string_literal: Box<str> = self.source[self.start + 1..self.current - 1]
// .iter()
// .collect();
// Some(TokenType::String(Box::new(string_literal))) // Some(TokenType::String(Box::new(string_literal)))
self.tokens self.tokens.push(Token::new_string(s, self.code_pos));
.push(Token::new_string(string_literal, self.code_pos));
} }
fn try_parse_number(&mut self) { fn try_parse_number(&mut self) {

View file

@ -8,6 +8,8 @@ pub enum LexerError {
UnexpectedCharacter { c: char, code_pos: CodePos }, UnexpectedCharacter { c: char, code_pos: CodePos },
#[error("unterminated string literal starting at {code_pos}.")] #[error("unterminated string literal starting at {code_pos}.")]
UnterminatedStringLiteral { code_pos: CodePos }, UnterminatedStringLiteral { code_pos: CodePos },
#[error("invalid escape sequence \\{c} at {code_pos}")]
InvalidEscapeSequence { code_pos: CodePos, c: char },
#[error("unterminated block comment starting at {code_pos}.")] #[error("unterminated block comment starting at {code_pos}.")]
UnterminatedBlockComment { code_pos: CodePos }, UnterminatedBlockComment { code_pos: CodePos },
#[error("invalid number literal {lexeme} at {code_pos}: {msg}")] #[error("invalid number literal {lexeme} at {code_pos}: {msg}")]