예제 #1
0
파일: seis.c 프로젝트: mangel45/esc
void initAutomata(const char *cad, int *p, int *c)
{
    *c = 0;
    if(*p < strlen(cad))
        q0(cad, p, c);
    fprintf(stdout, "La cadena \"ing\" fue encontrada %d veces\n", *c);

    inicializar();
    colorearPantalla();
    tituloVentana();

    estadoCualquiera(120.0, 250.0, "q0");
    estadoCualquiera(270.0, 250.0, "q1");
    estadoCualquiera(420.0, 250.0, "q2");
    estadoFinal(570.0, 250.0, "q3");
    grafoDirigido(120.0+40.0, 250.0, 270.0-40.0, 250.0, 1, "i");
    grafoDirigido(270.0+40.0, 250.0, 420.0-40.0, 250.0, 1, "n");
    grafoDirigido(420.0+40.0, 250.0, 570.0-40.0, 250.0, 1, "g");
    grafoDirigido(270.0, 250.0-40.0, 0.0, 0.0, 0, "i");
    grafoDirigido(110.0+40.0, 250.0+30, 280.0-40.0, 250.0+30, -1, "E-n");
    grafoDirigido(110.0+40.0, 190.0+30, 420.0-40.0, 190.0+30, -1, "E-n-g");

    al_flip_display();

    while(1)
    {
        al_wait_for_event(queue_evento, &evento);
        if(evento.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
            break;
    }

    about();
    finalizar();
}
예제 #2
0
파일: ocho.c 프로젝트: carlostule/ESCOM
void initAutomata(const char *cad, int *p, int *c)
{
	*c = 0;
	if(*p < strlen(cad))
		q0(cad, p, c);

	if(*c == 1)
		fprintf(stdout, "La cadena tiene todos los valores pares de ceros y unos\n");
	else
		fprintf(stdout, "La cadena no cumple con la paridad de ceros y unos\n");

	inicializar();
	colorearPantalla();
	tituloVentana();

	estadoFinal(250.0, 150.0, "q0");
	estadoCualquiera(500.0, 150.0, "q1");
	estadoCualquiera(250.0, 400.0, "q3");
	estadoCualquiera(500.0, 400.0, "q2");
	grafoDirigido(250.0+40.0, 180.0, 500.0-40.0, 180.0, 1, "1");
	grafoDirigido(250.0+40.0, 130.0, 500.0-40.0, 130.0, -1, "1");
	grafoDirigido(250.0-30, 200.0, 250.0-30, 360, 11, "0");
	grafoDirigido(250.0+30, 200.0, 250.0+30, 360, -11, "0");
	grafoDirigido(250.0+40.0, 430.0, 500.0-40.0, 430.0, 1, "1");
	grafoDirigido(250.0+40.0, 370.0, 500.0-40.0, 370.0, -1, "1");
	grafoDirigido(500.0-30.0, 200.0, 500.0-30, 360, 11, "0");
	grafoDirigido(500.0+30.0, 200.0, 500.0+30, 360, -11, "0");

	al_flip_display();

	while(1)
	{
		al_wait_for_event(queue_evento, &evento);
		if(evento.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
            break;
	}

	about();
	finalizar();
}
예제 #3
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;
}
예제 #4
0
int main() {
    
	Token *token;
	token = (Token*) malloc(sizeof(Token));
    
    // Inicializando lista de tokens e escopos
    tokens.tamanho = 0;
    escopos.tamanho = 0;
    constTab.tamanho = 0;
    
    // Inicializando pilhas de ifs, whiles e expressoes
    StackInit(&pilhaIfs, MAX_SIZE);
    StackInit(&pilhaWhiles, MAX_SIZE);
    StackInit(&pilhaElses, MAX_SIZE);
    StackTokenInit(&pilhaOperandos, MAX_SIZE);
    StackTokenInit(&pilhaOperadores, MAX_SIZE);
        
	FILE *entrada;
    entrada = fopen("ENTRADA.txt", "r");
    //verificando se arquivo existe
    if(entrada == NULL) {
        printf("arquivo nao encontrado\n\n");
        return 1;
    }
    
    // Abre o arquivo de saída
    out = fopen("SAIDA.txt", "wr");
	
	InicializaLexico();

	
	//Lendo o Arquivo pegando todos os Tokens até terminar o arquivo o ch deve iniciar com NULL
    StackInit(&pilha, MAX_SIZE);
    Estado estadoCorrente = PROGRAM_INICIAL;
    Estado estadoAnterior = 0;
    token = getNextToken(entrada);
	while (token->tipo != EoF && estadoCorrente != PROGRAM_6_AC) {
        
        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)) {       
                    estadoAnterior = estadoCorrente;
                    estadoCorrente = desempilha();
                    executarAcaoSemantica(estadoAnterior, estadoCorrente, token);

                } else {
                    printf("Erro no reconhecimento de sintaxe, linha %d", token->linha);
                    getchar();
                    exit(1);
                }
            } else { // Se acha chamada de submáquina
                estadoAnterior = estadoCorrente;
                estadoCorrente = chamada.estadoDestino;
                executarAcaoSemantica(estadoAnterior, estadoCorrente, token);
                empilha(chamada.estadoRetorno);
            }
            
        } else { // Se encontrar transição
            estadoAnterior = estadoCorrente;
            estadoCorrente = trans.estadoDestino;    
            executarAcaoSemantica(estadoAnterior, estadoCorrente, token);
            token = getNextToken(entrada);
            
        }
	}
    
    // Dump das variáveis e constantes no fim do programa
    escreveFuncoesMvn();
    declararVariaveisConstantes();
    imprimeFim();
	
    free(token);
	return 0;
}