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

}