Você está na página 1de 5

#include <fstream>

#include <cstdlib>
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <string>

using namespace std;


const int tamanho = 50;
string alfabeto;
string codigoCompletoAFD;
string estadosFinais;
int qtdLinhas;
int qtdColunas;
int matrizTransicoes[tamanho][tamanho];
//Prototipação
void lerAlfabeto();
void lerEstados();
void criarCodigoAFD();
void printMatriz();
void preencherFuncaoDeTransicao();
int verificaEstadoFinal(int);
void gravarArquivo();
string AddHeader();
string AddMain();
string AddPrototipos();
//Leitura do Alfabeto
void lerAlfabeto(){
printf("\nAlfabeto: ");
getline(cin,alfabeto);
qtdColunas = alfabeto.size();
//verificação se não há letras repetidas no alfabeto
for (int i=0; i<qtdColunas;i++){
for(int j=1+i;j<qtdColunas;j++){
if(alfabeto[j]==alfabeto[i]){
printf("Atencao: O alfabeto nao deve conter letrar repetidas
.\n\n");
system("PAUSE");
system("CLS");
lerAlfabeto();
}
}
}
}
//Leitura da quantidade de estados
void lerEstados(){
printf("\nQuantidade de Estados: ");
scanf("%d",&qtdLinhas);
//Verificação se não há qtd negativa ou nula
if(qtdLinhas<=0){
printf("Atencao: A quantidade de estados nao pode ser negativa ou nula\n
\n");
system("PAUSE");
system("CLS");
lerEstados();
}
printf("\nO estado inicial: %d\n", 0);
printf("\nDigite o conjunto de estados finais: ");
cin >> estadosFinais;
}
//Leitura das transições de estados
void lerMatrizTransicoes(){
printf("\n");
for(int i = 0 ; i < qtdLinhas; i++)
{
for(int j = 0 ; j < qtdColunas ; j++ )
{
int transicao;
printf("Digite a transicao para o estado e%d, simbolo %c
: ", i, alfabeto[j]);
scanf("%d", &transicao);
matrizTransicoes[i][j]=transicao;
}
}
printMatriz();
printf("\n\n");
system("PAUSE");
}
//Impressao da matriz de transicoes preenchida
void printMatriz(){
printf("\n############## Matriz de Transicoes ##############\n\n");
for(int j = 0 ; j < qtdColunas ; j++)
{
printf("\t%c",alfabeto[j]);
}
for(int i = 0 ; i < qtdLinhas; i++)
{
printf("\ne%d",i);
for(int j = 0 ; j < qtdColunas ; j++ )
{
printf("\te%d",matrizTransicoes[i][j]);
}
}
}
//criacao do codigo do AFD
void criarCodigoAFD(){
//string que contem todo o corpo do codigo, isto e, os metodos
string body;
for (int i = 0; i < qtdLinhas; i++)
{
//adicionando as funcoes void e
body+="void e";
char cNumEstado[10];
//converte o numero i em string
itoa (i,cNumEstado,10);
//adiciona o numero i em formato de string ao corpo do c
odigo
body+=cNumEstado;
body+="()\n{\n";
for(int j = 0 ; j < qtdColunas ; j++)
{ /*condicao que garante que apenas uma funcao sucesso
será adicionado ao corpo,
pois especifica que todos os estados serão procurados
- variavel i varia
numero de estados (qtdLinhas), e a variável j garante
que a pesquisa só sera feita uma
vez para cada numero de estado (variavel i).
*/
if(verificaEstadoFinal(i) >= 0 && j==0)
{
body+="\tif (linha[p] == '\\0')\n\t{\n\t
\t sucesso();\n\t}\n";
}
if(j==0)
{
if(verificaEstadoFinal(i) >= 0)
{
body+="\telse if (linha[p] == '";
}
else
{
body+="\tif (linha[p] == '";
}
}
else
{
body+="\telse if (linha[p] == '";
}
body+=alfabeto[j];
if(matrizTransicoes[i][j] == -1)
{
body+="')\n\t{\n\t\terro();\n\t}\n";
}
else
{
body+="')\n\t {\n\t\tp++;\n\t\te";
char cNumEstado[5];
itoa (matrizTransicoes[i][j],cNumEstado,
10);
body+=cNumEstado;
body+="();\n\t}\n";
}
}
body+="\telse\ if(linha[p] != '\\0')\n\t{\n\t\terroAlfabeto(linha[p]
);\n\t}\n \telse erro();\n";
body+="}\n";
}
//adiciona todas partes do programa
codigoCompletoAFD+=AddHeader();
codigoCompletoAFD+=AddPrototipos();
codigoCompletoAFD+=AddMain();
codigoCompletoAFD+=body;
}
//adiciona prototipos
string AddPrototipos(){
string prototipos;
for(int i = 0 ; i < qtdLinhas; i++)
{
prototipos+="void e";
char numEstado[10];
itoa(i,numEstado, 10);
prototipos+=numEstado;
prototipos+="();\n";
}
prototipos+="\n\n";
return prototipos;
}
//adiciona o cabecalho
string AddHeader(){
string header ="";
header +="#include <stdio.h>\n";
header +="#include <conio.h>\n\n";
header +="int p;\n";
header +="char linha[255];\n";
header +="void sucesso();\n";
header +="void erro();\n";
header +="void erroAlfabeto(char letra);\n";
return header;
}
//adiciona o codigo principal a uma string
string AddMain(){
string main="";
main+="int main(int argc, char * argv[])\n";
main+="{\n";
main+="\tsystem(\"CLS\");\n";
main+="\tprintf(\"######### Automato Finito Deterministico #########\");
\n";
main+="\tprintf(\"\\n\");\n";
main+="\tp=0;\n";
main+="\tprintf(\"Digite a palavra:\");\n";
main+="\tgets(linha);\n";
main+="\te0();\n";
main+="\tsystem(\"PAUSE\");\n";
main+="\treturn 0;\n";
main+="}\n\n";
main+="void sucesso()\n";
main+="{\n";
main+="\tprintf(\"Aceito\");\n";
main+="\tprintf(\"\\n\");\n";
main+="}\n";
main+="void erro()\n";
main+="{\n";
main+="\tprintf(\"Erro\");\n";
main+="\tprintf(\"\\n\");\n";
main+="}\n\n";
main+="void erroAlfabeto(char letra)\n";
main+="{\n";
main+="\tprintf(\"Erro: a letra '%c' nao pertence ao alfabeto.\",letra);\n";
main+="\tprintf(\"\\n\");\n";
main+="}\n";
return main;
}
/*verifica se o estado (numero) i da funcao criarCodigoAFD é um estado final,
se for, retorna um valor maior que zero, senão, retorna um valor menor*/
int verificaEstadoFinal(int numeroEstadoFinal){
int flagEstadoFinal;
char comparaEstadoFinal[5];
//converte o numeroEstadoFinal para a string comparaEstadoFinal
itoa (numeroEstadoFinal,comparaEstadoFinal,10);
//procura dentro da string que contém os EstadosFinais o "numero" contido
em compara
flagEstadoFinal = estadosFinais.find(comparaEstadoFinal);
//armazena o retorno da busca: >0, se ok, <=0 se fail
return flagEstadoFinal; ;
}
//grava a string codigoCompletoAFD no arquivo .c
void gravarArquivo(){
ofstream codigoFonte;
codigoFonte.open("AFDSolution.c");
codigoFonte<<codigoCompletoAFD;
codigoFonte.flush();
codigoFonte.close();
}
int main(int argc, char *argv[]){
lerAlfabeto();
lerEstados();
lerMatrizTransicoes();
criarCodigoAFD();
gravarArquivo();
return EXIT_SUCCESS;
}

Você também pode gostar