better escape code support
This commit is contained in:
@@ -8,6 +8,10 @@ is_identifier_start :: proc(value: byte) -> bool {
|
||||
return value == '_' || value >= 'a' && value <= 'z' || value >= 'A' && value <= 'Z'
|
||||
}
|
||||
|
||||
is_hex_digit :: proc(value: byte) -> bool {
|
||||
return value >= '0' && value <= '9' || value >= 'a' && value <= 'f' || value >= 'A' && value <= 'F'
|
||||
}
|
||||
|
||||
is_identifier_continue :: proc(value: byte) -> bool {
|
||||
return is_identifier_start(value) || value >= '0' && value <= '9'
|
||||
}
|
||||
@@ -319,13 +323,21 @@ lex :: proc(
|
||||
for cursor < len(bytes) && bytes[cursor] != '"' && bytes[cursor] != '\n' {
|
||||
if bytes[cursor] == '\\' {
|
||||
cursor += 1
|
||||
if cursor >= len(bytes) ||
|
||||
(bytes[cursor] != '\\' && bytes[cursor] != '"' && bytes[cursor] != 'n' &&
|
||||
bytes[cursor] != 'r' && bytes[cursor] != 't' && bytes[cursor] != '0') {
|
||||
valid_escape := cursor < len(bytes) &&
|
||||
(bytes[cursor] == '\\' || bytes[cursor] == '"' || bytes[cursor] == 'n' ||
|
||||
bytes[cursor] == 'r' || bytes[cursor] == 't' || bytes[cursor] == '0')
|
||||
if cursor < len(bytes) && bytes[cursor] == 'x' {
|
||||
valid_escape = cursor+2 < len(bytes) &&
|
||||
is_hex_digit(bytes[cursor+1]) && is_hex_digit(bytes[cursor+2])
|
||||
if valid_escape {
|
||||
cursor += 2
|
||||
}
|
||||
}
|
||||
if !valid_escape {
|
||||
source.add(
|
||||
diagnostics,
|
||||
source.Span{file=source_file.id, start=source.Offset(max(cursor-1, start)), end=source.Offset(min(cursor+1, len(bytes)))},
|
||||
"strings only support '\\\\', '\\\"', '\\n', '\\r', '\\t', and '\\0' escapes",
|
||||
source.Span{file=source_file.id, start=source.Offset(max(cursor-1, start)), end=source.Offset(min(cursor+3, len(bytes)))},
|
||||
"strings only support '\\\\', '\\\"', '\\n', '\\r', '\\t', '\\0', and '\\xNN' escapes",
|
||||
)
|
||||
valid = false
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user