Skip to content

Commit 014f714

Browse files
committed
More consistent lex modes with %q
1 parent 2dc5320 commit 014f714

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

src/prism.c

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,16 @@ lex_mode_push_list(pm_parser_t *parser, bool interpolation, uint8_t delimiter) {
275275
return lex_mode_push(parser, lex_mode);
276276
}
277277

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+
278288
/**
279289
* Push on a new regexp lex mode.
280290
*/
@@ -346,6 +356,16 @@ lex_mode_push_string(pm_parser_t *parser, bool interpolation, bool label_allowed
346356
return lex_mode_push(parser, lex_mode);
347357
}
348358

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+
349369
/**
350370
* Pop the current lex state off the stack. If we're within the pre-allocated
351371
* space of the lex state stack, then we'll just decrement the index. Otherwise
@@ -8676,6 +8696,8 @@ parser_lex(pm_parser_t *parser) {
86768696

86778697
if (parser->current.end < parser->end) {
86788698
lex_mode_push_list(parser, false, *parser->current.end++);
8699+
} else {
8700+
lex_mode_push_list_eof(parser);
86798701
}
86808702

86818703
LEX(PM_TOKEN_PERCENT_LOWER_I);
@@ -8685,6 +8707,8 @@ parser_lex(pm_parser_t *parser) {
86858707

86868708
if (parser->current.end < parser->end) {
86878709
lex_mode_push_list(parser, true, *parser->current.end++);
8710+
} else {
8711+
lex_mode_push_list_eof(parser);
86888712
}
86898713

86908714
LEX(PM_TOKEN_PERCENT_UPPER_I);
@@ -8696,6 +8720,8 @@ parser_lex(pm_parser_t *parser) {
86968720
lex_mode_push_regexp(parser, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
86978721
pm_newline_list_check_append(&parser->newline_list, parser->current.end);
86988722
parser->current.end++;
8723+
} else {
8724+
lex_mode_push_regexp(parser, '\0', '\0');
86998725
}
87008726

87018727
LEX(PM_TOKEN_REGEXP_BEGIN);
@@ -8707,6 +8733,8 @@ parser_lex(pm_parser_t *parser) {
87078733
lex_mode_push_string(parser, false, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
87088734
pm_newline_list_check_append(&parser->newline_list, parser->current.end);
87098735
parser->current.end++;
8736+
} else {
8737+
lex_mode_push_string_eof(parser);
87108738
}
87118739

87128740
LEX(PM_TOKEN_STRING_BEGIN);
@@ -8718,6 +8746,8 @@ parser_lex(pm_parser_t *parser) {
87188746
lex_mode_push_string(parser, true, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
87198747
pm_newline_list_check_append(&parser->newline_list, parser->current.end);
87208748
parser->current.end++;
8749+
} else {
8750+
lex_mode_push_string_eof(parser);
87218751
}
87228752

87238753
LEX(PM_TOKEN_STRING_BEGIN);
@@ -8729,6 +8759,8 @@ parser_lex(pm_parser_t *parser) {
87298759
lex_mode_push_string(parser, false, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
87308760
lex_state_set(parser, PM_LEX_STATE_FNAME | PM_LEX_STATE_FITEM);
87318761
parser->current.end++;
8762+
} else {
8763+
lex_mode_push_string_eof(parser);
87328764
}
87338765

87348766
LEX(PM_TOKEN_SYMBOL_BEGIN);
@@ -8738,6 +8770,8 @@ parser_lex(pm_parser_t *parser) {
87388770

87398771
if (parser->current.end < parser->end) {
87408772
lex_mode_push_list(parser, false, *parser->current.end++);
8773+
} else {
8774+
lex_mode_push_list_eof(parser);
87418775
}
87428776

87438777
LEX(PM_TOKEN_PERCENT_LOWER_W);
@@ -8747,6 +8781,8 @@ parser_lex(pm_parser_t *parser) {
87478781

87488782
if (parser->current.end < parser->end) {
87498783
lex_mode_push_list(parser, true, *parser->current.end++);
8784+
} else {
8785+
lex_mode_push_list_eof(parser);
87508786
}
87518787

87528788
LEX(PM_TOKEN_PERCENT_UPPER_W);
@@ -8757,6 +8793,8 @@ parser_lex(pm_parser_t *parser) {
87578793
if (parser->current.end < parser->end) {
87588794
lex_mode_push_string(parser, true, false, lex_mode_incrementor(*parser->current.end), lex_mode_terminator(*parser->current.end));
87598795
parser->current.end++;
8796+
} else {
8797+
lex_mode_push_string_eof(parser);
87608798
}
87618799

87628800
LEX(PM_TOKEN_PERCENT_LOWER_X);

0 commit comments

Comments
 (0)