| ... | @@ -141,6 +141,7 @@ pub const Token = struct { | ... | @@ -141,6 +141,7 @@ pub const Token = struct { |
| 141 | LineComment, | 141 | LineComment, |
| 142 | DocComment, | 142 | DocComment, |
| 143 | BracketStarBracket, | 143 | BracketStarBracket, |
| | 144 | BracketStarCBracket, |
| 144 | ShebangLine, | 145 | ShebangLine, |
| 145 | Keyword_align, | 146 | Keyword_align, |
| 146 | Keyword_and, | 147 | Keyword_and, |
| ... | @@ -279,6 +280,7 @@ pub const Tokenizer = struct { | ... | @@ -279,6 +280,7 @@ pub const Tokenizer = struct { |
| 279 | SawAtSign, | 280 | SawAtSign, |
| 280 | LBracket, | 281 | LBracket, |
| 281 | LBracketStar, | 282 | LBracketStar, |
| | 283 | LBracketStarC, |
| 282 | }; | 284 | }; |
| 283 | | 285 | |
| 284 | pub fn next(self: *Tokenizer) Token { | 286 | pub fn next(self: *Tokenizer) Token { |
| ... | @@ -456,6 +458,9 @@ pub const Tokenizer = struct { | ... | @@ -456,6 +458,9 @@ pub const Tokenizer = struct { |
| 456 | }, | 458 | }, |
| 457 | | 459 | |
| 458 | State.LBracketStar => switch (c) { | 460 | State.LBracketStar => switch (c) { |
| | 461 | 'c' => { |
| | 462 | state = State.LBracketStarC; |
| | 463 | }, |
| 459 | ']' => { | 464 | ']' => { |
| 460 | result.id = Token.Id.BracketStarBracket; | 465 | result.id = Token.Id.BracketStarBracket; |
| 461 | self.index += 1; | 466 | self.index += 1; |
| ... | @@ -467,6 +472,18 @@ pub const Tokenizer = struct { | ... | @@ -467,6 +472,18 @@ pub const Tokenizer = struct { |
| 467 | }, | 472 | }, |
| 468 | }, | 473 | }, |
| 469 | | 474 | |
| | 475 | State.LBracketStarC => switch (c) { |
| | 476 | ']' => { |
| | 477 | result.id = Token.Id.BracketStarCBracket; |
| | 478 | self.index += 1; |
| | 479 | break; |
| | 480 | }, |
| | 481 | else => { |
| | 482 | result.id = Token.Id.Invalid; |
| | 483 | break; |
| | 484 | }, |
| | 485 | }, |
| | 486 | |
| 470 | State.Ampersand => switch (c) { | 487 | State.Ampersand => switch (c) { |
| 471 | '=' => { | 488 | '=' => { |
| 472 | result.id = Token.Id.AmpersandEqual; | 489 | result.id = Token.Id.AmpersandEqual; |
| ... | @@ -1035,6 +1052,7 @@ pub const Tokenizer = struct { | ... | @@ -1035,6 +1052,7 @@ pub const Tokenizer = struct { |
| 1035 | State.CharLiteralEnd, | 1052 | State.CharLiteralEnd, |
| 1036 | State.StringLiteralBackslash, | 1053 | State.StringLiteralBackslash, |
| 1037 | State.LBracketStar, | 1054 | State.LBracketStar, |
| | 1055 | State.LBracketStarC, |
| 1038 | => { | 1056 | => { |
| 1039 | result.id = Token.Id.Invalid; | 1057 | result.id = Token.Id.Invalid; |
| 1040 | }, | 1058 | }, |
| ... | @@ -1169,12 +1187,15 @@ test "tokenizer" { | ... | @@ -1169,12 +1187,15 @@ test "tokenizer" { |
| 1169 | testTokenize("test", []Token.Id{Token.Id.Keyword_test}); | 1187 | testTokenize("test", []Token.Id{Token.Id.Keyword_test}); |
| 1170 | } | 1188 | } |
| 1171 | | 1189 | |
| 1172 | test "tokenizer - unknown length pointer" { | 1190 | test "tokenizer - unknown length pointer and then c pointer" { |
| 1173 | testTokenize( | 1191 | testTokenize( |
| 1174 | \\[*]u8 | 1192 | \\[*]u8 |
| | 1193 | \\[*c]u8 |
| 1175 | , []Token.Id{ | 1194 | , []Token.Id{ |
| 1176 | Token.Id.BracketStarBracket, | 1195 | Token.Id.BracketStarBracket, |
| 1177 | Token.Id.Identifier, | 1196 | Token.Id.Identifier, |
| | 1197 | Token.Id.BracketStarCBracket, |
| | 1198 | Token.Id.Identifier, |
| 1178 | }); | 1199 | }); |
| 1179 | } | 1200 | } |
| 1180 | | 1201 | |