| ... | ... | @@ -613,17 +613,25 @@ pub const Tokenizer = struct { |
| 613 | 613 | '\\' => { |
| 614 | 614 | state = State.CharLiteralBackslash; |
| 615 | 615 | }, |
| 616 | | '\'' => break, // Look for this error later. |
| 616 | '\'' => { |
| 617 | result.id = Token.Id.Invalid; |
| 618 | break; |
| 619 | }, |
| 617 | 620 | else => { |
| 618 | | if (c < 0x20 or c == 0x7f) |
| 619 | | break; // Look for this error later. |
| 621 | if (c < 0x20 or c == 0x7f) { |
| 622 | result.id = Token.Id.Invalid; |
| 623 | break; |
| 624 | } |
| 620 | 625 | |
| 621 | 626 | state = State.CharLiteralEnd; |
| 622 | 627 | } |
| 623 | 628 | }, |
| 624 | 629 | |
| 625 | 630 | State.CharLiteralBackslash => switch (c) { |
| 626 | | '\n' => break, // Look for this error later. |
| 631 | '\n' => { |
| 632 | result.id = Token.Id.Invalid; |
| 633 | break; |
| 634 | }, |
| 627 | 635 | else => { |
| 628 | 636 | state = State.CharLiteralEnd; |
| 629 | 637 | }, |
| ... | ... | @@ -635,7 +643,10 @@ pub const Tokenizer = struct { |
| 635 | 643 | self.index += 1; |
| 636 | 644 | break; |
| 637 | 645 | }, |
| 638 | | else => break, // Look for this error later. |
| 646 | else => { |
| 647 | result.id = Token.Id.Invalid; |
| 648 | break; |
| 649 | }, |
| 639 | 650 | }, |
| 640 | 651 | |
| 641 | 652 | State.MultilineStringLiteralLine => switch (c) { |
| ... | ... | @@ -903,7 +914,6 @@ pub const Tokenizer = struct { |
| 903 | 914 | State.FloatExponentNumber, |
| 904 | 915 | State.StringLiteral, // find this error later |
| 905 | 916 | State.MultilineStringLiteralLine, |
| 906 | | State.CharLiteralEnd, |
| 907 | 917 | State.Builtin => {}, |
| 908 | 918 | |
| 909 | 919 | State.Identifier => { |
| ... | ... | @@ -922,6 +932,7 @@ pub const Tokenizer = struct { |
| 922 | 932 | State.MultilineStringLiteralLineBackslash, |
| 923 | 933 | State.CharLiteral, |
| 924 | 934 | State.CharLiteralBackslash, |
| 935 | State.CharLiteralEnd, |
| 925 | 936 | State.StringLiteralBackslash => { |
| 926 | 937 | result.id = Token.Id.Invalid; |
| 927 | 938 | }, |
| ... | ... | @@ -1073,7 +1084,7 @@ test "tokenizer - invalid token characters" { |
| 1073 | 1084 | testTokenize("`", []Token.Id{Token.Id.Invalid}); |
| 1074 | 1085 | testTokenize("'c", []Token.Id {Token.Id.Invalid}); |
| 1075 | 1086 | testTokenize("'", []Token.Id {Token.Id.Invalid}); |
| 1076 | | testTokenize("''", []Token.Id {Token.Id.Invalid}); |
| 1087 | testTokenize("''", []Token.Id {Token.Id.Invalid, Token.Id.Invalid}); |
| 1077 | 1088 | } |
| 1078 | 1089 | |
| 1079 | 1090 | test "tokenizer - invalid literal/comment characters" { |
| ... | ... | @@ -1147,6 +1158,7 @@ fn testTokenize(source: []const u8, expected_tokens: []const Token.Id) void { |
| 1147 | 1158 | var tokenizer = Tokenizer.init(source); |
| 1148 | 1159 | for (expected_tokens) |expected_token_id| { |
| 1149 | 1160 | const token = tokenizer.next(); |
| 1161 | std.debug.warn("{} {}\n", @tagName(expected_token_id), @tagName(token.id)); |
| 1150 | 1162 | std.debug.assert(@TagType(Token.Id)(token.id) == @TagType(Token.Id)(expected_token_id)); |
| 1151 | 1163 | switch (expected_token_id) { |
| 1152 | 1164 | Token.Id.StringLiteral => |expected_kind| { |