diff options
Diffstat (limited to 'pkg/lang/scanner/scanner.go')
| -rw-r--r-- | pkg/lang/scanner/scanner.go | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/pkg/lang/scanner/scanner.go b/pkg/lang/scanner/scanner.go index 35c30cd..eb7da89 100644 --- a/pkg/lang/scanner/scanner.go +++ b/pkg/lang/scanner/scanner.go @@ -178,6 +178,24 @@ func (s *Scanner) scanString() (token.Token, error) { break } + if c == '\\' { + sequence, eof, err := s.src.Next() + if err != nil { + return token.Token{}, err + } + + if eof { + return token.Token{}, ErrUnclosedString + } + + escaped, err := escapedChar(sequence) + if err != nil { + return token.Token{}, err + } + + c = escaped + } + buf.WriteRune(c) } @@ -322,3 +340,20 @@ func (s *Scanner) skipWhitespace() (bool, source.Loc, error) { return hadNewline, firstNewline, nil } + +func escapedChar(c rune) (rune, error) { + switch c { + case 'n': + return '\n', nil + case 'r': + return '\r', nil + case 't': + return '\t', nil + case '\\': + return '\\', nil + case '"': + return '"', nil + } + + return c, ErrUnknownEscapeSequence{Char: c} +} |
