@@ -275,6 +275,16 @@ lex_mode_push_list(pm_parser_t *parser, bool interpolation, uint8_t delimiter) {
275
275
return lex_mode_push(parser, lex_mode);
276
276
}
277
277
278
+ /**
279
+ * Push on a new list lex mode that is only used for compatibility. This is
280
+ * called when we're at the end of the file. We want the parser to be able to
281
+ * perform its normal error tolerance.
282
+ */
283
+ static inline bool
284
+ lex_mode_push_list_eof(pm_parser_t *parser) {
285
+ return lex_mode_push_list(parser, false, '\0');
286
+ }
287
+
278
288
/**
279
289
* Push on a new regexp lex mode.
280
290
*/
@@ -346,6 +356,16 @@ lex_mode_push_string(pm_parser_t *parser, bool interpolation, bool label_allowed
346
356
return lex_mode_push(parser, lex_mode);
347
357
}
348
358
359
+ /**
360
+ * Push on a new string lex mode that is only used for compatibility. This is
361
+ * called when we're at the end of the file. We want the parser to be able to
362
+ * perform its normal error tolerance.
363
+ */
364
+ static inline bool
365
+ lex_mode_push_string_eof(pm_parser_t *parser) {
366
+ return lex_mode_push_string(parser, false, false, '\0', '\0');
367
+ }
368
+
349
369
/**
350
370
* Pop the current lex state off the stack. If we're within the pre-allocated
351
371
* space of the lex state stack, then we'll just decrement the index. Otherwise
@@ -8676,6 +8696,8 @@ parser_lex(pm_parser_t *parser) {
8676
8696
8677
8697
if (parser->current.end < parser->end) {
8678
8698
lex_mode_push_list(parser, false, *parser->current.end++);
8699
+ } else {
8700
+ lex_mode_push_list_eof(parser);
8679
8701
}
8680
8702
8681
8703
LEX(PM_TOKEN_PERCENT_LOWER_I);
@@ -8685,6 +8707,8 @@ parser_lex(pm_parser_t *parser) {
8685
8707
8686
8708
if (parser->current.end < parser->end) {
8687
8709
lex_mode_push_list(parser, true, *parser->current.end++);
8710
+ } else {
8711
+ lex_mode_push_list_eof(parser);
8688
8712
}
8689
8713
8690
8714
LEX(PM_TOKEN_PERCENT_UPPER_I);
@@ -8696,6 +8720,8 @@ parser_lex(pm_parser_t *parser) {
8696
8720
lex_mode_push_regexp(parser, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
8697
8721
pm_newline_list_check_append(&parser->newline_list, parser->current.end);
8698
8722
parser->current.end++;
8723
+ } else {
8724
+ lex_mode_push_regexp(parser, '\0', '\0');
8699
8725
}
8700
8726
8701
8727
LEX(PM_TOKEN_REGEXP_BEGIN);
@@ -8707,6 +8733,8 @@ parser_lex(pm_parser_t *parser) {
8707
8733
lex_mode_push_string(parser, false, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
8708
8734
pm_newline_list_check_append(&parser->newline_list, parser->current.end);
8709
8735
parser->current.end++;
8736
+ } else {
8737
+ lex_mode_push_string_eof(parser);
8710
8738
}
8711
8739
8712
8740
LEX(PM_TOKEN_STRING_BEGIN);
@@ -8718,6 +8746,8 @@ parser_lex(pm_parser_t *parser) {
8718
8746
lex_mode_push_string(parser, true, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
8719
8747
pm_newline_list_check_append(&parser->newline_list, parser->current.end);
8720
8748
parser->current.end++;
8749
+ } else {
8750
+ lex_mode_push_string_eof(parser);
8721
8751
}
8722
8752
8723
8753
LEX(PM_TOKEN_STRING_BEGIN);
@@ -8729,6 +8759,8 @@ parser_lex(pm_parser_t *parser) {
8729
8759
lex_mode_push_string(parser, false, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
8730
8760
lex_state_set(parser, PM_LEX_STATE_FNAME | PM_LEX_STATE_FITEM);
8731
8761
parser->current.end++;
8762
+ } else {
8763
+ lex_mode_push_string_eof(parser);
8732
8764
}
8733
8765
8734
8766
LEX(PM_TOKEN_SYMBOL_BEGIN);
@@ -8738,6 +8770,8 @@ parser_lex(pm_parser_t *parser) {
8738
8770
8739
8771
if (parser->current.end < parser->end) {
8740
8772
lex_mode_push_list(parser, false, *parser->current.end++);
8773
+ } else {
8774
+ lex_mode_push_list_eof(parser);
8741
8775
}
8742
8776
8743
8777
LEX(PM_TOKEN_PERCENT_LOWER_W);
@@ -8747,6 +8781,8 @@ parser_lex(pm_parser_t *parser) {
8747
8781
8748
8782
if (parser->current.end < parser->end) {
8749
8783
lex_mode_push_list(parser, true, *parser->current.end++);
8784
+ } else {
8785
+ lex_mode_push_list_eof(parser);
8750
8786
}
8751
8787
8752
8788
LEX(PM_TOKEN_PERCENT_UPPER_W);
@@ -8757,6 +8793,8 @@ parser_lex(pm_parser_t *parser) {
8757
8793
if (parser->current.end < parser->end) {
8758
8794
lex_mode_push_string(parser, true, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
8759
8795
parser->current.end++;
8796
+ } else {
8797
+ lex_mode_push_string_eof(parser);
8760
8798
}
8761
8799
8762
8800
LEX(PM_TOKEN_PERCENT_LOWER_X);
0 commit comments