| ... | @@ -403,6 +403,7 @@ pub const Tokenizer = struct { | ... | @@ -403,6 +403,7 @@ pub const Tokenizer = struct { |
| 403 | angle_bracket_angle_bracket_right, | 403 | angle_bracket_angle_bracket_right, |
| 404 | period, | 404 | period, |
| 405 | period_2, | 405 | period_2, |
| | 406 | period_asterisk, |
| 406 | saw_at_sign, | 407 | saw_at_sign, |
| 407 | }; | 408 | }; |
| 408 | | 409 | |
| ... | @@ -979,9 +980,7 @@ pub const Tokenizer = struct { | ... | @@ -979,9 +980,7 @@ pub const Tokenizer = struct { |
| 979 | state = .period_2; | 980 | state = .period_2; |
| 980 | }, | 981 | }, |
| 981 | '*' => { | 982 | '*' => { |
| 982 | result.id = .PeriodAsterisk; | 983 | state = .period_asterisk; |
| 983 | self.index += 1; | | |
| 984 | break; | | |
| 985 | }, | 984 | }, |
| 986 | else => { | 985 | else => { |
| 987 | result.id = .Period; | 986 | result.id = .Period; |
| ... | @@ -1001,6 +1000,17 @@ pub const Tokenizer = struct { | ... | @@ -1001,6 +1000,17 @@ pub const Tokenizer = struct { |
| 1001 | }, | 1000 | }, |
| 1002 | }, | 1001 | }, |
| 1003 | | 1002 | |
| | 1003 | .period_asterisk => switch (c) { |
| | 1004 | '*' => { |
| | 1005 | result.id = .Invalid; |
| | 1006 | break; |
| | 1007 | }, |
| | 1008 | else => { |
| | 1009 | result.id = .PeriodAsterisk; |
| | 1010 | break; |
| | 1011 | } |
| | 1012 | }, |
| | 1013 | |
| 1004 | .slash => switch (c) { | 1014 | .slash => switch (c) { |
| 1005 | '/' => { | 1015 | '/' => { |
| 1006 | state = .line_comment_start; | 1016 | state = .line_comment_start; |
| ... | @@ -1376,6 +1386,9 @@ pub const Tokenizer = struct { | ... | @@ -1376,6 +1386,9 @@ pub const Tokenizer = struct { |
| 1376 | .period_2 => { | 1386 | .period_2 => { |
| 1377 | result.id = .Ellipsis2; | 1387 | result.id = .Ellipsis2; |
| 1378 | }, | 1388 | }, |
| | 1389 | .period_asterisk => { |
| | 1390 | result.id = .PeriodAsterisk; |
| | 1391 | }, |
| 1379 | .pipe => { | 1392 | .pipe => { |
| 1380 | result.id = .Pipe; | 1393 | result.id = .Pipe; |
| 1381 | }, | 1394 | }, |
| ... | @@ -1762,6 +1775,31 @@ test "correctly parse pointer assignment" { | ... | @@ -1762,6 +1775,31 @@ test "correctly parse pointer assignment" { |
| 1762 | }); | 1775 | }); |
| 1763 | } | 1776 | } |
| 1764 | | 1777 | |
| | 1778 | test "correctly parse pointer dereference followed by asterisk" { |
| | 1779 | testTokenize("\"b\".* ** 10", &[_]Token.Id{ |
| | 1780 | .StringLiteral, |
| | 1781 | .PeriodAsterisk, |
| | 1782 | .AsteriskAsterisk, |
| | 1783 | .IntegerLiteral, |
| | 1784 | }); |
| | 1785 | |
| | 1786 | testTokenize("(\"b\".*)** 10", &[_]Token.Id{ |
| | 1787 | .LParen, |
| | 1788 | .StringLiteral, |
| | 1789 | .PeriodAsterisk, |
| | 1790 | .RParen, |
| | 1791 | .AsteriskAsterisk, |
| | 1792 | .IntegerLiteral, |
| | 1793 | }); |
| | 1794 | |
| | 1795 | testTokenize("\"b\".*** 10", &[_]Token.Id{ |
| | 1796 | .StringLiteral, |
| | 1797 | .Invalid, |
| | 1798 | .AsteriskAsterisk, |
| | 1799 | .IntegerLiteral, |
| | 1800 | }); |
| | 1801 | } |
| | 1802 | |
| 1765 | test "tokenizer - range literals" { | 1803 | test "tokenizer - range literals" { |
| 1766 | testTokenize("0...9", &[_]Token.Id{ .IntegerLiteral, .Ellipsis3, .IntegerLiteral }); | 1804 | testTokenize("0...9", &[_]Token.Id{ .IntegerLiteral, .Ellipsis3, .IntegerLiteral }); |
| 1767 | testTokenize("'0'...'9'", &[_]Token.Id{ .CharLiteral, .Ellipsis3, .CharLiteral }); | 1805 | testTokenize("'0'...'9'", &[_]Token.Id{ .CharLiteral, .Ellipsis3, .CharLiteral }); |