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;
}
Beispiel #2
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;


}