Mercurial > hg > CbC > old > device
changeset 66:0b068058dd67
*** empty log message ***
author | kono |
---|---|
date | Sat, 22 Feb 2003 01:32:47 +0900 |
parents | 8ad746efa4f8 |
children | 254a0c576114 |
files | Changes Makefile conv/c.c conv/c2cbc.c conv/cbc2c.c conv/null.c mc-code-ia32.c mc-code.h mc-codegen.c mc-codegen.h mc-parse.c mc.h |
diffstat | 12 files changed, 575 insertions(+), 84 deletions(-) [+] |
line wrap: on
line diff
--- a/Changes Thu Feb 20 08:56:29 2003 +0900 +++ b/Changes Sat Feb 22 01:32:47 2003 +0900 @@ -1637,3 +1637,66 @@ ずれるみたい。6809では問題にならなかったんだけどね。 leave で調整するべき。 + +Thu Feb 20 14:42:46 JST 2003 + +c2cbc,cbc2c なんだけど、いったん、構文木にしてから変換すると、 +結構失われる情報があるけど、いいの? 特に局所変数の名前とか型 +の情報とか。macro もそうだけど。 indent ぐらい保存できないか +なぁ。式の途中でfunction callする場合も取り扱う必要があるの +で、構文木にしてから計算するしかないかな。gexpr の代わりに生 +成するようにするか。そうすると、修正するのは、statement と、 +gexpr になる。でも、結局、構文木で型を持ち歩くしかないんじゃ +ないの? やっぱり変だよ。型の情報がないのは。 + +そうではなくて、exprN() で変換していく方法もある。この方が +情報が欠落しないので楽だろう。そうすると、修正するのは、 + exprN(),doXXXX() +となる。これは、量は多い。けど、まぁ、それだけ。この方が +オリジナルを保存しやすい。 + +中間変数を途中で追加すると、宣言部を前もって出力できなく +なる。{int a;...} を認めれば良いわけだど。実装は難しくない。 +じゃ、やれば? でも、汚くなるなあ。出力をいったんバッファ +に貯めれば? どこに? cheapp ですか? 中間変数はいらないん +じゃないの? + a = g(i)+a; +でしょ。 + goto g_1(i,f_1,save_a); } + code g_1(i,f_1,save_a) { .... goto f_1(ret_value,save_a); } + code f_1(ret_value,save_a) { a = ret_value+a; ...} +じゃん。いらないじゃん。。 + + +型を表示するルーチンが必要だね。 + +めんどくさいなぁ。CbCのProlog version とかほしいなぁ。そうすれば、 +変換は簡単。でも、やろうとしてできなかったことでもあるな。 + + +Thu Feb 20 21:13:23 JST 2003 + +MC6809 の mc-codegen.c version は? (ちょっと虚しすぎる?) +X と D で、use_data_register, use_pointer してやる。 +tosop で、X と D の間の足し算を特別扱いする。 +(なるほど...) MAX_MAX=0でうまく動くのか? やっぱり、1は +いるよね。できれば、2だよね。 + +結構、浮動小数点も簡単かも。 + +汎用の書き換えツールも便利そう。 + +でも、Prolog version ってのも面白そう。 + code(name,interface(....)) :- + p()....,goto(name,interface(....)). +みたいな感じ? 結構、簡単にinterpreterを書けるかも知れない。 +これは、あれだね。thread diagram interpreter と似ている。 + +Fri Feb 21 13:34:17 JST 2003 + +構文要素での書き換えだけど、どれくらいの能力があるの? +その場での書き換えだけだと、ちょっと低すぎない? それで、 +cbc2c,c2cbc はできるとは思う。 + +まぁいいけど.. chk を無視しているところが結構あるんですけど。 +jmp,enter,leave ...
--- a/Makefile Thu Feb 20 08:56:29 2003 +0900 +++ b/Makefile Sat Feb 22 01:32:47 2003 +0900 @@ -5,7 +5,8 @@ MFLAGS=$(MFALGS) BASE=$(BASE) STAGE=$(STAGE) MC=mc PRINTF= # printf.c -CONVERTER=conv/c.o conv/c2cbc.o conv/cbc2c.o conv/null.o +CONVERTER=conv/c.o +# conv/c2cbc.o conv/cbc2c.o conv/null.o all: mc
--- a/conv/c.c Thu Feb 20 08:56:29 2003 +0900 +++ b/conv/c.c Sat Feb 22 01:32:47 2003 +0900 @@ -2,23 +2,20 @@ #include "mc.h" -static void open(char *); -static void print(char *); -static void close(); - -Converter c_converter = { - &open, - &print, - &close, -}; +#include "conv/convdef.h" static FILE *vout; static void -open(char *s) +comment_(char *s) +{ +} + +static void +open_(char *s) { char *p=cheapp; - while((*cheapp++ = *s++)) { + while ((*cheapp++ = *s++)) { if (*s=='.') { *cheapp++=*s++; *cheapp++='c'; *cheapp++='c'; *cheapp++=0; @@ -26,17 +23,314 @@ } } vout = fopen(p,"w"); - if(!vout) error(-1); + if (!vout) error(-1); } static void -print(char *s) +print_(char *s) { fprintf(vout,"c: %s\n",s); } static void -close() +close_() { fclose(vout); } + +void +case_(int cases,int def){ + +} + +void +code_(NMTBL *fnptr,int arglist){ + +} + +void +code_end_(){ + +} + +void +comma_(){ + +} + +void +cond_(){ + +} + +void +cond1_(){ + +} + +void +cond2_(){ + +} + +void +cond_end_(){ + +} + +void +decl_data_begin_(){ + +} + +void +decl_data_end_(){ + +} + +void +def_(NMTBL *n){ + +} + +void +dowhile_(){ + +} + +void +dowhile_cond_(){ + +} + +void +dowhile_end_(){ + +} + +int +error_(n){ + return 0; +} + +void +expr16_end_(){ + +} + +void +extern_(){ + +} + +void +for_(){ + +} + +void +for1_(){ + +} + +void +for2_(){ + +} + +void +for3_(){ + +} + +void +for_body_(){ + +} + +void +for_end_(){ + +} + +void +funcall_(int type){ + +} + +void +funcall_args_(){ + +} + +void +function_(){ + +} + +void +function_end_(){ + +} + +void +goto_(){ + +} + +void +goto_label_(){ + +} + +void +id_(int sy,NMTBL *nptr){ + +} + +void +if_(){ + +} + +void +if_else_(){ + +} + +void +if_endif_(){ + +} + +void +if_then_(){ + +} + +void +jump_(int env){ + +} + +void +label_(){ + +} + +void +lbra_(int sym){ + +} + +void +lc_(){ + +} + +void +localvar_end_(){ + +} + +void +lpar_(){ + +} + +void +op_(int sym){ + +} + +void +postfix_(int sym){ + +} + +void +prefix_(int sym){ + +} + +void +rbra_(int sym){ + +} + +void +rc_(){ + +} + +void +register_(){ + +} + +void +return_(){ + +} + +void +return_end_(){ + +} + +void +return_type_(int t){ + +} + +void +rpar_(){ + +} + +void +sm_(){ + +} + +void +static_(){ + +} + +void +switch_(){ + +} + +void +switch_body_(){ + +} + +void +switch_end_(){ + +} + +void +typedef_(){ + +} + +void +while_(){ + +} + +void +while_body_(){ + +} + +void +while_end_(){ + +} + +/* end */
--- a/conv/c2cbc.c Thu Feb 20 08:56:29 2003 +0900 +++ b/conv/c2cbc.c Sat Feb 22 01:32:47 2003 +0900 @@ -5,13 +5,22 @@ static void open(char *); static void print(char *); static void close(); +static void comment(char *s); Converter c2cbc_converter = { &open, &print, &close, + &comment, }; +static FILE *vout; + +static void +comment(char *s) +{ +} + static void cbcstruct_init(void); static void init(void); static void unlist(int e1);
--- a/conv/cbc2c.c Thu Feb 20 08:56:29 2003 +0900 +++ b/conv/cbc2c.c Sat Feb 22 01:32:47 2003 +0900 @@ -5,16 +5,23 @@ static void open(char *); static void print(char *); static void close(); +static void comment(char *s); Converter cbc2c_converter = { &open, &print, &close, + &comment, }; static FILE *vout; static void +comment(char *s) +{ +} + +static void open(char *s) { char *p=cheapp;
--- a/conv/null.c Thu Feb 20 08:56:29 2003 +0900 +++ b/conv/null.c Sat Feb 22 01:32:47 2003 +0900 @@ -5,14 +5,21 @@ static void open(char *); static void print(char *); static void close(); +static void comment(char *s); Converter null_converter = { &open, &print, &close, + &comment, }; static void +comment(char *s) +{ +} + +static void open(char *s) { }
--- a/mc-code-ia32.c Thu Feb 20 08:56:29 2003 +0900 +++ b/mc-code-ia32.c Sat Feb 22 01:32:47 2003 +0900 @@ -87,7 +87,6 @@ void shift(char *op, int reg); void ld_indexx(int byte, int n, int xreg); void jmp(int l); -void global_table(void); void local_table(void); void text_mode(void); void data_mode(char *name); @@ -96,7 +95,6 @@ int register_var(int r); int get_register_var(void); void emit_push(void); -void emit_push_x(int xreg); int emit_pop(int type); void code_crlvar(int e2); void code_preinc(int e1,int e2); @@ -108,7 +106,8 @@ void function(int e1); void code_assop(int op,int byte); int edx_setup(); -void opening(char *filename); +void code_opening(char *filename); +void code_closing(); void code_leave(char *name); int lvar(int l); @@ -251,22 +250,6 @@ } } -void -emit_push_x(int xreg) -{ - int new_reg; - new_reg = get_register(); - if(new_reg<0) { /* もうレジスタがない */ - reg_stack[reg_sp++] = -1; - printf("\tpushl %s\n",register_name(xreg,0)); - /* creg is used soon, don't regv[xreg]=0 */ - } else { - reg_stack[reg_sp++] = xreg; /* push するかわりにレジスタを使う */ - xreg = new_reg; - regv[xreg]=1; - } -} - int emit_pop(int type) { @@ -1005,24 +988,23 @@ cmpdimm(int e, int csreg) { /* used in dosiwtch() */ + if(chk) return; use_register(creg,csreg,0); printf("\tcmpl $%d,%s\n",e,register_name(creg,0)); } void -opening(char *filename) +code_opening(char *filename) { printf("\t.file \"%s\"\n",filename); printf("\t.version\t\"01.01\"\n"); - printf("gcc2_compiled.:\n"); + /* printf("gcc2_compiled.:\n"); */ printf(".text\n"); - emit_init(); } void -closing(void) +code_closing() { - global_table(); printf("\t.ident \"Micro-C compiled\"\n"); } @@ -1036,6 +1018,7 @@ void jcond(int l, char cond) { + if (chk) return; printf("\tj%s\t_%d\n",cond?"ne":"e",l); } @@ -1043,6 +1026,7 @@ jmp(int l) { control=0; + if (chk) return; printf("\tjmp\t_%d\n",l); /* align? */ /* @@ -1056,7 +1040,8 @@ void gen_comment(char *s) { - printf("## %s",s); + if (chk) return; + printf("## %s",s); } @@ -1180,6 +1165,7 @@ if(mode!=GDECL) { error(-1); return; } + if (chk) return; if (n->dsp != -1) { n->dsp = -1; /* initiallized flag */ printf(".globl\t%s\n",name); @@ -1222,6 +1208,7 @@ emit_data_closing(NMTBL *n) { int lb; + if (chk) return; if (mode==GDECL) { data_mode(0); lb=fwdlabel();
--- a/mc-code.h Thu Feb 20 08:56:29 2003 +0900 +++ b/mc-code.h Sat Feb 22 01:32:47 2003 +0900 @@ -57,11 +57,13 @@ extern void code_register_assop(int e2,int op,int byte); extern void code_assop(int op,int byte); extern void tosop(int op,int oreg); -extern void opening(char *filename); +extern void code_opening(char *filename); +extern void code_closing(); extern void rexpr(int e1, int l1, char *s); extern void jcond(int l, char cond); extern void jmp(int l); extern void code_set_fixed_creg(int mode); extern void text_mode(void); +extern void global_table(void); extern int lvar(int l);
--- a/mc-codegen.c Thu Feb 20 08:56:29 2003 +0900 +++ b/mc-codegen.c Sat Feb 22 01:32:47 2003 +0900 @@ -111,6 +111,7 @@ register_usage(char *s) { int i; + if (chk) return; printf("# %d: %s:",lineno,s); printf(" creg=%s dreg=%s ",register_name(creg,0),register_name(dreg,0)); for(i=0;i<MAX_REGISTER;i++) { @@ -190,6 +191,7 @@ void gexpr(int e1) { + if (chk) return; gexpr_init(); #if 0 if(lineno==2862) { @@ -212,7 +214,6 @@ int e2,e3/*,e4*/; NMTBL *n; - if (chk) return; e2 = cadr(e1); switch (car(e1)){ case GVAR: @@ -362,6 +363,7 @@ void bexpr(int e1, char cond, int l1) { + if (chk) return; gexpr_init(); b_expr(e1,cond,l1,0); } @@ -370,7 +372,6 @@ b_expr(int e1, char cond, int l1,int err) { int e2,l2; - if (chk) return; e2=cadr(e1); switch(car(e1)) { case LNOT: @@ -865,14 +866,16 @@ fwddef(int l) { control=1; - printf("_%d:\n",l); + if (!chk) + printf("_%d:\n",l); } int backdef(void) { control=1; - printf("_%d:\n",labelno); + if (!chk) + printf("_%d:\n",labelno); return labelno++; } @@ -906,4 +909,19 @@ jmp(retlabel); } +void +opening(char *filename) +{ + emit_init(); + if (!chk) + code_opening(filename); +} + +void +closing() +{ + if (!chk) + code_closing(); +} + /* end */
--- a/mc-codegen.h Thu Feb 20 08:56:29 2003 +0900 +++ b/mc-codegen.h Sat Feb 22 01:32:47 2003 +0900 @@ -33,7 +33,6 @@ extern void fwddef(int l); extern int csvalue(); -extern void closing(void); extern void cmpdimm(int e, int csreg); extern void code_enter(char *name) ; extern void code_enter1(int args); @@ -56,6 +55,7 @@ extern void jmp_label(int l); extern void leave(int control, char *name); extern void opening(char *filename); +extern void closing(); extern void ret(void); extern void use_register_var(int);
--- a/mc-parse.c Thu Feb 20 08:56:29 2003 +0900 +++ b/mc-parse.c Sat Feb 22 01:32:47 2003 +0900 @@ -94,7 +94,8 @@ static int struct_return = 0; static int arglist = 0; -Converter *conv = &null_converter; +/* Converter *conv = &null_converter; */ +Converter *conv = &c_converter; static char *ccout = 0; @@ -123,7 +124,9 @@ debug = 1; break; case 'C': - if (av[ac2+1]) { set_converter(av[ac2+1]); ac2++; } + if (av[ac2+1]) set_converter(av[ac2]+2); + chk = 1; + ccout=0; break; default: error(OPTION); @@ -140,7 +143,7 @@ emit_init(); mode=TOP; lfree= HEAPSIZE; - while(getsym()==SM); + while(getsym()==SM) conv->sm_(); mode=GDECL; stmode=0; args=0; @@ -163,16 +166,15 @@ newfile(); return; } else if(mode == TOP) { - /* - if (!chk) fprintf(stderr, - "Total internal labels : %u.\n",labelno-1); - fprintf(stderr, - "Total global variables : %u bytes.\n\n",gpc); - */ + if (chk) { + fprintf(stderr, "Total internal labels : %u.\n",labelno-1); + fprintf(stderr, "Total global variables: %u bytes.\n",gpc); + } closing(); exit(0); } } + if (conv->error_(n)) return; fprintf(stderr,"%s:%d:%s\n",filep->name0,lineno, (n==FILERR) ? "Can't open specified file" : (n==DCERR) ? "Declaration syntax" : @@ -290,7 +292,7 @@ char *s; lineno=0; - /* fprintf(stderr,"%s:\n",av[ac2]); */ + if (chk) fprintf(stderr,"%s:\n",av[ac2]); if ( (filep->fcb = fopen(av[ac2++],"r")) == NULL ) error(FILERR); s = av[ac2-1]; filep->name0 = cheapp; @@ -314,10 +316,14 @@ set_converter(char *s) { chptr = s; +#if 0 if (macroeq("c2cbc")) conv=&c2cbc_converter; else if (macroeq("cbc2c")) conv=&cbc2c_converter; else if (macroeq("c")) conv=&c_converter; else conv=&null_converter; +#else + if (macroeq("c")) conv=&c_converter; +#endif } static void @@ -351,6 +357,7 @@ int t; if(sym==STATIC) { + conv->static_(); if(mode==LDECL) { getsym(); mode=STADECL; @@ -363,12 +370,15 @@ } else if(sym==REGISTER) { if(mode!=LDECL) error(DCERR); + conv->register_(); stmode=REGISTER; getsym(); } else if(sym==EXTRN) { + conv->extern_(); getsym(); stmode=EXTRN; } else if(sym==TYPEDEF) { + conv->typedef_(); if(mode==GDECL) { getsym(); mode=GTDECL; @@ -379,7 +389,10 @@ error(DCERR); } if((t=typespec())==0) return; - if(sym==SM) return; + conv->return_type_(t); + if(sym==SM) { + conv->sm_(); return; + } type=t; n=decl0(); reverse(t); @@ -392,10 +405,11 @@ code_decl(n); return; } else if (car(type)==FUNCTION) { fdecl(n); return; - } + } else error(TYERR); } def(n); while(sym==COMMA) { + conv->comma_(); getsym(); type=t; n=decl0(); @@ -405,6 +419,7 @@ def(n); } if(sym!=SM) error(DCERR); + conv->sm_(); if(mode==GTDECL) mode=GDECL; if(mode==STADECL||mode==LTDECL) @@ -660,6 +675,7 @@ n=free_nptr(); n->nm = "_"; } + conv->def_(n); nsc=ndsp=0; if(car(type)==FUNCTION) { if (n->sc==EXTRN || (mode==GDECL)) { @@ -805,7 +821,7 @@ if (!init_vars) return; init_vars = reverse0(init_vars); while(init_vars) { - g_expr(car(init_vars)); + gexpr(car(init_vars)); init_vars = cadr(init_vars); } } @@ -856,13 +872,17 @@ t1 = car(t); if (t1==ARRAY) { if (sym==LC) { + conv->decl_data_begin_(); mode = mode_save; t1 = cadr(t); for(i=0;;i++) { if (sym!=RC) offset=decl_data(t1,n,offset); /* array of some thing */ - if (sym==COMMA) { continue; + if (sym==COMMA) { + conv->comma_(); + continue; } else if (sym==RC) { + conv->decl_data_end_(); if (caddr(t)==0) { /* size not defined */ heap[t+2]=i+1; /* define array size */ } else if (caddr(t)!=i+1) { /* size match? */ @@ -874,6 +894,7 @@ error(TYERR); } } + /* NOT REACHED */ } else if (cadr(t)==CHAR) { e=expr1(); mode = mode_save; @@ -888,15 +909,17 @@ } else error(DCERR); } else if (t1==STRUCT) { + conv->decl_data_begin_(); mode = mode_save; if(cadr(t)==-1) error(DCERR); t1 = caddr(t); /* list of fields */ while(t1) { offset = decl_data(car(t1),n,offset); /* alignment? */ t1 = cadr(t1); - if ( t1 && sym==COMMA) continue; + if ( t1 && sym==COMMA) { conv->comma_(); continue; } if (!t1 && sym!=RC) error(DCERR); } + conv->decl_data_end_(); getsym(); return offset; } else { @@ -967,7 +990,7 @@ int t; if (n->sc==EMPTY) n->sc = CODE; - code_enter(n->nm); + if(!chk) code_enter(n->nm); fnptr=n; disp = -args; reg_var=0; @@ -985,6 +1008,7 @@ if(n->sc==LVAR) n->dsp = -n->dsp-caddr(t); } + conv->code_(fnptr,arglist); /* local variable declaration */ stmode=0; mode=STAT; @@ -994,14 +1018,16 @@ decl(); mode=STAT; } + conv->localvar_end_(); control=1; - code_enter1(args); + if(!chk) code_enter1(args); emit_init_vars(); while(sym!=RC) statement(); if(control) error(STERR); control=0; - code_leave(n->nm); + conv->code_end_(); + if(!chk) code_leave(n->nm); } static NMTBL *tmp_struct; @@ -1009,7 +1035,7 @@ static void fdecl(NMTBL *n) { - enter(n->nm); + if(!chk) enter(n->nm); fnptr=n; retlabel=fwdlabel(); retcont = 0; @@ -1024,6 +1050,7 @@ decl(); getsym(); } fdecl_struct(fnptr->ty); + conv->function_(fnptr,arglist); disp=0; init_vars=0; /* local variable declaration */ @@ -1035,18 +1062,28 @@ decl(); mode=STAT; } + conv->localvar_end_(); control=1; - enter1(); + if(!chk) enter1(); emit_init_vars(); while(sym!=RC) statement(); - leave(control,n->nm); + conv->function_end_(); + if(!chk) leave(control,n->nm); retpending = 0; control=0; } static NMTBL str_ret; +/* + If function has structure return value, it has extra + argument for where to write the structure. It have to be + a first argument. We add it here and we have to fix all arguments' + offset. If it is the last value, we don't have to fix, but + gcc has a first argument convention. + */ + static void fdecl_struct(int fntype) { @@ -1140,6 +1177,7 @@ int slfree; if(sym==SM) { + conv->sm_(); getsym(); return; } checkret(); @@ -1205,13 +1243,16 @@ int l1,l2,slfree; getsym(); checksym(LPAR); + conv->if_(); slfree=lfree; bexpr(expr(),0,l1=fwdlabel()); lfree=slfree; checksym(RPAR); + conv->if_then_(); statement(); checkret(); if(sym==ELSE) { + conv->if_else_(); if ((l2 = control)) jmp(l2=fwdlabel()); fwddef(l1); @@ -1221,6 +1262,7 @@ if (l2) fwddef(l2); } else fwddef(l1); + conv->if_endif_(); } static void @@ -1232,11 +1274,13 @@ scontinue=clabel; blabel=fwdlabel(); clabel=backdef(); + conv->while_(); getsym(); checksym(LPAR); slfree=lfree; e=expr(); checksym(RPAR); + conv->while_body_(); if(sym==SM) { bexpr(e,1,clabel); lfree=slfree; @@ -1249,6 +1293,7 @@ if(control) jmp(clabel); } + conv->while_end_(); fwddef(blabel); clabel=scontinue; blabel=sbreak; @@ -1264,6 +1309,7 @@ blabel=fwdlabel(); clabel=fwdlabel(); l=backdef(); + conv->dowhile_(); getsym(); statement(); checkret(); @@ -1271,6 +1317,7 @@ checksym(WHILE); checksym(LPAR); slfree=lfree; + conv->dowhile_cond_(); bexpr(expr(),1,l); lfree=slfree; checksym(RPAR); @@ -1278,6 +1325,7 @@ fwddef(blabel); clabel=scontinue; blabel=sbreak; + conv->dowhile_end_(); } static void @@ -1288,6 +1336,7 @@ sbreak=blabel; scontinue=clabel; blabel=fwdlabel(); + conv->for_(); getsym(); checksym(LPAR); slfree=lfree; @@ -1296,6 +1345,7 @@ checksym(SM); } else getsym(); + conv->for1_(); lfree=slfree; l=backdef(); if(sym!=SM) { @@ -1303,15 +1353,19 @@ checksym(SM); } else getsym(); + conv->for2_(); lfree=slfree; if(sym==RPAR) { clabel=l; getsym(); + conv->for_body_(); statement(); checkret(); } else { + conv->for3_(); clabel=fwdlabel(); e=expr(); + conv->for_body_(); checksym(RPAR); statement(); checkret(); @@ -1319,6 +1373,7 @@ gexpr(e); lfree=slfree; } + conv->for_end_(); jmp(l); fwddef(blabel); clabel=scontinue; @@ -1335,6 +1390,7 @@ sdefault=dlabel; /* save parents default label */ dlabel=0; scase=cslabel; /* save parents next case label */ + conv->switch_(); getsym(); checksym(LPAR); slfree=lfree; @@ -1343,9 +1399,11 @@ csvalue1=csvalue() ; lfree=slfree; checksym(RPAR); + conv->switch_body_(); cslabel = control = 0; /* should be case statement but... */ statement(); + conv->switch_end_(); checkret(); if(dlabel) def_label(cslabel,dlabel); else fwddef(cslabel); @@ -1359,8 +1417,10 @@ static void docomp(void) { + conv->lc_(); getsym(); while(sym!=RC) { statement(); checkret();} + conv->rc_(); getsym(); } @@ -1374,6 +1434,7 @@ while(sym==CASE) { getsym(); c=list2(cexpr(expr()),c); + conv->case_(c,0); checksym(COLON); } l=fwdlabel(); @@ -1401,6 +1462,7 @@ if (dlabel) error(STERR); if (!cslabel) jmp(cslabel = fwdlabel()); dlabel = backdef(); + conv->case_(0,1); } static void @@ -1413,6 +1475,7 @@ retpending = 1; return; } + conv->return_(); slfree=lfree; if (struct_return) { e = expr(); @@ -1438,6 +1501,7 @@ checksym(SM); /* control = 0; still control continue until pending return emittion */ retpending = 1; + conv->return_end_(); } void @@ -1454,6 +1518,7 @@ NMTBL *nptr0; int t,e1,e2,env; + conv->goto_(); getsym(); e1 = expr(); t=car(e1); @@ -1468,6 +1533,7 @@ } control=0; checksym(SM); + conv->goto_label_(nptr0); return; } if (t==COMMA) { @@ -1478,6 +1544,7 @@ env = 0; } if (t==FUNCTION) { + conv->jump_(env); e2 = cadr(e1); if (car(e2) == FNAME) { nptr0=(NMTBL *)cadr(e2); @@ -1503,6 +1570,7 @@ nptr->dsp = backdef(); getsym(); checksym(COLON); + conv->label_(); } int @@ -1538,7 +1606,9 @@ int expr(void) { - return(rvalue(expr0())); + int r; + r=rvalue(expr0()); + return r; } static int @@ -1548,6 +1618,7 @@ e=expr1(); while(sym==COMMA) { + conv->op_(sym); getsym();e=list3(COMMA,e,rvalue(expr1())); } return e; @@ -1558,6 +1629,7 @@ { int e1,e2,t,op; e1=expr2(); + conv->op_(sym); switch (sym) { case ASS: lcheck(e1); @@ -1572,6 +1644,7 @@ t=type; getsym(); e2=rvalue(expr1()); + if(!integral(type)) error(TYERR); if((t==UNSIGNED||type==UNSIGNED)&& (op==MUL||op==DIV||op==MOD||op==RSHIFT||op==LSHIFT)) @@ -1585,6 +1658,7 @@ if((op!=ADD&&op!=SUB)||car(t)!=POINTER) error(TYERR); e2=binop(MUL,e2,list2(CONST,size(cadr(t))),INT,UNSIGNED); type=t; + return list4(ASSOP,e1,e2,op); default: return(e1); @@ -1596,14 +1670,18 @@ { int e1,e2,e3,t; + conv->cond_(); e1=expr3(); if(sym==COND) { e1=rvalue(e1); getsym(); + conv->cond1_(); e2=rvalue(expr2()); t=type; checksym(COLON); + conv->cond2_(); e3=rvalue(expr2()); + conv->cond_end_(); if(car(e1)==CONST) { if(cadr(e1)) { type=t;return e2; @@ -1624,6 +1702,7 @@ e=expr4(); while(sym==LOR) { + conv->op_(sym); e=rvalue(e); getsym(); e=list3(LOR,e,rvalue(expr4())); @@ -1639,6 +1718,7 @@ e=expr5(); while(sym==LAND) { + conv->op_(sym); e=rvalue(e); getsym(); e=list3(LAND,e,rvalue(expr5())); @@ -1654,6 +1734,7 @@ e1=expr6(); while(sym==BOR) { + conv->op_(sym); e1=rvalue(e1); t=type; getsym(); @@ -1670,6 +1751,7 @@ e1=expr7(); while(sym==EOR) { + conv->op_(sym); e1=rvalue(e1); t=type; getsym(); @@ -1686,6 +1768,7 @@ e1=expr8(); while(sym==BAND) { + conv->op_(sym); e1=rvalue(e1); t=type; getsym(); @@ -1702,6 +1785,7 @@ e=expr9(); while((op=sym)==EQ||op==NEQ) { + conv->op_(sym); e=rvalue(e); getsym(); e=list3(op,e,rvalue(expr9())); @@ -1717,6 +1801,7 @@ e1=expr10(); while((op=sym)==GT||op==GE||op==LT||op==LE) { + conv->op_(sym); e1=rvalue(e1); t=type; getsym(); @@ -1737,6 +1822,7 @@ e1=expr11(); while((op=sym)==RSHIFT||op==LSHIFT) { + conv->op_(sym); e1=rvalue(e1); t=type; getsym(); @@ -1753,6 +1839,7 @@ e1=expr12(); while((op=sym)==ADD||op==SUB) { + conv->op_(sym); e1=rvalue(e1); t=type; getsym(); @@ -1769,6 +1856,7 @@ e1=expr13(); while((op=sym)==MUL||op==DIV||op==MOD) { + conv->op_(sym); e1=rvalue(e1); t=type; getsym(); @@ -1783,8 +1871,9 @@ { int e,op; + conv->prefix_(sym); switch (op = sym) { - case INC: case DEC: + case INC: case DEC: getsym(); lcheck(e=expr13()); if(type==CHAR) { @@ -1860,6 +1949,7 @@ return e; } e=expr14(); + conv->postfix_(sym); if((op=sym)==INC||op==DEC) { lcheck(e); getsym(); @@ -1882,6 +1972,7 @@ { int e1,t; + conv->id_(sym,nptr); switch(sym) { case IDENT: switch(nptr->sc) { @@ -1955,14 +2046,17 @@ getsym(); break; case LPAR: + conv->lpar_(); if(typeid(getsym())) { t=typename(); checksym(RPAR); e1=expr13(); type=t; + conv->rpar_(); return e1; } e1=expr0(); + conv->rpar_(); checksym(RPAR); break; default:error(EXERR); @@ -1977,17 +2071,22 @@ while(1) { if(sym==LBRA) { + conv->lbra_(sym); e1=rvalue(e1); t=type; getsym(); e2=rvalue(expr0()); checksym(RBRA); + conv->rbra_(sym); e1=binop(ADD,e1,e2,t,type); e1=indop(e1); - } else if(sym==LPAR) e1=expr15(e1); - else if(sym==PERIOD) e1=strop(e1); - else if(sym==ARROW) e1=strop(indop(rvalue(e1))); - else break; + } else if(sym==LPAR) { conv->function_(); e1=expr15(e1); } + else { + conv->op_(sym); + if(sym==PERIOD) e1=strop(e1); + else if(sym==ARROW) e1=strop(indop(rvalue(e1))); + else break; + } } if(car(e1)==FNAME) type=list2(POINTER,type); return e1; @@ -2238,6 +2337,7 @@ t=type; if(integral(t)|| ((car(t)!=FUNCTION)&&(car(t)!=CODE))) error(TYERR); + conv->funcall_(type); getsym(); arglist=0; while(sym!=RPAR) { @@ -2247,6 +2347,7 @@ getsym(); } checksym(RPAR); + conv->funcall_args_(); if(car(t)==CODE) return list3(FUNCTION,e1,arglist); type=cadr(t); @@ -2523,15 +2624,20 @@ } else return sym=PERIOD; case '/': - if(ch!='*') return postequ(DIV,DIV+AS); if(ch=='/') { - while(ch!='\n') getch(); + in_comment = 1; + conv->comment_('/'); conv->comment_('/'); + while(ch!='\n') { getch(); conv->comment_(ch); } + in_comment = 0; getch(); return getsym(); } + if(ch!='*') return postequ(DIV,DIV+AS); in_comment = 1; - getch(); - while(ch=='*'?getch()!='/':getch()); + conv->comment_('/'); conv->comment_('*'); + do { + c=ch; getch(); conv->comment_(ch); + } while(!(c=='*'&&ch=='/')); in_comment = 0; getch(); return getsym();
--- a/mc.h Thu Feb 20 08:56:29 2003 +0900 +++ b/mc.h Sat Feb 22 01:32:47 2003 +0900 @@ -234,16 +234,13 @@ #define cadddr(e) (heap[((int)(e))+3]) -typedef struct converter { - void (*open)(char *); - void (*print)(char *); - void (*close)(); -} Converter; - +#include "conv/conv.h" +#include "conv/c.h" +/* #include "conv/c2cbc.h" #include "conv/cbc2c.h" -#include "conv/c.h" #include "conv/null.h" + */ extern Converter *conv;