Beruflich Dokumente
Kultur Dokumente
LEXICO.CPP
Libreras:
# include<stdio.h>
# include<iostream.h>
# include<io.h>
# include<string.h>
# include<ctype.h>
# include<conio.h>
122,122,122},{109,109,109,109,109,109,109,109,109,109,109,109,107,108,109,109,109,109
,109,109,109,109,109,109,109,109,109},{110,110,110,110,110,110,110,110,110,110,110,11
0,110,111,110,110,110,110,110,110,110,110,110,110,110,110,110},{115,115,115,115,115,
115,115,116,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,115,
115,115},{18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,206,117,18,18,18,18,18,18,18,
18,18,207},{19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,206,118,19,19,19,19,19,
19,19},{120,123,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,
120,120,120,120,120,120,120,120,120}};
char res[39][10]= {"ARRAY", "ELSE", "FOR", "EXIT", "REPEAT", "TO", "TRUE", "CHAR",
"BEGIN", "WRITELN", "IF", "NOT", "RETURN" ,"UNTIL", "FALSE", "STRING", "CASE",
"READLN", "LOOP", "OF", "PROCEDURE", "VAR", "DIV", "BYTE", "CONST", "ELSEIF",
"MODULE", "MOD", "BY", "WHILE", "INTEGER", "BOOLEAN", "DO", "END", "FUNCTION",
"RECORD", "THEN", "WITH", "REAL"};
char log[3][4] = {"AND","OR","NOT"};
CLASE PRINCIPAL:
void main()
{
char *archivo;
clrscr();
edo=0;
Pide la direccin del archivo que se desea analizar y lo almacena en el puntero archivo
cout<<"Indique la ruta y el nombres del archivo ";
cin>>archivo;
fclose(fp);
cout<<"Nombre de archivo no valido" ;
getch();
}
En caso de que el archivo sea abierto, se llama al mtodo lxico y luego al mtodo men
else{
lxico
();
menu();
}
}
METODO LEXICO
void especifica mtodo que no retorna valor
void lexico(){
char *buf;
int l=0,i=0,c=1,p=1,a=0;
fa=fopen("c:\\acepta.txt","w");
fe=fopen("c:\\error.txt","w");
Realiza el proceso mientras no lea el smbolo peso ($)en el archivo
do{
edo=0;
i=0;
c=1;
p=1;
while((bufer[l]==' ') || (bufer[l]=='\n') || (bufer[l]=='\t'))
{
l++;
}
while((bufer[l]==';') || (bufer[l]=='+') || (bufer[l]=='-') || (bufer[l]=='=') || (bufer[l]==',')
|| (bufer[l]=='#') || (bufer[l]=='&'))
{
edo=0;
cad=bufer[l];
col=busca_columna(cad);
edo=mat[edo][col];
cout<<cad;
aceptacion(edo);
fputc(cad,fa);
fputc('\n',fa);
l++;
}
if(bufer[l]!='$'){
do{
cad=bufer[l];
if(cad!='@'){
col=busca_columna(cad);
edo=mat[edo][col];
if((edo>=0) && (edo<=20)){
buf[i]=cad;
i++;
}
l++;
}
else
{
cout<<bufer[l];
a=buf_doble(a);
if (a==0) l=0;
else l++;
}
}while((edo>=0) && (edo<=20));
if ((edo==105) || (edo==106) || (edo==117) || (edo==118) || (edo==116)
|| (edo==201) || (edo==203) || (edo==111) || (edo==107) || (edo==123)
|| (edo==108)){
buf[i]=cad;
i++;
}
for(int t=0; t<i; t++){
cout<<buf[t];
}
if(edo==102)
c=comp(buf);
error(edo);
}
}while(cad!='$');
cout<<"archivo analizado\n";
strncpy(&buf[0]," ",200);
strncpy(&bufer[0]," ",250);
fclose(fp);
fclose(fa);
fclose(fe);
getch();
}
METODO ACEPTACIN
void especifica mtodo que no retorna valor.
Recibe una variable de tipo entero y pregunta que asignacin tiene para imprimir especificacin de
token:
void aceptacion(int e)
{
switch(e)
{
case 100:printf(" CONSTANTE ENTERA\n");
break;
case 101:printf(" CONSTANTE REAL\n");
break;
case 102:printf(" IDENTIFICADOR \n");
break;
case 103:printf(" LETRERO ( ' O '' )\n");
break;
case 104:printf(" OPERADOR ARITMETICO DE DIVISION ( / )\n");
break;
case 105:printf(" COMENTARIOS\n");
break;
case 106:printf(" OPERADOR RELACIONAL DE ASIGNACION ( := )\n");
break;
case 107:printf(" OPERADOR RELACIONAL DIFERENTE ( <> )\n");
break;
case 108:printf(" OPERADOR RELACIONAL MENOR O IGUAL ( <= )\n");
break;
case 109:printf(" OPERADOR RELACIONAL MENOR ( < )\n");
break;
case 110:printf(" OPERADOR RELACIONAL MAYOR ( > )\n");
break;
case 111:printf(" OPERADOR RELACIONAL MAYOR O IGUAL ( >= )\n");
break;
case 112:printf(" OPERADOR RELACIONAL IGUAL ( = )\n");
break;
case '#':return(22);
case '&':return(23);
case ' ':return(24);
case '\t':return(25);
case '\n':return(26);
case '$':return(27);
default:if(isdigit(c));
return(0);
}
}
METODO COMP
int especifica mtodo que retornar valores enteros
Recibe una variable de tipo puntero y pregunta que carcter tiene para retornar de acuerdo al
carcter valores enteros correspondientes:
La funcin strncmp compara dos cadenas pero solo hasta cierto nmero que es el tercer campo
que usa la funcin, si no son iguales devuelve un valor negativo, en caso de ser iguales devuelve el
valor cero, r se incrementar y como la matriz res solo tiene 39 valores el do while se terminar en
caso de ser estas dos cadenas iguales y no mayores al tamao de res
La funcin strupr convierte los caracteres a maysculas. Finalmente el mtodo devuelve la variable
a.
int comp(char *b)
{
int a,r=0;
do{
a=strncmp(strupr(b),res[r],10);
r++;
}while((r<=38) && (a!=0));
return(a);
}
METODO COMP1
int especifica mtodo que retornar valores enteros.
Recibe una variable de tipo puntero y pregunta que carcter tiene para retornar de acuerdo al
carcter valores enteros correspondientes:
La funcin strncmp compara dos cadenas pero solo hasta cierto nmero que es el tercer campo
que usa la funcin, si no son iguales devuelve un valor negativo, en caso de ser iguales devuelve el
valor cero, r se incrementar y como la matriz log solo tiene 3 valores el do while se terminar en
caso de ser estas dos cadenas iguales y no mayores al tamao de log
La funcin strupr convierte los caracteres a maysculas. Finalmente el mtodo devuelve la variable
a.
int comp1(char *b)
{
int a,r=0;
do{
a=strncmp(strupr(b),log[r],4);
r++;
}while((r<=2) && (a!=0));
return(a);
}
METODO BUF_DOBLE
int especifica mtodo que retornar valores enteros
int buf_doble(int a){
if(a==0){
bufer[0];
fread(bufer,250,1,fp);
bufer[250]='@';
a=1;
}
else
{
fread(bufer,250,1,fp);
bufer[501]='@';
a=0;
}
return(a);
}
METODO MENU
Despliega en pantalla un men de tres opciones, condicionando con un swicth el acceso a una sola
opcin a la vez
void menu()
{
int op;
do{
clrscr();
gotoxy(25,2); cout<<"MENU";
gotoxy(23,4); cout<<"1.- Token's validos";
gotoxy(23,5); cout<<"2.- Errores";
gotoxy(23,6); cout<<"3.- Salir";
gotoxy(22,8); cout<<"Seleccione una opcion ";
cin>>op;
switch(op){
case 1: acep(); break;
case 2: error(); break;
}
}while(op!=3);
}
METODO ACEP
void especifica mtodo que no retorna valor
void acep()
{
char car;
Abre para lectura el archivo de texto de una direccin especifica
fa=fopen("c:\\acepta.txt","rt");
clrscr();
do{
La funcin fgetc obtiene el carcter siguiente (si est presente), si se llega al final del
fichero la funcin devuelve EOF
car=fgetc(fa);
Imprime en pantalla el carcter ledo
cout<<car;
}while(!feof(fa));
Cierra el archivo fa
fclose(fa);
getch();
}
METODO ERROR
void especifica mtodo que no retorna valor
void error()
{
char car;
Abre para lectura el archivo de texto de una direccin especifica
fe=fopen("c:\\error.txt","rt");
clrscr();
do{
La funcin fgetc obtiene el carcter siguiente (si est presente), si se llega al final del
fichero la funcin devuelve EOF
car=fgetc(fe);
Imprime en pantalla el carcter ledo
cout<<car;
}while(!feof(fe));
Cierra el archivo fe
fclose(fe);
getch();
}
COMPILACIN
Primero se debe crear en el disco C un archivo de texto que contenga los tokens que se desean
analizar
Segundo
Hacer compilar el programa: se debe especificar la direccin y nombre del archivo, entonces el
programa comenzar a identificar cada lnea del archivo de texto.
Tercero
Al terminar de analizar el archivo, el programa mostrar un men con tres opcciones
Cuarto
La primera opcin nos muestra el contenido aceptado:
Quinto
La segunda opcin nos muestra los errores de contenido identificados:
Sexto
Para verificar, ingresamos al disco C y notaremos que se crearon dos archivos de texto que
previamente no existan uno con el nombre de error y otro con el nombre de acepta, ambos
archivos contendrn los token aceptados y los token identificados como errores respectivamente: