diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2018-05-24 21:51:58 -0400 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2018-05-24 21:51:58 -0400 |
| commit | b74dda34b6a8b5f04d1865e2f23aab43229815f9 (patch) | |
| tree | 038e0da38722232944287cce84ab6100f3d56415 /std | |
| parent | 43085417bec447ab31f3454e180213f102885cc8 (diff) | |
| download | zig-b74dda34b6a8b5f04d1865e2f23aab43229815f9.tar.gz zig-b74dda34b6a8b5f04d1865e2f23aab43229815f9.zip | |
std.zig.tokenizer: support hex escape in char literals
Diffstat (limited to 'std')
| -rw-r--r-- | std/zig/parser_test.zig | 13 | ||||
| -rw-r--r-- | std/zig/tokenizer.zig | 34 |
2 files changed, 47 insertions, 0 deletions
diff --git a/std/zig/parser_test.zig b/std/zig/parser_test.zig index c11db78775..d114179bf7 100644 --- a/std/zig/parser_test.zig +++ b/std/zig/parser_test.zig @@ -1,5 +1,18 @@ test "zig fmt: float literal with exponent" { try testCanonical( + \\test "aoeu" { + \\ switch (state) { + \\ TermState.Start => switch (c) { + \\ '\x1b' => state = TermState.Escape, + \\ else => try out.writeByte(c), + \\ }, + \\ } + \\} + \\ + ); +} +test "zig fmt: float literal with exponent" { + try testCanonical( \\pub const f64_true_min = 4.94065645841246544177e-324; \\const threshold = 0x1.a827999fcef32p+1022; \\ diff --git a/std/zig/tokenizer.zig b/std/zig/tokenizer.zig index afea7fc899..f4cd847dff 100644 --- a/std/zig/tokenizer.zig +++ b/std/zig/tokenizer.zig @@ -220,6 +220,8 @@ pub const Tokenizer = struct { MultilineStringLiteralLineBackslash, CharLiteral, CharLiteralBackslash, + CharLiteralEscape1, + CharLiteralEscape2, CharLiteralEnd, Backslash, Equal, @@ -612,9 +614,32 @@ pub const Tokenizer = struct { result.id = Token.Id.Invalid; break; }, + 'x' => { + state = State.CharLiteralEscape1; + }, + else => { + state = State.CharLiteralEnd; + }, + }, + + State.CharLiteralEscape1 => switch (c) { + '0'...'9', 'a'...'z', 'A'...'F' => { + state = State.CharLiteralEscape2; + }, else => { + result.id = Token.Id.Invalid; + break; + }, + }, + + State.CharLiteralEscape2 => switch (c) { + '0'...'9', 'a'...'z', 'A'...'F' => { state = State.CharLiteralEnd; }, + else => { + result.id = Token.Id.Invalid; + break; + }, }, State.CharLiteralEnd => switch (c) { @@ -988,6 +1013,8 @@ pub const Tokenizer = struct { State.MultilineStringLiteralLineBackslash, State.CharLiteral, State.CharLiteralBackslash, + State.CharLiteralEscape1, + State.CharLiteralEscape2, State.CharLiteralEnd, State.StringLiteralBackslash => { result.id = Token.Id.Invalid; @@ -1127,6 +1154,13 @@ test "tokenizer" { }); } +test "tokenizer - char literal with hex escape" { + testTokenize( \\'\x1b' + , []Token.Id { + Token.Id.CharLiteral, + }); +} + test "tokenizer - float literal e exponent" { testTokenize("a = 4.94065645841246544177e-324;\n", []Token.Id { Token.Id.Identifier, |
