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" {...@@ -4153,13 +4153,13 @@ test "zig fmt: decimal float literals with underscore separators" {
4153 try testTransform(4153 try testTransform(
4154 \\pub fn main() void {4154 \\pub fn main() void {
4155 \\ const a:f64=(10.0e-0+(10.e+0))+10_00.00_00e-2+00_00.00_10e+4;4155 \\ 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;
4157 \\ std.debug.warn("a: {}, b: {} -> a+b: {}\n", .{ a, b, a + b });4157 \\ std.debug.warn("a: {}, b: {} -> a+b: {}\n", .{ a, b, a + b });
4158 \\}4158 \\}
4159 ,4159 ,
4160 \\pub fn main() void {4160 \\pub fn main() void {
4161 \\ const a: f64 = (10.0e-0 + (10.e+0)) + 10_00.00_00e-2 + 00_00.00_10e+4;4161 \\ 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;
4163 \\ std.debug.warn("a: {}, b: {} -> a+b: {}\n", .{ a, b, a + b });4163 \\ std.debug.warn("a: {}, b: {} -> a+b: {}\n", .{ a, b, a + b });
4164 \\}4164 \\}
4165 \\4165 \\
...@@ -4170,13 +4170,13 @@ test "zig fmt: hexadeciaml float literals with underscore separators" {...@@ -4170,13 +4170,13 @@ test "zig fmt: hexadeciaml float literals with underscore separators" {
4170 try testTransform(4170 try testTransform(
4171 \\pub fn main() void {4171 \\pub fn main() void {
4172 \\ const a: f64 = (0x10.0p-0+(0x10.p+0))+0x10_00.00_00p-8+0x00_00.00_10p+16;4172 \\ 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;
4174 \\ std.debug.warn("a: {}, b: {} -> a+b: {}\n", .{ a, b, a + b });4174 \\ std.debug.warn("a: {}, b: {} -> a+b: {}\n", .{ a, b, a + b });
4175 \\}4175 \\}
4176 ,4176 ,
4177 \\pub fn main() void {4177 \\pub fn main() void {
4178 \\ const a: f64 = (0x10.0p-0 + (0x10.p+0)) + 0x10_00.00_00p-8 + 0x00_00.00_10p+16;4178 \\ 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;
4180 \\ std.debug.warn("a: {}, b: {} -> a+b: {}\n", .{ a, b, a + b });4180 \\ std.debug.warn("a: {}, b: {} -> a+b: {}\n", .{ a, b, a + b });
4181 \\}4181 \\}
4182 \\4182 \\
lib/std/zig/tokenizer.zig+12-7
...@@ -1160,7 +1160,7 @@ pub const Tokenizer = struct {...@@ -1160,7 +1160,7 @@ pub const Tokenizer = struct {
1160 },1160 },
1161 '.' => {1161 '.' => {
1162 state = .num_dot_dec;1162 state = .num_dot_dec;
1163 result.tag = .float_literal;1163 result.tag = .invalid;
1164 },1164 },
1165 'e', 'E' => {1165 'e', 'E' => {
1166 state = .float_exponent_unsigned;1166 state = .float_exponent_unsigned;
...@@ -1189,7 +1189,7 @@ pub const Tokenizer = struct {...@@ -1189,7 +1189,7 @@ pub const Tokenizer = struct {
1189 },1189 },
1190 '.' => {1190 '.' => {
1191 state = .num_dot_hex;1191 state = .num_dot_hex;
1192 result.tag = .float_literal;1192 result.tag = .invalid;
1193 },1193 },
1194 'p', 'P' => {1194 'p', 'P' => {
1195 state = .float_exponent_unsigned;1195 state = .float_exponent_unsigned;
...@@ -1211,9 +1211,11 @@ pub const Tokenizer = struct {...@@ -1211,9 +1211,11 @@ pub const Tokenizer = struct {
1211 break;1211 break;
1212 },1212 },
1213 'e', 'E' => {1213 'e', 'E' => {
1214 result.tag = .float_literal;
1214 state = .float_exponent_unsigned;1215 state = .float_exponent_unsigned;
1215 },1216 },
1216 '0'...'9' => {1217 '0'...'9' => {
1218 result.tag = .float_literal;
1217 state = .float_fraction_dec;1219 state = .float_fraction_dec;
1218 },1220 },
1219 else => {1221 else => {
...@@ -1231,6 +1233,7 @@ pub const Tokenizer = struct {...@@ -1231,6 +1233,7 @@ pub const Tokenizer = struct {
1231 break;1233 break;
1232 },1234 },
1233 'p', 'P' => {1235 'p', 'P' => {
1236 result.tag = .float_literal;
1234 state = .float_exponent_unsigned;1237 state = .float_exponent_unsigned;
1235 },1238 },
1236 '0'...'9', 'a'...'f', 'A'...'F' => {1239 '0'...'9', 'a'...'f', 'A'...'F' => {
...@@ -1852,7 +1855,6 @@ test "tokenizer - number literals decimal" {...@@ -1852,7 +1855,6 @@ test "tokenizer - number literals decimal" {
1852 try testTokenize("0_0_f_00", &.{ .invalid, .identifier });1855 try testTokenize("0_0_f_00", &.{ .invalid, .identifier });
1853 try testTokenize("1_,", &.{ .invalid, .comma });1856 try testTokenize("1_,", &.{ .invalid, .comma });
18541857
1855 try testTokenize("1.", &.{.float_literal});
1856 try testTokenize("0.0", &.{.float_literal});1858 try testTokenize("0.0", &.{.float_literal});
1857 try testTokenize("1.0", &.{.float_literal});1859 try testTokenize("1.0", &.{.float_literal});
1858 try testTokenize("10.0", &.{.float_literal});1860 try testTokenize("10.0", &.{.float_literal});
...@@ -1864,8 +1866,8 @@ test "tokenizer - number literals decimal" {...@@ -1864,8 +1866,8 @@ test "tokenizer - number literals decimal" {
1864 try testTokenize("1.0e+100", &.{.float_literal});1866 try testTokenize("1.0e+100", &.{.float_literal});
1865 try testTokenize("1.0e-100", &.{.float_literal});1867 try testTokenize("1.0e-100", &.{.float_literal});
1866 try testTokenize("1_0_0_0.0_0_0_0_0_1e1_0_0_0", &.{.float_literal});1868 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});
1869 try testTokenize("1e", &.{.invalid});1871 try testTokenize("1e", &.{.invalid});
1870 try testTokenize("1.0e1f0", &.{ .invalid, .identifier });1872 try testTokenize("1.0e1f0", &.{ .invalid, .identifier });
1871 try testTokenize("1.0p100", &.{ .invalid, .identifier });1873 try testTokenize("1.0p100", &.{ .invalid, .identifier });
...@@ -1877,6 +1879,7 @@ test "tokenizer - number literals decimal" {...@@ -1877,6 +1879,7 @@ test "tokenizer - number literals decimal" {
1877 try testTokenize("1.a", &.{ .invalid, .identifier });1879 try testTokenize("1.a", &.{ .invalid, .identifier });
1878 try testTokenize("1.z", &.{ .invalid, .identifier });1880 try testTokenize("1.z", &.{ .invalid, .identifier });
1879 try testTokenize("1._0", &.{ .invalid, .identifier });1881 try testTokenize("1._0", &.{ .invalid, .identifier });
1882 try testTokenize("1.+", &.{ .invalid, .plus });
1880 try testTokenize("1._+", &.{ .invalid, .identifier, .plus });1883 try testTokenize("1._+", &.{ .invalid, .identifier, .plus });
1881 try testTokenize("1._e", &.{ .invalid, .identifier });1884 try testTokenize("1._e", &.{ .invalid, .identifier });
1882 try testTokenize("1.0e", &.{.invalid});1885 try testTokenize("1.0e", &.{.invalid});
...@@ -2004,16 +2007,18 @@ test "tokenizer - number literals hexadecimal" {...@@ -2004,16 +2007,18 @@ test "tokenizer - number literals hexadecimal" {
2004 try testTokenize("0x0_1_", &.{.invalid});2007 try testTokenize("0x0_1_", &.{.invalid});
2005 try testTokenize("0x_,", &.{ .invalid, .identifier, .comma });2008 try testTokenize("0x_,", &.{ .invalid, .identifier, .comma });
20062009
2007 try testTokenize("0x1.", &.{.float_literal});
2008 try testTokenize("0x1.0", &.{.float_literal});2010 try testTokenize("0x1.0", &.{.float_literal});
2009 try testTokenize("0xF.", &.{.float_literal});
2010 try testTokenize("0xF.0", &.{.float_literal});2011 try testTokenize("0xF.0", &.{.float_literal});
2011 try testTokenize("0xF.F", &.{.float_literal});2012 try testTokenize("0xF.F", &.{.float_literal});
2012 try testTokenize("0xF.Fp0", &.{.float_literal});2013 try testTokenize("0xF.Fp0", &.{.float_literal});
2013 try testTokenize("0xF.FP0", &.{.float_literal});2014 try testTokenize("0xF.FP0", &.{.float_literal});
2014 try testTokenize("0x1p0", &.{.float_literal});2015 try testTokenize("0x1p0", &.{.float_literal});
2015 try testTokenize("0xfp0", &.{.float_literal});2016 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
2018 try testTokenize("0x0123456.789ABCDEF", &.{.float_literal});2023 try testTokenize("0x0123456.789ABCDEF", &.{.float_literal});
2019 try testTokenize("0x0_123_456.789_ABC_DEF", &.{.float_literal});2024 try testTokenize("0x0_123_456.789_ABC_DEF", &.{.float_literal});