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 {
189189 TokenizeStateLineString,
190190 TokenizeStateLineStringEnd,
191191 TokenizeStateLineStringContinue,
192 TokenizeStateLineStringContinueC,
192193 TokenizeStateSawEq,
193194 TokenizeStateSawBang,
194195 TokenizeStateSawLessThan,
......@@ -932,6 +933,30 @@ void tokenize(Buf *buf, Tokenization *out) {
932933 switch (c) {
933934 case WHITESPACE:
934935 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) {
935960 case '\\':
936961 t.state = TokenizeStateLineStringContinue;
937962 break;
......@@ -970,6 +995,11 @@ void tokenize(Buf *buf, Tokenization *out) {
970995 t.cur_tok->data.str_lit.is_c_str = true;
971996 t.state = TokenizeStateString;
972997 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;
9731003 case SYMBOL_CHAR:
9741004 t.state = TokenizeStateSymbol;
9751005 buf_append_char(&t.cur_tok->data.str_lit.str, c);
......@@ -1386,6 +1416,7 @@ void tokenize(Buf *buf, Tokenization *out) {
13861416 case TokenizeStateSawDotDot:
13871417 case TokenizeStateSawBackslash:
13881418 case TokenizeStateLineStringContinue:
1419 case TokenizeStateLineStringContinueC:
13891420 tokenize_error(&t, "unexpected EOF");
13901421 break;
13911422 case TokenizeStateLineComment:
test/self_hosted.zig+11
......@@ -693,6 +693,17 @@ fn multiline_string() {
693693 assert(str.eql(s1, s2));
694694}
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
698709#attribute("test")