commit d1b65c6f46ab0891db3c80db2eedbb434168aabe (tree)
parent 3886fdc19b624e6fa47dcd02b627548bc7a7ada0
Author: Andrew Kelley <superjoe30@gmail.com>
Date: Sun, 24 Apr 2016 16:33:32 -0700
fix ability to parse character literals
Diffstat:
2 files changed, 27 insertions(+), 0 deletions(-)
diff --git a/src/tokenizer.cpp b/src/tokenizer.cpp
@@ -136,6 +136,8 @@ enum TokenizeState {
TokenizeStateRawStringContents,
TokenizeStateRawStringMaybeEnd,
TokenizeStateCharLiteral,
+ TokenizeStateCharLiteralEscape,
+ TokenizeStateCharLiteralEnd,
TokenizeStateSawStar,
TokenizeStateSawSlash,
TokenizeStateSawPercent,
@@ -955,10 +957,27 @@ 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:
switch (c) {
case 'b':
@@ -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
@@ -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 = '\'';