# HG changeset patch # User kono # Date 1044698385 -32400 # Node ID 8b87de87eb54c1dd6d4fb4859289d302b0efceb2 # Parent 20ed2786a27610601c7062af83b37f2d9786101d *** empty log message *** diff -r 20ed2786a276 -r 8b87de87eb54 Idea --- a/Idea Sat Feb 08 18:18:46 2003 +0900 +++ b/Idea Sat Feb 08 18:59:45 2003 +0900 @@ -1407,9 +1407,22 @@ いちおう、mflag まではデバッグしたが.... mflag を戻してないんじゃないの? - ---c(a,b)----------------------- mflag ==0 - ----g(ac,bc)----------------- mflag ==1 - ----printf(a,b)---------- mflag ==2 + ---c(a,b)----------------------- mflag ==1 + a=>hoge, b=>hoga (mflag==1) + ----g(ac,bc)----------------- mflag ==2 + ac=>goge, bc=>goga(mflag==2) + ----printf(a,b)---------- mflag ==3 + a=>poge, b=>poga(mflag==3) g が呼び出されると、ac,bc は mflag==1 でのみ置換される。 +あるテキストを置き換えると、それは置き換えたマクロのmflag level +(つまり一つ少ないレベル)になる。 +置き換え終ったら、元のlevelに戻す。 + +mflag==2のlevel では、mflag==2のlocal macroの展開しかしない。 + +置き換えると、mflag level 1 になるので、そこで mflag==1 のlocal +macro を展開する。mflag==0 は常に展開を行う。 + + diff -r 20ed2786a276 -r 8b87de87eb54 mc-parse.c --- a/mc-parse.c Sat Feb 08 18:18:46 2003 +0900 +++ b/mc-parse.c Sat Feb 08 18:59:45 2003 +0900 @@ -2236,6 +2236,7 @@ if (cadddr(i)) { mflag--; } +fprintf(stderr,"macro subsitite: %d %s=>%s\n",mflag,name,macro); chptr = macro; getch(); return getsym(); @@ -2452,7 +2453,7 @@ NMTBL *nptr,*iptr; int hash,i; - i = 0; + i = 0; hash = 0; while((name[i])) { hash=((7*hash) ^ name[i++]); } @@ -2518,7 +2519,7 @@ { NMTBL *nptr0; int sargs; - if(*chptr) return ch= *chptr++; + if(*chptr) return ch = *chptr++; if(chptrsave) { nptr0=(NMTBL *)car(cadddr(chptrsave)); @@ -2529,7 +2530,10 @@ sargs = cadr(sargs); } } - mflag--; + if (nptr0->ty>0) { /* local macro's current mflag level */ + mflag++; /* for global macro, this is 0 */ + } +fprintf(stderr,"macro subsitite end: %d %s\n",mflag,nptr0->nm); chptr=(char *)car(chptrsave); ch=caddr(chptrsave); chptrsave=cadr(chptrsave); @@ -2832,32 +2836,17 @@ fmacro() { int args,values; -#if 1 -int i; -fprintf(stderr,"linebuf: %s\n",linebuf); -fprintf(stderr,"fmacro: %s\n",nptr->nm); -fprintf(stderr,"fmacro body: %s\n",(char *)car(nptr->dsp)); -i = 1; -#endif args = cadr(nptr->dsp); values = macro_args(); mflag++; while(args) { -#if 1 -fprintf(stderr,"fmacro args %d: %s\n",i++,(char *) car(args)); -fprintf(stderr,"fmacro args value %d: %s\n",i,(char *) car(values)); -#endif local_define(car(args),car(values)); args = cadr(args); values = cadr(values); -fprintf(stderr,"fmacro body: %s\n",(char *)car(nptr->dsp)); } ch = *chptr; chptrsave = list4((int)chptr,chptrsave,ch,list2((int)nptr,car(nptr->dsp))); chptr = (char *)car(nptr->dsp); -#if 1 -fprintf(stderr,"fmacro replace result: %s\n",chptr); -#endif getch(); } @@ -2881,6 +2870,7 @@ nptr0->ty=list4(nptr0->sc,nptr0->dsp,nptr0->ty,mflag); nptr0->sc=MACRO; nptr0->dsp=list2((int)value,0); +fprintf(stderr,"local define: %d %s=>%s\n",mflag,macro,value); } void