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) {