From d1b65c6f46ab0891db3c80db2eedbb434168aabe Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sun, 24 Apr 2016 16:33:32 -0700 Subject: [PATCH] fix ability to parse character literals --- src/tokenizer.cpp | 21 +++++++++++++++++++++ test/self_hosted.zig | 6 ++++++ 2 files changed, 27 insertions(+) diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp index 62a43fc40c0fc0840f55aa5409414a383d56af7c..79b87c4536559ccb92a69b1aa91e94c209a774a8 100644 --- a/src/tokenizer.cpp +++ b/src/tokenizer.cpp @@ -136,6 +136,8 @@ enum TokenizeState { TokenizeStateRawStringContents, TokenizeStateRawStringMaybeEnd, TokenizeStateCharLiteral, + TokenizeStateCharLiteralEscape, + TokenizeStateCharLiteralEnd, TokenizeStateSawStar, TokenizeStateSawSlash, TokenizeStateSawPercent, @@ -955,8 +957,25 @@ void tokenize(Buf *buf, Tokenization *out) { end_token(&t); t.state = TokenizeStateStart; break; + case '\\': + t.state = TokenizeStateCharLiteralEscape; + break; default: + t.state = TokenizeStateCharLiteralEnd; + break; + } + break; + case TokenizeStateCharLiteralEscape: + t.state = TokenizeStateCharLiteralEnd; + break; + case TokenizeStateCharLiteralEnd: + switch (c) { + case '\'': + end_token(&t); + t.state = TokenizeStateStart; break; + default: + tokenize_error(&t, "invalid character: '%c'", c); } break; case TokenizeStateZero: @@ -1118,6 +1137,8 @@ void tokenize(Buf *buf, Tokenization *out) { tokenize_error(&t, "unterminated raw string"); break; case TokenizeStateCharLiteral: + case TokenizeStateCharLiteralEscape: + case TokenizeStateCharLiteralEnd: tokenize_error(&t, "unterminated character literal"); break; case TokenizeStateSymbol: diff --git a/test/self_hosted.zig b/test/self_hosted.zig index b136279bd3a678169848228530e8e6337f9475f9..610e9c755c705e330396184bd6f2bd6810bde2a0 100644 --- a/test/self_hosted.zig +++ b/test/self_hosted.zig @@ -1333,3 +1333,9 @@ fn pointer_comparison() { fn ptr_eql(a: &[]u8, b: &[]u8) -> bool { a == b } + +#attribute("test") +fn character_literals() { + assert('\'' == single_quote); +} +const single_quote = '\''; -- 2.54.0