diff options
-rw-r--r-- | lexer.c | 26 | ||||
-rw-r--r-- | tests/00_syntax/21_regex_literals | 2 |
2 files changed, 15 insertions, 13 deletions
@@ -394,23 +394,13 @@ parse_string(struct uc_state *s) /* continuation of escape sequence */ if (s->lex.is_escape) { if (s->lex.esclen == 0) { - /* regex mode => do not interprete escapes */ - if (q == '/') { - s->lex.is_escape = false; - lookbehind_append(s, "\\", 1); - lookbehind_append(s, ptr, 1); - buf_consume(s, (ptr + 1) - s->lex.bufstart); - - continue; - } - /* non-unicode escape following a lead surrogate, emit replacement... */ if (s->lex.lead_surrogate && *ptr != 'u') { append_utf8(s, 0xFFFD); s->lex.lead_surrogate = 0; } - switch (*ptr) { + switch ((q == '/') ? 0 : *ptr) { case 'u': case 'x': s->lex.esc[s->lex.esclen++] = *ptr; @@ -444,8 +434,20 @@ parse_string(struct uc_state *s) default: s->lex.is_escape = false; c = strchr("a\ab\be\ef\fn\nr\rt\tv\v", *ptr); - lookbehind_append(s, (c && *c >= 'a') ? c + 1 : ptr, 1); + + if (c && *c >= 'a') { + lookbehind_append(s, c + 1, 1); + } + else { + /* regex mode => retain backslash */ + if (q == '/') + lookbehind_append(s, "\\", 1); + + lookbehind_append(s, ptr, 1); + } + buf_consume(s, (ptr + 1) - s->lex.bufstart); + break; } } diff --git a/tests/00_syntax/21_regex_literals b/tests/00_syntax/21_regex_literals index bbb78fb..4aef33f 100644 --- a/tests/00_syntax/21_regex_literals +++ b/tests/00_syntax/21_regex_literals @@ -4,7 +4,7 @@ within regular expression literals is subject of the underlying regular expression engine. -- Expect stdout -- -[ "/Hello world/", "/test/gis", "/test/g", "/test1 \\\/ test2/", "/\\x31\\n\\.\\a\\b\\c\\u2600\\\\/" ] +[ "/Hello world/", "/test/gis", "/test/g", "/test1 \\\/ test2/", "/\\x31\n\\.\u0007\b\\c\\u2600\\\\/" ] -- End -- -- Testcase -- |