authorgravatar for mail@isaacfreund.comIsaac Freund <mail@isaacfreund.com> 2021-05-27 20:03:27+00:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2021-05-27 21:00:44-04:00
logec10595b65490126e1b7d231f655be6d7d198acf
tree70ec8e640c121aa5db5f99915d49de43c6bf907b
parent4bf8ec99521f2b8b056475ec703a06a8b149cca5

stage2: disallow trailing dot on float literals

This disallows e.g. `1.` or `0x1.` as a float literal, which is consistent with the grammar.

2 files changed, 16 insertions(+), 11 deletions(-)

lib/std/zig/parser_test.zig+4-4
......@@ -4153,13 +4153,13 @@ test "zig fmt: decimal float literals with underscore separators" {
41534153 try testTransform(
41544154 \\pub fn main() void {
41554155 \\ const a:f64=(10.0e-0+(10.e+0))+10_00.00_00e-2+00_00.00_10e+4;
4156 \\ const b:f64=010.0--0_10.+0_1_0.0_0+1e2;
4156 \\ const b:f64=010.0--0_10.0+0_1_0.0_0+1e2;
41574157 \\ std.debug.warn("a: {}, b: {} -> a+b: {}\n", .{ a, b, a + b });
41584158 \\}
41594159 ,
41604160 \\pub fn main() void {
41614161 \\ const a: f64 = (10.0e-0 + (10.e+0)) + 10_00.00_00e-2 + 00_00.00_10e+4;
4162 \\ const b: f64 = 010.0 - -0_10. + 0_1_0.0_0 + 1e2;
4162 \\ const b: f64 = 010.0 - -0_10.0 + 0_1_0.0_0 + 1e2;
41634163 \\ std.debug.warn("a: {}, b: {} -> a+b: {}\n", .{ a, b, a + b });
41644164 \\}
41654165 \\
......@@ -4170,13 +4170,13 @@ test "zig fmt: hexadeciaml float literals with underscore separators" {
41704170 try testTransform(
41714171 \\pub fn main() void {
41724172 \\ const a: f64 = (0x10.0p-0+(0x10.p+0))+0x10_00.00_00p-8+0x00_00.00_10p+16;
4173 \\ const b: f64 = 0x0010.0--0x00_10.+0x10.00+0x1p4;
4173 \\ const b: f64 = 0x0010.0--0x00_10.0+0x10.00+0x1p4;
41744174 \\ std.debug.warn("a: {}, b: {} -> a+b: {}\n", .{ a, b, a + b });
41754175 \\}
41764176 ,
41774177 \\pub fn main() void {
41784178 \\ const a: f64 = (0x10.0p-0 + (0x10.p+0)) + 0x10_00.00_00p-8 + 0x00_00.00_10p+16;
4179 \\ const b: f64 = 0x0010.0 - -0x00_10. + 0x10.00 + 0x1p4;
4179 \\ const b: f64 = 0x0010.0 - -0x00_10.0 + 0x10.00 + 0x1p4;
41804180 \\ std.debug.warn("a: {}, b: {} -> a+b: {}\n", .{ a, b, a + b });
41814181 \\}
41824182 \\
lib/std/zig/tokenizer.zig+12-7
......@@ -1160,7 +1160,7 @@ pub const Tokenizer = struct {
11601160 },
11611161 '.' => {
11621162 state = .num_dot_dec;
1163 result.tag = .float_literal;
1163 result.tag = .invalid;
11641164 },
11651165 'e', 'E' => {
11661166 state = .float_exponent_unsigned;
......@@ -1189,7 +1189,7 @@ pub const Tokenizer = struct {
11891189 },
11901190 '.' => {
11911191 state = .num_dot_hex;
1192 result.tag = .float_literal;
1192 result.tag = .invalid;
11931193 },
11941194 'p', 'P' => {
11951195 state = .float_exponent_unsigned;
......@@ -1211,9 +1211,11 @@ pub const Tokenizer = struct {
12111211 break;
12121212 },
12131213 'e', 'E' => {
1214 result.tag = .float_literal;
12141215 state = .float_exponent_unsigned;
12151216 },
12161217 '0'...'9' => {
1218 result.tag = .float_literal;
12171219 state = .float_fraction_dec;
12181220 },
12191221 else => {
......@@ -1231,6 +1233,7 @@ pub const Tokenizer = struct {
12311233 break;
12321234 },
12331235 'p', 'P' => {
1236 result.tag = .float_literal;
12341237 state = .float_exponent_unsigned;
12351238 },
12361239 '0'...'9', 'a'...'f', 'A'...'F' => {
......@@ -1852,7 +1855,6 @@ test "tokenizer - number literals decimal" {
18521855 try testTokenize("0_0_f_00", &.{ .invalid, .identifier });
18531856 try testTokenize("1_,", &.{ .invalid, .comma });
18541857
1855 try testTokenize("1.", &.{.float_literal});
18561858 try testTokenize("0.0", &.{.float_literal});
18571859 try testTokenize("1.0", &.{.float_literal});
18581860 try testTokenize("10.0", &.{.float_literal});
......@@ -1864,8 +1866,8 @@ test "tokenizer - number literals decimal" {
18641866 try testTokenize("1.0e+100", &.{.float_literal});
18651867 try testTokenize("1.0e-100", &.{.float_literal});
18661868 try testTokenize("1_0_0_0.0_0_0_0_0_1e1_0_0_0", &.{.float_literal});
1867 try testTokenize("1.+", &.{ .float_literal, .plus });
18681869
1870 try testTokenize("1.", &.{.invalid});
18691871 try testTokenize("1e", &.{.invalid});
18701872 try testTokenize("1.0e1f0", &.{ .invalid, .identifier });
18711873 try testTokenize("1.0p100", &.{ .invalid, .identifier });
......@@ -1877,6 +1879,7 @@ test "tokenizer - number literals decimal" {
18771879 try testTokenize("1.a", &.{ .invalid, .identifier });
18781880 try testTokenize("1.z", &.{ .invalid, .identifier });
18791881 try testTokenize("1._0", &.{ .invalid, .identifier });
1882 try testTokenize("1.+", &.{ .invalid, .plus });
18801883 try testTokenize("1._+", &.{ .invalid, .identifier, .plus });
18811884 try testTokenize("1._e", &.{ .invalid, .identifier });
18821885 try testTokenize("1.0e", &.{.invalid});
......@@ -2004,16 +2007,18 @@ test "tokenizer - number literals hexadecimal" {
20042007 try testTokenize("0x0_1_", &.{.invalid});
20052008 try testTokenize("0x_,", &.{ .invalid, .identifier, .comma });
20062009
2007 try testTokenize("0x1.", &.{.float_literal});
20082010 try testTokenize("0x1.0", &.{.float_literal});
2009 try testTokenize("0xF.", &.{.float_literal});
20102011 try testTokenize("0xF.0", &.{.float_literal});
20112012 try testTokenize("0xF.F", &.{.float_literal});
20122013 try testTokenize("0xF.Fp0", &.{.float_literal});
20132014 try testTokenize("0xF.FP0", &.{.float_literal});
20142015 try testTokenize("0x1p0", &.{.float_literal});
20152016 try testTokenize("0xfp0", &.{.float_literal});
2016 try testTokenize("0x1.+0xF.", &.{ .float_literal, .plus, .float_literal });
2017 try testTokenize("0x1.0+0xF.0", &.{ .float_literal, .plus, .float_literal });
2018
2019 try testTokenize("0x1.", &.{.invalid});
2020 try testTokenize("0xF.", &.{.invalid});
2021 try testTokenize("0x1.+0xF.", &.{ .invalid, .plus, .invalid });
20172022
20182023 try testTokenize("0x0123456.789ABCDEF", &.{.float_literal});
20192024 try testTokenize("0x0_123_456.789_ABC_DEF", &.{.float_literal});