authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-04-24 16:33:32-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-04-24 16:36:05-07:00
logd1b65c6f46ab0891db3c80db2eedbb434168aabe
tree7dd56a4baa0bd1436e20fb1ead20959e3b4fa963
parent3886fdc19b624e6fa47dcd02b627548bc7a7ada0

fix ability to parse character literals


2 files changed, 27 insertions(+), 0 deletions(-)

src/tokenizer.cpp+21
...@@ -136,6 +136,8 @@ enum TokenizeState {...@@ -136,6 +136,8 @@ enum TokenizeState {
136 TokenizeStateRawStringContents,136 TokenizeStateRawStringContents,
137 TokenizeStateRawStringMaybeEnd,137 TokenizeStateRawStringMaybeEnd,
138 TokenizeStateCharLiteral,138 TokenizeStateCharLiteral,
139 TokenizeStateCharLiteralEscape,
140 TokenizeStateCharLiteralEnd,
139 TokenizeStateSawStar,141 TokenizeStateSawStar,
140 TokenizeStateSawSlash,142 TokenizeStateSawSlash,
141 TokenizeStateSawPercent,143 TokenizeStateSawPercent,
...@@ -955,10 +957,27 @@ void tokenize(Buf *buf, Tokenization *out) {...@@ -955,10 +957,27 @@ void tokenize(Buf *buf, Tokenization *out) {
955 end_token(&t);957 end_token(&t);
956 t.state = TokenizeStateStart;958 t.state = TokenizeStateStart;
957 break;959 break;
960 case '\\':
961 t.state = TokenizeStateCharLiteralEscape;
962 break;
958 default:963 default:
964 t.state = TokenizeStateCharLiteralEnd;
959 break;965 break;
960 }966 }
961 break;967 break;
968 case TokenizeStateCharLiteralEscape:
969 t.state = TokenizeStateCharLiteralEnd;
970 break;
971 case TokenizeStateCharLiteralEnd:
972 switch (c) {
973 case '\'':
974 end_token(&t);
975 t.state = TokenizeStateStart;
976 break;
977 default:
978 tokenize_error(&t, "invalid character: '%c'", c);
979 }
980 break;
962 case TokenizeStateZero:981 case TokenizeStateZero:
963 switch (c) {982 switch (c) {
964 case 'b':983 case 'b':
...@@ -1118,6 +1137,8 @@ void tokenize(Buf *buf, Tokenization *out) {...@@ -1118,6 +1137,8 @@ void tokenize(Buf *buf, Tokenization *out) {
1118 tokenize_error(&t, "unterminated raw string");1137 tokenize_error(&t, "unterminated raw string");
1119 break;1138 break;
1120 case TokenizeStateCharLiteral:1139 case TokenizeStateCharLiteral:
1140 case TokenizeStateCharLiteralEscape:
1141 case TokenizeStateCharLiteralEnd:
1121 tokenize_error(&t, "unterminated character literal");1142 tokenize_error(&t, "unterminated character literal");
1122 break;1143 break;
1123 case TokenizeStateSymbol:1144 case TokenizeStateSymbol:
test/self_hosted.zig+6
...@@ -1333,3 +1333,9 @@ fn pointer_comparison() {...@@ -1333,3 +1333,9 @@ fn pointer_comparison() {
1333fn ptr_eql(a: &[]u8, b: &[]u8) -> bool {1333fn ptr_eql(a: &[]u8, b: &[]u8) -> bool {
1334 a == b1334 a == b
1335}1335}
1336
1337#attribute("test")
1338fn character_literals() {
1339 assert('\'' == single_quote);
1340}
1341const single_quote = '\'';