From 25e3b6068d9bf01c1f2c0e74b8badec23c79c2ad Mon Sep 17 00:00:00 2001 From: AYM1607 Date: Sun, 7 May 2023 00:00:35 +0000 Subject: [PATCH] String literals --- golox/internal/runner/scanner.go | 24 ++++++++++++++++++++++++ golox/test.lox | 1 + 2 files changed, 25 insertions(+) diff --git a/golox/internal/runner/scanner.go b/golox/internal/runner/scanner.go index 622c74f..e5e9351 100644 --- a/golox/internal/runner/scanner.go +++ b/golox/internal/runner/scanner.go @@ -91,6 +91,8 @@ func (s *Scanner) scanToken() { } else { s.addToken(SLASH) } + case '"': + s.scanString() // Ignore whitespace. case ' ': case '\t': @@ -132,6 +134,28 @@ func (s *Scanner) peek() byte { return s.source[s.current] } +func (s *Scanner) scanString() { + for s.peek() != '"' && !s.isAtEnd() { + // Lox allows multi-line strings. + if s.peek() == '\n' { + s.line += 1 + } + s.advance() + } + + if s.isAtEnd() { + lerrors.EmitError(s.line, "Unterminated string.") + return + } + + // Consume the closing " + s.advance() + + // Trim enclosing quotes + val := s.source[s.start+1 : s.current-1] + s.addTokenWithLiteral(STRING, val) +} + // addToken produces a single token without a literal value. func (s *Scanner) addToken(typ TokenType) { s.addTokenWithLiteral(typ, nil) diff --git a/golox/test.lox b/golox/test.lox index 51a4006..a6662bd 100644 --- a/golox/test.lox +++ b/golox/test.lox @@ -1,3 +1,4 @@ // this is a comment (( )){} // grouping stuff !*+-/=<> <= == // operators +"some string literal"