diff options
| -rw-r--r-- | c.c | 25 | ||||
| -rw-r--r-- | test/pp.c | 5 |
2 files changed, 26 insertions, 4 deletions
@@ -18,7 +18,27 @@ struct comp { /** Parsing helper functions **/ #define peek(Cm,Tk) lexpeek(&(Cm)->lx,Tk) -#define lex(Cm,Tk) lex(&(Cm)->lx,Tk) +static int +lexc(struct comp *cm, struct token *tk) +{ + int t = lex(&cm->lx, tk); + if (t == TKSTRLIT && peek(cm, NULL) == TKSTRLIT) { + /* 5.1.1.2 Translation phase 6: concatenate adjacent string literal tokens */ + static char buf[200]; + struct token tk2; + vec_of(char) rest = VINIT(buf, sizeof buf); + do { + lex(&cm->lx, &tk2); + vpushn(&rest, tk2.s, tk2.len); + } while (peek(cm, NULL) == TKSTRLIT); + tk->s = memcpy(alloc(&cm->exarena, tk->len + rest.n, 0), tk->s, tk->len); + memcpy((char *)tk->s + tk->len, rest.p, rest.n); + tk->len += rest.n; + vfree(&rest); + } + return t; +} +#define lex(Cm,Tk) lexc(Cm,Tk) static bool match(struct comp *cm, struct token *tk, enum toktag t) { @@ -744,8 +764,7 @@ Unary: ex.ty.t = ty.t ? ty.t : TYINT; break; case TKSTRLIT: - ex = mkexpr(ESTRLIT, tk.span, - mkarrtype(mktype(TYCHAR), 0, tk.len+1), .s = { (uchar *)tk.s, tk.len }); + ex = mkexpr(ESTRLIT, tk.span, mkarrtype(mktype(TYCHAR), 0, tk.len+1), .s = { (uchar *)tk.s, tk.len }); break; case TKIDENT: Ident: @@ -7,6 +7,7 @@ #define CATl(a) a##bar #define CATr(a) foo##a #define CAT(a,b) a##b +#define foobar() foo##bar #define hash_hash # ## # #define mkstr(a) # a @@ -21,11 +22,13 @@ main(void) ++foobar; --CATr(bar); CAT(foo,bar) += 3; + foobar() /=2; printf("%s %s\n",STR ( ok /1 "\n"n ;.& 05.5), STR(ADD(1,2))); hi(ADD(Foo, SQR(Bar+1))); int foo123 = 77; - printf("%s %s %g\n", str(Foo,5), xstr(Foo), CAT(1.5,e3f) + CAT(7,)-CAT(,1)); + printf("%s " + "%s %g\n", str(Foo,5), xstr(Foo), CAT(1.5,e3f) + CAT(7,)-CAT(,1)); printf("join: \"%s\"\n", p); CAT(ret,urn) 0; } |