int main(int argc, char **argv){ LexemeTable *tab = new LexemeTable(); Analex analex(tab); Anasin anasin(tab); CuadrupleGenerator cuadrupleGenerator(tab); if (argc != 2){ std::cout << "Uso: " << argv[0] << " [file name]" << std::endl; return (-1); } // Run Analex analex.run(argv[1]); // Write Symbol Table std::cout << std::endl << "Tabla de simbolos escrita en symbolTable.txt" << std::endl; tab->writeToFile(); /* Run Anasin */ if(anasin.run(tab)){ std::cout << "Gramática Aceptada" << std::endl; cuadrupleGenerator.run(tab); cuadrupleGenerator.writeToFile(); cuadrupleGenerator.printCuadruples(); }else{ std::cout << "Gramática Denegada" << std::endl; } std::cout << std::endl; return (0); }
void runAndClean(){ fprintf(stdout, "\n-----Ejectuando Analizador Sintactico-----\n\n"); // Corre anasin anasin(); // Reinicia automatas y limpia inputs clear(&pila); clearInput(); freeInp(); inputSize = 0; inputSizeLex = 0; }
int main (int argc, const char * argv[]) { int i; /*Stack hola; initStack(&hola); for (i=0; i<53; i++) { push(&hola, i); if(i%3 == 0){ pop(&hola); } char ret[BUFSIZ]; memset(ret, '\0', BUFSIZ); int pilaprint[BUFSIZ]; int k; despliega(&hola, pilaprint); for (k=0; k<hola.size; k++) { strcat(ret,itoaC(pilaprint[k])); strcat(ret," "); } fprintf(stdout,"Pila: %s\n", ret); fprintf(stdout,"Size: %d\n\n", hola.size); }*/ if (argc != 2) { fprintf(stderr, "Forma de uso: %s origen\n",argv[0]); return -1; } if((fuente=fopen(argv[1],"r")) == NULL){ fprintf(stderr, "Error al abrir el archivo: %s",argv[1]); return -1; } if ((fdLexemas=open("lexemas.txt",O_WRONLY | O_CREAT | O_TRUNC,0666)) < 0) { fprintf(stderr, "Error al crear archivo lexemas.txt"); return -1; } if ((fdTabla=open("tabla_simbolos.txt",O_WRONLY | O_CREAT | O_TRUNC,0666)) < 0) { fprintf(stderr, "Error al crear archivo tabla_simbolos.txt"); return -1; } if ((fdOutput=open("output.txt",O_WRONLY | O_CREAT | O_TRUNC,0666)) < 0) { fprintf(stderr, "Error al crear archivo output.txt"); return -1; } //Crear automatas automata automatas[cuantosAutomatas]; automatas[0].funcion = automataComentarios; automatas[1].funcion = automataIdentificadores; automatas[2].funcion = automataOperadoresLogicos; automatas[3].funcion = automataOperadoresComparacion; automatas[4].funcion = automataOperadoresAsignacion; automatas[5].funcion = automataNumerosReales; automatas[6].funcion = automataNumeros; automatas[7].funcion = automataPuntuacion; automatas[8].funcion = automataCadenaCaracteres; automatas[9].funcion = automataOperadoresAgrupacion; automatas[10].funcion = automataAritmetico; reset(automatas); resetInp(); //fprintf(stdout, "Dame opcion a ejecutar:"); //scanf("%d",&eleccion); fprintf(stdout, "\n\n-----Ejectuando Analizador Lexico-----\n\n"); char c; while ((c = getc(fuente)) != EOF) { if (c == '\n' || c == '\t') { continue; } // Si el automata regresa 1 es que llega a estado terminal if (automatas[0].funcion(&automatas[0],c) == 1) { reset(automatas); continue; } if (automatas[1].funcion(&automatas[1],c) == 1) { reset(automatas); continue; } if (automatas[2].funcion(&automatas[2],c) == 1) { reset(automatas); continue; } if (automatas[3].funcion(&automatas[3],c) == 1) { reset(automatas); continue; } if (automatas[4].funcion(&automatas[4],c) == 1) { reset(automatas); continue; } if (automatas[5].funcion(&automatas[5],c) == 1) { reset(automatas); continue; } if (automatas[6].funcion(&automatas[6],c) == 1) { reset(automatas); continue; } if (automatas[7].funcion(&automatas[7],c) == 1) { reset(automatas); continue; } if (automatas[8].funcion(&automatas[8],c) == 1) { reset(automatas); continue; } if (automatas[9].funcion(&automatas[9],c) == 1) { reset(automatas); continue; } if (automatas[10].funcion(&automatas[10],c) == 1) { reset(automatas); continue; } } strcpy(inputLex[inputSizeLex],"$"); strcpy(inputRealLex[inputSizeLex],"$"); inputSizeLex++; // Igualas los datos del analex con los del anasin inputSize = inputSizeLex; cuantosTokens = cuantosTokensLex; for (i=0; i<inputSizeLex; i++) { input[i] = inputLex[i]; inputReal[i] = inputRealLex[i]; } // Transferir arreglo de tokens para que el anasin lo use for (i=0; i<cuantosTokensLex; i++) { tokenTemp[i] = tokenTempLex[i]; } // Inicializa Valores inicializaGramatica(); // Inicializa Pila initStack(&pila); // Correr anasin fprintf(stdout, "\n-----Ejectuando Analizador Sintactico-----\n\n"); int statusAnasin; statusAnasin = anasin(); fprintf(stdout, "\n"); //imprimeTokens(); reset(automatas); clearInput(); clear(&pila); inputSize = inputSizeLex = 0; // Si hay error salir if (errorSintactico == 1) { clear(&pila); return -1; } fclose(fuente); return statusAnasin; }