@@ -6980,6 +6980,14 @@ is_identchar(struct parser_params *p, const char *ptr, const char *MAYBE_UNUSED(
69806980 return rb_enc_isalnum((unsigned char)*ptr, enc) || *ptr == '_' || !ISASCII(*ptr);
69816981}
69826982
6983+ static inline bool
6984+ peek_ident_p(struct parser_params *p, size_t n)
6985+ {
6986+ const char *ptr = p->lex.pcur + n;
6987+ if (lex_eol_ptr_p(p, ptr)) return false;
6988+ return is_identchar(p, ptr, p->lex.pend, p->enc);
6989+ }
6990+
69836991static inline int
69846992parser_is_identchar(struct parser_params *p)
69856993{
@@ -10551,15 +10559,36 @@ parser_yylex(struct parser_params *p)
1055110559 token_flush(p);
1055210560 }
1055310561 goto retry;
10562+ case 'a':
10563+ dispatch_delayed_token(p, tIGNORED_NL);
10564+ if (peek_n(p, 'n', 0) && peek_n(p, 'd', 1) && !peek_ident_p(p, 2)) {
10565+ goto fluent;
10566+ }
10567+ goto bol;
10568+ case 'o':
10569+ dispatch_delayed_token(p, tIGNORED_NL);
10570+ if (peek_n(p, 'r', 0) && !peek_ident_p(p, 1)) {
10571+ goto fluent;
10572+ }
10573+ goto bol;
10574+
10575+ case '|':
10576+ dispatch_delayed_token(p, tIGNORED_NL);
10577+ if (peek(p, '|')) {
10578+ goto fluent;
10579+ }
10580+ goto bol;
1055410581 case '&':
1055510582 case '.': {
1055610583 dispatch_delayed_token(p, tIGNORED_NL);
10557- if (peek(p, '.') == (c == '&')) {
10584+ if (peek(p, '.') == (c == '&') || ((c == '&') && peek(p, '&'))) {
10585+ fluent:
1055810586 pushback(p, c);
1055910587 dispatch_scan_event(p, tSP);
1056010588 goto retry;
1056110589 }
1056210590 }
10591+ bol:
1056310592 default:
1056410593 p->ruby_sourceline--;
1056510594 p->lex.nextline = p->lex.lastline;
0 commit comments