summaryrefslogtreecommitdiff
path: root/prism
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2023-12-11 09:30:24 -0500
committergit <svn-admin@ruby-lang.org>2023-12-11 16:34:55 +0000
commit4095e7d2be0ef6426e0cb75a53472f6dc1e5a0af (patch)
tree444e2533fc549421f381e0a290466dd274a51436 /prism
parentc65de63913487caf26a281cb5c3be112f87a23a1 (diff)
[ruby/prism] Regexp terminator escapes
https://github.com/ruby/prism/commit/42a48a2ba9
Diffstat (limited to 'prism')
-rw-r--r--prism/prism.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/prism/prism.c b/prism/prism.c
index 9922f57722..9bed7b19d8 100644
--- a/prism/prism.c
+++ b/prism/prism.c
@@ -9535,7 +9535,9 @@ parser_lex(pm_parser_t *parser) {
case '\r':
parser->current.end++;
if (peek(parser) != '\n') {
- pm_token_buffer_push(&token_buffer, '\\');
+ if (lex_mode->as.regexp.terminator != '\r') {
+ pm_token_buffer_push(&token_buffer, '\\');
+ }
pm_token_buffer_push(&token_buffer, '\r');
break;
}
@@ -9563,7 +9565,20 @@ parser_lex(pm_parser_t *parser) {
escape_read(parser, &token_buffer.buffer, PM_ESCAPE_FLAG_REGEXP);
break;
default:
- if (lex_mode->as.regexp.terminator == '/' && peeked == '/') {
+ if (lex_mode->as.regexp.terminator == peeked) {
+ // Some characters when they are used as the
+ // terminator also receive an escape. They are
+ // enumerated here.
+ switch (peeked) {
+ case '$': case ')': case '*': case '+':
+ case '.': case '>': case '?': case ']':
+ case '^': case '|': case '}':
+ pm_token_buffer_push(&token_buffer, '\\');
+ break;
+ default:
+ break;
+ }
+
pm_token_buffer_push(&token_buffer, peeked);
parser->current.end++;
break;