aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Newton <kddnewton@gmail.com>2023-11-01 13:29:39 -0400
committergit <svn-admin@ruby-lang.org>2023-11-14 21:19:12 +0000
commitdb8803d583c31767a2f6771ecdf929bf5ee6c278 (patch)
tree31bf43f079a230911e1fb4852d8f49167e9f1f32
parent336d81a6718c64cade9f1dfcfdf159fbfa92ba3a (diff)
downloadruby-db8803d583c31767a2f6771ecdf929bf5ee6c278.tar.gz
[ruby/prism] More consistent lex modes with %q
https://github.com/ruby/prism/commit/014f714ed1
-rw-r--r--prism/prism.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/prism/prism.c b/prism/prism.c
index 132cf3a97d..c98062f40a 100644
--- a/prism/prism.c
+++ b/prism/prism.c
@@ -276,6 +276,16 @@ lex_mode_push_list(pm_parser_t *parser, bool interpolation, uint8_t delimiter) {
}
/**
+ * Push on a new list lex mode that is only used for compatibility. This is
+ * called when we're at the end of the file. We want the parser to be able to
+ * perform its normal error tolerance.
+ */
+static inline bool
+lex_mode_push_list_eof(pm_parser_t *parser) {
+ return lex_mode_push_list(parser, false, '\0');
+}
+
+/**
* Push on a new regexp lex mode.
*/
static inline bool
@@ -347,6 +357,16 @@ lex_mode_push_string(pm_parser_t *parser, bool interpolation, bool label_allowed
}
/**
+ * Push on a new string lex mode that is only used for compatibility. This is
+ * called when we're at the end of the file. We want the parser to be able to
+ * perform its normal error tolerance.
+ */
+static inline bool
+lex_mode_push_string_eof(pm_parser_t *parser) {
+ return lex_mode_push_string(parser, false, false, '\0', '\0');
+}
+
+/**
* Pop the current lex state off the stack. If we're within the pre-allocated
* space of the lex state stack, then we'll just decrement the index. Otherwise
* we'll free the current pointer and use the previous pointer.
@@ -8791,6 +8811,8 @@ parser_lex(pm_parser_t *parser) {
if (parser->current.end < parser->end) {
lex_mode_push_list(parser, false, *parser->current.end++);
+ } else {
+ lex_mode_push_list_eof(parser);
}
LEX(PM_TOKEN_PERCENT_LOWER_I);
@@ -8800,6 +8822,8 @@ parser_lex(pm_parser_t *parser) {
if (parser->current.end < parser->end) {
lex_mode_push_list(parser, true, *parser->current.end++);
+ } else {
+ lex_mode_push_list_eof(parser);
}
LEX(PM_TOKEN_PERCENT_UPPER_I);
@@ -8811,6 +8835,8 @@ parser_lex(pm_parser_t *parser) {
lex_mode_push_regexp(parser, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
pm_newline_list_check_append(&parser->newline_list, parser->current.end);
parser->current.end++;
+ } else {
+ lex_mode_push_regexp(parser, '\0', '\0');
}
LEX(PM_TOKEN_REGEXP_BEGIN);
@@ -8822,6 +8848,8 @@ parser_lex(pm_parser_t *parser) {
lex_mode_push_string(parser, false, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
pm_newline_list_check_append(&parser->newline_list, parser->current.end);
parser->current.end++;
+ } else {
+ lex_mode_push_string_eof(parser);
}
LEX(PM_TOKEN_STRING_BEGIN);
@@ -8833,6 +8861,8 @@ parser_lex(pm_parser_t *parser) {
lex_mode_push_string(parser, true, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
pm_newline_list_check_append(&parser->newline_list, parser->current.end);
parser->current.end++;
+ } else {
+ lex_mode_push_string_eof(parser);
}
LEX(PM_TOKEN_STRING_BEGIN);
@@ -8844,6 +8874,8 @@ parser_lex(pm_parser_t *parser) {
lex_mode_push_string(parser, false, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
lex_state_set(parser, PM_LEX_STATE_FNAME | PM_LEX_STATE_FITEM);
parser->current.end++;
+ } else {
+ lex_mode_push_string_eof(parser);
}
LEX(PM_TOKEN_SYMBOL_BEGIN);
@@ -8853,6 +8885,8 @@ parser_lex(pm_parser_t *parser) {
if (parser->current.end < parser->end) {
lex_mode_push_list(parser, false, *parser->current.end++);
+ } else {
+ lex_mode_push_list_eof(parser);
}
LEX(PM_TOKEN_PERCENT_LOWER_W);
@@ -8862,6 +8896,8 @@ parser_lex(pm_parser_t *parser) {
if (parser->current.end < parser->end) {
lex_mode_push_list(parser, true, *parser->current.end++);
+ } else {
+ lex_mode_push_list_eof(parser);
}
LEX(PM_TOKEN_PERCENT_UPPER_W);
@@ -8872,6 +8908,8 @@ parser_lex(pm_parser_t *parser) {
if (parser->current.end < parser->end) {
lex_mode_push_string(parser, true, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
parser->current.end++;
+ } else {
+ lex_mode_push_string_eof(parser);
}
LEX(PM_TOKEN_PERCENT_LOWER_X);