loc_var

loc_var.cpp
Este programa sirve para reconocer nuestras variables, genera el programa tabla.cpp que es la tabla de nuestras variables
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include <dos.h>
#include <string.h>
FILE *in, *out;
int bandera=0,bandcom=0,cont=0;
char a;
char tip[1][20]={'\0'};
char cadena[20][50];
char cadena2[350][50]={'\0'};
char funciones[30][25]={'\0'};
char tipos[10][9]={"int","char","float","void","const"};
void cerrar(void);
void abrir(void);
void busc_fun(void);
void paso1();
void paso2();
void paso3();
void quitaesp();
void linea();
void letrero();
void porfin();
void main()
{char op;
clrscr();
busc_fun();
paso1();
paso2();
paso3();
quitaesp();
porfin();
printf("deseas ver la tabla de variables (S/N)\n");
op=toupper(getche());
if(op=='S')
system("edit tabla.cpp");
printf("\n\nARCHIVO DE SALIDA: tabla.CPP\n");
}
void abrir()
{
if ((in = fopen("tabla.CPP", "rt"))
== NULL)
{
fprintf(stderr, "no se puede abrir tabla.\n");
exit(1);
}
if ((out = fopen("tabla.BAK", "wt"))
== NULL)
{
fprintf(stderr, "no se puede abrir el bak.\n");
exit(1);
}
}
void cerrar()
{fclose(in);
fclose(out);
remove("tabla.cpp");
rename("tabla.bak","tabla.cpp");
remove("tabla.bak");
}
void busc_fun()
{
int i,k,e=0,l,m,j;
abrir();
int bandera=0;
// int bandera2=0;
while (!feof(in))
{ a=fgetc(in);
fputc(a,out);
if(a=='\n' )
bandera=0;
else
{ if(isalpha(a) || a=='_')
{
i=0;
while(a!='\n')
{
cadena[0][i]=a;
i++;
a=fgetc(in);
}
cadena[0][i]='\0';
for(l=0;l<10;l++)
{ if(strcmpi(cadena[0],tipos[l])==0)
{ bandera=1;
e=1;
break;
}
}
if(bandera==1 && e==0)
{ strcpy(funciones[cont],cadena[0]);
bandera=2;
a=fgetc(in);
if(a=='(')
{j=0;
for(m=0;m<cont;m++)
if(strcmpi(cadena[0],funciones[m])==0)
j=1;
if(j==0)
cont++;
}
else
{bandera=1;//no la ocupo
}
}
e=0;
}
else
bandera=0;//no l
}
}
funciones[cont][0]='\0';
/* for(i=0;i<cont;i++)
{for(k=0;k)
strcmpi(funciones[i][j])
}*/
fclose(in);
fclose(out);
}
void paso1()
{ abrir();
bandera=0;
while (!feof(in))
{ a=fgetc(in);
if(a!=',' && a!='}'
&& a!='(' && a!=')')
{ fputc(a,out);
}
if(a=='(')
{ fputc(';',out);
bandera++;
}
if(a==')')
{ fputc(';',out);
bandera--;
}
if(bandera>0 && a==',')
{fputc(';',out);
}
}
cerrar();
}
void paso2()
{
abrir();
bandera=0;
while (!feof(in))
{a=fgetc(in);
if(a==';' && bandera==0)
{ fputc(a, out);
fputc('\n',out);
bandera=1;}
else
{if(!isspace(a) && a!=';')
bandera=0;
}
if(bandera==0)
fputc(a,out);
}
cerrar();
}
void paso3()
{int k,i,m,j=0,e=0;
abrir();
while (!feof(in))
{ a=fgetc(in);
if(isalpha(a) || a=='_')
{
i=0;
while(a!='\n')
{
cadena[0][i]=a;
cadena2[j][i]=a;
i++;
a=fgetc(in);
}
cadena[0][i]='\0';
cadena2[j][i]='\0';

for(k=0;k<cont;k++)
if(strcmpi(cadena[0],funciones[k])==0 && bandera==1)
{
m=0;
j=0;
strcpy(cadena2[j],cadena[0]);
break;
}
for(k=m;k<j;k++)
if((strcmpi(cadena[0],cadena2[k])==0) && bandera==0)
{ if(cadena[0][0]!=';')
{ e=1;
break;
}
}
j++;
for(k=0;k<10;k++)
if(strcmpi(cadena[0],tipos[k])==0)
{ e=0;
bandera=1;
}
if(e==0)
{for(k=0;cadena[0][k]!='\0';k++)
fputc(cadena[0][k],out);
fputc('\n',out);
}
if(e==1)
j--;
if(cadena[0][0]==';')
bandera=0;
}
else
{ fputc(a,out);
if(a==';')
bandera=0;
}
e=0;
}
cerrar();
paso2();
}
void quitaesp()
{ abrir();
while (!feof(in))
{a=fgetc(in);
if(!isspace(a))
{ fputc(a, out);
bandera=0;}
else
if (bandera==0 )
{fputc('\n',out);
bandera=1;
}
}
cerrar();
}
void porfin()
{ int j=0,m,i,w,k,e;
abrir();
while (!feof(in))
{ a=fgetc(in);
if(a==';' || a == '{' )
strcpy(tip[0],'\0');
if(isalpha(a) || a=='_')
{
i=0;
while(a!='\n')
{
cadena[0][i]=a;
cadena2[j][i]=a;
i++;
a=fgetc(in);
}
cadena[0][i]='\0';
cadena2[j][i]='\0';
for(i=0;i<10;i++)
{ if(strcmpi(cadena[0],tipos[i])==0)
{ strcat(tip[0]," ");
strcat(tip[0],cadena[0]);
bandera=1;
break;
}
}
if(bandera==0 && cadena[0][0]!=';' && cadena[0][0]!='{')
{ strcpy(cadena2[j],cadena[0]);
w=strlen(cadena2[j]);
for(m=w;m<w+15;m++)
cadena2[j][m]=' ';
for(m=0;tip[0][m]!='\0';m++)
cadena2[j][15+m]=tip[0][m];
cadena2[e][15+m]='\0';
if(strlen(tip[0])==0)
cadena2[j][w]='\0';
j++;
}
bandera=0;
}
}
e=0;
bandera=0;
for(k=0;k<j;k++)
{ for(m=0;m<cont;m++)
{ w=strlen(funciones[m]);
if(strncmpi(cadena2[k],funciones[m],w)==0)
{ if(cadena2[k][16]==' ' && cadena2[k][17]==' ')
bandera=1;
}
}
if(bandera==0)
{strcpy(cadena2[e],cadena2[k]);
e++;
}
bandera=0;
}
bandera=0;
m=0;
k=0;
for(i=0;i<e;i++)
{ m=0;
for(j=0;j<cont;j++)
{ w=strlen(funciones[j]);
if(strncmpi(cadena2[i],funciones[j],w)==0)
m=1;
}
w=strlen("principal");
if(strncmpi(cadena2[i],"principal",w)==0)
break;
if(m==0)
{ strcpy(cadena[k],cadena2[i]);
k++;
}
}
for(i=0;i<e;i++)
{ w=strlen(cadena2[i]);
for(j=0;j<k;j++)
if((strncmpi(cadena2[i],cadena[j],w)==0) && cadena[j][w]==' ')
{strcpy(cadena2[i],cadena[j]);
break;
}
}
fputc('\n',out);
fputc('\n',out);
for(i=0;i<17;i++)
fputc(' ',out);
for(i=0;i<40;i++)
fputc('_',out);
fputc('\n',out);
for(k=0;k<18;k++)
fputc(' ',out);
letrero();
bandera=0;
for(i=0;i<e;i++)
{
for(k=0;k<cont;k++)
{
if(strncmpi(cadena2[i],funciones[k],strlen(funciones[k]))==0)
{ fputc('\n',out);
for(k=0;k<17;k++)
fputc(' ',out);
linea();
fputc('\n',out);
bandera=1;
break;
}
}
fputc('\n',out);
for(k=0;k<20;k++)
fputc(' ',out);
for(k=0;cadena2[i][k]!='\0';k++)
fputc(cadena2[i][k],out);
/* if(bandera==1)
{fputc('\n',out);
for(k=0;k<17;k++)
fputc(' ',out);
linea();
fputc('\n',out);
bandera=0;
}*/
}
fputc('\n',out);
for(i=0;i<17;i++)
fputc(' ',out);
for(i=0;i<40;i++)
fputc('_',out);
cerrar();
}
void letrero()
{int i;
fputc('V',out);
fputc('A',out);
fputc('R',out);
fputc('I',out);
fputc('A',out);
fputc('B',out);
fputc('L',out);
fputc('E',out);
for(i=0;i<10;i++)
fputc(' ',out);
fputc('T',out);
fputc('I',out);
fputc('P',out);
fputc('O',out);
fputc('\n',out);
for(i=0;i<17;i++)
fputc(' ',out);
for(i=0;i<40;i++)
fputc('-',out);
}
void linea(void)
{int i;
for(i=0;i<40;i++)
fputc('_',out);
}


Find_tk.cpp
Encuentra los tokens en el programa y tiene tambien la portada

#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <conio.h>
#include <dos.h>
FILE *in, *out,*maes;
int bandera=0,bandcom=0;
long curpos, length;
char a;
char archiv[15];
void quitpunt3(void);
void quitpunt2(void);
void quitpunt(void);
void quitaesp(void);
void opers(void);
void cerrar(void);
void abrir(void);
void copia(void);
void checa(void);
void main()
{char op;
textbackground(BLACK);
textcolor(WHITE);
clrscr();
gotoxy(1,8);
textattr(RED + BLINK);
cprintf("ANALIZADOR LEXICO:\n\n\r");
//textattr(YELLOW);
printf(" El programa analiza el codigo fuente de un programa en c");
textcolor(10);
cprintf("\n\nPresione cualquier tecla para continuar");
getch();

textbackground(BLUE);
textcolor(WHITE);
clrscr();
printf("Introduce el nombre del archivo\n");
gets(archiv);
copia();
quitpunt();
opers();
quitaesp();
// printf("deseas ver la salida (S/N)\n");
// op=toupper(getche());
// if(op=='S')
// system("edit tokens.cpp");
printf("\n\nARCHIVO DE SALIDA: TOKENS.CPP\n");
}
void abrir()
{if ((in = fopen("Tokens.CPP", "rt"))
== NULL)
{
fprintf(stderr, "Cannot open input file.\n");
exit(1);
}
if ((out = fopen("Tokens.BAK", "wt"))
== NULL)
{
fprintf(stderr, "Cannot open output file.\n");
exit(1);
}
}
void cerrar()
{fclose(in);
fclose(out);
remove("tokens.cpp");
rename("tokens.bak","tokens.cpp");
remove("tokens.bak");
}
void quitaesp()
{ abrir();
while (!feof(in))
{a=fgetc(in);
checa();
if(!isspace(a))
{ fputc(a, out);
bandera=0;}
else
{ if (bandera==0 && bandcom!=1 && a!='"')
{fputc('\n',out);
bandera=1;
}
if(bandcom==1)
fputc(a,out);
}
if(a=='\\')
{ a=fgetc(in);
fputc(a,out);
}
if(a==';')
{a=fgetc(in);
fputc(a,out);
if(a=='\n')
{ bandcom=0;
bandera=1;
}
}
}
cerrar();
}
void quitpunt()
{char f;
abrir();
bandera=0;
while (!feof(in))
{a=fgetc(in);
if(ispunct(a))
{
checa();
if(a=='"' && bandcom==1)
fputc('\n',out);
if(a!='.'
&& a!='_' && bandcom!=1)
fputc('\n',out);
}
else
bandera=0;
fputc(a, out);
if(ispunct(a))
{
if(a!='.' && a!='_' && bandcom!=1 && a!='"')
fputc('\n',out);
if(bandcom==1 && a=='"')
fputc('\n',out);
}
if(a=='\\')
{ a=fgetc(in);
fputc(a,out);
}
if(a==';')
{a=fgetc(in);
fputc(a,out);
if(a=='\n')
bandcom=0;
}
}
cerrar();
}
void opers()
{char f;
abrir();
bandera=0;
f='\0';
while (!feof(in))
{a=fgetc(in);
fputc(a,out);
if(a=='='|| a=='+' || a=='-' || a=='&' || a=='|' || a=='<' || a=='>' || a=='!') //|| a=='e' || a=='E')|| a=='\\')
{ f=a;
while(!feof(in))
{a=fgetc(in);
if(!isspace(a))
{
/* if(f=='E' || f=='e')
{if(a=='+' || a=='-')
bandera2=1;
// break;
}
if(f=='+' || f=='-')
{ if(isdigit(a))
bandera=1;
// break;
} */
if(f==a)
{ bandera=1;
break;
}
if(a=='=')
bandera=1;
break;
}
}
if(bandera==1)
{fputc(a,out);
fputc('\n',out);
bandera=0;
}
else
{
fputc('\n',out);
fputc(a,out);
bandera=0;
}
/* if(bandera2==1)
{ fputc(a,out);
bandera2=0;
} */
}
}
cerrar();
}
void copia()
{char x;
int banee=0;
if ((in = fopen(archiv, "rt"))
== NULL)
{
fprintf(stderr, "Cannot open input file.\n");
exit(1);
}
if ((out = fopen("Tokens.CPP", "wt"))
== NULL)
{
fprintf(stderr, "Cannot open output file.\n");
exit(1);
}
while (!feof(in))
{ a=fgetc(in);
if(a=='/' || a=='*')
{ if(a=='/')
{
x=fgetc(in);
if(x=='*')
banee=1;
else
{ fputc(a,out);
fputc(x,out);
}
}
if(a=='*')
{
x=fgetc(in);
if(x=='/')
banee=0;
else
{ fputc(a,out);
fputc(x,out);
}
}
}
else
{ if(banee==0)
fputc(a,out);
}


}
void checa()
{if(a=='"')
{
if(bandcom==0)
bandcom=1;
else
bandcom=0;
}
}

index.cpp
Manda a llamar a 3 programas find_tk,reserv1 y loc_var

#include<stdlib.h>
void main()
{
system("find_tk.exe"); // tokens
system("reserv1.exe"); // busca palabras reservadas
system("loc_var.exe"); // tabla de simbolos
}