| ... | @@ -223,6 +223,7 @@ enum TokenizeState { | ... | @@ -223,6 +223,7 @@ enum TokenizeState { |
| 223 | TokenizeStateSawGreaterThanGreaterThan, | 223 | TokenizeStateSawGreaterThanGreaterThan, |
| 224 | TokenizeStateSawDot, | 224 | TokenizeStateSawDot, |
| 225 | TokenizeStateSawDotDot, | 225 | TokenizeStateSawDotDot, |
| | 226 | TokenizeStateSawDotStar, |
| 226 | TokenizeStateSawAtSign, | 227 | TokenizeStateSawAtSign, |
| 227 | TokenizeStateCharCode, | 228 | TokenizeStateCharCode, |
| 228 | TokenizeStateError, | 229 | TokenizeStateError, |
| ... | @@ -566,9 +567,8 @@ void tokenize(Buf *buf, Tokenization *out) { | ... | @@ -566,9 +567,8 @@ void tokenize(Buf *buf, Tokenization *out) { |
| 566 | set_token_id(&t, t.cur_tok, TokenIdEllipsis2); | 567 | set_token_id(&t, t.cur_tok, TokenIdEllipsis2); |
| 567 | break; | 568 | break; |
| 568 | case '*': | 569 | case '*': |
| 569 | t.state = TokenizeStateStart; | 570 | t.state = TokenizeStateSawDotStar; |
| 570 | set_token_id(&t, t.cur_tok, TokenIdDotStar); | 571 | set_token_id(&t, t.cur_tok, TokenIdDotStar); |
| 571 | end_token(&t); | | |
| 572 | break; | 572 | break; |
| 573 | default: | 573 | default: |
| 574 | t.pos -= 1; | 574 | t.pos -= 1; |
| ... | @@ -591,6 +591,18 @@ void tokenize(Buf *buf, Tokenization *out) { | ... | @@ -591,6 +591,18 @@ void tokenize(Buf *buf, Tokenization *out) { |
| 591 | continue; | 591 | continue; |
| 592 | } | 592 | } |
| 593 | break; | 593 | break; |
| | 594 | case TokenizeStateSawDotStar: |
| | 595 | switch (c) { |
| | 596 | case '*': |
| | 597 | tokenize_error(&t, "`.*` can't be followed by `*`. Are you missing a space?"); |
| | 598 | break; |
| | 599 | default: |
| | 600 | t.pos -= 1; |
| | 601 | end_token(&t); |
| | 602 | t.state = TokenizeStateStart; |
| | 603 | continue; |
| | 604 | } |
| | 605 | break; |
| 594 | case TokenizeStateSawGreaterThan: | 606 | case TokenizeStateSawGreaterThan: |
| 595 | switch (c) { | 607 | switch (c) { |
| 596 | case '=': | 608 | case '=': |