Пример #1
0
		A_exp ret_Refold(A_pos pos, A_oper oper, A_exp left, A_exp right)
		{
			
			A_exp p = checked_malloc(sizeof(*p));
				p->kind = A_opExp;
				p->pos = pos;
				p->u.op.oper = oper;
				p->u.op.left = left;
				p->u.op.right = right;
			//printf("VINPRINT: Left operation : %d , Right_operation: %d, Left kind : %d , Current Operation : %d , Left value:%d Right value:%d ,Right kind : %d Right value: %d\n",left->u.op.oper,right->u.op.oper,left->kind,oper,left->u.intt,right->u.intt,right->kind,right->u.intt);
			if (left->kind == A_intExp  && right->kind == A_intExp)
			{
				int l,r;
								
				l=left->u.intt;
				r=right->u.intt;
				//printf("VINPRINT: Entered int int oper %d pos %d\n",oper,pos);
				
				//printf("VINPRINT:!!@$@#$ Entered int int oper %d pos %d\n",oper,pos);
				//Checking operation and performing const folding
				
				switch(oper)
				{
				case A_plusOp: folded=1;return A_IntExp(pos, (left->u.intt) + (right->u.intt));break;
				case A_minusOp:  folded=1;return A_IntExp(pos, left->u.intt - right->u.intt);break;
				case A_timesOp:   folded=1;return A_IntExp(pos, left->u.intt * right->u.intt);break;
				case A_divideOp:   folded=1;return A_IntExp(pos, left->u.intt / right->u.intt);break;
				default: return p; break;
				
				}
				
				
				
				}
				
			else if ( (left->kind == A_opExp  && right->kind == A_intExp) && ((left->u.op.oper)!= A_timesOp) &&((left->u.op.oper)!= A_divideOp)&&((left->u.op.right)->kind==A_intExp))
			{
				A_exp leftexp,op_chl,op_chr;
				leftexp= left->u.op.right;
				//printf("VINPRINT: Entered here\n");
				//Checking operation and performing const folding
				switch(oper)
				{
				case A_plusOp: leftexp->u.intt = leftexp->u.intt + right->u.intt;break;
				case A_minusOp: leftexp->u.intt = leftexp->u.intt - right->u.intt;break;
				case A_timesOp:  leftexp->u.intt = leftexp->u.intt * right->u.intt;break;
				case A_divideOp:  leftexp->u.intt = leftexp->u.intt / right->u.intt;break;
				default: return p; break;
				}
				folded=1;
				left->u.op.right = leftexp;
				return left;
			}
		
			else
			{
				
			//printf("VINPRINT: Entered last else Operation : %d , Right Exp operation: %d\n",p->u.op.oper, (p->u.op.right)->u.op.oper);
			return p;
			folded=0;
			}
		}
Пример #2
0
struct expty transExp_forExp(Tr_level level, S_table venv, S_table tenv, A_exp a, Temp_label breakk) {
  struct expty lo = transExp(level, venv, tenv, a->u.forr.lo, breakk);
  struct expty hi = transExp(level, venv, tenv, a->u.forr.hi, breakk);

  if (lo.ty->kind != Ty_int || hi.ty->kind != Ty_int)
    EM_error(a->u.forr.lo->pos, "lo or hi expr is not int");

  /*
   * LET VAR i := lo
   *     VAR lmt := hi
   * IN
   *    IF lo < hi THEN
   *      WHILE i <= lmt DO
   *        (body;
   *         i := i+1)
   */
  A_pos pos1 = a->pos;
  A_pos pos2 = a->u.forr.body->pos;
  S_symbol var = a->u.forr.var;
  S_symbol lmt = S_Symbol("limit");
  A_exp ebody = a->u.forr.body;
  A_exp transformed = A_LetExp(pos1,
      A_DecList(A_VarDec(pos1, var, S_Symbol("int"), a->u.forr.lo),
      A_DecList(A_VarDec(pos1, lmt, S_Symbol("int"), a->u.forr.hi), NULL)),
          A_IfExp(pos1,
              A_OpExp(pos1, A_ltOp, a->u.forr.lo, a->u.forr.hi),
              A_WhileExp(pos1,
                  A_OpExp(pos1, A_leOp, A_VarExp(pos1, A_SimpleVar(pos1, var)), A_VarExp(pos1, A_SimpleVar(pos1, lmt))),
                  A_SeqExp(pos2, A_ExpList(ebody, 
                                 A_ExpList(A_OpExp(pos1, A_plusOp, A_VarExp(pos1, A_SimpleVar(pos1, var)), A_IntExp(pos1, 1)),
                                 A_ExpList(A_SeqExp(pos2, NULL), // return no value
                                 NULL))))),
              NULL)
  );
  return transExp(level, venv, tenv, transformed, breakk);
}
Пример #3
0
		/* Print A_var types. Indent d spaces. */
		void retReplace_exp(  A_exp *v, int d) {
			//printf("Entered here retexp %d\n", (*v)->kind);
		 //indent(  d);
		 switch ((*v)->kind) {
		 case A_varExp:
		   //fprintf(  "varExp(\n");
		   //printf(  "varExp(\n");
		   
		   if(((*v)->u.var)->kind == A_simpleVar)
		   { 	
			   
			   if(ret_TableMatch((*v)->u.var))
			   { //printf("here 1\n");
			   printf("Replacing Variable %s ",S_name(((*v)->u.var)->u.simple));
			   (*v) = A_IntExp(((*v)->u.var)->pos,current_Const);
			   //printf("here 2\n");
				}
			}
			else
			{
				  ret_var(  &(*v)->u.var, d+1); 
			}
		   //f//printf(  "%s", ")");
		   break;
		 case A_nilExp:
		   //fprintf(  "nilExp()");
		   //printf(  "nilExp()");
		   break;
		 case A_intExp:
		   //fprintf(  "intExp(%d)", (*v)->u.intt);
		   //printf(  "intExp(%d)", (*v)->u.intt);
		   break;
		 case A_stringExp:
		   //fprintf(  "stringExp(%s)", (*v)->u.stringg);
		   //printf(  "stringExp(%s)", (*v)->u.stringg);
		   break;
		 case A_callExp:
		   //fprintf(  "callExp(%s,\n", S_name((*v)->u.call.func));
		   //printf(  "callExp(%s,\n", S_name((*v)->u.call.func));
		   ret_expList(  &(*v)->u.call.args, d+1); //fprintf(  ")");
		   break;
		 case A_opExp:
				ret_oper(  (*v)->u.op.oper); //fprintf(  ",\n"); 
				retReplace_exp(  &(*v)->u.op.left, d+1); //fprintf(  ",\n"); 
				retReplace_exp(  &(*v)->u.op.right, d+1); ////fprintf(  ")");
				break;
		 case A_recordExp:
		   ////fprintf(  "recordExp(%s,\n", S_name((*v)->u.record.typ)); 
		   ret_efieldList(  &(*v)->u.record.fields, d+1); ////fprintf(  ")");
		   break;
		 case A_seqExp:
		   ////fprintf(  "seqExp(\n");
		   ret_expList(  &(*v)->u.seq, d+1); ////fprintf(  ")");
		   break;
		 case A_assignExp:
		   ////fprintf(  "assignExp(\n");
		   //printf(  "assignExp(\n");
		   ret_var(  &(*v)->u.assign.var, d+1); ////fprintf(  ",\n");
		   //printf("fine here11!!!");
		   retReplace_exp(  &(*v)->u.assign.exp, d+1); ////fprintf(  ")");
		   break;
		 case A_ifExp:
		   ////fprintf(  "iffExp(\n");
		   retReplace_exp(  &(*v)->u.iff.test, d+1); ////fprintf(  ",\n");
		   retReplace_exp(  &(*v)->u.iff.then, d+1);
		   if ((*v)->u.iff.elsee) { /* else is optional */
		      ////fprintf(  ",\n");
		      retReplace_exp(  &(*v)->u.iff.elsee, d+1);
		   }
		   //fprintf(  ")");
		   break;
		 case A_whileExp:
		   //fprintf(  "whileExp(\n");
		   retReplace_exp(  &(*v)->u.whilee.test, d+1); //fprintf(  ",\n");
		   retReplace_exp(  &(*v)->u.whilee.body, d+1); //fprintf(  ")\n");
		   break;
		 case A_forExp:
		   //fprintf(  "forExp(%s,\n", S_name((*v)->u.forr.var)); 
		   retReplace_exp(  &(*v)->u.forr.lo, d+1); //fprintf(  ",\n");
		   retReplace_exp(  &(*v)->u.forr.hi, d+1); //fprintf(  "%s\n", ",");
		   retReplace_exp(  &(*v)->u.forr.body, d+1); //fprintf(  ",\n");
		   //indent(  d+1); //fprintf(  "%s", (*v)->u.forr.escape ? "TRUE)" : "FALSE)");
		   break;
		 case A_breakExp:
		   //fprintf(  "breakExp()");
		   break;
		 case A_letExp:
		   //fprintf(  "letExp(\n");
		   ret_decList(  &(*v)->u.let.decs, d+1); //fprintf(  ",\n");
		   retReplace_exp(  &(*v)->u.let.body, d+1); //fprintf(  ")");
		   break;
		 case A_arrayExp:
		   //fprintf(  "arrayExp(%s,\n", S_name((*v)->u.array.typ));
		   retReplace_exp(  &(*v)->u.array.size, d+1); //fprintf(  ",\n");
		   retReplace_exp(  &(*v)->u.array.init, d+1); //fprintf(  ")");
		   break;
		 default:
		   assert(0); 
		 } 
		}