String and rune literals now have correct width
This commit is contained in:
parent
a013d4caad
commit
bde4bf8493
@ -9,17 +9,20 @@ func (lexer *LexingOperation) tokenizeString (isRuneLiteral bool) (err error) {
|
||||
if err != nil { return }
|
||||
|
||||
token := lexer.newToken()
|
||||
got := ""
|
||||
got := ""
|
||||
tokenWidth := 2
|
||||
|
||||
beginning := lexer.file.Location(1)
|
||||
for {
|
||||
// TODO: add hexadecimal escape codes
|
||||
if lexer.char == '\\' {
|
||||
err = lexer.nextRune()
|
||||
tokenWidth ++
|
||||
if err != nil { return }
|
||||
|
||||
var actual rune
|
||||
actual, err = lexer.getEscapeSequence()
|
||||
var actual rune
|
||||
var amountRead int
|
||||
actual, amountRead, err = lexer.getEscapeSequence()
|
||||
tokenWidth += amountRead
|
||||
if err != nil { return }
|
||||
|
||||
got += string(actual)
|
||||
@ -27,6 +30,7 @@ func (lexer *LexingOperation) tokenizeString (isRuneLiteral bool) (err error) {
|
||||
got += string(lexer.char)
|
||||
|
||||
err = lexer.nextRune()
|
||||
tokenWidth ++
|
||||
if err != nil { return }
|
||||
}
|
||||
|
||||
@ -57,6 +61,7 @@ func (lexer *LexingOperation) tokenizeString (isRuneLiteral bool) (err error) {
|
||||
token.value = got
|
||||
}
|
||||
|
||||
token.location.SetWidth(tokenWidth)
|
||||
lexer.addToken(token)
|
||||
return
|
||||
}
|
||||
@ -77,16 +82,22 @@ var escapeSequenceMap = map[rune] rune {
|
||||
}
|
||||
|
||||
// getEscapeSequence reads an escape sequence in a string or rune literal.
|
||||
func (lexer *LexingOperation) getEscapeSequence () (result rune, err error) {
|
||||
func (lexer *LexingOperation) getEscapeSequence () (
|
||||
result rune,
|
||||
amountRead int,
|
||||
err error,
|
||||
) {
|
||||
result, exists := escapeSequenceMap[lexer.char]
|
||||
if exists {
|
||||
err = lexer.nextRune()
|
||||
amountRead ++
|
||||
return
|
||||
} else if lexer.char >= '0' && lexer.char <= '7' {
|
||||
// octal escape sequence
|
||||
number := string(lexer.char)
|
||||
|
||||
err = lexer.nextRune()
|
||||
amountRead ++
|
||||
if err != nil { return }
|
||||
|
||||
for len(number) < 3 {
|
||||
@ -95,6 +106,7 @@ func (lexer *LexingOperation) getEscapeSequence () (result rune, err error) {
|
||||
number += string(lexer.char)
|
||||
|
||||
err = lexer.nextRune()
|
||||
amountRead ++
|
||||
if err != nil { return }
|
||||
}
|
||||
|
||||
@ -118,6 +130,7 @@ func (lexer *LexingOperation) getEscapeSequence () (result rune, err error) {
|
||||
number := ""
|
||||
|
||||
err = lexer.nextRune()
|
||||
amountRead ++
|
||||
if err != nil { return }
|
||||
|
||||
for len(number) < want {
|
||||
@ -129,6 +142,7 @@ func (lexer *LexingOperation) getEscapeSequence () (result rune, err error) {
|
||||
number += string(lexer.char)
|
||||
|
||||
err = lexer.nextRune()
|
||||
amountRead ++
|
||||
if err != nil { return }
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user