Mercurial > hg > CbC > old > device
changeset 28:c6994794f084
functional macro (imcomplete)
author | kono |
---|---|
date | Sat, 08 Feb 2003 00:58:04 +0900 |
parents | af0c69eaa433 |
children | 160e20394f80 |
files | Idea mc-parse.c mc.h |
diffstat | 3 files changed, 215 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/Idea Fri Feb 07 14:23:25 2003 +0900 +++ b/Idea Sat Feb 08 00:58:04 2003 +0900 @@ -1323,3 +1323,44 @@ あとデータフローだよね。データフローに関しては、 あんまりやってないなぁ +Fri Feb 7 14:36:15 JST 2003 + +inline では、必らず、局所変数の増加がある。また、inline +は普通の関数として展開しておく必要もあるらしい。(何故?) + +#define ねぇ。 + + #define c(a,b) g(a+1,b+1) + #define g(a,b) printf("%d %d\n",a+1,b+1); + + main() { + int a,b; + a =1; b = 3; + c(a,b); + } + +local #define がいるんだよね。g の中で a が出て来た時には、 +c のa の置き換えは起こってはいけない。ということは、c +の置き換えはg が始まる前に終っている必要がある。dynamic +scope なんだから、assoc の上乗せで良いはず。 +macro のlevelを定義して、あるレベルでは、それ以前の展開 +を行わないという手法が良いかな。 + + c(a,b) => a=>"a+1", b=>"b+1" + g(a,b) => (a=>"a+1+1",a=>"a+1"), (b=>"b+1+1",a=>"a+1") + +みたいな感じ? + +やっぱり関数解析でマクロ処理をやらせるのは無理かな? 先読みされちゃうし。 + +Sat Feb 8 00:53:52 JST 2003 + +macro は途中まで書きました。置き換えをマクロが呼び出された +時点で cheap に置くと、それを解消するタイミングがない。 +ここだけmallocしても良いが.. + +chptrsave はlistにする必要がある。list で良い。 + +やっぱりmacro levelを見て、自分と一致したassoc valueまで +手繰って置換するんでしょう。そうすれば、置き換える必要は無い。 +ということは、local_define にmflagsを格納する必要がある。
--- a/mc-parse.c Fri Feb 07 14:23:25 2003 +0900 +++ b/mc-parse.c Sat Feb 08 00:58:04 2003 +0900 @@ -85,6 +85,11 @@ static int typespec(void); static int cexpr(int e); static void code_decl(NMTBL *n); +static int macro_args(); +static void fmacro(); +static void local_define(); +static void local_undef(); +static void replace_macro(); extern void display_ntable(NMTBL *n, char *s); extern void closing(void); @@ -1790,6 +1795,11 @@ type=nptr->ty; getsym(); break; + case FMACRO: + fmacro(); + ch = *chptr; + getsym(); + break; case FLABEL: case BLABEL: case FUNCTION: case CODE: e1=list2(FNAME,(int)nptr); @@ -2537,11 +2547,12 @@ { int i; int c; + int args; int mode_save; ++chptr; if (macroeq("ifdef") || macroeq("ifndef")) { - c = (chptr[-3]=='n'); + c = (chptr[-4]=='n'); macro_if_current++; if (!macro_if_skip) { mode_save = mode; mode = IFDEF; @@ -2591,26 +2602,44 @@ mode=GDECL; ch= *chptr; if (getsym() == IDENT) { - if (nptr->sc == EMPTY) { + if (nptr->sc != EMPTY) { error(MCERR); + } else if (ch=='(') { + nptr->sc = FMACRO; + args = macro_args(); + nptr->dsp = glist2((int)cheapp,args); + while ((*cheapp++ = c = *chptr++) + && c != '\n'); + *cheapp++ = '\0'; +#if 0 +fprintf(stderr,"macro function: %s\n",nptr->nm); +i = 0; +while(args) { +fprintf(stderr,"macro args %d: %s\n",i++,(char *) car(args)); +args = cadr(args); +} +fprintf(stderr,"macro body: %s\n",(char *)car(nptr->dsp)); +#endif + } else { nptr->sc = MACRO; nptr->dsp = (int)cheapp; while ((*cheapp++ = c = *chptr++) && c != '\n'); *cheapp++ = '\0'; - if (cheapp >= cheap+CHEAPSIZE) - error(STRERR); - /* if (!c) error(EOFERR); ??? #define hoge only case */ - } else error(MCERR); + } + if (cheapp >= cheap+CHEAPSIZE) /* too late? */ + error(STRERR); } else error(MCERR); mode=i; *(chptr = linebuf) = '\0'; } else if (macroeq("undef")) { i=mode; - mode=GDECL; + mode=LDECL; ch= *chptr; if (getsym() == IDENT) { if (nptr->sc == MACRO) { nptr->sc = EMPTY; + } else if (nptr->sc == LMACRO) { + nptr->sc = EMPTY; } else error(MCERR); } mode=i; @@ -2647,6 +2676,139 @@ return 1; } +int +macro_args() +{ + int c; + int in_quote = 0; + int in_wquote = 0; + int plevel = 0; + int args = glist2((int)cheapp,0); + for(;;) { + *cheapp++ = c = *chptr++; + if (in_quote) { + if (c=='\\') { + if (*chptr != '\n') { + *cheapp++ = *chptr++; + } else { + getline(); + } + } else if (c=='\'') { + in_quote = 0; + } + } else if (in_wquote) { + if (c=='\\') { + if (*chptr !='\n') { + *cheapp++ = *chptr++; + } else { + *cheapp = '\n'; + getline(); + } + } else if (c=='"') { + in_wquote = 0; + } + } else if (c=='"') { + in_wquote = 1; + } else if (c=='\'') { + in_quote = 1; + } if (plevel==0) { + if (c==',') { + cheapp[-1] = 0; + args = glist2((int)cheapp,args); + } else if (c==')') { + cheapp[-1] = 0; + break; + } else if (c=='(') { + plevel++; + } else if (c=='\\') { + if (*chptr=='\n') { + cheapp--; + getline(); + } + } else if (c==' '||c=='\t') { + cheapp--; + } else if (c=='\n') { + cheapp--; + getline(); + } + } else if (c==')') { + plevel--; + } else if (c=='\n') { + cheapp--; + getline(); + } + } + return reverse0(args); +} + +void +fmacro() +{ + int args,sargs,values; +#if 0 +int i; +fprintf(stderr,"linebuf: %s\n",linebuf); +fprintf(stderr,"fmacro: %s\n",nptr->nm); +i = 0; +args = cadr(nptr->dsp); +while(args) { +fprintf(stderr,"fmacro args %d: %s\n",i++,(char *) car(args)); +args = cadr(args); +} +fprintf(stderr,"fmacro body: %s\n",(char *)car(nptr->dsp)); + args = macro_args(); +i = 0; +while(args) { +fprintf(stderr,"fmacro args value %d: %s\n",i++,(char *) car(args)); +args = cadr(args); +} +#endif + args = sargs = cadr(nptr->dsp); + values = macro_args(); + while(args) { + local_define(car(args),car(values)); + args = cadr(args); + values = cadr(values); + } + mflag++; + replace_macro(); + chsave = ch; + chptrsave = chptr; + chptr = cheapp; + while(sargs) { + local_undef(car(sargs)); + sargs = cadr(sargs); + } + getch(); +} + +void +replace_macro() +{ +} + +void +local_define(char *macro,char *value) +{ + NMTBL *nptr0; + nptr0 = lsearch(macro); + nptr0->sc=LMACRO; + nptr0->ty=list3(nptr0->sc,nptr0->dsp,nptr0->ty); + nptr0->dsp=(int)value; +} + +void +local_undef(char *macro) +{ + NMTBL *nptr0; + int save; + nptr0 = lsearch(macro); + save = nptr0->ty; + nptr0->sc=car(save); + nptr0->dsp=cadr(save); + nptr0->ty=caddr(save); +} + int car(int e) {
--- a/mc.h Fri Feb 07 14:23:25 2003 +0900 +++ b/mc.h Sat Feb 08 00:58:04 2003 +0900 @@ -54,6 +54,8 @@ #define ENVIRONMENT (-40) #define DEFINED (-41) #define KONST (-42) +#define FMACRO (-43) +#define LMACRO (-44) #define TOP 0 #define GDECL 1 @@ -194,7 +196,9 @@ char *nm; int sc,ty,dsp; } NMTBL; -EXTERN NMTBL ntable[GSYMS+LSYMS],*nptr,*gnptr,*decl0(void),*decl1(void),*lsearch(char *name),*gsearch(void); +EXTERN NMTBL ntable[GSYMS+LSYMS]; +EXTERN NMTBL *nptr,*gnptr; +EXTERN NMTBL *decl0(void),*decl1(void),*lsearch(char *name),*gsearch(void); EXTERN NMTBL *fnptr; EXTERN struct {int fd,ln;char *name0;FILE *fcb;} *filep,filestack[FILES];