Skip to content

Commit c34c29d

Browse files
fix: Fix string literal parsing in lexer
Co-Authored-By: [email protected] <[email protected]>
1 parent 8a4854f commit c34c29d

File tree

1 file changed

+36
-16
lines changed

1 file changed

+36
-16
lines changed

jparse/lexer.go

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -377,26 +377,46 @@ func (l *lexer) scanRegex(delim rune) token {
377377
// and returns a string token. The opening quote has already been
378378
// consumed.
379379
func (l *lexer) scanString(quote rune) token {
380-
Loop:
380+
pos := l.start
381+
l.nextRune() // consume opening quote
382+
383+
var value strings.Builder
381384
for {
382-
switch l.nextRune() {
383-
case quote:
384-
break Loop
385-
case '\\':
386-
if r := l.nextRune(); r != eof {
387-
break
388-
}
389-
fallthrough
390-
case eof:
385+
ch := l.nextRune()
386+
if ch == eof {
391387
return l.error(ErrUnterminatedString, string(quote))
392388
}
389+
if ch == quote {
390+
break
391+
}
392+
if ch == '\\' {
393+
ch = l.nextRune()
394+
if ch == eof {
395+
return l.error(ErrUnterminatedString, string(quote))
396+
}
397+
switch ch {
398+
case 'n':
399+
value.WriteRune('\n')
400+
case 'r':
401+
value.WriteRune('\r')
402+
case 't':
403+
value.WriteRune('\t')
404+
case '"', '\'', '\\':
405+
value.WriteRune(ch)
406+
default:
407+
value.WriteRune('\\')
408+
value.WriteRune(ch)
409+
}
410+
continue
411+
}
412+
value.WriteRune(ch)
413+
}
414+
415+
return token{
416+
Type: typeString,
417+
Value: value.String(),
418+
Position: pos,
393419
}
394-
395-
l.backup()
396-
t := l.newToken(typeString)
397-
l.acceptRune(quote)
398-
l.ignore()
399-
return t
400420
}
401421

402422
// scanNumber reads a number literal from the current position

0 commit comments

Comments
 (0)