| ... | ... | @@ -136,8 +136,7 @@ pub const Token = struct { |
| 136 | 136 | angle_bracket_angle_bracket_right, |
| 137 | 137 | angle_bracket_angle_bracket_right_equal, |
| 138 | 138 | tilde, |
| 139 | | integer_literal, |
| 140 | | float_literal, |
| 139 | number_literal, |
| 141 | 140 | doc_comment, |
| 142 | 141 | container_doc_comment, |
| 143 | 142 | keyword_addrspace, |
| ... | ... | @@ -199,8 +198,7 @@ pub const Token = struct { |
| 199 | 198 | .char_literal, |
| 200 | 199 | .eof, |
| 201 | 200 | .builtin, |
| 202 | | .integer_literal, |
| 203 | | .float_literal, |
| 201 | .number_literal, |
| 204 | 202 | .doc_comment, |
| 205 | 203 | .container_doc_comment, |
| 206 | 204 | => null, |
| ... | ... | @@ -328,8 +326,7 @@ pub const Token = struct { |
| 328 | 326 | .char_literal => "a character literal", |
| 329 | 327 | .eof => "EOF", |
| 330 | 328 | .builtin => "a builtin function", |
| 331 | | .integer_literal => "an integer literal", |
| 332 | | .float_literal => "a floating point literal", |
| 329 | .number_literal => "a number literal", |
| 333 | 330 | .doc_comment, .container_doc_comment => "a document comment", |
| 334 | 331 | else => unreachable, |
| 335 | 332 | }; |
| ... | ... | @@ -387,24 +384,11 @@ pub const Tokenizer = struct { |
| 387 | 384 | line_comment, |
| 388 | 385 | doc_comment_start, |
| 389 | 386 | doc_comment, |
| 390 | | zero, |
| 391 | | int_literal_dec, |
| 392 | | int_literal_dec_no_underscore, |
| 393 | | int_literal_bin, |
| 394 | | int_literal_bin_no_underscore, |
| 395 | | int_literal_oct, |
| 396 | | int_literal_oct_no_underscore, |
| 397 | | int_literal_hex, |
| 398 | | int_literal_hex_no_underscore, |
| 399 | | num_dot_dec, |
| 400 | | num_dot_hex, |
| 401 | | float_fraction_dec, |
| 402 | | float_fraction_dec_no_underscore, |
| 403 | | float_fraction_hex, |
| 404 | | float_fraction_hex_no_underscore, |
| 405 | | float_exponent_unsigned, |
| 406 | | float_exponent_num, |
| 407 | | float_exponent_num_no_underscore, |
| 387 | int, |
| 388 | int_exponent, |
| 389 | int_period, |
| 390 | float, |
| 391 | float_exponent, |
| 408 | 392 | ampersand, |
| 409 | 393 | caret, |
| 410 | 394 | percent, |
| ... | ... | @@ -557,13 +541,9 @@ pub const Tokenizer = struct { |
| 557 | 541 | '&' => { |
| 558 | 542 | state = .ampersand; |
| 559 | 543 | }, |
| 560 | | '0' => { |
| 561 | | state = .zero; |
| 562 | | result.tag = .integer_literal; |
| 563 | | }, |
| 564 | | '1'...'9' => { |
| 565 | | state = .int_literal_dec; |
| 566 | | result.tag = .integer_literal; |
| 544 | '0'...'9' => { |
| 545 | state = .int; |
| 546 | result.tag = .number_literal; |
| 567 | 547 | }, |
| 568 | 548 | else => { |
| 569 | 549 | result.tag = .invalid; |
| ... | ... | @@ -1175,232 +1155,42 @@ pub const Tokenizer = struct { |
| 1175 | 1155 | '\t', '\r' => {}, |
| 1176 | 1156 | else => self.checkLiteralCharacter(), |
| 1177 | 1157 | }, |
| 1178 | | .zero => switch (c) { |
| 1179 | | 'b' => { |
| 1180 | | state = .int_literal_bin_no_underscore; |
| 1181 | | }, |
| 1182 | | 'o' => { |
| 1183 | | state = .int_literal_oct_no_underscore; |
| 1184 | | }, |
| 1185 | | 'x' => { |
| 1186 | | state = .int_literal_hex_no_underscore; |
| 1187 | | }, |
| 1188 | | '0'...'9', '_', '.', 'e', 'E' => { |
| 1189 | | // reinterpret as a decimal number |
| 1190 | | self.index -= 1; |
| 1191 | | state = .int_literal_dec; |
| 1192 | | }, |
| 1193 | | 'a', 'c', 'd', 'f'...'n', 'p'...'w', 'y', 'z', 'A'...'D', 'F'...'Z' => { |
| 1194 | | result.tag = .invalid; |
| 1195 | | break; |
| 1196 | | }, |
| 1197 | | else => break, |
| 1198 | | }, |
| 1199 | | .int_literal_bin_no_underscore => switch (c) { |
| 1200 | | '0'...'1' => { |
| 1201 | | state = .int_literal_bin; |
| 1202 | | }, |
| 1203 | | else => { |
| 1204 | | result.tag = .invalid; |
| 1205 | | break; |
| 1206 | | }, |
| 1207 | | }, |
| 1208 | | .int_literal_bin => switch (c) { |
| 1209 | | '_' => { |
| 1210 | | state = .int_literal_bin_no_underscore; |
| 1211 | | }, |
| 1212 | | '0'...'1' => {}, |
| 1213 | | '2'...'9', 'a'...'z', 'A'...'Z' => { |
| 1214 | | result.tag = .invalid; |
| 1215 | | break; |
| 1216 | | }, |
| 1158 | .int => switch (c) { |
| 1159 | '.' => state = .int_period, |
| 1160 | '_', 'a'...'d', 'f'...'o', 'q'...'z', 'A'...'D', 'F'...'O', 'Q'...'Z', '0'...'9' => {}, |
| 1161 | 'e', 'E', 'p', 'P' => state = .int_exponent, |
| 1217 | 1162 | else => break, |
| 1218 | 1163 | }, |
| 1219 | | .int_literal_oct_no_underscore => switch (c) { |
| 1220 | | '0'...'7' => { |
| 1221 | | state = .int_literal_oct; |
| 1164 | .int_exponent => switch (c) { |
| 1165 | '-', '+' => { |
| 1166 | state = .float; |
| 1222 | 1167 | }, |
| 1223 | 1168 | else => { |
| 1224 | | result.tag = .invalid; |
| 1225 | | break; |
| 1226 | | }, |
| 1227 | | }, |
| 1228 | | .int_literal_oct => switch (c) { |
| 1229 | | '_' => { |
| 1230 | | state = .int_literal_oct_no_underscore; |
| 1231 | | }, |
| 1232 | | '0'...'7' => {}, |
| 1233 | | '8', '9', 'a'...'z', 'A'...'Z' => { |
| 1234 | | result.tag = .invalid; |
| 1235 | | break; |
| 1236 | | }, |
| 1237 | | else => break, |
| 1238 | | }, |
| 1239 | | .int_literal_dec_no_underscore => switch (c) { |
| 1240 | | '0'...'9' => { |
| 1241 | | state = .int_literal_dec; |
| 1242 | | }, |
| 1243 | | else => { |
| 1244 | | result.tag = .invalid; |
| 1245 | | break; |
| 1246 | | }, |
| 1247 | | }, |
| 1248 | | .int_literal_dec => switch (c) { |
| 1249 | | '_' => { |
| 1250 | | state = .int_literal_dec_no_underscore; |
| 1251 | | }, |
| 1252 | | '.' => { |
| 1253 | | state = .num_dot_dec; |
| 1254 | | result.tag = .invalid; |
| 1255 | | }, |
| 1256 | | 'e', 'E' => { |
| 1257 | | state = .float_exponent_unsigned; |
| 1258 | | result.tag = .float_literal; |
| 1259 | | }, |
| 1260 | | '0'...'9' => {}, |
| 1261 | | 'a'...'d', 'f'...'z', 'A'...'D', 'F'...'Z' => { |
| 1262 | | result.tag = .invalid; |
| 1263 | | break; |
| 1264 | | }, |
| 1265 | | else => break, |
| 1266 | | }, |
| 1267 | | .int_literal_hex_no_underscore => switch (c) { |
| 1268 | | '0'...'9', 'a'...'f', 'A'...'F' => { |
| 1269 | | state = .int_literal_hex; |
| 1270 | | }, |
| 1271 | | else => { |
| 1272 | | result.tag = .invalid; |
| 1273 | | break; |
| 1274 | | }, |
| 1275 | | }, |
| 1276 | | .int_literal_hex => switch (c) { |
| 1277 | | '_' => { |
| 1278 | | state = .int_literal_hex_no_underscore; |
| 1279 | | }, |
| 1280 | | '.' => { |
| 1281 | | state = .num_dot_hex; |
| 1282 | | result.tag = .invalid; |
| 1283 | | }, |
| 1284 | | 'p', 'P' => { |
| 1285 | | state = .float_exponent_unsigned; |
| 1286 | | result.tag = .float_literal; |
| 1287 | | }, |
| 1288 | | '0'...'9', 'a'...'f', 'A'...'F' => {}, |
| 1289 | | 'g'...'o', 'q'...'z', 'G'...'O', 'Q'...'Z' => { |
| 1290 | | result.tag = .invalid; |
| 1291 | | break; |
| 1292 | | }, |
| 1293 | | else => break, |
| 1294 | | }, |
| 1295 | | .num_dot_dec => switch (c) { |
| 1296 | | '.' => { |
| 1297 | | result.tag = .integer_literal; |
| 1298 | | self.index -= 1; |
| 1299 | | state = .start; |
| 1300 | | break; |
| 1301 | | }, |
| 1302 | | '0'...'9' => { |
| 1303 | | result.tag = .float_literal; |
| 1304 | | state = .float_fraction_dec; |
| 1305 | | }, |
| 1306 | | '_', 'a'...'z', 'A'...'Z' => { |
| 1307 | | result.tag = .invalid; |
| 1308 | | break; |
| 1309 | | }, |
| 1310 | | else => break, |
| 1311 | | }, |
| 1312 | | .num_dot_hex => switch (c) { |
| 1313 | | '.' => { |
| 1314 | | result.tag = .integer_literal; |
| 1315 | 1169 | self.index -= 1; |
| 1316 | | state = .start; |
| 1317 | | break; |
| 1318 | | }, |
| 1319 | | '0'...'9', 'a'...'f', 'A'...'F' => { |
| 1320 | | result.tag = .float_literal; |
| 1321 | | state = .float_fraction_hex; |
| 1322 | | }, |
| 1323 | | '_', 'g'...'z', 'G'...'Z' => { |
| 1324 | | result.tag = .invalid; |
| 1325 | | break; |
| 1170 | state = .int; |
| 1326 | 1171 | }, |
| 1327 | | else => break, |
| 1328 | 1172 | }, |
| 1329 | | .float_fraction_dec_no_underscore => switch (c) { |
| 1330 | | '0'...'9' => { |
| 1331 | | state = .float_fraction_dec; |
| 1173 | .int_period => switch (c) { |
| 1174 | '_', 'a'...'d', 'f'...'o', 'q'...'z', 'A'...'D', 'F'...'O', 'Q'...'Z', '0'...'9' => { |
| 1175 | state = .float; |
| 1332 | 1176 | }, |
| 1177 | 'e', 'E', 'p', 'P' => state = .float_exponent, |
| 1333 | 1178 | else => { |
| 1334 | | result.tag = .invalid; |
| 1335 | | break; |
| 1336 | | }, |
| 1337 | | }, |
| 1338 | | .float_fraction_dec => switch (c) { |
| 1339 | | '_' => { |
| 1340 | | state = .float_fraction_dec_no_underscore; |
| 1341 | | }, |
| 1342 | | 'e', 'E' => { |
| 1343 | | state = .float_exponent_unsigned; |
| 1344 | | }, |
| 1345 | | '0'...'9' => {}, |
| 1346 | | 'a'...'d', 'f'...'z', 'A'...'D', 'F'...'Z' => { |
| 1347 | | result.tag = .invalid; |
| 1348 | | break; |
| 1349 | | }, |
| 1350 | | else => break, |
| 1351 | | }, |
| 1352 | | .float_fraction_hex_no_underscore => switch (c) { |
| 1353 | | '0'...'9', 'a'...'f', 'A'...'F' => { |
| 1354 | | state = .float_fraction_hex; |
| 1355 | | }, |
| 1356 | | else => { |
| 1357 | | result.tag = .invalid; |
| 1179 | self.index -= 1; |
| 1358 | 1180 | break; |
| 1359 | 1181 | }, |
| 1360 | 1182 | }, |
| 1361 | | .float_fraction_hex => switch (c) { |
| 1362 | | '_' => { |
| 1363 | | state = .float_fraction_hex_no_underscore; |
| 1364 | | }, |
| 1365 | | 'p', 'P' => { |
| 1366 | | state = .float_exponent_unsigned; |
| 1367 | | }, |
| 1368 | | '0'...'9', 'a'...'f', 'A'...'F' => {}, |
| 1369 | | 'g'...'o', 'q'...'z', 'G'...'O', 'Q'...'Z' => { |
| 1370 | | result.tag = .invalid; |
| 1371 | | break; |
| 1372 | | }, |
| 1183 | .float => switch (c) { |
| 1184 | '_', 'a'...'d', 'f'...'o', 'q'...'z', 'A'...'D', 'F'...'O', 'Q'...'Z', '0'...'9' => {}, |
| 1185 | 'e', 'E', 'p', 'P' => state = .float_exponent, |
| 1373 | 1186 | else => break, |
| 1374 | 1187 | }, |
| 1375 | | .float_exponent_unsigned => switch (c) { |
| 1376 | | '+', '-' => { |
| 1377 | | state = .float_exponent_num_no_underscore; |
| 1378 | | }, |
| 1188 | .float_exponent => switch (c) { |
| 1189 | '-', '+' => state = .float, |
| 1379 | 1190 | else => { |
| 1380 | | // reinterpret as a normal exponent number |
| 1381 | 1191 | self.index -= 1; |
| 1382 | | state = .float_exponent_num_no_underscore; |
| 1383 | | }, |
| 1384 | | }, |
| 1385 | | .float_exponent_num_no_underscore => switch (c) { |
| 1386 | | '0'...'9' => { |
| 1387 | | state = .float_exponent_num; |
| 1192 | state = .float; |
| 1388 | 1193 | }, |
| 1389 | | else => { |
| 1390 | | result.tag = .invalid; |
| 1391 | | break; |
| 1392 | | }, |
| 1393 | | }, |
| 1394 | | .float_exponent_num => switch (c) { |
| 1395 | | '_' => { |
| 1396 | | state = .float_exponent_num_no_underscore; |
| 1397 | | }, |
| 1398 | | '0'...'9' => {}, |
| 1399 | | 'a'...'z', 'A'...'Z' => { |
| 1400 | | result.tag = .invalid; |
| 1401 | | break; |
| 1402 | | }, |
| 1403 | | else => break, |
| 1404 | 1194 | }, |
| 1405 | 1195 | } |
| 1406 | 1196 | } |
| ... | ... | @@ -1571,7 +1361,7 @@ test "code point literal with unicode escapes" { |
| 1571 | 1361 | , &.{ .invalid, .invalid }); |
| 1572 | 1362 | try testTokenize( |
| 1573 | 1363 | \\'\U0333' |
| 1574 | | , &.{ .invalid, .integer_literal, .invalid }); |
| 1364 | , &.{ .invalid, .number_literal, .invalid }); |
| 1575 | 1365 | } |
| 1576 | 1366 | |
| 1577 | 1367 | test "code point literal with unicode code point" { |
| ... | ... | @@ -1584,7 +1374,7 @@ test "float literal e exponent" { |
| 1584 | 1374 | try testTokenize("a = 4.94065645841246544177e-324;\n", &.{ |
| 1585 | 1375 | .identifier, |
| 1586 | 1376 | .equal, |
| 1587 | | .float_literal, |
| 1377 | .number_literal, |
| 1588 | 1378 | .semicolon, |
| 1589 | 1379 | }); |
| 1590 | 1380 | } |
| ... | ... | @@ -1593,7 +1383,7 @@ test "float literal p exponent" { |
| 1593 | 1383 | try testTokenize("a = 0x1.a827999fcef32p+1022;\n", &.{ |
| 1594 | 1384 | .identifier, |
| 1595 | 1385 | .equal, |
| 1596 | | .float_literal, |
| 1386 | .number_literal, |
| 1597 | 1387 | .semicolon, |
| 1598 | 1388 | }); |
| 1599 | 1389 | } |
| ... | ... | @@ -1757,7 +1547,7 @@ test "correctly parse pointer assignment" { |
| 1757 | 1547 | .identifier, |
| 1758 | 1548 | .period_asterisk, |
| 1759 | 1549 | .equal, |
| 1760 | | .integer_literal, |
| 1550 | .number_literal, |
| 1761 | 1551 | .semicolon, |
| 1762 | 1552 | }); |
| 1763 | 1553 | } |
| ... | ... | @@ -1767,7 +1557,7 @@ test "correctly parse pointer dereference followed by asterisk" { |
| 1767 | 1557 | .string_literal, |
| 1768 | 1558 | .period_asterisk, |
| 1769 | 1559 | .asterisk_asterisk, |
| 1770 | | .integer_literal, |
| 1560 | .number_literal, |
| 1771 | 1561 | }); |
| 1772 | 1562 | |
| 1773 | 1563 | try testTokenize("(\"b\".*)** 10", &.{ |
| ... | ... | @@ -1776,256 +1566,256 @@ test "correctly parse pointer dereference followed by asterisk" { |
| 1776 | 1566 | .period_asterisk, |
| 1777 | 1567 | .r_paren, |
| 1778 | 1568 | .asterisk_asterisk, |
| 1779 | | .integer_literal, |
| 1569 | .number_literal, |
| 1780 | 1570 | }); |
| 1781 | 1571 | |
| 1782 | 1572 | try testTokenize("\"b\".*** 10", &.{ |
| 1783 | 1573 | .string_literal, |
| 1784 | 1574 | .invalid_periodasterisks, |
| 1785 | 1575 | .asterisk_asterisk, |
| 1786 | | .integer_literal, |
| 1576 | .number_literal, |
| 1787 | 1577 | }); |
| 1788 | 1578 | } |
| 1789 | 1579 | |
| 1790 | 1580 | test "range literals" { |
| 1791 | | try testTokenize("0...9", &.{ .integer_literal, .ellipsis3, .integer_literal }); |
| 1581 | try testTokenize("0...9", &.{ .number_literal, .ellipsis3, .number_literal }); |
| 1792 | 1582 | try testTokenize("'0'...'9'", &.{ .char_literal, .ellipsis3, .char_literal }); |
| 1793 | | try testTokenize("0x00...0x09", &.{ .integer_literal, .ellipsis3, .integer_literal }); |
| 1794 | | try testTokenize("0b00...0b11", &.{ .integer_literal, .ellipsis3, .integer_literal }); |
| 1795 | | try testTokenize("0o00...0o11", &.{ .integer_literal, .ellipsis3, .integer_literal }); |
| 1583 | try testTokenize("0x00...0x09", &.{ .number_literal, .ellipsis3, .number_literal }); |
| 1584 | try testTokenize("0b00...0b11", &.{ .number_literal, .ellipsis3, .number_literal }); |
| 1585 | try testTokenize("0o00...0o11", &.{ .number_literal, .ellipsis3, .number_literal }); |
| 1796 | 1586 | } |
| 1797 | 1587 | |
| 1798 | 1588 | test "number literals decimal" { |
| 1799 | | try testTokenize("0", &.{.integer_literal}); |
| 1800 | | try testTokenize("1", &.{.integer_literal}); |
| 1801 | | try testTokenize("2", &.{.integer_literal}); |
| 1802 | | try testTokenize("3", &.{.integer_literal}); |
| 1803 | | try testTokenize("4", &.{.integer_literal}); |
| 1804 | | try testTokenize("5", &.{.integer_literal}); |
| 1805 | | try testTokenize("6", &.{.integer_literal}); |
| 1806 | | try testTokenize("7", &.{.integer_literal}); |
| 1807 | | try testTokenize("8", &.{.integer_literal}); |
| 1808 | | try testTokenize("9", &.{.integer_literal}); |
| 1809 | | try testTokenize("1..", &.{ .integer_literal, .ellipsis2 }); |
| 1810 | | try testTokenize("0a", &.{ .invalid, .identifier }); |
| 1811 | | try testTokenize("9b", &.{ .invalid, .identifier }); |
| 1812 | | try testTokenize("1z", &.{ .invalid, .identifier }); |
| 1813 | | try testTokenize("1z_1", &.{ .invalid, .identifier }); |
| 1814 | | try testTokenize("9z3", &.{ .invalid, .identifier }); |
| 1815 | | |
| 1816 | | try testTokenize("0_0", &.{.integer_literal}); |
| 1817 | | try testTokenize("0001", &.{.integer_literal}); |
| 1818 | | try testTokenize("01234567890", &.{.integer_literal}); |
| 1819 | | try testTokenize("012_345_6789_0", &.{.integer_literal}); |
| 1820 | | try testTokenize("0_1_2_3_4_5_6_7_8_9_0", &.{.integer_literal}); |
| 1821 | | |
| 1822 | | try testTokenize("00_", &.{.invalid}); |
| 1823 | | try testTokenize("0_0_", &.{.invalid}); |
| 1824 | | try testTokenize("0__0", &.{ .invalid, .identifier }); |
| 1825 | | try testTokenize("0_0f", &.{ .invalid, .identifier }); |
| 1826 | | try testTokenize("0_0_f", &.{ .invalid, .identifier }); |
| 1827 | | try testTokenize("0_0_f_00", &.{ .invalid, .identifier }); |
| 1828 | | try testTokenize("1_,", &.{ .invalid, .comma }); |
| 1829 | | |
| 1830 | | try testTokenize("0.0", &.{.float_literal}); |
| 1831 | | try testTokenize("1.0", &.{.float_literal}); |
| 1832 | | try testTokenize("10.0", &.{.float_literal}); |
| 1833 | | try testTokenize("0e0", &.{.float_literal}); |
| 1834 | | try testTokenize("1e0", &.{.float_literal}); |
| 1835 | | try testTokenize("1e100", &.{.float_literal}); |
| 1836 | | try testTokenize("1.0e100", &.{.float_literal}); |
| 1837 | | try testTokenize("1.0e+100", &.{.float_literal}); |
| 1838 | | try testTokenize("1.0e-100", &.{.float_literal}); |
| 1839 | | try testTokenize("1_0_0_0.0_0_0_0_0_1e1_0_0_0", &.{.float_literal}); |
| 1840 | | |
| 1841 | | try testTokenize("1.", &.{.invalid}); |
| 1842 | | try testTokenize("1e", &.{.invalid}); |
| 1843 | | try testTokenize("1.e100", &.{ .invalid, .identifier }); |
| 1844 | | try testTokenize("1.0e1f0", &.{ .invalid, .identifier }); |
| 1845 | | try testTokenize("1.0p100", &.{ .invalid, .identifier }); |
| 1846 | | try testTokenize("1.0p-100", &.{ .invalid, .identifier, .minus, .integer_literal }); |
| 1847 | | try testTokenize("1.0p1f0", &.{ .invalid, .identifier }); |
| 1848 | | try testTokenize("1.0_,", &.{ .invalid, .comma }); |
| 1849 | | try testTokenize("1_.0", &.{ .invalid, .period, .integer_literal }); |
| 1850 | | try testTokenize("1._", &.{ .invalid, .identifier }); |
| 1851 | | try testTokenize("1.a", &.{ .invalid, .identifier }); |
| 1852 | | try testTokenize("1.z", &.{ .invalid, .identifier }); |
| 1853 | | try testTokenize("1._0", &.{ .invalid, .identifier }); |
| 1854 | | try testTokenize("1.+", &.{ .invalid, .plus }); |
| 1855 | | try testTokenize("1._+", &.{ .invalid, .identifier, .plus }); |
| 1856 | | try testTokenize("1._e", &.{ .invalid, .identifier }); |
| 1857 | | try testTokenize("1.0e", &.{.invalid}); |
| 1858 | | try testTokenize("1.0e,", &.{ .invalid, .comma }); |
| 1859 | | try testTokenize("1.0e_", &.{ .invalid, .identifier }); |
| 1860 | | try testTokenize("1.0e+_", &.{ .invalid, .identifier }); |
| 1861 | | try testTokenize("1.0e-_", &.{ .invalid, .identifier }); |
| 1862 | | try testTokenize("1.0e0_+", &.{ .invalid, .plus }); |
| 1589 | try testTokenize("0", &.{.number_literal}); |
| 1590 | try testTokenize("1", &.{.number_literal}); |
| 1591 | try testTokenize("2", &.{.number_literal}); |
| 1592 | try testTokenize("3", &.{.number_literal}); |
| 1593 | try testTokenize("4", &.{.number_literal}); |
| 1594 | try testTokenize("5", &.{.number_literal}); |
| 1595 | try testTokenize("6", &.{.number_literal}); |
| 1596 | try testTokenize("7", &.{.number_literal}); |
| 1597 | try testTokenize("8", &.{.number_literal}); |
| 1598 | try testTokenize("9", &.{.number_literal}); |
| 1599 | try testTokenize("1..", &.{ .number_literal, .ellipsis2 }); |
| 1600 | try testTokenize("0a", &.{.number_literal}); |
| 1601 | try testTokenize("9b", &.{.number_literal}); |
| 1602 | try testTokenize("1z", &.{.number_literal}); |
| 1603 | try testTokenize("1z_1", &.{.number_literal}); |
| 1604 | try testTokenize("9z3", &.{.number_literal}); |
| 1605 | |
| 1606 | try testTokenize("0_0", &.{.number_literal}); |
| 1607 | try testTokenize("0001", &.{.number_literal}); |
| 1608 | try testTokenize("01234567890", &.{.number_literal}); |
| 1609 | try testTokenize("012_345_6789_0", &.{.number_literal}); |
| 1610 | try testTokenize("0_1_2_3_4_5_6_7_8_9_0", &.{.number_literal}); |
| 1611 | |
| 1612 | try testTokenize("00_", &.{.number_literal}); |
| 1613 | try testTokenize("0_0_", &.{.number_literal}); |
| 1614 | try testTokenize("0__0", &.{.number_literal}); |
| 1615 | try testTokenize("0_0f", &.{.number_literal}); |
| 1616 | try testTokenize("0_0_f", &.{.number_literal}); |
| 1617 | try testTokenize("0_0_f_00", &.{.number_literal}); |
| 1618 | try testTokenize("1_,", &.{ .number_literal, .comma }); |
| 1619 | |
| 1620 | try testTokenize("0.0", &.{.number_literal}); |
| 1621 | try testTokenize("1.0", &.{.number_literal}); |
| 1622 | try testTokenize("10.0", &.{.number_literal}); |
| 1623 | try testTokenize("0e0", &.{.number_literal}); |
| 1624 | try testTokenize("1e0", &.{.number_literal}); |
| 1625 | try testTokenize("1e100", &.{.number_literal}); |
| 1626 | try testTokenize("1.0e100", &.{.number_literal}); |
| 1627 | try testTokenize("1.0e+100", &.{.number_literal}); |
| 1628 | try testTokenize("1.0e-100", &.{.number_literal}); |
| 1629 | try testTokenize("1_0_0_0.0_0_0_0_0_1e1_0_0_0", &.{.number_literal}); |
| 1630 | |
| 1631 | try testTokenize("1.", &.{ .number_literal, .period }); |
| 1632 | try testTokenize("1e", &.{.number_literal}); |
| 1633 | try testTokenize("1.e100", &.{.number_literal}); |
| 1634 | try testTokenize("1.0e1f0", &.{.number_literal}); |
| 1635 | try testTokenize("1.0p100", &.{.number_literal}); |
| 1636 | try testTokenize("1.0p-100", &.{.number_literal}); |
| 1637 | try testTokenize("1.0p1f0", &.{.number_literal}); |
| 1638 | try testTokenize("1.0_,", &.{ .number_literal, .comma }); |
| 1639 | try testTokenize("1_.0", &.{.number_literal}); |
| 1640 | try testTokenize("1._", &.{.number_literal}); |
| 1641 | try testTokenize("1.a", &.{.number_literal}); |
| 1642 | try testTokenize("1.z", &.{.number_literal}); |
| 1643 | try testTokenize("1._0", &.{.number_literal}); |
| 1644 | try testTokenize("1.+", &.{ .number_literal, .period, .plus }); |
| 1645 | try testTokenize("1._+", &.{ .number_literal, .plus }); |
| 1646 | try testTokenize("1._e", &.{.number_literal}); |
| 1647 | try testTokenize("1.0e", &.{.number_literal}); |
| 1648 | try testTokenize("1.0e,", &.{ .number_literal, .comma }); |
| 1649 | try testTokenize("1.0e_", &.{.number_literal}); |
| 1650 | try testTokenize("1.0e+_", &.{.number_literal}); |
| 1651 | try testTokenize("1.0e-_", &.{.number_literal}); |
| 1652 | try testTokenize("1.0e0_+", &.{ .number_literal, .plus }); |
| 1863 | 1653 | } |
| 1864 | 1654 | |
| 1865 | 1655 | test "number literals binary" { |
| 1866 | | try testTokenize("0b0", &.{.integer_literal}); |
| 1867 | | try testTokenize("0b1", &.{.integer_literal}); |
| 1868 | | try testTokenize("0b2", &.{ .invalid, .integer_literal }); |
| 1869 | | try testTokenize("0b3", &.{ .invalid, .integer_literal }); |
| 1870 | | try testTokenize("0b4", &.{ .invalid, .integer_literal }); |
| 1871 | | try testTokenize("0b5", &.{ .invalid, .integer_literal }); |
| 1872 | | try testTokenize("0b6", &.{ .invalid, .integer_literal }); |
| 1873 | | try testTokenize("0b7", &.{ .invalid, .integer_literal }); |
| 1874 | | try testTokenize("0b8", &.{ .invalid, .integer_literal }); |
| 1875 | | try testTokenize("0b9", &.{ .invalid, .integer_literal }); |
| 1876 | | try testTokenize("0ba", &.{ .invalid, .identifier }); |
| 1877 | | try testTokenize("0bb", &.{ .invalid, .identifier }); |
| 1878 | | try testTokenize("0bc", &.{ .invalid, .identifier }); |
| 1879 | | try testTokenize("0bd", &.{ .invalid, .identifier }); |
| 1880 | | try testTokenize("0be", &.{ .invalid, .identifier }); |
| 1881 | | try testTokenize("0bf", &.{ .invalid, .identifier }); |
| 1882 | | try testTokenize("0bz", &.{ .invalid, .identifier }); |
| 1883 | | |
| 1884 | | try testTokenize("0b0000_0000", &.{.integer_literal}); |
| 1885 | | try testTokenize("0b1111_1111", &.{.integer_literal}); |
| 1886 | | try testTokenize("0b10_10_10_10", &.{.integer_literal}); |
| 1887 | | try testTokenize("0b0_1_0_1_0_1_0_1", &.{.integer_literal}); |
| 1888 | | try testTokenize("0b1.", &.{ .integer_literal, .period }); |
| 1889 | | try testTokenize("0b1.0", &.{ .integer_literal, .period, .integer_literal }); |
| 1890 | | |
| 1891 | | try testTokenize("0B0", &.{ .invalid, .identifier }); |
| 1892 | | try testTokenize("0b_", &.{ .invalid, .identifier }); |
| 1893 | | try testTokenize("0b_0", &.{ .invalid, .identifier }); |
| 1894 | | try testTokenize("0b1_", &.{.invalid}); |
| 1895 | | try testTokenize("0b0__1", &.{ .invalid, .identifier }); |
| 1896 | | try testTokenize("0b0_1_", &.{.invalid}); |
| 1897 | | try testTokenize("0b1e", &.{ .invalid, .identifier }); |
| 1898 | | try testTokenize("0b1p", &.{ .invalid, .identifier }); |
| 1899 | | try testTokenize("0b1e0", &.{ .invalid, .identifier }); |
| 1900 | | try testTokenize("0b1p0", &.{ .invalid, .identifier }); |
| 1901 | | try testTokenize("0b1_,", &.{ .invalid, .comma }); |
| 1656 | try testTokenize("0b0", &.{.number_literal}); |
| 1657 | try testTokenize("0b1", &.{.number_literal}); |
| 1658 | try testTokenize("0b2", &.{.number_literal}); |
| 1659 | try testTokenize("0b3", &.{.number_literal}); |
| 1660 | try testTokenize("0b4", &.{.number_literal}); |
| 1661 | try testTokenize("0b5", &.{.number_literal}); |
| 1662 | try testTokenize("0b6", &.{.number_literal}); |
| 1663 | try testTokenize("0b7", &.{.number_literal}); |
| 1664 | try testTokenize("0b8", &.{.number_literal}); |
| 1665 | try testTokenize("0b9", &.{.number_literal}); |
| 1666 | try testTokenize("0ba", &.{.number_literal}); |
| 1667 | try testTokenize("0bb", &.{.number_literal}); |
| 1668 | try testTokenize("0bc", &.{.number_literal}); |
| 1669 | try testTokenize("0bd", &.{.number_literal}); |
| 1670 | try testTokenize("0be", &.{.number_literal}); |
| 1671 | try testTokenize("0bf", &.{.number_literal}); |
| 1672 | try testTokenize("0bz", &.{.number_literal}); |
| 1673 | |
| 1674 | try testTokenize("0b0000_0000", &.{.number_literal}); |
| 1675 | try testTokenize("0b1111_1111", &.{.number_literal}); |
| 1676 | try testTokenize("0b10_10_10_10", &.{.number_literal}); |
| 1677 | try testTokenize("0b0_1_0_1_0_1_0_1", &.{.number_literal}); |
| 1678 | try testTokenize("0b1.", &.{ .number_literal, .period }); |
| 1679 | try testTokenize("0b1.0", &.{.number_literal}); |
| 1680 | |
| 1681 | try testTokenize("0B0", &.{.number_literal}); |
| 1682 | try testTokenize("0b_", &.{.number_literal}); |
| 1683 | try testTokenize("0b_0", &.{.number_literal}); |
| 1684 | try testTokenize("0b1_", &.{.number_literal}); |
| 1685 | try testTokenize("0b0__1", &.{.number_literal}); |
| 1686 | try testTokenize("0b0_1_", &.{.number_literal}); |
| 1687 | try testTokenize("0b1e", &.{.number_literal}); |
| 1688 | try testTokenize("0b1p", &.{.number_literal}); |
| 1689 | try testTokenize("0b1e0", &.{.number_literal}); |
| 1690 | try testTokenize("0b1p0", &.{.number_literal}); |
| 1691 | try testTokenize("0b1_,", &.{ .number_literal, .comma }); |
| 1902 | 1692 | } |
| 1903 | 1693 | |
| 1904 | 1694 | test "number literals octal" { |
| 1905 | | try testTokenize("0o0", &.{.integer_literal}); |
| 1906 | | try testTokenize("0o1", &.{.integer_literal}); |
| 1907 | | try testTokenize("0o2", &.{.integer_literal}); |
| 1908 | | try testTokenize("0o3", &.{.integer_literal}); |
| 1909 | | try testTokenize("0o4", &.{.integer_literal}); |
| 1910 | | try testTokenize("0o5", &.{.integer_literal}); |
| 1911 | | try testTokenize("0o6", &.{.integer_literal}); |
| 1912 | | try testTokenize("0o7", &.{.integer_literal}); |
| 1913 | | try testTokenize("0o8", &.{ .invalid, .integer_literal }); |
| 1914 | | try testTokenize("0o9", &.{ .invalid, .integer_literal }); |
| 1915 | | try testTokenize("0oa", &.{ .invalid, .identifier }); |
| 1916 | | try testTokenize("0ob", &.{ .invalid, .identifier }); |
| 1917 | | try testTokenize("0oc", &.{ .invalid, .identifier }); |
| 1918 | | try testTokenize("0od", &.{ .invalid, .identifier }); |
| 1919 | | try testTokenize("0oe", &.{ .invalid, .identifier }); |
| 1920 | | try testTokenize("0of", &.{ .invalid, .identifier }); |
| 1921 | | try testTokenize("0oz", &.{ .invalid, .identifier }); |
| 1922 | | |
| 1923 | | try testTokenize("0o01234567", &.{.integer_literal}); |
| 1924 | | try testTokenize("0o0123_4567", &.{.integer_literal}); |
| 1925 | | try testTokenize("0o01_23_45_67", &.{.integer_literal}); |
| 1926 | | try testTokenize("0o0_1_2_3_4_5_6_7", &.{.integer_literal}); |
| 1927 | | try testTokenize("0o7.", &.{ .integer_literal, .period }); |
| 1928 | | try testTokenize("0o7.0", &.{ .integer_literal, .period, .integer_literal }); |
| 1929 | | |
| 1930 | | try testTokenize("0O0", &.{ .invalid, .identifier }); |
| 1931 | | try testTokenize("0o_", &.{ .invalid, .identifier }); |
| 1932 | | try testTokenize("0o_0", &.{ .invalid, .identifier }); |
| 1933 | | try testTokenize("0o1_", &.{.invalid}); |
| 1934 | | try testTokenize("0o0__1", &.{ .invalid, .identifier }); |
| 1935 | | try testTokenize("0o0_1_", &.{.invalid}); |
| 1936 | | try testTokenize("0o1e", &.{ .invalid, .identifier }); |
| 1937 | | try testTokenize("0o1p", &.{ .invalid, .identifier }); |
| 1938 | | try testTokenize("0o1e0", &.{ .invalid, .identifier }); |
| 1939 | | try testTokenize("0o1p0", &.{ .invalid, .identifier }); |
| 1940 | | try testTokenize("0o_,", &.{ .invalid, .identifier, .comma }); |
| 1695 | try testTokenize("0o0", &.{.number_literal}); |
| 1696 | try testTokenize("0o1", &.{.number_literal}); |
| 1697 | try testTokenize("0o2", &.{.number_literal}); |
| 1698 | try testTokenize("0o3", &.{.number_literal}); |
| 1699 | try testTokenize("0o4", &.{.number_literal}); |
| 1700 | try testTokenize("0o5", &.{.number_literal}); |
| 1701 | try testTokenize("0o6", &.{.number_literal}); |
| 1702 | try testTokenize("0o7", &.{.number_literal}); |
| 1703 | try testTokenize("0o8", &.{.number_literal}); |
| 1704 | try testTokenize("0o9", &.{.number_literal}); |
| 1705 | try testTokenize("0oa", &.{.number_literal}); |
| 1706 | try testTokenize("0ob", &.{.number_literal}); |
| 1707 | try testTokenize("0oc", &.{.number_literal}); |
| 1708 | try testTokenize("0od", &.{.number_literal}); |
| 1709 | try testTokenize("0oe", &.{.number_literal}); |
| 1710 | try testTokenize("0of", &.{.number_literal}); |
| 1711 | try testTokenize("0oz", &.{.number_literal}); |
| 1712 | |
| 1713 | try testTokenize("0o01234567", &.{.number_literal}); |
| 1714 | try testTokenize("0o0123_4567", &.{.number_literal}); |
| 1715 | try testTokenize("0o01_23_45_67", &.{.number_literal}); |
| 1716 | try testTokenize("0o0_1_2_3_4_5_6_7", &.{.number_literal}); |
| 1717 | try testTokenize("0o7.", &.{ .number_literal, .period }); |
| 1718 | try testTokenize("0o7.0", &.{.number_literal}); |
| 1719 | |
| 1720 | try testTokenize("0O0", &.{.number_literal}); |
| 1721 | try testTokenize("0o_", &.{.number_literal}); |
| 1722 | try testTokenize("0o_0", &.{.number_literal}); |
| 1723 | try testTokenize("0o1_", &.{.number_literal}); |
| 1724 | try testTokenize("0o0__1", &.{.number_literal}); |
| 1725 | try testTokenize("0o0_1_", &.{.number_literal}); |
| 1726 | try testTokenize("0o1e", &.{.number_literal}); |
| 1727 | try testTokenize("0o1p", &.{.number_literal}); |
| 1728 | try testTokenize("0o1e0", &.{.number_literal}); |
| 1729 | try testTokenize("0o1p0", &.{.number_literal}); |
| 1730 | try testTokenize("0o_,", &.{ .number_literal, .comma }); |
| 1941 | 1731 | } |
| 1942 | 1732 | |
| 1943 | 1733 | test "number literals hexadecimal" { |
| 1944 | | try testTokenize("0x0", &.{.integer_literal}); |
| 1945 | | try testTokenize("0x1", &.{.integer_literal}); |
| 1946 | | try testTokenize("0x2", &.{.integer_literal}); |
| 1947 | | try testTokenize("0x3", &.{.integer_literal}); |
| 1948 | | try testTokenize("0x4", &.{.integer_literal}); |
| 1949 | | try testTokenize("0x5", &.{.integer_literal}); |
| 1950 | | try testTokenize("0x6", &.{.integer_literal}); |
| 1951 | | try testTokenize("0x7", &.{.integer_literal}); |
| 1952 | | try testTokenize("0x8", &.{.integer_literal}); |
| 1953 | | try testTokenize("0x9", &.{.integer_literal}); |
| 1954 | | try testTokenize("0xa", &.{.integer_literal}); |
| 1955 | | try testTokenize("0xb", &.{.integer_literal}); |
| 1956 | | try testTokenize("0xc", &.{.integer_literal}); |
| 1957 | | try testTokenize("0xd", &.{.integer_literal}); |
| 1958 | | try testTokenize("0xe", &.{.integer_literal}); |
| 1959 | | try testTokenize("0xf", &.{.integer_literal}); |
| 1960 | | try testTokenize("0xA", &.{.integer_literal}); |
| 1961 | | try testTokenize("0xB", &.{.integer_literal}); |
| 1962 | | try testTokenize("0xC", &.{.integer_literal}); |
| 1963 | | try testTokenize("0xD", &.{.integer_literal}); |
| 1964 | | try testTokenize("0xE", &.{.integer_literal}); |
| 1965 | | try testTokenize("0xF", &.{.integer_literal}); |
| 1966 | | try testTokenize("0x0z", &.{ .invalid, .identifier }); |
| 1967 | | try testTokenize("0xz", &.{ .invalid, .identifier }); |
| 1968 | | |
| 1969 | | try testTokenize("0x0123456789ABCDEF", &.{.integer_literal}); |
| 1970 | | try testTokenize("0x0123_4567_89AB_CDEF", &.{.integer_literal}); |
| 1971 | | try testTokenize("0x01_23_45_67_89AB_CDE_F", &.{.integer_literal}); |
| 1972 | | try testTokenize("0x0_1_2_3_4_5_6_7_8_9_A_B_C_D_E_F", &.{.integer_literal}); |
| 1973 | | |
| 1974 | | try testTokenize("0X0", &.{ .invalid, .identifier }); |
| 1975 | | try testTokenize("0x_", &.{ .invalid, .identifier }); |
| 1976 | | try testTokenize("0x_1", &.{ .invalid, .identifier }); |
| 1977 | | try testTokenize("0x1_", &.{.invalid}); |
| 1978 | | try testTokenize("0x0__1", &.{ .invalid, .identifier }); |
| 1979 | | try testTokenize("0x0_1_", &.{.invalid}); |
| 1980 | | try testTokenize("0x_,", &.{ .invalid, .identifier, .comma }); |
| 1981 | | |
| 1982 | | try testTokenize("0x1.0", &.{.float_literal}); |
| 1983 | | try testTokenize("0xF.0", &.{.float_literal}); |
| 1984 | | try testTokenize("0xF.F", &.{.float_literal}); |
| 1985 | | try testTokenize("0xF.Fp0", &.{.float_literal}); |
| 1986 | | try testTokenize("0xF.FP0", &.{.float_literal}); |
| 1987 | | try testTokenize("0x1p0", &.{.float_literal}); |
| 1988 | | try testTokenize("0xfp0", &.{.float_literal}); |
| 1989 | | try testTokenize("0x1.0+0xF.0", &.{ .float_literal, .plus, .float_literal }); |
| 1990 | | |
| 1991 | | try testTokenize("0x1.", &.{.invalid}); |
| 1992 | | try testTokenize("0xF.", &.{.invalid}); |
| 1993 | | try testTokenize("0x1.+0xF.", &.{ .invalid, .plus, .invalid }); |
| 1994 | | try testTokenize("0xff.p10", &.{ .invalid, .identifier }); |
| 1995 | | |
| 1996 | | try testTokenize("0x0123456.789ABCDEF", &.{.float_literal}); |
| 1997 | | try testTokenize("0x0_123_456.789_ABC_DEF", &.{.float_literal}); |
| 1998 | | try testTokenize("0x0_1_2_3_4_5_6.7_8_9_A_B_C_D_E_F", &.{.float_literal}); |
| 1999 | | try testTokenize("0x0p0", &.{.float_literal}); |
| 2000 | | try testTokenize("0x0.0p0", &.{.float_literal}); |
| 2001 | | try testTokenize("0xff.ffp10", &.{.float_literal}); |
| 2002 | | try testTokenize("0xff.ffP10", &.{.float_literal}); |
| 2003 | | try testTokenize("0xffp10", &.{.float_literal}); |
| 2004 | | try testTokenize("0xff_ff.ff_ffp1_0_0_0", &.{.float_literal}); |
| 2005 | | try testTokenize("0xf_f_f_f.f_f_f_fp+1_000", &.{.float_literal}); |
| 2006 | | try testTokenize("0xf_f_f_f.f_f_f_fp-1_00_0", &.{.float_literal}); |
| 2007 | | |
| 2008 | | try testTokenize("0x1e", &.{.integer_literal}); |
| 2009 | | try testTokenize("0x1e0", &.{.integer_literal}); |
| 2010 | | try testTokenize("0x1p", &.{.invalid}); |
| 2011 | | try testTokenize("0xfp0z1", &.{ .invalid, .identifier }); |
| 2012 | | try testTokenize("0xff.ffpff", &.{ .invalid, .identifier }); |
| 2013 | | try testTokenize("0x0.p", &.{ .invalid, .identifier }); |
| 2014 | | try testTokenize("0x0.z", &.{ .invalid, .identifier }); |
| 2015 | | try testTokenize("0x0._", &.{ .invalid, .identifier }); |
| 2016 | | try testTokenize("0x0_.0", &.{ .invalid, .period, .integer_literal }); |
| 2017 | | try testTokenize("0x0_.0.0", &.{ .invalid, .period, .float_literal }); |
| 2018 | | try testTokenize("0x0._0", &.{ .invalid, .identifier }); |
| 2019 | | try testTokenize("0x0.0_", &.{.invalid}); |
| 2020 | | try testTokenize("0x0_p0", &.{ .invalid, .identifier }); |
| 2021 | | try testTokenize("0x0_.p0", &.{ .invalid, .period, .identifier }); |
| 2022 | | try testTokenize("0x0._p0", &.{ .invalid, .identifier }); |
| 2023 | | try testTokenize("0x0.0_p0", &.{ .invalid, .identifier }); |
| 2024 | | try testTokenize("0x0._0p0", &.{ .invalid, .identifier }); |
| 2025 | | try testTokenize("0x0.0p_0", &.{ .invalid, .identifier }); |
| 2026 | | try testTokenize("0x0.0p+_0", &.{ .invalid, .identifier }); |
| 2027 | | try testTokenize("0x0.0p-_0", &.{ .invalid, .identifier }); |
| 2028 | | try testTokenize("0x0.0p0_", &.{ .invalid, .eof }); |
| 1734 | try testTokenize("0x0", &.{.number_literal}); |
| 1735 | try testTokenize("0x1", &.{.number_literal}); |
| 1736 | try testTokenize("0x2", &.{.number_literal}); |
| 1737 | try testTokenize("0x3", &.{.number_literal}); |
| 1738 | try testTokenize("0x4", &.{.number_literal}); |
| 1739 | try testTokenize("0x5", &.{.number_literal}); |
| 1740 | try testTokenize("0x6", &.{.number_literal}); |
| 1741 | try testTokenize("0x7", &.{.number_literal}); |
| 1742 | try testTokenize("0x8", &.{.number_literal}); |
| 1743 | try testTokenize("0x9", &.{.number_literal}); |
| 1744 | try testTokenize("0xa", &.{.number_literal}); |
| 1745 | try testTokenize("0xb", &.{.number_literal}); |
| 1746 | try testTokenize("0xc", &.{.number_literal}); |
| 1747 | try testTokenize("0xd", &.{.number_literal}); |
| 1748 | try testTokenize("0xe", &.{.number_literal}); |
| 1749 | try testTokenize("0xf", &.{.number_literal}); |
| 1750 | try testTokenize("0xA", &.{.number_literal}); |
| 1751 | try testTokenize("0xB", &.{.number_literal}); |
| 1752 | try testTokenize("0xC", &.{.number_literal}); |
| 1753 | try testTokenize("0xD", &.{.number_literal}); |
| 1754 | try testTokenize("0xE", &.{.number_literal}); |
| 1755 | try testTokenize("0xF", &.{.number_literal}); |
| 1756 | try testTokenize("0x0z", &.{.number_literal}); |
| 1757 | try testTokenize("0xz", &.{.number_literal}); |
| 1758 | |
| 1759 | try testTokenize("0x0123456789ABCDEF", &.{.number_literal}); |
| 1760 | try testTokenize("0x0123_4567_89AB_CDEF", &.{.number_literal}); |
| 1761 | try testTokenize("0x01_23_45_67_89AB_CDE_F", &.{.number_literal}); |
| 1762 | try testTokenize("0x0_1_2_3_4_5_6_7_8_9_A_B_C_D_E_F", &.{.number_literal}); |
| 1763 | |
| 1764 | try testTokenize("0X0", &.{.number_literal}); |
| 1765 | try testTokenize("0x_", &.{.number_literal}); |
| 1766 | try testTokenize("0x_1", &.{.number_literal}); |
| 1767 | try testTokenize("0x1_", &.{.number_literal}); |
| 1768 | try testTokenize("0x0__1", &.{.number_literal}); |
| 1769 | try testTokenize("0x0_1_", &.{.number_literal}); |
| 1770 | try testTokenize("0x_,", &.{ .number_literal, .comma }); |
| 1771 | |
| 1772 | try testTokenize("0x1.0", &.{.number_literal}); |
| 1773 | try testTokenize("0xF.0", &.{.number_literal}); |
| 1774 | try testTokenize("0xF.F", &.{.number_literal}); |
| 1775 | try testTokenize("0xF.Fp0", &.{.number_literal}); |
| 1776 | try testTokenize("0xF.FP0", &.{.number_literal}); |
| 1777 | try testTokenize("0x1p0", &.{.number_literal}); |
| 1778 | try testTokenize("0xfp0", &.{.number_literal}); |
| 1779 | try testTokenize("0x1.0+0xF.0", &.{ .number_literal, .plus, .number_literal }); |
| 1780 | |
| 1781 | try testTokenize("0x1.", &.{ .number_literal, .period }); |
| 1782 | try testTokenize("0xF.", &.{ .number_literal, .period }); |
| 1783 | try testTokenize("0x1.+0xF.", &.{ .number_literal, .period, .plus, .number_literal, .period }); |
| 1784 | try testTokenize("0xff.p10", &.{.number_literal}); |
| 1785 | |
| 1786 | try testTokenize("0x0123456.789ABCDEF", &.{.number_literal}); |
| 1787 | try testTokenize("0x0_123_456.789_ABC_DEF", &.{.number_literal}); |
| 1788 | try testTokenize("0x0_1_2_3_4_5_6.7_8_9_A_B_C_D_E_F", &.{.number_literal}); |
| 1789 | try testTokenize("0x0p0", &.{.number_literal}); |
| 1790 | try testTokenize("0x0.0p0", &.{.number_literal}); |
| 1791 | try testTokenize("0xff.ffp10", &.{.number_literal}); |
| 1792 | try testTokenize("0xff.ffP10", &.{.number_literal}); |
| 1793 | try testTokenize("0xffp10", &.{.number_literal}); |
| 1794 | try testTokenize("0xff_ff.ff_ffp1_0_0_0", &.{.number_literal}); |
| 1795 | try testTokenize("0xf_f_f_f.f_f_f_fp+1_000", &.{.number_literal}); |
| 1796 | try testTokenize("0xf_f_f_f.f_f_f_fp-1_00_0", &.{.number_literal}); |
| 1797 | |
| 1798 | try testTokenize("0x1e", &.{.number_literal}); |
| 1799 | try testTokenize("0x1e0", &.{.number_literal}); |
| 1800 | try testTokenize("0x1p", &.{.number_literal}); |
| 1801 | try testTokenize("0xfp0z1", &.{.number_literal}); |
| 1802 | try testTokenize("0xff.ffpff", &.{.number_literal}); |
| 1803 | try testTokenize("0x0.p", &.{.number_literal}); |
| 1804 | try testTokenize("0x0.z", &.{.number_literal}); |
| 1805 | try testTokenize("0x0._", &.{.number_literal}); |
| 1806 | try testTokenize("0x0_.0", &.{.number_literal}); |
| 1807 | try testTokenize("0x0_.0.0", &.{ .number_literal, .period, .number_literal }); |
| 1808 | try testTokenize("0x0._0", &.{.number_literal}); |
| 1809 | try testTokenize("0x0.0_", &.{.number_literal}); |
| 1810 | try testTokenize("0x0_p0", &.{.number_literal}); |
| 1811 | try testTokenize("0x0_.p0", &.{.number_literal}); |
| 1812 | try testTokenize("0x0._p0", &.{.number_literal}); |
| 1813 | try testTokenize("0x0.0_p0", &.{.number_literal}); |
| 1814 | try testTokenize("0x0._0p0", &.{.number_literal}); |
| 1815 | try testTokenize("0x0.0p_0", &.{.number_literal}); |
| 1816 | try testTokenize("0x0.0p+_0", &.{.number_literal}); |
| 1817 | try testTokenize("0x0.0p-_0", &.{.number_literal}); |
| 1818 | try testTokenize("0x0.0p0_", &.{.number_literal}); |
| 2029 | 1819 | } |
| 2030 | 1820 | |
| 2031 | 1821 | test "multi line string literal with only 1 backslash" { |
| ... | ... | @@ -2034,7 +1824,7 @@ test "multi line string literal with only 1 backslash" { |
| 2034 | 1824 | |
| 2035 | 1825 | test "invalid builtin identifiers" { |
| 2036 | 1826 | try testTokenize("@()", &.{ .invalid, .l_paren, .r_paren }); |
| 2037 | | try testTokenize("@0()", &.{ .invalid, .integer_literal, .l_paren, .r_paren }); |
| 1827 | try testTokenize("@0()", &.{ .invalid, .number_literal, .l_paren, .r_paren }); |
| 2038 | 1828 | } |
| 2039 | 1829 | |
| 2040 | 1830 | test "invalid token with unfinished escape right before eof" { |