zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit b74dda34b6a8b5f04d1865e2f23aab43229815f9 (tree)
parent 43085417bec447ab31f3454e180213f102885cc8
Author: Andrew Kelley <superjoe30@gmail.com>
Date:   Thu, 24 May 2018 21:51:58 -0400

std.zig.tokenizer: support hex escape in char literals

Diffstat:
Mstd/zig/parser_test.zig | 13+++++++++++++
Mstd/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 @@ -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 @@ -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,