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 {
136136 TokenizeStateRawStringContents,
137137 TokenizeStateRawStringMaybeEnd,
138138 TokenizeStateCharLiteral,
139 TokenizeStateCharLiteralEscape,
140 TokenizeStateCharLiteralEnd,
139141 TokenizeStateSawStar,
140142 TokenizeStateSawSlash,
141143 TokenizeStateSawPercent,
......@@ -955,10 +957,27 @@ void tokenize(Buf *buf, Tokenization *out) {
955957 end_token(&t);
956958 t.state = TokenizeStateStart;
957959 break;
960 case '\\':
961 t.state = TokenizeStateCharLiteralEscape;
962 break;
958963 default:
964 t.state = TokenizeStateCharLiteralEnd;
959965 break;
960966 }
961967 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;
962981 case TokenizeStateZero:
963982 switch (c) {
964983 case 'b':
......@@ -1118,6 +1137,8 @@ void tokenize(Buf *buf, Tokenization *out) {
11181137 tokenize_error(&t, "unterminated raw string");
11191138 break;
11201139 case TokenizeStateCharLiteral:
1140 case TokenizeStateCharLiteralEscape:
1141 case TokenizeStateCharLiteralEnd:
11211142 tokenize_error(&t, "unterminated character literal");
11221143 break;
11231144 case TokenizeStateSymbol:
test/self_hosted.zig+6
......@@ -1333,3 +1333,9 @@ fn pointer_comparison() {
13331333fn ptr_eql(a: &[]u8, b: &[]u8) -> bool {
13341334 a == b
13351335}
1336
1337#attribute("test")
1338fn character_literals() {
1339 assert('\'' == single_quote);
1340}
1341const single_quote = '\'';