[ruby/prism] Regexp terminator escapes

https://github.com/ruby/prism/commit/42a48a2ba9
This commit is contained in:
Kevin Newton 2023-12-11 09:30:24 -05:00 committed by git
parent c65de63913
commit 4095e7d2be
2 changed files with 18 additions and 3 deletions

View File

@ -9535,7 +9535,9 @@ parser_lex(pm_parser_t *parser) {
case '\r': case '\r':
parser->current.end++; parser->current.end++;
if (peek(parser) != '\n') { 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'); pm_token_buffer_push(&token_buffer, '\r');
break; break;
} }
@ -9563,7 +9565,20 @@ parser_lex(pm_parser_t *parser) {
escape_read(parser, &token_buffer.buffer, PM_ESCAPE_FLAG_REGEXP); escape_read(parser, &token_buffer.buffer, PM_ESCAPE_FLAG_REGEXP);
break; break;
default: 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); pm_token_buffer_push(&token_buffer, peeked);
parser->current.end++; parser->current.end++;
break; break;

View File

@ -8,4 +8,4 @@
├── opening_loc: (1,0)-(1,3) = "%r'" ├── opening_loc: (1,0)-(1,3) = "%r'"
├── content_loc: (1,3)-(1,5) = "\\'" ├── content_loc: (1,3)-(1,5) = "\\'"
├── closing_loc: (1,5)-(1,6) = "'" ├── closing_loc: (1,5)-(1,6) = "'"
└── unescaped: "\\'" └── unescaped: "'"