Mercurial > hg > CbC > old > device
changeset 601:6b808480f08b struct-array-parse-tree
strcut, array parse tree in inmode.
author | kono |
---|---|
date | Fri, 27 Jan 2006 11:07:44 +0900 |
parents | c6afbdf982f7 |
children | 429ec87e03e7 |
files | .gdbinit Changes mc-codegen.c mc-inline.c mc-parse.c |
diffstat | 5 files changed, 81 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/.gdbinit Thu Jan 26 21:12:47 2006 +0900 +++ b/.gdbinit Fri Jan 27 11:07:44 2006 +0900 @@ -39,7 +39,7 @@ # run -s l.c # run -s test/const.c # run -s test/basic.c -run -s test/code-gen-all.c +# run -s test/code-gen-all.c # run -s test/tmp7.c # run -s test/inline.c # run -s test/code-gen-inline.c @@ -53,6 +53,6 @@ # run -s test/stralign.c # run -s test/putenemy.c # run -s test/func_conv_err.c -# run -DINLINE=inline test/tmp7.c +run -DINLINE=inline test/tmp7.c # run -DINLINE=inline test/code-gen-all.c # run -s throw.c
--- a/Changes Thu Jan 26 21:12:47 2006 +0900 +++ b/Changes Fri Jan 27 11:07:44 2006 +0900 @@ -8609,6 +8609,19 @@ cbc2c で、env 切替えはどうやってコンパイルするの? - - - +Thu Jan 26 23:42:18 JST 2006 + +やっぱり、strop/array をいじると動かなくなるね。 + +本来、parse tree にtypeは入るべきではないんだよね。 +syntax tree だったら tree にそってparseすればtypeは決まる。 +parse tree だったら、node でtypeは決まっているはず。 + +binop にtypeが二つついているあたりが中途半端な矛盾に +なっているんだよな。 + +そうか、rvalue では、ARRAY/PERIOD/ARROWに RINDIRECT を付けないとダメ。 +ということは、RARRAY/RPERIOD/RARROW/RIVAR があった方が、 +構文木が保存されるから、そっちがいいわけね。 + +確かに、RINDIRECTで、IVAR の先読みをするのはおかしいものな。
--- a/mc-codegen.c Thu Jan 26 21:12:47 2006 +0900 +++ b/mc-codegen.c Fri Jan 27 11:07:44 2006 +0900 @@ -264,6 +264,23 @@ } jump(e2,caddr(e1)); return VOID; + case ARRAY: + e1=binop(ADD,e2,caddr(e1),cadddr(e1),caddddr(e1)); + e1 = indop(e1); t = type; + g_expr0(e1); + return t; + case PERIOD: + nptr = (NMTBL*)caddr(e1); + type = cadddr(e1); + e1 = strop(e2,0); t = type; + g_expr0(e1); + return t; + case ARROW: + nptr = (NMTBL*)caddr(e1); + type = cadddr(e1); + e1 = strop(e2,1); t = type; + g_expr0(e1); + return t; case INLINE: return gen_inline(e1); case INDIRECT: @@ -3637,8 +3654,8 @@ return(list3(RLVAR+op,cadr(e),caddr(e))); case INDIRECT: return(indirect(RINDIRECT+op,cadr(e),type0)); - case IVAR: - return(indirect(RINDIRECT+op,e,type0)); + case IVAR: case ARRAY: case PERIOD: case ARROW: + return(indirect(RINDIRECT+op,e,type0)); // RIVAR? default:return(e); /* idempotent case? */ } } @@ -3732,7 +3749,11 @@ { int dsp = 0; int type0; - + int e1; + + if (inmode) { + e1 = list4(ind?ARROW:PERIOD,e,(int)nptr,type); + } if (ind) e = indop(rvalue(e)); type0 = type_value(type); if (integral(type0)||(car(type0)!=STRUCT && car(type0)!=UNION)) { @@ -3745,7 +3766,9 @@ /* print_fields(caddr(type),"strop"); */ type = search_struct_type(type,nptr->nm,&dsp); if (!type) { error(TYERR); type=INT; return e; } - if(dsp) { + if (inmode) { + e = e1; + } else if(dsp) { switch(car(e)) { case GVAR: // e=list2(INDIRECT,list3(ADD,e,list2(CONST,dsp))); @@ -3757,12 +3780,15 @@ case INDIRECT: e=list2(INDIRECT,list3(ADD,cadr(e),list2(CONST,dsp))); break; + case IVAR: + e=list3(ADD,e,list2(CONST,dsp)); + break; default: e=list2(INDIRECT,list3(ADD,e,list2(CONST,dsp))); } } else { switch(car(e)) { - case GVAR: case LVAR: case INDIRECT: + case GVAR: case LVAR: case INDIRECT: case IVAR: break; default: e=list2(INDIRECT,e); @@ -4150,16 +4176,17 @@ return(e1); if (car(e)==CONST) { if(car(e1)==ADDRESS) { - if (car(cadr(e1))==IVAR) { - } else if (car(cadr(e1))!=GVAR) { - // must be lvar - if (car(cadr(e1))!=LVAR) error(-1); + if (car(cadr(e1))==GVAR) { + return(list2(ADDRESS, + list3(GVAR,cadr(cadr(e1))+cadr(e),caddr(cadr(e1))))); + } else if (car(cadr(e1))==LVAR) { return(list2(ADDRESS, list3(car(cadr(e1)),cadr(cadr(e1))+cadr(e), caddr(cadr(e1))))); + } else if (car(cadr(e1))==INDIRECT) { + return(list3(ADD,e1,e)); } else { - return(list2(ADDRESS, - list3(GVAR,cadr(cadr(e1))+cadr(e),caddr(cadr(e1))))); + error(-1); // ? } } else if(car(e1)==GVAR) { return(list3(GVAR,cadr(e1)+cadr(e),caddr(e1)));
--- a/mc-inline.c Thu Jan 26 21:12:47 2006 +0900 +++ b/mc-inline.c Fri Jan 27 11:07:44 2006 +0900 @@ -499,6 +499,7 @@ static int paddress(int e) { + // if (car(cadr(e))==INDIRECT) return pexpr(cadr(cadr(e))); return list2(car(e),pexpr(cadr(e))); } @@ -924,8 +925,22 @@ case FUNCTION: return pfunction(e1); case CODE: - e2=pexpr(e2); + e2 = pexpr(e2); return list3(car(e1),e2,pexpr(cadddr(e1))); + case ARRAY: + e2 = pexpr(e2); + e1 = binop(ADD,e2,pexpr(caddr(e1)),cadddr(e1),caddddr(e1)); + return indop(e1); + case PERIOD: + e2 = pexpr(e2); + nptr = (NMTBL*)caddr(e1); + type = cadddr(e1); + return strop(e2,0); + case ARROW: + e2 = pexpr(e2); + nptr = (NMTBL*)caddr(e1); + type = cadddr(e1); + return strop(e2,1); case INLINE: return p_inline(e1); case INDIRECT:
--- a/mc-parse.c Thu Jan 26 21:12:47 2006 +0900 +++ b/mc-parse.c Fri Jan 27 11:07:44 2006 +0900 @@ -3802,8 +3802,15 @@ e2=rvalue(expr0()); checksym(RBRA); conv->rbra_(sym); - e1=binop(ADD,e1,e2,t,type); - e1=indop(e1); + if (inmode) { + e1 = list5(ARRAY,e1,e2,t,type); + if (car(t)!=POINTER) + error(-1); + type = cadr(t); + } else { + e1=binop(ADD,e1,e2,t,type); + e1=indop(e1); + } } else if(sym==LPAR) { e1=expr15(e1); /* f() */ } else if(sym==PERIOD||sym==ARROW) {