summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--lexer.c26
-rw-r--r--tests/00_syntax/21_regex_literals2
2 files changed, 15 insertions, 13 deletions
diff --git a/lexer.c b/lexer.c
index 21a3b3a..5e2e7e8 100644
--- a/lexer.c
+++ b/lexer.c
@@ -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 --