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];