Respuesta: Problema con analizador lexico completo Chicos , se que no es etico, pero tengo avanzado mi codigo y desearia saber como terminarlo, es urgente
Código:
#include <cstdlib>
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <fstream>
#define max 100
using namespace std;
typedef char cadena[100];
typedef enum{verdadero,falso} coin;
coin relacionales (char aux)
{if(aux=='<' || aux=='>' || aux=='!' || aux==char(34) || aux==char(39))
{ return verdadero;}
return falso;
}
coin delimitador (char aux)
{if(aux==',' || aux==';' || aux=='[' || aux==']' || aux=='(' || aux==')' || aux==':')
{ return verdadero;}
return falso;
}
coin arimeticos (char aux)
{if(aux=='+' || aux=='-' || aux=='*' || aux=='/' || aux=='=' || aux=='#' )
{ return verdadero;}
return falso;
}
coin reservada (cadena cad)
{ int i;
char *lista[]={"AND","ARRAY","BEGIN","CASE","CONST","CLRSCR","CRT","DIV","DO","DOWNTO","ELSE","END","FILE","FOR","FUNCTION","GOTO",
"IF","IN","LABEL","MOD","NULL","NOT","OF","OR","PACKED","PROCEDURE","PROGRAM","RECORD","REPEAT","SET","THEN","TO","TYPE","UNTIL","VAR",
"WHILE","WITH","ABS","ACTAN","BOOLEAN","CHAR","CUS","DISPOSE","EOF","EOL","EXP","FALSE","INPUT","INTEGER","INT","MAXINT","NEW","NIL",
"ODD","ORD","OUTPUT","PACK","PAGE","PUT","READ","READLN","REAL","RESET","REWRITE","ROUND","SIN","SQR","SQRT","SOCC","TEXT","TRUE",
"TRUNC","UNPACK","USES","WRITE","WRITELN"};
for(i=0;i<77;i++)
{
if (strcmp(lista[i],cad)== 0)
return verdadero;
}
return falso;
}
/*coin analiz (string cad)
{
int i,est,c=0,l=0,d=0,u,e=0;
for(u=0;cad[u]!='\0';u++)
{cad[u]='\0';}
for(i=0;i<cad.length();i++)
{
if((isalpha(cad[i]))||(isdigit(cad[i])))
{
if(isalpha(cad[i]))
l++;
if(isdigit(cad[i]))
d++;
}
else
if(!(isalpha(cad[i]))&&!(isdigit(cad[i])))
e++;
if(cad[i]=='\0')
break;
}
c=l+d+e-1;
est=1;
while(est!=3)
{
for(i=0;i<=c;i++)
{
switch(est)
{
case 1: if(isalpha(cad[i]))
{est=2;break;}
else {return falso;}
case 2: if(cad[i]=='\0')
{return falso;}
if(isalpha(cad[i]))
{est=2;break;}
else {if(isdigit(cad[i]))
{est=3;
if(d>=1 and l==1)
{return verdadero;}
}
default: return falso;
}
}
}
}
}*/
/*coin numero (string cad)
{
int i,est,c=0,l=0,d=0,u,e=0;
for(u=0;cad[u]!='\0';u++)
{cad[u]='\0';}
for(i=0;i<cad.length();i++)
{
if((isalpha(cad[i]))||(isdigit(cad[i])))
{
if(isalpha(cad[i]))
l++;
if(isdigit(cad[i]))
d++;
}
else
if(!(isalpha(cad[i]))&&!(isdigit(cad[i])))
e++;
if(cad[i]=='\0')
break;
}
c=l+d+e-1;
est=1;
while(est!=3)
{
for(i=0;i<=c;i++)
{
switch(est)
{
case 1: if(isdigit(cad[i]))
{est=2;break;}
case 2: if(cad[i]=='\0' and d>=1)
{est=3;return verdadero;}
else if(isdigit(cad[i]))
{est=2;break;}
default: return falso;
}
}
}
}*/
/*coin real (string cad)
{
int i,est,c=0,l=0,d=0,u,e=0;
for(u=0;cad[u]!='\0';u++)
{cad[u]='\0';}
for(i=0;i<cad.length();i++)
{
if((isalpha(cad[i]))||(isdigit(cad[i])))
{
if(isalpha(cad[i]))
l++;
if(isdigit(cad[i]))
d++;
}
else
if(!(isalpha(cad[i]))&&!(isdigit(cad[i])))
e++;
if(cad[i]=='\0')
break;
}
c=l+d+e-1;
est=1;
while(est!=4)
{
for(i=0;i<=c;i++)
{
switch(est)
{
case 1: if(isdigit(cad[i]))
{est=2;break;}
case 2: if(cad[i]=='\0' and d>=1)
{est=3;}
else if(isdigit(cad[i]))
{est=2;break;}
else if(cad[i]='.')
{est=3;break;}
else
{return falso;}
case 3: if(isdigit(a[i]))
{est=3;break;}
if(a[i]=='\0' and d>=1)
{est=4;return verdadero;}
else{return falso;}}
default: return falso;
}
}
}
}*/
int main(int argc, char *argv[])
{
int c;
cadena linea;
cadena cad;
char lex[max];
int u,i=0;
char *aplin;
for(u=0;linea[u]!='\0';u++)
linea[u]='\0';
for(u=0;lex[u]!='\0';u++)
lex[u]='\0';
ifstream arch("Codigo.txt");
ofstream resp("Respuesta.txt");
while(!arch.eof())
{
arch.getline(linea,sizeof(linea));
cout<<"Codigo Base: "<<linea<<endl<<endl;
resp<<"Codigo Base: "<<linea<<endl<<endl;
while((linea[i]!='\0')&&(linea[i]!=';'))
{
lex[i]=toupper(linea[i]);
i++;
}
lex[i]='\0';
aplin=lex;
while(*aplin!='\x0' && *aplin!=';' && *aplin!='\0')
{
i=0;
if(relacionales(*aplin)==verdadero || arimeticos(*aplin)==verdadero || *aplin =='\t' ||delimitador(*aplin)==verdadero ||*aplin==' ')
{
if(relacionales(*aplin)==verdadero)
{
cout<<*aplin<<" ... Operador Relacional "<<endl;
resp<<*aplin<<" ... Operador Relacional "<<endl;
}
if(delimitador(*aplin)==verdadero)
{
cout<<*aplin<<" .... Delimitador "<<endl;
resp<<*aplin<<" .... Delimitador "<<endl;
}
if(arimeticos(*aplin)==verdadero)
{
cout<<*aplin<<" .... Operador Arimetico "<<endl;
resp<<*aplin<<" .... Operador Arimetico "<<endl;
}
*aplin++;
}
else
{
i=0;
do
{ cad[i]=*aplin;
*aplin++;
i++;}
while(relacionales(*aplin)==falso && arimeticos(*aplin)==falso && *aplin!='\x0' && delimitador(*aplin)==falso && *aplin!='\0' && *aplin!=' ');
cad[i]='\0';
if(reservada(cad)==verdadero)
{cout<<cad<<" ..... Palabra Reservada"<<endl;
resp<<cad<<" ..... Palabra Reservada"<<endl;}
/*if(analiz(cad)==verdadero)
{cout<<cad<<" Identificador"<<endl;
resp<<cad<<" Identificador"<<endl;}*/
/* if(numero(cad)==verdadero)
{cout<<cad<<" Numero"<<endl;
resp<<cad<<" Numero"<<endl;}*/
/*if(real(cad)==verdadero)
{cout<<cad<<" Numero Real"<<endl;
resp<<cad<<" Numero Real"<<endl;}*/
}
}
}
resp.close();
system("PAUSE");
return 0;
}
lo ultimo que me falta es como detectar los numeros, los numeros reales y los identificadores, basta con hallar uno de ellos para hallar todo |