Estou implementando um Analisador Léxico e estou com dúvidas, pois a saída gerada em um arquivo .txt está com caracteres estranhos. Se eu colocar constantes no arquivo que vai ser lido , no arquivo de saida elas são impressas com caracteres e aspas sendo que devem aparecer só os numeros. Caso tenha algo a mais para ajudar na implementação favor comentar.
Segue abaixo o código:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
void sleep( clock_t wait ) //Wait é o tempo que deverá ficar ocioso.. em milisegundos
{
clock_t goal = ( wait + clock() );
while( goal > clock() );
}
int num(char pegachar){ //- Se número
if(pegachar>='0' && pegachar<='9')
return 1;
return 0;
}
int main() {
int i; //indice
int estado; // 0 - inicial , 1 - final , 2 - numero define o estado do automata
char pegachar; //pega o proximo caracter
char charprox; //letra que a função getc esta lendo
FILE *arqler, *arqescrever; //criando arquivo de leitura e arquivo de saida
char temp[100]; // arquivo temporario que armazena carcater atual
char nome[40]; //nome do arquivo a ser lido
char *palavras[] = {"begin" , "boolean", "do", "else", "end", "false", "if", "integer", "program", "read",
"then", "true", "var", "while", "write"}; //palavras a serem comparadas
printf("Analisador Léxico em C\n");
printf("\nDigite o nome do arquivo a ser lido:\n");
printf("\nO arquivo deve estar na mesma pasta do fonte do programa\n");
scanf("%s", &nome);
arqler = fopen(nome,"r");
arqescrever = fopen("tokens.txt", "w");
if(arqler == 0)
{
printf("Arquivo não encontrado!");
printf("\nATENÇÃO VERIFIQUE SE O ARQUIVO A SER LIDO ESTA NA MESMA PASTA DO ARQUIVO FONTE");
getch();
exit(0);
}
printf("\nLoading...");
while(!feof(arqler))
{
sleep(100);
printf("....");
estado = 0;
while (estado != 1)
{
i=0;
pegachar = getc(arqler);
switch (estado)
{
case 0:
if (pegachar == EOF)
{
estado = 1;
}
else if (isdigit(pegachar))
{
estado = 2;
}
else if (pegachar == '+')
{
fprintf(arqescrever, "\nOPERADOR ADICAO : %c",pegachar);
estado = 1;
}
else if (pegachar == '-')
{
fprintf(arqescrever, "\nOPERADOR ADICAO : %c",pegachar);
estado = 1;
}
else if (!isspace(pegachar))
{
estado = 1;
}
break;
case 2:
while(isdigit(pegachar))
{
temp[i] = pegachar;
pegachar = getc(arqler);
i++;
}
fprintf(arqescrever, "\nCONSTANTE : %s",temp);
estado = 1;
strncpy(temp,"",100);
break;
}
}
}
fclose(arqescrever);
system("C:\\tokens.txt");
}
Pergunta
brunogomes18
Olá,
Estou implementando um Analisador Léxico e estou com dúvidas, pois a saída gerada em um arquivo .txt está com caracteres estranhos. Se eu colocar constantes no arquivo que vai ser lido , no arquivo de saida elas são impressas com caracteres e aspas sendo que devem aparecer só os numeros. Caso tenha algo a mais para ajudar na implementação favor comentar.
Segue abaixo o código:
#include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> #include <math.h> #include <time.h> #include <stdlib.h> void sleep( clock_t wait ) //Wait é o tempo que deverá ficar ocioso.. em milisegundos { clock_t goal = ( wait + clock() ); while( goal > clock() ); } int num(char pegachar){ //- Se número if(pegachar>='0' && pegachar<='9') return 1; return 0; } int main() { int i; //indice int estado; // 0 - inicial , 1 - final , 2 - numero define o estado do automata char pegachar; //pega o proximo caracter char charprox; //letra que a função getc esta lendo FILE *arqler, *arqescrever; //criando arquivo de leitura e arquivo de saida char temp[100]; // arquivo temporario que armazena carcater atual char nome[40]; //nome do arquivo a ser lido char *palavras[] = {"begin" , "boolean", "do", "else", "end", "false", "if", "integer", "program", "read", "then", "true", "var", "while", "write"}; //palavras a serem comparadas printf("Analisador Léxico em C\n"); printf("\nDigite o nome do arquivo a ser lido:\n"); printf("\nO arquivo deve estar na mesma pasta do fonte do programa\n"); scanf("%s", &nome); arqler = fopen(nome,"r"); arqescrever = fopen("tokens.txt", "w"); if(arqler == 0) { printf("Arquivo não encontrado!"); printf("\nATENÇÃO VERIFIQUE SE O ARQUIVO A SER LIDO ESTA NA MESMA PASTA DO ARQUIVO FONTE"); getch(); exit(0); } printf("\nLoading..."); while(!feof(arqler)) { sleep(100); printf("...."); estado = 0; while (estado != 1) { i=0; pegachar = getc(arqler); switch (estado) { case 0: if (pegachar == EOF) { estado = 1; } else if (isdigit(pegachar)) { estado = 2; } else if (pegachar == '+') { fprintf(arqescrever, "\nOPERADOR ADICAO : %c",pegachar); estado = 1; } else if (pegachar == '-') { fprintf(arqescrever, "\nOPERADOR ADICAO : %c",pegachar); estado = 1; } else if (!isspace(pegachar)) { estado = 1; } break; case 2: while(isdigit(pegachar)) { temp[i] = pegachar; pegachar = getc(arqler); i++; } fprintf(arqescrever, "\nCONSTANTE : %s",temp); estado = 1; strncpy(temp,"",100); break; } } } fclose(arqescrever); system("C:\\tokens.txt"); }Obrigado
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.