authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-08-04 23:10:12-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-08-04 23:10:24-07:00
log275410dc33d3f040be9213d5f8175e1ced6c6a7d
tree2e8f77be61c1b030370722a1e88795c788af3a2f
parentd0b11af2bd445d10383049d2d7574c19a95c9006

implement multiline C string syntax


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

src/tokenizer.cpp+31
...@@ -189,6 +189,7 @@ enum TokenizeState {...@@ -189,6 +189,7 @@ enum TokenizeState {
189 TokenizeStateLineString,189 TokenizeStateLineString,
190 TokenizeStateLineStringEnd,190 TokenizeStateLineStringEnd,
191 TokenizeStateLineStringContinue,191 TokenizeStateLineStringContinue,
192 TokenizeStateLineStringContinueC,
192 TokenizeStateSawEq,193 TokenizeStateSawEq,
193 TokenizeStateSawBang,194 TokenizeStateSawBang,
194 TokenizeStateSawLessThan,195 TokenizeStateSawLessThan,
...@@ -932,6 +933,30 @@ void tokenize(Buf *buf, Tokenization *out) {...@@ -932,6 +933,30 @@ void tokenize(Buf *buf, Tokenization *out) {
932 switch (c) {933 switch (c) {
933 case WHITESPACE:934 case WHITESPACE:
934 break;935 break;
936 case 'c':
937 if (!t.cur_tok->data.str_lit.is_c_str) {
938 t.pos -= 1;
939 end_token(&t);
940 t.state = TokenizeStateStart;
941 break;
942 }
943 t.state = TokenizeStateLineStringContinueC;
944 break;
945 case '\\':
946 if (t.cur_tok->data.str_lit.is_c_str) {
947 tokenize_error(&t, "invalid character: '%c'", c);
948 }
949 t.state = TokenizeStateLineStringContinue;
950 break;
951 default:
952 t.pos -= 1;
953 end_token(&t);
954 t.state = TokenizeStateStart;
955 continue;
956 }
957 break;
958 case TokenizeStateLineStringContinueC:
959 switch (c) {
935 case '\\':960 case '\\':
936 t.state = TokenizeStateLineStringContinue;961 t.state = TokenizeStateLineStringContinue;
937 break;962 break;
...@@ -970,6 +995,11 @@ void tokenize(Buf *buf, Tokenization *out) {...@@ -970,6 +995,11 @@ void tokenize(Buf *buf, Tokenization *out) {
970 t.cur_tok->data.str_lit.is_c_str = true;995 t.cur_tok->data.str_lit.is_c_str = true;
971 t.state = TokenizeStateString;996 t.state = TokenizeStateString;
972 break;997 break;
998 case '\\':
999 set_token_id(&t, t.cur_tok, TokenIdStringLiteral);
1000 t.cur_tok->data.str_lit.is_c_str = true;
1001 t.state = TokenizeStateSawBackslash;
1002 break;
973 case SYMBOL_CHAR:1003 case SYMBOL_CHAR:
974 t.state = TokenizeStateSymbol;1004 t.state = TokenizeStateSymbol;
975 buf_append_char(&t.cur_tok->data.str_lit.str, c);1005 buf_append_char(&t.cur_tok->data.str_lit.str, c);
...@@ -1386,6 +1416,7 @@ void tokenize(Buf *buf, Tokenization *out) {...@@ -1386,6 +1416,7 @@ void tokenize(Buf *buf, Tokenization *out) {
1386 case TokenizeStateSawDotDot:1416 case TokenizeStateSawDotDot:
1387 case TokenizeStateSawBackslash:1417 case TokenizeStateSawBackslash:
1388 case TokenizeStateLineStringContinue:1418 case TokenizeStateLineStringContinue:
1419 case TokenizeStateLineStringContinueC:
1389 tokenize_error(&t, "unexpected EOF");1420 tokenize_error(&t, "unexpected EOF");
1390 break;1421 break;
1391 case TokenizeStateLineComment:1422 case TokenizeStateLineComment:
test/self_hosted.zig+11
...@@ -693,6 +693,17 @@ fn multiline_string() {...@@ -693,6 +693,17 @@ fn multiline_string() {
693 assert(str.eql(s1, s2));693 assert(str.eql(s1, s2));
694}694}
695695
696#attribute("test")
697fn multiline_c_string() {
698 const s1 =
699 c\\one
700 c\\two)
701 c\\three
702 ;
703 const s2 = c"one\ntwo)\nthree";
704 assert(cstr.cmp(s1, s2) == 0);
705}
706
696707
697708
698#attribute("test")709#attribute("test")