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"); }
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"); }
//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); } } }
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)); }
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"); }
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); }
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 } }
void lista_expresiones() { expresion(); while (sbol->codigo == CCOMA) { scanner(); expresion(); } }
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); }
/* <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); } }
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(); } }
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(); }
/* * <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; } }
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"); } }
//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(); } } }
//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 }
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)); }
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 >> } }
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"); }
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"); }
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; } }
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; } }
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); }
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; } }
void proposicion_retorno() { flag_hay_return = TRUE; scanner(); expresion(); if (sbol->codigo == CPYCOMA) { scanner(); } else { error_handler(22); // falta ; } }
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; } } }
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; } }
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); } } } }
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 ; } }
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; } }