Programa AnaLizador LéxiCo
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
#include<graphics.h>
#include "stddef.h"
#define tope 100
typedef char string[90];
void verif(char *ch,FILE *fp,char *cadena);
void visual();
int k,j;
main(){
int gdriver=DETECT;
int gmode;
FILE *arch1=NULL,*arch2=NULL;
char ch,enter,cad[35],ch2;
string cadena;
string iden[tope];
int cont,iden1[tope],reser1[42],oper1[21],e;
string reser[43]={"auto","break","case","char","const","continue","default",
"do","double","else","enum","extern","float","for","goto","if","int",
"long","register","return","short","signed","sizeof","static",
"struct","switch","typedef","union","unsigned","void","volatile",
"while","asm","_ss","interrupt","_cs","cdecl","near","_ds","far",
"pascal","_es","huge"};
string oper[22]={"(",")","[","]","_",".","!","~","*","&","/","%","+","-",
"<",">","=","^","|","?","'",":"};
int flag,fin,i;
initgraph(&gdriver,&gmode,"");
clrscr();
bar(10,10,600,450);
setcolor(BLUE);
rectangle(15,15,595,445);
rectangle(20,20,590,440);
outtextxy(100,30,"A N A L I Z A D O R L E X I C O G R A F I C O");
outtextxy(140,130," I . T . P .");
outtextxy(140,150," ING en SISTEMAS COMPUTACIONALES");
outtextxy(140,170," PROGRAMACION DE SISTEMAS");
outtextxy(100,300,"Oprima <enter> para continuar");
scanf("%c",&enter);
clrscr();
bar(10,10,600,450);
rectangle(15,15,595,445);
rectangle(20,20,590,440);
for (i=0;i<tope;i++)
iden1[i]=0;
for (i=0;i<43;i++)
reser1[i]=0;
for(i=0;i<21;i++)
oper1[i]=0;
gotoxy(15,10);
outtextxy(100,100,"Dame el nombre del archivo con su extension");
outtextxy(100,110,"y ( si se necesita con su direccion )");
rectangle(90,130,250,165);
gets(cad);
/* abre archivo para lectura */
if((arch1=fopen(cad,"r"))==NULL){
setcolor(RED);
outtextxy(100,180,"Imposible abrir el archivo");
getch();
main();
}
else{ /* abre archivo para escritura */
if((arch2=fopen("anal_lex.dat","w"))==NULL){
setcolor(RED);
outtextxy(100,180,"Imposible abrir el archivo");
getch();
main();
}
}
ch=getc(arch1);
j=0;
i=0;
k=0;
e=0;
fin=0;
while(ch != EOF){
if((ch != ' ') && (isalnum(ch))){
while(isalnum(ch) || (ch== '_')){
cadena[i]=ch;
i++;
ch=getc(arch1);
}
cadena[i]='\0';
fputs(cadena,arch2);
fputs("\n",arch2);
flag=0;
for (k=0;k<43;k++)
if (strcmp(cadena,reser[k])==0)
{
reser1[k]=reser1[k]+1;
flag=1;
} /* fin if*/
if (flag==0)
for (k=0;k<fin+1;k++)
if (strcmp(cadena,iden[k])==0)
{
iden1[k]=iden1[k]+1;
flag=1;
}
if (flag== 0)
{
strcpy(iden[fin],cadena);
iden1[k]=iden1[k]+1;
fin++;
}
}
i=0;
if(ispunct(ch)){
verif(&ch,arch1,cadena);
fputs(cadena,arch2);
fputs("\n",arch2);
for (k=0;k<21;k++)
if (strcmp(oper[k],cadena)==0)
oper1[k]=oper1[k]+1;
}
ch=getc(arch1);
cadena[0]=ch;
} /* del while */
fclose(arch1);
fclose(arch2);
clrscr();
gotoxy(10,10);
cont=1;
bar(10,10,600,450);
setcolor(BLUE);
outtextxy(70,30,"Lista de identificadores");
rectangle(15,15,595,445);
rectangle(20,20,590,440);
for (i=0;i<fin;i++)
{
gotoxy(10,5+e);
printf("%s ",iden[i]);
gotoxy(35,5+e);
printf("%d ",iden1[i]);
cont++;
e++;
if(cont >=20){
outtextxy(20,400," Oprima una tecla para continuar......");
cont=1;
ch=getch();
e=0;
bar(10,10,600,450);
setcolor(BLUE);
outtextxy(70,30,"Lista de identificadores");
rectangle(15,15,595,445);
rectangle(20,20,590,440);
}
}
outtextxy(20,400," Oprima una tecla para continuar..........");
ch=getch();
clrscr();
cont=1;
e=0;
bar(10,10,600,450);
setcolor(BLUE);
outtextxy(70,30,"Lista de Operadores");
rectangle(15,15,595,445);
rectangle(20,20,590,440);
for (i=0;i<22;i++){
gotoxy(10,5+e);
printf("%s ",oper[i]);
gotoxy(35,5+e);
printf("%d ",oper1[i]);
e++;
cont++;
if(cont >=18){
outtextxy(20,400," Oprima una tecla para continuar..........");
cont=1;
e=0;
ch=getch();
bar(10,10,600,450);
setcolor(BLUE);
outtextxy(70,30,"Lista de Operadores");
rectangle(15,15,595,445);
rectangle(20,20,590,440);
}
}
outtextxy(20,400," Oprima una tecla para continuar..........");
ch=getch();
cont=1;
e=0;
bar(10,10,600,450);
setcolor(BLUE);
outtextxy(70,30,"Lista de Palabras Reservadas");
rectangle(15,15,595,445);
rectangle(20,20,590,440);
for (i=0;i<42;i++){
gotoxy(10,5+e);
printf("%s ",reser[i]);
gotoxy(35,5+e);
printf("%d ",reser1[i]);
cont++;
e++;
cont++;
if(cont >=20){
outtextxy(20,400," Oprima una tecla para continuar..........");
cont=1;
e=0;
ch=getch();
bar(10,10,600,450);
setcolor(BLUE);
outtextxy(70,30,"Lista de Palabras Reservadas");
rectangle(15,15,595,445);
rectangle(20,20,590,440);
}
}
outtextxy(20,400," Oprima una tecla para continuar..........");
ch=getch();
bar(10,10,600,450);
setcolor(BLUE);
outtextxy(70,100,"Desea ver el archivo s/n");
rectangle(15,15,595,445);
rectangle(20,20,590,440);
gotoxy(20,20);
ch=getch();
if(toupper(ch)=='S')
visual();
exit(1);
if(toupper(ch)=='N')
exit(1);
return 0;
}
void verif(char *ch,FILE *fp,char *cadena)
{
int i=0;
char ch2,c[1]="'";
FILE *aux;
if(*ch==c[1])
*ch='@';
switch(*ch){
case '@':
cadena[i]=c[0];
cadena[i]=*ch;
cadena[i+1]='\0';
/* break; */
case ':':
aux=fp;
ch2=getc(aux);
if(ch2!=':'){
*ch=ch2;
cadena[i]=*ch;
i++;
cadena[i++]='\0';
}
else{
cadena[i]=*ch;
cadena[i+1]='\0';
*ch=ch2;
}
break;
default:
cadena[i]=*ch;
cadena[i+1]='\0';
} /* del case */
closegraph();
}
void visual()
{
int e;
FILE *fp;
char ch;
int cont=1;
clrscr();
if(((fp=fopen("anal_lex.dat","r"))==NULL)){
outtextxy(50,50,"!.....ERROR.....!"
);
}
e=0;
bar(0,10,600,450);
setcolor(BLUE);
outtextxy(140,30,"Listado del Programa");
rectangle(120,15,595,445);
rectangle(130,20,590,440);
ch=getc(fp);
while((ch!=EOF)){
putchar(ch);
ch=getc(fp);
if(ch=='\n')
cont++;
if(cont >=24){
outtextxy(140,430," Oprima una tecla para continuar..........");
cont=1;
ch=getch();
clrscr();
bar(0,10,600,450);
setcolor(BLUE);
outtextxy(140,30,"Listado del Programa");
rectangle(120,15,595,445);
rectangle(130,20,590,440);
}
}
fclose(fp);
}