File tree Expand file tree Collapse file tree 1 file changed +36
-16
lines changed
Expand file tree Collapse file tree 1 file changed +36
-16
lines changed Original file line number Diff line number Diff 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.
379379func (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
You can’t perform that action at this time.
0 commit comments