示例#1
0
int confereTipo(PilhaT *pilha, OperacaoT op, TipoT tipo_esperado) {
  TipoT tipo_esquerda, tipo_direita;
  
  int i;
  if (pilha == NULL ) {
    trataErro(ERRO_PILHA_N_EXISTE, "");
  }
  else {
    tipo_direita= *(TipoT *)desempilha(pilha);
    tipo_esquerda= *(TipoT *)desempilha(pilha);
    switch (op) {
      case OP_CALCULO:
        empilhaTipoT(pilha, tipo_direita);
        break;
      case OP_COMPARACAO:
        empilhaTipoT(pilha, T_BOOLEAN);
        break;
      case OP_ATRIBUICAO:
        empilhaTipoT(pilha, tipo_esquerda);
        break;
      }
      debug_print("[TipoT Tests] tipo_esquerda= %d - tipo_direita= %d\n", tipo_esquerda, tipo_direita);
    if (tipo_esquerda == tipo_direita)
      return 1;
    else
      trataErro(ERRO_TIPO, "");
      return 0;
  } 
  return 0;
}
示例#2
0
//Empilha a pilha um em cima da pilha2
void uniaodepilhas(Pilha* pilha1, Pilha* pilha2){
    Pilha aux;
    int elem;
    limpa(&aux);
    while(ehvazia(pilha1) != 1){
        desempilha(&elem, pilha1);
        empilha(elem, &aux);
    }
    while(ehvazia(&aux)!= 1){
        desempilha(&elem, &aux);
        empilha(elem, pilha2);
    }
}
示例#3
0
int main(){
    
    int i, remove;
    float aux;
    Pilha filha;
    
    inicializa_pilha(&filha, 5, sizeof(float));
    
    for(i=0;i<5;i++){
        scanf("%f", &aux);
        empilha(&filha, &aux);
    }
    mostra_pilha(filha, mostra_float);
    
    printf("\nRemover quantos elementos? (0 ate 5): ");
    scanf("%d", &remove);
    
    for(i=0;i<remove;i++)
        desempilha(&filha);
        
    mostra_pilha(filha, mostra_float);
    
    system("PAUSE");
    
}
int main(){
	PilhaInt f;
	inicializa(&f);
	
	int x, OP=1;

	while((OP >= 1) && (OP <= 3)){
		printf("\t\t-- Pilha Simples Com Vetor - By Genicleito Goncalves--\n\n");
		printf("\n1. Empilhar;");
		printf("\n2. Desempilhar.");
		printf("\n\nOpcao Desejada: ");
		scanf("%d", &OP);
			if(OP == 1){
				printf("\nNumero para empilhar: ");
				scanf("%d", &x);
				if(empilha(&f, x)){
					printf("\nEmpilhado %d com sucesso!\n", x);
				}else
					printf("\nNao foi possivel empilhar o numero %d.\n", x);
			}
			else if(OP == 2){
				if(desempilha(&f, &x))
					printf("\nO valor %d foi desempilhado!\n", x);
				else
					printf("\nA Pilha esta vazia!\n");
			}
	}
	return 0;	
}
示例#5
0
文件: ex6.c 项目: Limaa/aps1
void alteraLista(Lista *original, Lista *alterada)
{
	destroyLista(alterada);

	Fila letras;
	iniciaFila(&letras);

	Pilha numeros;
	iniciaPilha(&numeros);

	// analisa os elementos da lista original
	struct elementoLista *aux = original->inicio;
	while(aux != NULL)
	{
		if(isalpha(aux->info))
			enfileira(&letras, aux->info);
		else if(isdigit(aux->info))
			empilha(&numeros, aux->info);
		else
			printf("Invalid character (%c).\n", aux->info);
		
		aux = aux->next;
	}
	
	//adiciona os valores a lista alterada
	while(emptyFila(&letras) != 1)
		pushBackLista(alterada, desenfileira(&letras));
	while(sizePilha(&numeros) != 0)
		pushBackLista(alterada, desempilha(&numeros));
	
	destroyFila(&letras);
	destroyPilha(&numeros);
}
示例#6
0
void consumidor(Shared *shm) {
  int j, n;
  while(1) {
    /* Se o produtor nao vai mais produzir, o proprio consumidor tem que liberar o seu semaforo */
    if(shm->termina) {
      sem_post(&shm->c_sem);
      /* Se a pilha ficar vazia e o produtor nao vai mais produzir, terminou a tarefa */
      if(pilhaVazia(&shm->pilha)) break;
    }

    /* Aguarda ate semaforo ficar verde */
    sem_wait(&shm->c_sem);
    
    /* Cada consumidor vai consumir entre 0 e 9 vezes por ciclo */
    n = randomNumber(0, 9);
    printf("[PID: %d] Consumir: %d vezes\n", getpid(), n);

    /* Consome N vezes por ciclo */
    for(j = 0; j < n; j++) {
      if(!pilhaVazia(&shm->pilha)) {
        printf("[PID: %d] Consumindo: %d\n", getpid(), topoPilha(&shm->pilha));
        desempilha(&shm->pilha);
      } else {
        printf("[PID: %d] Pilha esvaziou! Lote teve %d unidades\n", getpid(), j);
        break;
      }
    }

    /* Libera produtor */
    sem_post(&shm->p_sem);
  }
}
示例#7
0
int main(void){
	char frase[]="akila a baleia dos 7 mares .";
	ld pilha;
	int cont=0;
	char aux;

	define(&pilha);
	//scanf("%[^\n]",&frase);
	printf("%s\n",frase );

	while(frase[cont]!='.'){
		printf(" ");
		while(frase[cont]!=' '){
			empilha(&pilha,frase[cont]);
			cont++;
		}
		while(pilha.quant>0){
			aux=desempilha(&pilha);
			printf("%c",aux );
		}
		cont++;
	}

	return 0;
}
void eD() {

	char simbolo = palavra[posicaoPalavra];

	if (!ehFinalPalavra(simbolo)) {
		if (ehOperador(simbolo)) {
			posicaoPalavra++;
			eA();
		} else {
			if (!pilhaEstaVazia(pilha_estados)) {
				ptr_estado estado_desempilhado = desempilha(pilha_estados, &posicao_pilha);
				estado_desempilhado();
			} else {
				if (verificaAceitacao(pilha_estados, simbolo)) {
					printf("\nACEITO!\n");
				} else {
					printf("\nNÃO ACEITO!\n");
				}
			}
		}
	} else {
		if (verificaAceitacao(pilha_estados, simbolo)) {
			printf("\nACEITO!\n");
		} else {
			printf("\nNÃO ACEITO!\n");
		}
	}
}
示例#9
0
void resolve()
{
	int mov, topo, passos, x,y;
	item local, aux;
	posicao atual;
	item pilha[32];
	
	topo = 0; passos = 1; x = 0, y = 0, mov = 1;
	atual.x = 3; atual.y = 3;
	local.pos.x = 0; local.pos.y = 0; local.mov = 1;
	
	while ( passos < 32 ) {
		while ( mov <= 4 ) {
			desenha();
			printf(" %d ", podemov( atual, mov ) );
			if ( podemov( &atual, mov ) ) {
			 printf("Testando uma posicao... \n ");			
			 break;
			} 
			else mov++;
		}
		if ( mov < 5 ) {
		local.pos.x = atual.x;
		local.pos.y = atual.y;
		local.mov = mov;
		printf("Empilhando uma posicao... \n");
	  empilha( pilha, &topo, local );
	  x = 0; y = 0;
	  passos++;
	  mov = 1;
	  }
		else if ( mov == 5 ) {
			printf("Procurando uma posicao... \n");
			for ( ; x < MAX, x++ ) {
				for ( ; y < MAX, y++ ) {
					if ( achaoutro( x, y ) ) {
						atual.x = x;
						atual.y = y;
						break;
					}	
				}
			}
		}	
		if ( x == 6 && y == 6 && mov == 5 ) {
			if ( topo == 0 ) printf("Sem Solucao. /n");
			else {
				aux = topodapilha( pilha, topo );
				atual.x = aux.pos.x;
				atual.y = aux.pos.y;
				mov = aux.mov + 1;
				passos--;
				printf("Desempilhando uma posicao... \n");
				desempilha( &topo );
			}
		} 
	}
示例#10
0
Pilha* desempilha(Pilha* p, Pilha* o)
{
        char t;
        Pop(o,&t);
        if(t == '('){
            return p;
        }else{
            Push(p,t);
            return (desempilha(p,o));
        }
}
示例#11
0
int ver_pilha(tp_pilha p){
    tp_item e;
    int i;

    for(i = p.topo; i >= 0; i--){
        desempilha(&p,&e);
        printf("---\n");
        printf("|%d|\n",e);
    }
    printf("--- \n");
    return 1;
}
示例#12
0
int recorta_pilha(tp_pilha *pMain, tp_pilha *pDestiny){
    //printf("\n=============\nCheguei no Recorta Pilha\n=============\n");
    tp_item e;
    int i;
    for(i = pMain->topo; i >= 0; i--){
        desempilha(pMain, &e);
        //printf("\nO Valor [%d] foi Removido da Pilha Principal!",e);
        empilha(pDestiny,e);
        //printf("\nO Valor [%d] foi Inserido na Pilha Destino!",e);
    }
    return 1;
}
int main( void )
{
    char op;  // opcao do menu                               
    PILHA* p; // declaracao da pilha // variavel do tipo pilha = pilha de ponteiros


    while( 1 ){
         printf( "\n /---------------------------------------------------/" ); 
         printf( "\n Programa de cadastro academico - Menu                " );
         printf( "\n [1] Cria pilha                                       " );
         printf( "\n [2] Empilha                                          " );
         printf( "\n [3] Desempilha                                       " );
         printf( "\n [4] Imprime pilha                                    " );
         printf( "\n [5] Para sair do programa                            " );
         printf( "\n /---------------------------------------------------/" );      
         printf( "\n Opcao: " );
         op = getchar();// tecla de opcao do menu

         switch( op ) {
           case '1':  // rotina cria pilha
                   cria_pilha( &p );
                   break;
                                
           case '2':  // rotina empilha
                   empilha( &p );    
                   break;
           
           case '3':   // rotina desempilha
                   desempilha( &p );
                   break;
                                                                            
           case '4':   // rotina imprime pilha                 
                   imprime_pilha( p ); 
                   break;
                                
           case '5':  // t�rmino do programa                                                 
                   exit( 1 ); 
                   break;
                
           default : 
                   printf( "\n Digite uma opcao!" );
                   break;
        } // switch( op )

        __fpurge(stdin);
        fflush( stdin ); // limpa buffer do teclado, funciona junto com entrada de dados
        getchar();       // parada da tela
        
        printf( "\n" );
     } // fim do while( 1 )
     
 return 0;
} // fim do programa principal
示例#14
0
int pilhas_iguais(tp_pilha p1,tp_pilha p2){
///2)	Implementar uma função que receba duas pilhas como parâmetro
///     e retorna 1 caso sejam idênticas ou zero caso contrário.
    tp_item e1, e2;
    int i;

    if(p1.topo != p2.topo){
        printf("\n\t\t\tTAMANHO DAS PILHAS DIFERENTES!");
        return 0;
    }

    for(i = p1.topo; i >= 0; i--){
    //while(!(pilha_vazia(&p1))){
        desempilha(&p1, &e1);
        desempilha(&p2, &e2);
        //printf("\nO Valor [%d] foi Removido da Pilha Auxiliar!",e);
        if(e1 != e2){
            return 0;
        }
    }

    return 1;
}
示例#15
0
float notacao_polonesa(char ex[]){
    tp_pilha pilha;
    float calc, num1, num2, numAux;
    int i;
    char aux[1];

    inicia_pilha(&pilha);
    for(i = 0; i < 9; i++){
        aux[0] = ex[i];
        if(isdigit(aux[0])){
            numAux = strtof(aux,NULL);
            empilha(&pilha, numAux);
            //printf("\nEmpilhei: %.0f\n",numAux);
        } else{
            desempilha(&pilha, &num2);
            desempilha(&pilha, &num1);
            switch(aux[0]){
                case '+': calc = num1 + num2;
                //printf("\n%f + %f = &f",num1,num2,calc);
                break;
                case '-': calc = num1 - num2;
                //printf("\n%f - %f = &f",num1,num2,calc);
                break;
                case '*': calc = num1 * num2;
                //printf("\n%f * %f = &f",num1,num2,calc);
                break;
                case '/': calc = num1 / num2;
                //printf("\n%f / %f = &f",num1,num2,calc);
                break;
            }
            empilha(&pilha, calc);
        }
       // printf("\nPassei do Switch, calc = %f\n",calc);
    }
    desempilha(&pilha, &calc);
    return calc;
}
示例#16
0
/**
 * Função responsável por implementar o algoritmo de backtracking propriamente dito
 * de maneira iterativa para varrer o espaço de estados. Se encontrar uma
 * resposta válida retorna um vetor com maxMov posições contendo os passos a serem
 * seguidos, senão retorna NULL.
 */
movimento* buscaSolucao(jogo oJogo, estado *inicial){
	estado *atual = inicial;

	do {
		if(!empilhaCandidatos(oJogo, atual)) {
			if(matrizesIguais(oJogo.obj, atual->tabuleiro, oJogo.l, oJogo.c))
				return atual->passos;
			if(pilhaVazia(oJogo.candidatos))
				return NULL;
		}

		desalocaEstado(atual, oJogo.l);
		atual = desempilha(oJogo.candidatos);
	} while(TRUE);
}
示例#17
0
void resolve()
{
	int topo, passos, x, y;
	item atual;
	item pilha[32];
	topo = 0; passos = 0; x = 0; y = 0;
	atual.pos.x = 0; atual.pos.y = 0;
	atual = procura( atual, &x, &y );
	while ( ganhou() ) {
		getchar();
		printf("X = %d Y = %d Mov = %d x = %d y = %d P = %d \n", atual.pos.x, atual.pos.y, atual.mov, x, y, passos);
		desenha();	
		while ( atual.mov <= 4 ) {
			if ( podemov(atual) ) {
				printf("Empilhando - \n");
				empilha( pilha, &topo, atual );
	 			atualizatab( atual, &atual );
	 			x = 0;
	 			y = 0;
	 			passos++;
	 			getchar();
				printf("X = %d Y = %d Mov = %d x = %d y = %d P = %d \n", atual.pos.x, atual.pos.y, atual.mov, x, y, passos);
				desenha();		
			}
			else atual.mov++;
		}
		if ( atual.mov > 4 ) {
			if ( x >= 6 && y >= 4 ) {
				if ( topo == 0 ) { 
					printf("Sem Solucao.");
					break;
				}
				else {
					printf("Backtrack - \n");
					atual = topodapilha( pilha, topo );
					desatualizatab( atual ); 
					x = atual.pos.x;
					y = atual.pos.y;
					atual.mov++;
					desempilha( &topo );
					passos--;
				}
		}				 
	}
	}
	imprimesol(pilha, topo);
}
示例#18
0
文件: 1944.c 项目: Gruutak/uri
int main(){
	int n, i, j, cont = 0, aux;
	Pilha *s = malloc(sizeof(Pilha));
	char v[] = { 'F', 'A', 'C', 'E' }, v2[4];

	inicPilha(s);

	for(i = 0; i < 4; i++)
		empilha(s, v[i]);

	scanf("%d", &n);
	getchar();

	for(i = 0; i < n; i++){
		scanf("%c %c %c %c", &v[0], &v[1], &v[2], &v[3]);
		getchar();
		for(j = 0; j < 4; j++){
			v2[j] = desempilha(s);
		}

		aux = 0;

		for(j = 0; j < 4; j++){
			if(v[j] == v2[j]);
				aux++;
		}

		if(aux == 4){
			cont++;

			for(j = 0; j < 4; j++){
				empilha(s, v2[j]);
			}
		}
		else{
			for(j = 0; j < 4; j++){
				empilha(s, v[j]);
			}
		}
	}

	printf("%d\n", cont);

	return 0;
}
示例#19
0
int main(void){
	LD lista;
	int cont=0, aux;
	char chave[] = "ESTE EXERCICIO E MUITO FACIL .";
	DefineS(&lista);

	while(chave[cont]!='.'){
		empilha(&lista,chave[cont]);
		if(chave[cont]== ' ' || chave[cont]=='.'){
                while(lista.quant>0)
                    desempilha(&lista);
		}
		cont++;
	}


return 0;
}
示例#20
0
int main(){
    Pilha *posfixa = criaPilha();
    Pilha *operadores = criaPilha();
    Pilha *infixa = criaPilha();
    char inf[MAX],letra,t;
    int testes,n,i,j,f=0;
    scanf("%d",&testes);
    while(testes > 0){
        testes--;
        scanf("%s",&inf);
        n = strlen(inf);
        for(i = n-1;i>=0;i--){
            Push(infixa,inf[i]);
        }
        while(!isEmpty(infixa))
        {
            Pop(infixa,&letra);
            if(letra != '+' && letra != '-' && letra != '*' && letra != '/' && letra != '^' && letra != '(' && letra != ')'){
                Push(posfixa,letra);
            }else if(letra == '('){
                Push(operadores,letra);
            }else if(letra == ')'){
                desempilha(posfixa,operadores);
            }else{
                while(precedencia(Topo(operadores)) > precedencia(letra) || precedencia(Topo(operadores)) == precedencia(letra)){
                    Pop(operadores,&t);
                    Push(posfixa,t);
                }
                Push(operadores,letra);
            }
        }
            if(!isEmpty(operadores))
            {
                desempilha_op(posfixa,operadores);
            }
        exibe(posfixa);
        Empty(posfixa);
        Empty(operadores);
    };

    return 0;
}
示例#21
0
void busca(int v) {
        int i, aux, min = low[v] = pre[v] = cont++;
        empilha(v);
        for (i = 0; i < nviz[v]; i++) {
                aux = grafo[v][i];
                if (pre[aux] == -1)
                        busca(aux);
                if (low[aux] < min)
                        min = low[aux];
        }
        if (min < low[v]) {
                low[v] = min;
                return;
        }
        do {
                id[i = desempilha()] = numcomp;
                low[i] = n;
        } while (i != v);
        numcomp++;
}
示例#22
0
int main(void){
	char s[]="tudo puta e viado.";
	clock_t Ti, Tf;

	//scanf("%[^\n]",&s);
	printf("%s\n",s );

	Ti=clock();
	string_inverte(s);
	Tf=clock();
	printf("%s\nem tempo: %f",s,(Tf-Ti) );

	//usando pilha
	char t[]="tudo puta e viado.";
	lista pilha;
	int cont=0;
	char aux;

	printf("\npilha\n");
	Ti=clock();
	define(&pilha);

	while(t[cont]!='.'){
		while(t[cont]!=' ' && t[cont]!='.'){
			empilha(&pilha,t[cont]);
			cont++;
		}
		while(pilha.total>0){
			aux=desempilha(&pilha);
			printf("%c",aux );
		}
		printf(" ");
		if(t[cont]!='.'){
			cont++;
		}
	}
	Tf=clock();
	printf("\npilha com tempo: %f\n",(Tf-Ti) );

	return 0;
}
示例#23
0
文件: pilha.c 项目: vhbarros/aed1
int main(){
	PILHA *pilha;
	int escolha;
	int num;
	int flag;
	
	pilha = criaPilha();//pilha é topo
	

	for (;;){
		escolha=menu();
		switch (escolha){
			case 1:
				printf ("Informe o número que deseja empilhar:\n");
				scanf ("%d", &num);
				pilha=empilha(pilha, num);
				break;
			case 2:
				pilha=desempilha (pilha);
				break;
			case 3:
				tamanhoDaPilha(pilha);
				break;
			case 4:
				flag = mostraTopo(pilha);
				if (flag == -1){
					printf ("A pilha está vazia\n");
				}
				else{
					printf ("Elemento do Topo: %d\n", pilha->elemento);
				}
				break;
			case 5:
				return 0;;
			}
	}
	
	return 0;		
}
int busca(int j, int i, grafo *g) {
        int v, u, *visitado, k;
        pilha *P;
        P = constroi_pilha();
        cor = (int *) calloc(g->n_vertices, sizeof(int));

        cor[i] = 1;
        empilha(i, P);

        while(!vazia_pilha(P)) {
                v = topo_da_pilha(P);
                for (u = 0; u < g->n_vertices; u++) {
                        //tem aresta de do vertice v para vertice count
                        if(!visitado[count] && (g->matriz[v][u])) {
                                        if (count == j) {    // ACHOU! tem caminho de i para j.
                                                printf("Destruindo arestas\n");
                                                while(v>=0){
                                                    g->matriz[v][count] = 0;//retiramos a aresta que nos fez chegar ao vertice j.
                                                    g->matriz[count][v] = 0;
                                                    count=v;
                                                    v=desempilha(P);
                                                }
                                                destroi_pilha(P);
                                                return 1;
                                        }
                                        else {
                                                visitado[count] = 1;
                                                empilha(count,P);
                                        }
                        }
                }
                printf("Imprimindo vertice");
                for (i = 0; i < g->n_vertices; i++) 
                        printf("%d->", visitado[i]);
                printf("\n");
        }
                destroi_pilha(P);
                return 0;
}
//algoritmo de movimentacao de disco
void movediscos(int n, int torreI, int torreF)
{
    //variaveis locais
    int torreAux = 3 - (torreI + torreF);
    int tam;

    //se existe apenas um disco a ser movido
    if(n == 1)
    {
     tam = desempilha(torreI);
     empilha(tam,torreF);

     apaga_disco(tam,torreI);
     desenha_disco(tam,torreF);

     delay(500);
    }
    else
    {
    movediscos(n-1,torreI, torreAux);
    movediscos(1, torreI, torreF);
    movediscos(n-1,torreAux,torreF);
    }
}
示例#26
0
//Nome: MatrizAdjacenciaBuscaProfund
//Função: Realiza uma busca em profundidade em um grafo a partir de um nó, para descobrir se é conexo
//Entrada: Ponteiro para a estrutura de um grafo, nó inicial
//Saída: Retorna TRUE se o grafo é conexo e FALSE caso contrário
int MatrizAdjacenciaBuscaProfund(GrafoAdj *grafo, int valor){
    int marca = 1;
    int i, no;
    int compConex = FALSE;
    Pilha *p = cria();
    visitados = (int*) malloc(sizeof(int) * grafo->vertices);
    for (i = 0; i < grafo->vertices; i++) visitados[i] = 0;

    visitados[valor-1] = marca;
    empilha(p, valor-1);

    //while (compConex == TRUE){
        while (!vazia(p)){
            no = desempilha(p);
            visitados[no] = marca;
            for (i = 0; i < grafo->vertices; i++){
                if (grafo->matrizAdj[no][i] != 0){
                    if(visitados[i] == 0)
                        empilha(p, i);
                }
            }
        }
        compConex = TRUE;
        //marca++;
        for (i = 0; i < grafo->vertices; i++){
            if (visitados[i] == 0) {
                compConex = FALSE;
                break;
            }
        }
        //if (compConex == TRUE) empilha(p, i);
    //}
    free(visitados);
    destroi(p);
    return compConex;
}
示例#27
0
/**
 * Função responsável por desalocar todas estruturas de dados remanecentes do
 * cálculo da resposta ao jogo dado.
 */
void encerraJogo(jogo oJogo){
	while(!pilhaVazia(oJogo.candidatos))
		desalocaEstado(desempilha(oJogo.candidatos), oJogo.l);
	desalocaMatriz(oJogo.obj, oJogo.l);
	free(oJogo.candidatos);
}
示例#28
0
	/*!
	\sa PilhaEnc(), ~PilhaEnc(), PilhaVazia()
	*/
	void limparPilha() {
		while (!PilhaVazia()) {
			desempilha();
		}
	}
示例#29
0
// funçao que checa se existe a transicao na matriz e realiza transicao caso tenha
char    busca_e_realiza_transicao_automato( automato    *A   , char token[TAMANHO_MAX_NOME_ELEMENTO] , Pilha *Pilha_submaquina, Pilha *Pilha_estado,    char cadeia_parcial[TAMANHO_MAX_NOME_ELEMENTO]){

int i=0;
int submaquina=0;
char teve_transicao;
char nome_submaquina_chamada[TAMANHO_MAX_NOME_ELEMENTO];
char nome_submaquina_retorno[TAMANHO_MAX_NOME_ELEMENTO];
char estado_retorno[TAMANHO_MAX_NOME_ELEMENTO];

        for(    i=0 ;   i<(*A).numero_submaquinas  ; i++    ){ // obtem o indice da submaquina
            if(strcmp((*A).submaquina_atual, (*A).nome_submaq[i] )==0)
                submaquina=i;
        }

        //checa se é estado de transicao para submaquina

        if(check_se_eh_transicao_para_submaquina( &(*A).sub_maquina[submaquina]    ,   A,  &nome_submaquina_chamada,    &estado_retorno)=='T'){ //se teve transicao para submaquina

            empilha((*A).submaquina_atual, Pilha_submaquina); //empilha submaquina atual
            empilha(estado_retorno, Pilha_estado); //empilha estado de retorno

            for(    i=0 ;   i<(*A).numero_submaquinas  ; i++    ){ // obtem o indice da nova submaquina
            if(strcmp(nome_submaquina_chamada, (*A).nome_submaq[i] )==0)
                submaquina=i;
        }

            strcpy((*A).estado_atual, (*A).sub_maquina[submaquina].estado_inicial  ); // atualiza estado atual do automato com estado inicial da submaquina chamada
            strcpy((*A).submaquina_atual, nome_submaquina_chamada ); // atualiza submaquina atual no automato

        }


        printf("\n|\t%s\t|\t%s\t|  (%s,%s)\t|\t",  (*A).estado_atual  , (*A).submaquina_atual, cadeia_parcial,token);


            teve_transicao =   busca_e_realiza_transicao_lendo_vetor(  &(*A).sub_maquina[submaquina]    ,   (*A).estado_atual,   token    );

            printf("%s\t",  (*A).estado_atual );

            if((*Pilha_submaquina).topo !=  -1){
            printf("|\t%s\t",   (*Pilha_submaquina).elementos->info);
            }
            if((*Pilha_estado).topo!=-1){
            printf("|\t%s\t\t|",   (*Pilha_estado).elementos->info);
            }
            if((*Pilha_submaquina).topo ==  -1){
            printf("|\tvazio\t");
            }
            if((*Pilha_estado).topo==-1){
            printf("|\tvazio\t\t|");
            }


         while(teve_transicao=='F'){

            desempilha( &nome_submaquina_retorno ,   Pilha_submaquina   );  // desempillha submaquina

            desempilha( &estado_retorno ,   Pilha_estado   );               //desempilha estado de retorno
            for(    i=0 ;   i<(*A).numero_submaquinas  ; i++    ){ // obtem o indice da nova submaquina
            if(strcmp(nome_submaquina_retorno, (*A).nome_submaq[i] )==0)
                submaquina=i;
            }
            strcpy((*A).estado_atual, estado_retorno  ); // atualiza estado atual do automato com estado inicial da submaquina de retorno
            strcpy((*A).submaquina_atual, nome_submaquina_retorno ); // atualiza submaquina atual no automato

            printf("\n|\t%s\t|\t%s\t|  (%s,%s)\t|\t",  (*A).estado_atual  , (*A).submaquina_atual, cadeia_parcial,token);


            teve_transicao =   busca_e_realiza_transicao_lendo_vetor(  &(*A).sub_maquina[submaquina]    ,   (*A).estado_atual,   token    );

            printf("%s\t",  (*A).estado_atual );

            if((*Pilha_submaquina).topo !=  -1){
            printf("|\t%s\t",   (*Pilha_submaquina).elementos->info);
            }
            if((*Pilha_estado).topo!=-1){
            printf("|\t%s\t\t|",   (*Pilha_estado).elementos->info);
            }

            if((*Pilha_submaquina).topo ==  -1){
            printf("|\tvazio\t");
            }
            if((*Pilha_estado).topo==-1){
            printf("|\tvazio\t\t|");
            }

         }


}
示例#30
0
int main() {    
	Token *token;
	token = (Token*) malloc(sizeof(Token));
    
        
    
	FILE *entrada;
    entrada = fopen("./ENTRADA.txt", "r");
    //verificando se arquivo existe
    if(entrada == NULL) {
        printf("arquivo nao encontrado\n\n");
        return 1;
    }
        
    StackInit(&pilhaEstado, MAX_SIZE);
    // Escreve o cabeçalho antes mesmo de entrar
    // em algum estado, já que não existe um "main"
    // em Kipple.
    
    inicializaSemantico();
    imprimeCabecalho();
    declaraVariaveis();
    
    Submaquina ultimaSubmaquina;
    Estado estadoCorrente = CODE_INICIAL;
    Estado estadoAnterior = 0;
	token = getNextToken(entrada);
	while (token->tipo != EoF) {
        
        transicao trans;
        chamadaSubmaquina chamada;
        
        // Procura transição
        if(!procuraTransicao(estadoCorrente, token, &trans)) {
            
            // Se não encontrar transição procura chamada de submáquina
            if(!procuraChamadaSubmaquina(estadoCorrente, token, &chamada)) {
                // Caso não encontra chamada de submáquina, verifica se é estado final,
                // se for aceita, senão dá erro
                if(estadoFinal(estadoCorrente)) {  
                    ultimaSubmaquina = obterSubmaquina(estadoCorrente);
                    estadoAnterior = estadoCorrente;
                    estadoCorrente = desempilha();
                    executarAcaoSemantica(estadoAnterior, estadoCorrente, ultimaSubmaquina, token);
                    
                } else {
                    printf("Erro no reconhecimento de sintaxe, linha %d", token->linha);
                    getchar();
                    exit(1);
                }
            } else { // Se acha chamada de submáquina
                ultimaSubmaquina = obterSubmaquina(estadoCorrente);
                estadoAnterior = estadoCorrente;
                estadoCorrente = chamada.estadoDestino;
                executarAcaoSemantica(estadoAnterior, estadoCorrente, ultimaSubmaquina, token);
                empilha(chamada.estadoRetorno);
            }
            
        } else { // Se encontrar transição
            estadoAnterior = estadoCorrente;
            estadoCorrente = trans.estadoDestino;    
            executarAcaoSemantica(estadoAnterior, estadoCorrente, ultimaSubmaquina, token);
            token = getNextToken(entrada);
            
        }
	}
    
    // Dump das variáveis e constantes no fim do programa
	//declararVariaveisConstantes();	
	//escreveFuncoesMvn();
	imprimeFim();
	
    free(token);
	return 0;
}