int main() { PILHA pilhaTesteExercicio; inicializarPilha(&pilhaTesteExercicio); REGISTRO r1; r1.chave = 10; inserirElementoPilha(&pilhaTesteExercicio, r1); exibirPilha(&pilhaTesteExercicio); REGISTRO r2; r2.chave = 20; inserirElementoPilha(&pilhaTesteExercicio, r2); exibirPilha(&pilhaTesteExercicio); REGISTRO r3; r3.chave = 30; inserirElementoPilha(&pilhaTesteExercicio, r3); exibirPilha(&pilhaTesteExercicio); REGISTRO r4; r4.chave = 40; inserirElementoPilha(&pilhaTesteExercicio, r4); exibirPilha(&pilhaTesteExercicio); assert(pilhaTesteExercicio.A[0].chave == 10); assert(pilhaTesteExercicio.A[1].chave == 20); assert(pilhaTesteExercicio.A[2].chave == 30); assert(pilhaTesteExercicio.A[3].chave == 40); int itensABuscar[] = {5, 10, 15, 20, 30, 40, 50}; printf("\nTestes de busca:\n"); int i; for (i = 0; i < 7; i++) printf("Posicao do valor %d: %d\n", itensABuscar[i], buscarElementoPilha(&pilhaTesteExercicio, itensABuscar[i])); assert(pilhaTesteExercicio.A[0].chave == 10); assert(pilhaTesteExercicio.A[1].chave == 20); assert(pilhaTesteExercicio.A[2].chave == 30); assert(pilhaTesteExercicio.A[3].chave == 40); assert(buscarElementoPilha(&pilhaTesteExercicio, 5) == -1); assert(buscarElementoPilha(&pilhaTesteExercicio, 10) == 0); assert(buscarElementoPilha(&pilhaTesteExercicio, 30) == 2); assert(buscarElementoPilha(&pilhaTesteExercicio, 50) == -1); return 0; }
/** * Função responsável por alocar e inicializar a pilha a ser utilizada * no backtracking além de outros campos relevantes do jogo. */ void inicializaJogo(jogo *oJogo){ oJogo->candidatos = (pilha*) malloc(sizeof(pilha)); inicializarPilha(oJogo->candidatos); oJogo->maxMov = 0; }
int analisadorSintatico(FILE* codigo, char** TABGRAFO, char*** TABT, char*** TABNT, char*** ANASIN, int linhasTabNT, int** automato, Hash tab, FILE* tabVar, Hash tabProc){ char nomeArquivo[20]; int* flag1 = (int *)malloc(sizeof(int));; *flag1 = 0; FILE* codigoIntermediario; //Inicializa as Pilhas Pilha* cadeia = inicializarPilha(cadeia); Pilha* naoTerminais = inicializarPilha(naoTerminais); push(naoTerminais,"progrm",10,0); char* cadCaracteres = (char *)malloc(50*sizeof(char)); char* cadTerminais = (char *)malloc(50*sizeof(char)); char* p = (char *)malloc(50*sizeof(char)); //Isso sera alterado quando comecarmos a ler strings ao inves de caracteres char* caracter = (char *)malloc(50*sizeof(char)); int numeroLinha = 0; int aux=0; int aux2=0; int flag = 0; char** vetor = (char **)malloc(4*sizeof(char *)); int i; for(i=0;i<4;i++){ vetor[i] = (char *)malloc(20*sizeof(char)); } int* posicaoArquivo = (int *)malloc(sizeof(int)); int* linhaArquivo = (int *)malloc(sizeof(int)); *linhaArquivo = 1; *posicaoArquivo = 0; while(executaAnalisador(codigo, automato, 34, 7, tab, posicaoArquivo, vetor, tabProc, variaveis, linhaArquivo)) { strcpy(caracter, vetor[1]); printf("\n\nLinha %d | Lexema: \"%s\"\n", aux+1, caracter); if(aux==-1){ printf("\n\n!! Cadeia nao aceita !!\n\n\n"); //printf("\n\nErro na linha %d\n\n",*linhaArquivo); return 0; } while(1){ // para aux == -2 while(aux==-2 && !vaziaNTerminais(naoTerminais)){ //imprimirPilha(naoTerminais); aux = atoi(ANASIN[buscaNoTopo(naoTerminais)][4])-1; printf("Voltando para linha %d.\n", aux+1); if(aux==-1) aux = -2; if(aux!=-2){ while(aux!=-1 && strcmp(ANASIN[aux][1],caracter)!=0){ //Verifica os nos alternativos para procurar o caracter aux = atoi(ANASIN[aux][3])-1; printf("Voltando novamente, para linha %d.\n", aux+1); // trick para tratar alternativo igual a -1 if(aux==-2) aux = -1; } if(aux==-1) aux = -2; } // printf("%s\n",caracter); // printf("O Nao Terminal abaixo eh pai de: "); // imprimePilhaPosicaoAteTopo(cadeia, buscaPosicaoReconhecida(naoTerminais)); desempilhaDaPosicaoAteTopo(cadeia,buscaPosicaoReconhecida(naoTerminais)); //Adicionar uma especie de fila aqui strcpy(p, pop(naoTerminais)); push(cadeia,p,0,0); // printf("Desempilha o nao terminal %s\n",p); } if(vaziaNTerminais(naoTerminais) && aux==-2){ printf("\n\n!! Cadeia nao aceita !!\n\n\n"); // printf("Linha %d - Lexema \"%s\" encontrado.\n", numeroLinha, caracter); return 0; } // Para um Terminal encontrado if(strcmp(ANASIN[aux][0],"T")==0){ // para caracter lido reconhecido if(strcmp(ANASIN[aux][1],caracter)==0){ strcpy(cadCaracteres,ANASIN[aux][1]); push(cadeia,cadCaracteres,0,0); //Insere na pilha o caracter reconhecido aplicaAcoesSemanticas(codigoIntermediario, atoi(ANASIN[aux][5]),vetor, nomeArquivo, flag1); printf("TO AQUI %s\n",ANASIN[aux][5]); //imprimirPilha(cadeia); aux = atoi(ANASIN[aux][4])-1; //Aux recebe a linha correspondente ao sucessor do no encontrado printf("Lexema aceito. O sucessor é a linha: %d\n", aux+1); //printf("%s - %d\n", cadCaracteres, atoi(ANASIN[aux][5])); if(aux==-1) { aux=-2; printf("Linha sucessora é 0, ou seja, Chegamos ao fim dessa cadeia não terminal.\n"); } break; } // para caracter não reconhecido else { aux = atoi(ANASIN[aux][3])-1; //Aux recebe a posicao do no alternativo //Caso nao haja mais nenhum no alternativo if(aux==-2){ printf("\n\n!! Cadeia nao aceita !!\n\n\n"); //printf("\n\nErro na linha %d\n\n",*linhaArquivo); return 0; } printf("Não reconhecido. Alternativo na linha: %d\n", aux+1); } } // para um não terminal encontrado else if(strcmp(ANASIN[aux][0],"N")==0){ //Encontra um Nao Terminal strcpy(cadTerminais,ANASIN[aux][1]); aplicaAcoesSemanticas(codigoIntermediario, atoi(ANASIN[aux][5]),vetor, nomeArquivo, flag1); push(naoTerminais,cadTerminais,atoi(ANASIN[aux][2])-1,topo(cadeia)); //Empilha o nao terminal na pilha de nao naoTerminais printf("Não terminal encontrado: \"%s\". Devemos empilha-lo.\n",cadTerminais); printf("Ao finalizar esse não terminal devemos voltar na linha: %d. ", atoi(ANASIN[aux][4])); aux = verificaLinhaTerminal(TABNT,linhasTabNT,cadTerminais); //Aux vai para a linha correspondente ao grafo do nao terminal printf("Vai para a linha: %d\n", aux+1); // imprimirPilha(naoTerminais); } } numeroLinha = aux; strcpy(vetor[0], ""); strcpy(vetor[1], ""); strcpy(vetor[2], ""); } imprimirPilha(naoTerminais); while(!vazia(naoTerminais)){ // printf("O Nao Terminal Abaixo é pai de: "); // imprimePilhaPosicaoAteTopo(cadeia, buscaPosicaoReconhecida(naoTerminais)); desempilhaDaPosicaoAteTopo(cadeia,buscaPosicaoReconhecida(naoTerminais)); strcpy(p,pop(naoTerminais)); // printf("Desempilhando o %s\n",p); push(cadeia,p,0,0); } printf("\n\n!! Cadeia reconhecida !!\n\n\n"); return 1; }