aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2018-05-24 21:51:58 -0400
committerAndrew Kelley <superjoe30@gmail.com>2018-05-24 21:51:58 -0400
commitb74dda34b6a8b5f04d1865e2f23aab43229815f9 (patch)
tree038e0da38722232944287cce84ab6100f3d56415
parent43085417bec447ab31f3454e180213f102885cc8 (diff)
downloadzig-b74dda34b6a8b5f04d1865e2f23aab43229815f9.tar.gz
zig-b74dda34b6a8b5f04d1865e2f23aab43229815f9.zip
std.zig.tokenizer: support hex escape in char literals
-rw-r--r--std/zig/parser_test.zig13
-rw-r--r--std/zig/tokenizer.zig34
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,