void jugar(int **tab) { int i,j,pos; bool bandera = true; while(bandera) { printf("\nSeleccione la posicion i , j separadas por un espacio\n"); scanf("%d",&i); scanf("%d",&j); i -= 1; j -= 1; if(i<TAM && j< TAM && i>=0 && j>=0) { if((*tab)[posicion(i,j)]!=0) printf("\nPosicion ocupada: Elije otra\n"); else { (*tab)[posicion(i,j)] = O; bandera = false; } } } }
void declaracionboolean() { //boolean variable := [true,false,0,1] int i; if (token==ident) { //ve a buscarlo a la tabla de símbolos i=posicion(); if (i==0) { error(11); //error 11: identificador no declarado } else if (buscarElemento(i) -> tipo != VARIABLE) error(12); //error 12: no están permitidas las asignaciones a constantes o a procedimientos obtoken(); if (token==asignacion) { //mejora del tipo "adivinación" de la intención del programador obtoken(); switch(token){ case truetok: break; case falsetok: break; default: error(40); break; //No coinciden tipos } obtoken(); if(token == puntoycoma){ obtoken(); }else{ error(5); //punto y coma } } else error (3) ; //error 3: el identificador debe ir seguido de ":=" } else error(4) ; //error 4: Boolean, Const, Var y Procedure deben ir seguidos de un identificador }
//declaracionconst //se checa que se tenga una definición de constante. si está bien //el identificador se pone en la tabla de símbolos, otro caso //el programador cometió un error al construir la definición de constante void declaracionconst() { int i; if (token==ident) { i=posicion(); if (i!=0) { error(41); //error 11: No se deben redefinir objetos } obtoken(); if ( (token==igl) || (token==asignacion) ) { //mejora del tipo "adivinación" de la intención del programador if (token==asignacion) error(1); //error 1: usar '=" en vez de ":=". es la misma técnica que en C & C++ se usa para if (x=) por if (x==) obtoken(); if (token == entero || token == real) { poner(CONSTANTE); obtoken(); } else error(2) ; //error 2: debe ir seguido de un número } else error (3) ; //error 3: el identificador debe ir seguido de "=" } else error(4) ; //error 4: Const, Var y Procedure deben ir seguidos de un identificador }
//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 imprimir(int **tab) { int i, j; for(i=0; i<TAM; i++) { printf("\n"); for(j=0; j<TAM; j++) { if((*tab)[posicion(i,j)]==X) printf("X\t"); else if((*tab)[posicion(i,j)]==O) printf("O\t"); else printf("-\t"); } } printf("\n"); }
void Celda::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { QPair<int,int> posicion(pos.y()/65,pos.x()/65); set<QPair<int,int> > movPosibles = juego->getMovimientosPosibles(juego->getTurno()); if (movPosibles.find(posicion) != movPosibles.end()) { p = pen(); QPen newPen(Qt::SolidLine); newPen.setWidth(3); setPen(newPen); entroHover = 1; } }
//declaracionvar //se checa que se tenga una declaración de variable. si está bien //el identificador se pone en la tabla de símbolos, otro caso //el programador cometió un error al construir la declaración de variable void declaracionvar() { int i; if (token==ident) { i=posicion(); if (i!=0) { error(41); //error 11: No se deben redefinir objetos } poner(VARIABLE); obtoken(); } else error(4) ; //error 4: Const, Var y Procedure deben ir seguidos de un identificador }
void alta (char *nomfich) { FILE *fiche; registro regaux, regalta, indice; int posi = 0, sgte1; // Abre el fichero fiche = fopen (nomfich, "r+b"); // Lee el indice fread (&indice, sizeof (registro), 1, fiche); // Introduce la clave printf ("Introduce la clave y el dato del registro: "); scanf ("%d %d %c", ®alta.clave, ®alta.dato); // Calcula la posición de la clave posi = posicion (regalta.clave); // Lee el registro de esa posición fseek (fiche, posi * sizeof (registro), SEEK_SET); fread (®aux, sizeof (registro), 1, fiche); // Se posiciona posi en el último registro con un valor while (regaux.activo && regaux.sgte) { posi = regaux.sgte; fseek (fiche, posi * sizeof (registro), SEEK_SET); fread (®aux, sizeof (registro), 1, fiche); } // Ajustar la lista de espacios libres fseek (fiche, (indice.sgte) * sizeof (registro), SEEK_SET); fread (®aux, sizeof (registro), 1, fiche); // 1º registro libre sgte1 = regaux.sgte; regalta.activo = SI; regalta.sgte = 0; //se situa en el registro a dar de alta y lo escribe fseek (fiche, (indice.sgte) * sizeof (registro), SEEK_SET); fwrite (®alta, sizeof (registro), 1, fiche); indice.sgte = sgte1; fseek (fiche, 0, SEEK_SET); fwrite (&indice, sizeof (registro), 1, fiche); printf ("Registro dado de alta.\n"); }
//factor void factor(int toksig[]) { int i; int setpaso[NOTOKENS]; //conjunto de paso por valor test(tokinifact,toksig,24); //error(24): Una expresión no puede empezar con este símbolo while (tokinifact[token]==1) { //mientras el token sea un símbolo inicial de factor... if (token==ident) { i=posicion(); if (i==0) { copia_set(setpaso,toksig); setpaso[parenc]=1; //setpaso=parenc+toksig funcion(setpaso); //error(11); //error 11: Identificador no declarado }else if (buscarElemento(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(); copia_set(setpaso,toksig); setpaso[parenc]=1; //setpaso=parenc+toksig expresion(setpaso); if (token==parenc) obtoken(); else error(22); //error 22: Falta un paréntesis de cierre }; init_set(setpaso); //conjunto vacío setpaso[parena]=1; //setpaso=parena test(toksig,setpaso,23); //error(23): El factor anterior no puede ir seguido de este simbolo o falta un punto y coma } }
void funcion(int toksig[]) { int i; if (strcmp(lex, "READ") == 0 || strcmp(lex, "READLN") == 0) { obtoken(); if (token == parena) { obtoken(); if (token == ident) { i = posicion(); if (i == 0) { // no se encontro el identificador error(11); // identificador no declarado } else if (buscarElemento(i) -> tipo==PROCEDIMIENTO) { error(21); //error 21: identificador de procedimiento } else { // era un identificador valido obtoken(); if (token == parenc) { // todo nice obtoken(); } else error(27);// se esperaba un parentesis de cierre } } else error(28); } else error(26); // se esperaba una lista de argumentos } else if (strcmp(lex, "WRITE") == 0 || strcmp(lex, "WRITELN") == 0 ){ obtoken(); if (token == parena) { obtoken(); if (token == string) { obtoken(); if (token == coma) { obtoken(); } else error(5); // falta coma o punto y coma } if (token == ident) { i = posicion(); if (i == 0) { // no se encontro el identificador error(11); // identificador no declarado } else if (buscarElemento(i) -> tipo==PROCEDIMIENTO) { error(21); //error 21: identificador de procedimiento } else { // era un identificador valido obtoken(); if (token == parenc) { // todo nice obtoken(); } else error(27); } } else error(28); } else error(26); // se esperaba una lista de argumentos } //random else if (strcmp(lex, "RND") == 0 || strcmp(lex, "CLRSCR") == 0 || strcmp(lex, "HALT") == 0 ){ obtoken(); if (token == parena) { obtoken(); if (token == parenc) { obtoken(); } else error(27);//se esperaba parentesis de cierre } } //pitagoras else if (strcmp(lex, "PITAG") == 0 ){ obtoken(); if (token == parena) { obtoken(); if (token == ident) { obtoken(); if (token == coma) { obtoken(); if (token == ident) { obtoken(); if (token == coma) { obtoken(); if (token == ident) { obtoken(); if (token == parenc) { obtoken(); } else error(27); // se esperaba parentesis de cierre } else error(36); // se esperaba un identificador } else error(5); // falta coma o punto y coma } else error(36); // se esperaba un identificador } else error(5); // falta coma o punto y coma } else error(36); // se esperaba un identificador } else error(37); // se esperaba parentesis de apertura } else error(11); // identificador no declarado }
//instruccion void instruccion(int toksig[]) { int i; int setpaso[NOTOKENS]; //conjunto de paso por valor int vacio[NOTOKENS]; //conjunto vacío init_set(vacio); if (token==ident) { if (esFuncion()) { copia_set(setpaso,toksig); funcion(setpaso); } else { //ve a buscarlo a la tabla de símbolos i=posicion(); if (i==0) { error(11); //error 11: identificador no declarado } else if (buscarElemento(i) -> tipo != VARIABLE) error(12); //error 12: no están permitidas las asignaciones a constantes o a procedimientos obtoken(); if (token==asignacion) obtoken(); else error(13); //error 13: se esperaba el operador de asignación copia_set(setpaso,toksig); expresion(setpaso); } } else if (token==calltok) { obtoken(); if (token!=ident) error(14); //error 14: "CALL" debe ir seguido de un identificador else { //buscar el nombre del procedimiento en la tabla de símbolos i=posicion(); if (i==0) error(11); //error 11: Identificador no declarado else if (buscarElemento(i) -> tipo!=PROCEDIMIENTO) error(15); //error 15 : No tiene sentido llamar a una constante o a una variable obtoken(); } } else if (token==iftok) { obtoken(); copia_set(setpaso,toksig); setpaso[thentok]=setpaso[dotok]=1; //setpaso=thentok+dotok+toksig condicion(setpaso); if (token==thentok) obtoken(); else error(16); //error 16: Se esperaba un "THEN" copia_set(setpaso,toksig); instruccion(toksig); } else if (token==begintok) { obtoken(); copia_set(setpaso,toksig); setpaso[puntoycoma]=setpaso[endtok]=1; //setpaso=puntoycoma+endtok+toksig instruccion(setpaso); while (token==puntoycoma || token==calltok || token==begintok || token==iftok || token==whiletok || token == fortok) { //aquí el while 'inserta' el punto y coma para continuar compilando cuando no lo encuentre //el compilador detecta la omisión clásica del punto y coma if (token==puntoycoma) obtoken(); else error(10); //error 10: Falta un punto y coma entre instrucciones copia_set(setpaso,toksig); setpaso[puntoycoma]=setpaso[endtok]=1; //setpaso=puntoycoma+endtok+toksig instruccion(setpaso); } if (token==endtok) obtoken(); else error(17); //error 17: Se esperaba un "END" o un punto y coma } else if (token==whiletok) { obtoken(); copia_set(setpaso,toksig); setpaso[dotok]=1;//setpaso=dotok+toksig condicion(setpaso); if (token==dotok) obtoken(); else error(18); //error 18: Se esperaba un "DO" copia_set(setpaso,toksig); instruccion(setpaso); } else if (token == fortok) { obtoken(); copia_set(setpaso,toksig); setpaso[dotok]=1;//setpaso=dotok+toksig if (token == ident) { i = posicion(); if (i == 0) { // no se encontro el identificador error(11); // identificador no declarado } else if (buscarElemento(i) -> tipo==PROCEDIMIENTO) { error(21); //error 21: identificador de procedimiento } else { // era un identificador valido obtoken(); if (token == intok) { obtoken(); if (token == entero) { obtoken(); if (token == dospuntos) { obtoken(); if (token == entero) { obtoken(); if (token == dotok) { obtoken(); copia_set(setpaso,toksig); instruccion(setpaso); } else { error(18); } } else { error(38); // se esperaba un numero entero } } else { error(39); // se esperaban dos puntos } } else { error(38); // se esperaba un numero entero } } else { error(29); // se esperaba un IN despues del FOR } } } else error(28); } else if (token == booleantok) { obtoken(); declaracionboolean(); } else if (token == codigoptok) { obtoken(); declaracioninline(); } //comprobación explícita de que los tokens que viene son sucesores de instrucción copia_set(setpaso,toksig); test(setpaso,vacio,19); //error(19): Un simbolo incorrecto sigue a una instrucción }
void alta (char *nomfich) { FILE *fiche; registro regaux, regalta, indice; int posi = 0, sgte1, posi2, band = 0; // Abre el fichero fiche = fopen (nomfich, "r+b"); // Lee el indice fread (&indice, sizeof (registro), 1, fiche); // Introduce la clave printf ("Introduce la clave y el dato del registro: "); scanf ("%d %d", ®alta.clave, ®alta.dato); // Calcula la posición de la clave posi = posicion (regalta.clave); if (posi == 0) posi = 10; // Lee el registro de esa posición fseek (fiche, posi * sizeof (registro), SEEK_SET); fread (®aux, sizeof (registro), 1, fiche); // Se posiciona posi en el último registro con un valor posi2 = posi; if (regaux.activo) { if (regaux.sgte) while (regaux.sgte) { posi = regaux.sgte; fseek (fiche, posi * sizeof (registro), SEEK_SET); fread (®aux, sizeof (registro), 1, fiche); posi2 = posi; } if (regaux.clave == regalta.clave) band = 1; else { posi = indice.sgte; regaux.sgte = indice.sgte; fseek (fiche, posi2 * sizeof (registro), SEEK_SET); fwrite (®aux, sizeof (registro), 1, fiche); } } if (!band) { // Completa el registro regalta.activo = SI; regalta.sgte = 0; // Decide según está en z. principal o de colisiones if (posi) { if (posi > REGISTROS) { fseek (fiche, posi * sizeof (registro), SEEK_SET); fread (®aux, sizeof (registro), 1, fiche); indice.sgte = regaux.sgte; fseek (fiche, 0, SEEK_SET); fwrite (&indice, sizeof (registro), 1, fiche); } fseek (fiche, posi * sizeof (registro), SEEK_SET); fwrite (®alta, sizeof (registro), 1, fiche); // 1º registro libre printf ("Registro dado de alta.\n"); } else printf ("No hay espacio."); } else printf ("La clave ya existe."); getch (); fclose (fiche); }
void baja (char *nomfich) { FILE *fiche; registro regbaja, regaux, regaux2, regaux3, indice; int num, posi, posi2 = 0, aux; fiche = fopen (nomfich, "r+b"); printf ("Introduzca la clave a dar de baja: "); scanf ("%d", &num); fseek (fiche, 0, SEEK_SET); fread (&indice, sizeof (registro), 1, fiche); regaux.sgte = indice.sgte; regaux.activo = NO; regaux.clave = 0; regaux.dato = 0; posi = posicion (num); fseek (fiche, posi * sizeof (registro), SEEK_SET); fread (®baja, sizeof (registro), 1, fiche); if (regbaja.activo) { while ((num != regbaja.clave) && (regbaja.sgte)) { posi2 = posi; posi = regbaja.sgte; fseek (fiche, posi * sizeof (registro), SEEK_SET); fread (®baja, sizeof (registro), 1, fiche); } if (num == regbaja.clave) { if (posi2) { //zona de colisiones fseek (fiche, posi * sizeof (registro), SEEK_SET); fread (®aux3, sizeof (registro), 1, fiche); fseek (fiche, posi2 * sizeof (registro), SEEK_SET); fread (®aux2, sizeof (registro), 1, fiche); aux = regaux2.sgte; regaux2.sgte = regaux3.sgte; regaux.sgte = indice.sgte; indice.sgte = aux; fseek (fiche, 0, SEEK_SET); fwrite (&indice, sizeof (registro), 1, fiche); fseek (fiche, posi2 * sizeof (registro), SEEK_SET); fwrite (®aux2, sizeof (registro), 1, fiche); fseek (fiche, posi * sizeof (registro), SEEK_SET); fwrite (®aux, sizeof (registro), 1, fiche); } else { //zona principal if (regbaja.sgte) { //si tiene continuacion fseek (fiche, regbaja.sgte * sizeof (registro), SEEK_SET); fread (®aux2, sizeof (registro), 1, fiche); fseek (fiche, regbaja.sgte * sizeof (registro), SEEK_SET); fwrite (®aux, sizeof (registro), 1, fiche); fseek (fiche, posi * sizeof (registro), SEEK_SET); fwrite (®aux2, sizeof (registro), 1, fiche); fseek (fiche, 0, SEEK_SET); indice.sgte = regbaja.sgte; fwrite (&indice, sizeof (registro), 1, fiche); } else { //si sólo está esa clave regaux.sgte = 0; fseek (fiche, posi * sizeof (registro), SEEK_SET); fwrite (®aux, sizeof (registro), 1, fiche); } } printf ("Registro dado de baja."); } else printf ("No se ha encontrado la clave dada."); } else printf ("La clave especificada no estaba dada de alta."); getch (); fclose (fiche); }
// energia mecanica TFloat energiaMecanica(const Datos& d, TFloat t) { TFloat dos_tf=TFloat(2.0,pr); return posicion(d, t)*g + velocidad(d,t)*velocidad(d,t) / dos_tf; }
void reconocedor(FILE * archivo,FILE * tmp){ //Se encarga de obtener los nombres y valores definidos por el #define rewind(archivo); int _estaDefinido=0; char guardar[33]; char guardar2[33]; char *nombre[_totalDefine]; char *valor[_totalDefine]; int pos; palabras palabras = escaner(archivo); int esta=0; while (palabras!=FIN){ switch(palabras){ case NOT_COMMENT: clear_buffer(); buffer_char(c); fprintf(tmp,"/%s",token_buffer); break; case DEFINE: //No se pasa con el & debido a que la estructura ya es *guardar if (raro==1){ memset(guardar2, '\0', sizeof(guardar2)); escaner(archivo); pos= posicion(nombre); asignar_nombre(guardar,archivo); nombre[pos]=strdup(guardar); asignar_valor(guardar2,archivo); valor[pos]=strdup(guardar2); if (pos==cont){ cont ++; } raro=0; } break; case ANYWORD: esta =0; int i=0; for (i<cont;i++;){ if (strcmp(nombre[i],token_buffer)==0){ fprintf(tmp, "%s",valor [i]); esta=1; } } if (esta==0){ fprintf(tmp, "%s", token_buffer); } break; case PUNTUACTION: //signo_puntuacion=0; if (strlen(token_buffer)==0){ buffer_char(c); fprintf(tmp,"%s",token_buffer); break; } else{ _estaDefinido = 0; //Si no esta definido solo imprimo if (_estaDefinido == 0){ fprintf(tmp,"%s",token_buffer); clear_buffer(); buffer_char(c); fprintf(tmp,"%s", token_buffer); break; } break; } case ESPACIO: imprimir_espacios(); break; default: break; } palabras = escaner(archivo); //Llamamos a cambiador para reescribir el texto por su respectivo valorr }}
//instruccion void instruccion() { int i; if (token==ident) { //ve a buscarlo a la tabla de símbolos i=posicion() ; if (i==0) error(11); //error 11: identificador no declarado else if (tabla[i].tipo != VARIABLE) error(12); //error 12: no están permitidas las asignaciones a constantes o a procedimientos obtoken(); if (token==asignacion) obtoken(); else error(13) ; //error 13: se esperaba el operador de asignación expresion(); } else if (token==calltok) { obtoken(); if (token!=ident) error(14); //error 14: "CALL" debe ir seguido de un identificador else { //buscar el nombre del procedimiento en la tabla de símbolos i=posicion(); if (i==0) error(11); //error 11: Identificador no declarado else if (tabla[i].tipo!=PROCEDIMIENTO) error(15); //error 15 : No tiene sentido llamar a una constante o a una variable obtoken(); } } else if (token==iftok) { obtoken(); condicion(); if (token==thentok) obtoken(); else error(16); //error 16: Se esperaba un "THEN" instruccion(); } else if (token==begintok) { obtoken(); instruccion(); while (token==puntoycoma) { obtoken(); instruccion(); } if (token==endtok) obtoken(); else error(17); //error 17: Se esperaba un "END" o un punto y coma } else if (token==whiletok) { obtoken(); condicion(); if (token==dotok) obtoken(); else error(18); //error 18: Se esperaba un "DO" instruccion(); } }