예제 #1
0
void MatLabExporter::segun(t_output &prog, list<t_proceso_it> its, string tabs){
	list<t_proceso_it>::iterator p,q,r;
	q=p=its.begin();r=its.end();
	t_proceso_it i=*q;
	insertar(prog,tabs+"switch "+expresion((*i).par1));
	++q;++p;
	while (++p!=r) {
		i=*q;
		if ((*i).par1=="DE OTRO MODO")
			insertar(prog,tabs+"otherwise");
		else {
			string e=expresion((*i).par1); int en=1;
			bool comillas=false; int parentesis=0, j=0,l=e.size();
			while(j<l) {
				if (e[j]=='\''||e[j]=='\"') comillas=!comillas;
				else if (!comillas) {
					if (e[j]=='['||e[j]=='(') parentesis++;
					else if (e[j]==']'||e[j]==')') parentesis--;
					else if (parentesis==0 && e[j]==',') {
						e.replace(j,1,","); l+=5; en++;
					}
				}
				j++;
			}
			if (en>1) e=string("{")+e+"}";
			insertar(prog,tabs+"case "+e);
		}
		bloque(prog,++i,*p,tabs+"\t");
		++q;
	}
	insertar(prog,tabs+"end");
}
예제 #2
0
void VbExporter::segun(t_output &prog, list<t_proceso_it> its, string tabs){
	list<t_proceso_it>::iterator p,q,r;
	q=p=its.begin();r=its.end();
	t_proceso_it i=*q;
	insertar(prog,tabs+"Select Case "+expresion((*i).par1));
	++q;++p;
	while (++p!=r) {
		i=*q;
		if ((*i).par1=="DE OTRO MODO")
			insertar(prog,tabs+"Case Else");
		else {
			string e="Case "+expresion((*i).par1);
			bool comillas=false; int parentesis=0, j=0,l=e.size();
			while(j<l) {
				if (e[j]=='\''||e[j]=='\"') comillas=!comillas;
				else if (!comillas) {
					if (e[j]=='['||e[j]=='(') parentesis++;
					else if (e[j]==']'||e[j]==')') parentesis--;
					else if (parentesis==0 && e[j]==',') {
						e.replace(j,1,", "); l+=6;
					}
				}
				j++;
			}
			insertar(prog,tabs+e);
		}
		bloque(prog,++i,*p,tabs+"\t");
		++q;
	}
	insertar(prog,tabs+"End Select");
}
예제 #3
0
//condicion
void condicion(int toksig[])
{
  int setpaso[NOTOKENS]; //conjunto de paso por valor
  
  
  if (token==oddtok) {
    obtoken();
    copia_set(setpaso,toksig); //setpaso=toksig
    expresion(setpaso);    
  }
  else {
    //en este caso los sucesores de expresion son los operadores relacionales
    copia_set(setpaso,toksig);
    setpaso[igl]=setpaso[nig]=setpaso[mnr]=setpaso[myr]=setpaso[mei]=setpaso[mai]=1;
    //setpaso=igl+nig+mnr+myr+mei+mai+toksig
    
    expresion(setpaso);
    if ( (token!=igl) && (token!=nig) && (token!=mnr) && (token!=mei) && (token!=myr) && (token!=mai) )
      error(20); //error 20: Se esperaba un operador relacional 
    else {
      obtoken();
      
      copia_set(setpaso,toksig); //setpaso=toksig
      expresion(setpaso);          
    }
  }
}
예제 #4
0
void VbExporter::repetir(t_output &prog, t_proceso_it r, t_proceso_it q, string tabs){
	insertar(prog,tabs+"Do");
	bloque(prog,++r,q,tabs+"\t");
	if ((*q).nombre=="HASTAQUE")
		insertar(prog,tabs+"Loop Until "+expresion((*q).par1));
	else
		insertar(prog,tabs+"Loop While "+expresion((*q).par1));
}
예제 #5
0
void MatLabExporter::para(t_output &prog, t_proceso_it r, t_proceso_it q, string tabs) {
	string var=expresion((*r).par1), ini=expresion((*r).par2), fin=expresion((*r).par3), paso=(*r).par4;
	if (paso=="1")
		insertar(prog,tabs+"for "+var+"="+ini+":"+fin);
	else
		insertar(prog,tabs+"for "+var+"="+ini+":"+expresion(paso)+":"+fin);
	bloque(prog,++r,q,tabs+"\t");
	insertar(prog,tabs+"end");
}
예제 #6
0
void VbExporter::para(t_output &prog, t_proceso_it r, t_proceso_it q, string tabs){
	string var=expresion((*r).par1), ini=expresion((*r).par2), fin=expresion((*r).par3), paso=(*r).par4;
	if (paso=="1")
		insertar(prog,tabs+"For "+var+"="+ini+" To "+fin);
	else
		insertar(prog,tabs+"For "+var+"="+ini+" To "+fin+" Step "+expresion(paso));
	bloque(prog,++r,q,tabs+"\t");
	insertar(prog,tabs+"Next "+var);
}
예제 #7
0
void factor() {
    int clase_rerere_loca;
    switch (sbol->codigo) {
    case CIDENT:

        if(en_tabla(sbol->lexema) != NIL) { /*&*/
            clase_rerere_loca = Clase_Ident(sbol->lexema);
            switch (clase_rerere_loca) {
            case CLASPAR:
            case CLASVAR:
                variable();
                break;
            case CLASFUNC:
                llamada_funcion();
                break;
            default:
                error_handler(8);// palabra reservada
            }
        } else {
            // no esta en la tabla
            error_handler(33); // identificador no declarado
            inf_id->ptr_tipo = en_tabla("TIPOERROR");
            variable();
        }

        break;

    case CCONS_ENT:
    case CCONS_FLO:
    case CCONS_CAR:
        constante();
        break;
    case CCONS_STR:
        scanner();
        break;
    case CPAR_ABR: {
        scanner();
        expresion();
        if (sbol->codigo == CPAR_CIE) {
            scanner();
        } else {
            error_handler(20);    // falta )
        }
        break;
    }
    case CNEG: {
        scanner();
        expresion();
        break;
    }
    default:
        error_handler(31); // error de factor
    }

}
예제 #8
0
void lista_expresiones() {

    expresion();

    while (sbol->codigo == CCOMA) {
        scanner();

        expresion();
    }

}
예제 #9
0
void MatLabExporter::repetir(t_output &prog, t_proceso_it r, t_proceso_it q, string tabs){
	string auxvar=get_aux_varname("aux_logica_");
	insertar(prog,tabs+auxvar+"=true;");
	insertar(prog,tabs+"while "+auxvar);
	bloque(prog,++r,q,tabs+"\t");
	if ((*q).nombre=="HASTAQUE")
		insertar(prog,tabs+"\t"+auxvar+"="+expresion(invert_expresion((*q).par1))+";");
	else
		insertar(prog,tabs+"\t"+auxvar+"="+expresion((*q).par1)+";");
	insertar(prog,tabs+"end");
	release_aux_varname(auxvar);
}
예제 #10
0
/* <listaExpresiones> → <expresión> #escribir_exp {, <expresión> #escribir_exp} */
void lista_expresiones(void) {
	
	struct reg_expr result_reg;
	
	expresion(&result_reg);
	escribir_exp(&result_reg);
	while(prox_token() == COMA) {
		match(COMA);
		expresion(&result_reg);
		escribir_exp(&result_reg);
	}
}
예제 #11
0
void proposicion_seleccion() {

    if (sbol->codigo == CIF) {
        scanner();
    } else {
        error_handler(27);    // falta if
    }

    if (sbol->codigo == CPAR_ABR) {
        scanner();
    } else {
        error_handler(19);    // falta parentesis que abre
    }

    expresion();

    if (sbol->codigo == CPAR_CIE) {
        scanner();
    } else {
        error_handler(20);    // falta parentesis que cierra
    }
    pushTB();
    proposicion();

    if (sbol->codigo == CELSE) {
        scanner();
        pushTB();
        proposicion();
    }

}
예제 #12
0
void proposicion_iteracion() {

    if (sbol->codigo == CWHILE) {
        scanner();
    } else {
        error_handler(26);    // falta while
    }

    if (sbol->codigo == CPAR_ABR) {
        scanner();
    } else {
        error_handler(19);    // falta parentesis que abre
    }

    expresion();

    if (sbol->codigo == CPAR_CIE) {
        scanner();
    } else {
        error_handler(20);    // falta parentesis que cierra
    }
    pushTB();
    proposicion();

}
예제 #13
0
/*
 *	<sentencia> →
 *	<identificador> := <expresión> #asignar ;  |
 *	leer ( <listaIdentificadores> ) ; |
 *	escribir ( <listaExpresiones> ) ;
 */
void sentencia(void) {
	token tok = prox_token();
	struct reg_expr id_reg, result_reg;
	
	switch(tok) {
		case ID:
			identificador(&id_reg);
			match(ASIGNACION);
			expresion(&result_reg);
			asignar(&id_reg, &result_reg);
			match(PUNTOYCOMA);
			break;
		case LEER:
			match(LEER);
			match(PARENIZQUIERDO);
			lista_identificadores();
			match(PARENDERECHO);
			match(PUNTOYCOMA);
			break;
		case ESCRIBIR:
			match(ESCRIBIR);
			match(PARENIZQUIERDO);
			lista_expresiones();
			match(PARENDERECHO);
			match(PUNTOYCOMA);
			break;
		default:
			error_sintactico(tok);
			return;
	}
}
예제 #14
0
void primaria(reg_expr * reg) {
    /* <primaria> -> <identificador>
	 *             | CONSTANTE
	 *             | PARENIZQUIERDO <expresión> PARENDERECHO
	 */
	token tok = next_token();
	switch (tok) {
		case ID:
			identificador(reg);
			break;

		case CONSTANTE:
			match(CONSTANTE);
			*reg = procesar_cte(); // #procesar_cte
			break;

		case PARENIZQUIERDO:
			match(PARENIZQUIERDO);
			expresion(reg);
			match(PARENDERECHO);
			break;

		default:
			syntax_error(tok, "PRIMARIA");
	}
}
예제 #15
0
//condicion
void condicion()
{
 if (token==oddtok) {
    obtoken();
    expresion();
 }
 else {
    expresion();
    if ( (token!=igl) && (token!=nig) && (token!=mnr) && (token!=mei) && (token!=myr) && (token!=mai) )
       error(20); //error 20: Se esperaba un operador relacional 
    else {
       obtoken();
	   expresion(); 
	}
 }
}
예제 #16
0
//factor
void factor()
{
 int i;
 if (token==ident) {
    i=posicion();
    if (i==0) 
       error(11); //error 11: Identificador no declarado
    else
       if (tabla[i].tipo==PROCEDIMIENTO)
	      error(21); //error 21: Una expresión no debe contener un identificador de procedimiento
	obtoken();
 }
 else 
    if (token==entero || token == real) 
       obtoken();
    else
       if (token==parena) {
          obtoken();
          expresion();
		  if (token==parenc)
             obtoken();
          else
             error(22); //error 22: Falta un paréntesis de cierre  
       }
	   else 
		  error(23); //error 23: El factor anterior no puede ir seguido de este símbolo 
}
예제 #17
0
void lista_expresiones(void) {
	// <listaExpresiones> -> <expresión> {COMA <expresión>}
	reg_expr exp;
    do {
        expresion(&exp);
        escribir_exp(&exp); // #escribir_exp
    } while(next_token() == COMA && (match(COMA), true));
}
예제 #18
0
void proposicion_e_s() {

    switch(sbol->codigo) {
    case CIN: {
        scanner();
        if (sbol->codigo == CSHR) {
            scanner();
        } else {
            error_handler(28);    // falta  >>
        }
        variable();
        while (sbol->codigo == CSHR) {
            scanner();
            variable();
        }
        if (sbol->codigo == CPYCOMA) {
            scanner();
        } else {
            error_handler(22);    // falta ;
        }
        break;
    }
    case COUT: {
        scanner();
        if (sbol->codigo == CSHL) {
            scanner();
        } else {
            error_handler(29);    // falta <<
        }
        expresion();
        while (sbol->codigo == CSHL) {
            scanner();
            expresion();
        }
        if (sbol->codigo == CPYCOMA) {
            scanner();
        } else {
            error_handler(22);    // falta ;
        }
        break;
    }
    default:
        error_handler(30); // %& //falta << o >>
    }
}
예제 #19
0
void MatLabExporter::si(t_output &prog, t_proceso_it r, t_proceso_it q, t_proceso_it s, string tabs){
	insertar(prog,tabs+"if "+expresion((*r).par1));
	bloque(prog,++r,q,tabs+"\t");
	if (q!=s) {
		insertar(prog,tabs+"else");
		bloque(prog,++q,s,tabs+"\t");
	}
	insertar(prog,tabs+"end");
}
예제 #20
0
void VbExporter::si(t_output &prog, t_proceso_it r, t_proceso_it q, t_proceso_it s, string tabs){
	insertar(prog,tabs+"If "+expresion((*r).par1)+" Then");
	bloque(prog,++r,q,tabs+"\t");
	if (q!=s) {
		insertar(prog,tabs+"Else");
		bloque(prog,++q,s,tabs+"\t");
	}
	insertar(prog,tabs+"End If");
}
예제 #21
0
void MatLabExporter::leer(t_output &prog, t_arglist args, string tabs){
	t_arglist_it it=args.begin();
	while (it!=args.end()) {
		tipo_var t;
		string varname=expresion(*it,t);
		if (t==vt_caracter) insertar(prog,tabs+varname+"=input(\'\',\'s\');");
		else insertar(prog,tabs+varname+"=input(\'\');");
		++it;
	}
}
예제 #22
0
void MatLabExporter::definir(t_output &prog, t_arglist &arglist, string tipo, string tabs) {
	if (tipo=="ENTERO") tipo="0";
	else if (tipo=="REAL") tipo="0";
	else if (tipo=="LOGICO") tipo="false";
	else tipo="\'\'";
	t_arglist_it it=arglist.begin();
	while (it!=arglist.end()) {
		insertar(prog,tabs+expresion(*it)+"="+tipo+";");
		++it;
	}
}
예제 #23
0
void VbExporter::escribir(t_output &prog, t_arglist args, bool saltar, string tabs){
	t_arglist_it it=args.begin();
	string linea;
	while (it!=args.end()) {
		if (linea.size()) linea+=",";
		linea+=expresion(*it);
		++it;
	}
	if (saltar) linea=string("Console.WriteLine(")+linea+")"; 
	else linea=string("Console.Write(")+linea+")";
	insertar(prog,tabs+linea);
}
예제 #24
0
void VbExporter::leer(t_output &prog, t_arglist args, string tabs){
	t_arglist_it it=args.begin();
	while (it!=args.end()) {
		tipo_var t;
		string varname=expresion(*it,t);
		if (t==vt_numerica && t.rounded) insertar(prog,tabs+varname+" = Integer.Parse(Console.ReadLine())");
		else if (t==vt_numerica) insertar(prog,tabs+varname+" = Double.Parse(Console.ReadLine())");
		else if (t==vt_logica) insertar(prog,tabs+varname+" = Boolean.Parse(Console.ReadLine())");
		else  insertar(prog,tabs+varname+" = Console.ReadLine()");
		++it;
	}
}
예제 #25
0
void proposicion_retorno() {

    flag_hay_return = TRUE;
    scanner();
    expresion();
    if (sbol->codigo == CPYCOMA) {
        scanner();
    } else {
        error_handler(22);    // falta ;
    }

}
예제 #26
0
void expresion() {

    expresion_simple();

    switch (sbol->codigo) {
    case CASIGNAC: {
        scanner();
        expresion();
        break;
    }
    case CDISTINTO:
    case CIGUAL:
    case CMENOR:
    case CMEIG:
    case CMAYOR:
    case CMAIG: {
        scanner();
        expresion();
        break;
    }
    }
}
예제 #27
0
void VbExporter::dimension(t_output &prog, t_arglist &args, string tabs) {
	t_arglist_it it=args.begin();
	while (it!=args.end()) {
		string name=*it;
		name.erase(name.find("("));
		tipo_var t = memoria->LeerTipo(name);
		string stipo="String";
		if (t==vt_caracter) { stipo="String"; }
		else if (t==vt_numerica) stipo=t.rounded?"Integer":"Double";
		else if (t==vt_logica) stipo="Boolean";
		insertar(prog,tabs+"Dim "+expresion(*it)+" As "+stipo);
		++it;
	}
}
예제 #28
0
void variable() {
    char str_aux[9]; /*&*/
    if (sbol->codigo == CIDENT) {
        if(inf_id->ptr_tipo == en_tabla("TIPOERROR")) {/*&*/ // si no esta declarada me interesa
            strcpy(inf_id->nbre,sbol->lexema); 	   // el nombre del id para insertarlo
            inf_id->clase=CLASVAR;
        }
        strcpy(str_aux,sbol->lexema);/*&*/ //necesito saber el nbre del ident para chekear si es tipo arreglo
        scanner();
    } else {
        error_handler(16);    // falta identificador
    }



    if (sbol->codigo == CCOR_ABR) {
        if(inf_id->ptr_tipo == en_tabla("TIPOERROR")) {/*&*/ // si es un arreglo no declarado me interesa guardarlo
            inf_id->ptr_tipo = en_tabla("TIPOARREGLO"); // como arreglo
            inf_id->desc.part_var.arr.ptero_tipo_base = en_tabla("TIPOERROR");
        } else {
            if(Tipo_Ident(str_aux) != en_tabla("TIPOARREGLO")) { // si esta en la tabla me fijo que sea arreglo
                error_handler(32);    // la variable no es de tipo arreglo
            }
        }
        scanner();
        expresion();
        if (sbol->codigo == CCOR_CIE) {
            scanner();
        } else {
            error_handler(21);    // falta ]
        }
    } else {
        if(inf_id->ptr_tipo != en_tabla("TIPOERROR") && Tipo_Ident(str_aux) == en_tabla("TIPOARREGLO")
                && !inInvocation) { // checkeo no estar en una invocacion
            error_handler(40); // en una expresiòn las variables deben ser accedidas por sus elementos
        }
    }
    if(inf_id->ptr_tipo == en_tabla("TIPOERROR")) {
        if (!insertarTS()) {
            error_handler(9);
        }
    } else {
        if(inf_id->ptr_tipo == en_tabla("TIPOARREGLO") && (inf_id->desc.part_var.arr.ptero_tipo_base == en_tabla("TIPOERROR"))) {
            if (!insertarTS()) {
                error_handler(9);
            }
        }
    }

}
예제 #29
0
void proposicion_expresion() {

    if (sbol->codigo == CMAS || sbol->codigo == CMENOS ||
            sbol->codigo == CIDENT ||
            sbol->codigo == CPAR_ABR || sbol->codigo == CNEG ||
            sbol->codigo == CCONS_ENT || sbol->codigo == CCONS_FLO ||
            sbol->codigo == CCONS_CAR || sbol->codigo == CCONS_STR)

    {
        expresion();
    }

    if (sbol->codigo == CPYCOMA) {
        scanner();
    } else {
        error_handler(22);    // falta ;
    }
}
예제 #30
0
void MatLabExporter::dimension(t_output &prog, t_arglist &args, string tabs) {
	ExporterBase::dimension(prog,args,tabs);
	t_arglist_it it=args.begin();
	while (it!=args.end()) {
		// obtener nombre y dimensiones
		string name=*it, dims=*it;
		name.erase(name.find("("));
		dims.erase(0,dims.find("(")+1);
		dims.erase(dims.size()-1,1);
		dims=expresion(dims);
		if (dims.find(",")==string::npos) dims=string("1,")+dims;
		// armar la linea que hace el new
		if (memoria->LeerTipo(name)==vt_caracter) {
			insertar(prog,tabs+ToLower(name)+"=cell("+dims+");");
			use_string_matrix=true;
		} else {
			insertar(prog,tabs+ToLower(name)+"=zeros("+dims+");");
		}
		++it;
	}
}