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(); }
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(); }
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; }
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; }