- Tema Autor
- #1
He estado en clase y tengo que hacer un analizador Léxico.
Hasta ahorita tengo avanzado una cierta parte pero lo que no lee o hace falta son las palabras reservadas faltan los exponentes y que lea también operadores, lógicos, relacionales, y aritméticos.
Agradecería bastante una respuesta con la solución, gracias
#include <iostream>
#include <windows.h>
using namespace std;
void gotoxy(int, int);
void marco(int, int, int, int);
void pantalla();
int estado(char);
enum Estados
{
_1,
_2,
_3,
_4,
_5,
_6,
_7,
_8,
_9,
_10,
_11,
_12,
_13,
_14,
_15,
_16,
}
aef;
int main()
{
string cadena;
int resultado,token, x1, x2, y1;
system("color 3F");
while(1>0)
{
x1=25;
y1=21;
x2=13;
resultado=0;
token=0;
aef=_1;
system("cls");
pantalla();
gotoxy(25,6);
cin>>cadena;
for(int i=0; i<cadena.length(); i++)
{
resultado=estado(cadena);
gotoxy(x1,8);
switch(aef)
{
case _1:
gotoxy(x2,y1);
cout<<"1, ";
x2+=3;
if(resultado==1)
{
aef=_2;
token=1;
}
else if(resultado==2)
{
aef=_11;
token=6;
}
else if(resultado==3)
{
aef=_3;
token=2;
}
else
token=-1;
break;
case _2:
gotoxy(x2,y1);
cout<<"2, ";
x2+=3;
if(resultado==1)
{
aef=_2;
}
else if(resultado==4)
{
aef=_4;
if(token!=7)
{
if(token==1)
token=3;
else if(token==2)
token=4;
}
}
else if(resultado==2&&(cadena=='e'||cadena=='E'))
{
if(token!=7)
token=5;
aef=_6;
}
else if(resultado==7||resultado==3)
{
token=7;
aef=_15;
}
else
token=-1;
break;
case _3:
gotoxy(x2,y1);
cout<<"3, ";
x2+=3;
if(resultado==1)
aef=_2;
else
token=-1;
break;
case _4:
gotoxy(x2,y1);
cout<<"4, ";
x2+=3;
if(resultado==1)
aef=_5;
else
token=-1;
break;
case _5:
gotoxy(x2,y1);
cout<<"5, ";
x2+=3;
if(resultado==1)
{
aef=_5;
}
else if(resultado==2&&(cadena=='e'||cadena=='E'))
{
aef=_6;
if(token!=7)
token=5;
}
else if(resultado==7||resultado==3)
{
token=7;
aef=_15;
}
else
token=-1;
break;
case _6:
gotoxy(x2,y1);
cout<<"6, ";
x2+=3;
if (resultado==3)
aef=_7;
else
token=-1;
break;
case _7:
gotoxy(x2,y1);
cout<<"7, ";
x2+=3;
if(resultado==1)
aef=_8;
else
token=-1;
break;
case _8:
gotoxy(x2,y1);
cout<<"8, ";
x2+=3;
if(resultado==1)
{
aef=_8;
}
else if(resultado==4)
{
aef=_9;
}
else if(resultado==7||resultado==3)
{
token=7;
aef=_15;
}
else token=-1;
break;
case _9:
gotoxy(x2,y1);
cout<<"9, ";
x2+=3;
if(resultado==1)
aef=_10;
else
token=-1;
break;
case _10:
gotoxy(x2,y1);
cout<<"10, ";
x2+=4;
if(resultado==1)
aef=_10;
else if(resultado==7||resultado==3)
{
token=7;
aef=_15;
}
else
token=-1;
break;
case _11:
gotoxy(x2,21);
cout<<"11, ";
x2+=4;
if(resultado==1||resultado==2)
aef=_11;
else if(resultado==6)
{
if(cadena[i+1]=='=')
{
i++;
gotoxy(x1,8);
cout<<"|";
}
aef=_12;
token=8;
}
else
token=-1;
break;
case _12:
gotoxy(x2,y1);
cout<<"12, ";
x2+=4;
if(resultado==1)
aef=_14;
else if(resultado==2)
aef=_13;
else
token=-1;
break;
case _13:
gotoxy(x2,y1);
cout<<"13, ";
x2+=4;
if(resultado==2)
aef=_13;
else
token=-1;
break;
case _14:
gotoxy(x2,y1);
cout<<"14, ";
x2+=4;
if(resultado==1)
aef=_14;
else
token=-1;
break;
case _15:
gotoxy(x2,y1);
cout<<"15, ";
x2+=4;
if(resultado==1)
aef=_2;
else if(resultado==3)
aef=_16;
else
token=-1;
break;
case _16:
gotoxy(x2,y1);
cout<<"16, ";
x2+=4;
if(resultado==1)
aef=_2;
else
token=-1;
break;
}
if(x2>=150)
{
x2=13;
y1++;
}
if(token==-1)
break;
Sleep(200);
}
if(token!=-1)
{
if(aef==_2||aef==_5||aef==_8||aef==_10||aef==_11||aef==_13||aef==_14)
{
gotoxy(x2,y1);
cout<<"La cadena si es valida joven";
gotoxy(20,17);
if(token==1)
cout<<"Numero entero sin signo";
else if(token==2)
cout<<"Numero entero con signo";
else if(token==3)
cout<<"Numero real sin signo";
else if(token==4)
cout<<"Numero real con signo";
else if(token==5)
cout<<"Numero exponencial";
else if(token==6)
cout<<"Identificador";
else if(token==7)
cout<<"Expresion aritmetica";
else if(token==8)
cout<<"Expresion relacional";
}
else
{
gotoxy(x2,y1);
cout<<"Error carnal :/ !";
gotoxy(20,17);
cout<<"La cadena no es valida joven";
}
}
else
{
gotoxy(x2,y1);
cout<<"Error carnal :/ !";
gotoxy(20,17);
cout<<"La cadena no es valida joven";
}
gotoxy(40,y1+2);
system("pause");
}
}
void gotoxy(int x, int y)
{
HANDLE hCon;
hCon = GetStdHandle(STD_OUTPUT_HANDLE);
COORD dwPos;
dwPos.X = x;
dwPos.Y = y;
SetConsoleCursorPosition(hCon,dwPos);
}
void marco(int IniX, int IniY, int FinX, int FinY)
{
gotoxy(IniX,IniY);
cout<<char(201);
gotoxy(FinX,IniY);
cout<<char(187);
gotoxy(IniX,FinY);
cout<<char(200);
gotoxy(FinX,FinY);
cout<<char(188);
for(int i=IniX+1; i<FinX; i++)
{
gotoxy(i,IniY);
cout<<char(205);
gotoxy(i,FinY);
cout<<char(205);
}
for(int i=IniY+1; i<FinY; i++)
{
gotoxy(IniX,i);
cout<<char(186);
gotoxy(FinX,i);
cout<<char(186);
}
}
void pantalla()
{
marco(0,0,119,29);
gotoxy(44,2);
cout<<"****Analizador Lexico ****";
marco(2,5,117,7);
gotoxy(4,6);
cout<<"Escribe la cadena: ";
marco(2,16,19,18);
gotoxy(4,17);
cout<<"Tipo de cadena:";
marco(2,20,12,22);
gotoxy(4,21);
cout<<"Estados:";
}
int estado(char a)
{
if(isdigit(a))
return 1;
else if(isalpha(a)||a=='_')
return 2;
else if(a=='+'||a=='-')
return 3;
else if(a=='.')
return 4;
else if(a=='E'||a=='e'||a=='^')
return 5;
else if(a=='<'||a=='>'||a=='='||a=='!')
return 6;
else if(a=='*'||a=='/'||a=='%')
return 7;
else
return 0;
}
Hasta ahorita tengo avanzado una cierta parte pero lo que no lee o hace falta son las palabras reservadas faltan los exponentes y que lea también operadores, lógicos, relacionales, y aritméticos.
Agradecería bastante una respuesta con la solución, gracias
#include <iostream>
#include <windows.h>
using namespace std;
void gotoxy(int, int);
void marco(int, int, int, int);
void pantalla();
int estado(char);
enum Estados
{
_1,
_2,
_3,
_4,
_5,
_6,
_7,
_8,
_9,
_10,
_11,
_12,
_13,
_14,
_15,
_16,
}
aef;
int main()
{
string cadena;
int resultado,token, x1, x2, y1;
system("color 3F");
while(1>0)
{
x1=25;
y1=21;
x2=13;
resultado=0;
token=0;
aef=_1;
system("cls");
pantalla();
gotoxy(25,6);
cin>>cadena;
for(int i=0; i<cadena.length(); i++)
{
resultado=estado(cadena);
gotoxy(x1,8);
switch(aef)
{
case _1:
gotoxy(x2,y1);
cout<<"1, ";
x2+=3;
if(resultado==1)
{
aef=_2;
token=1;
}
else if(resultado==2)
{
aef=_11;
token=6;
}
else if(resultado==3)
{
aef=_3;
token=2;
}
else
token=-1;
break;
case _2:
gotoxy(x2,y1);
cout<<"2, ";
x2+=3;
if(resultado==1)
{
aef=_2;
}
else if(resultado==4)
{
aef=_4;
if(token!=7)
{
if(token==1)
token=3;
else if(token==2)
token=4;
}
}
else if(resultado==2&&(cadena=='e'||cadena=='E'))
{
if(token!=7)
token=5;
aef=_6;
}
else if(resultado==7||resultado==3)
{
token=7;
aef=_15;
}
else
token=-1;
break;
case _3:
gotoxy(x2,y1);
cout<<"3, ";
x2+=3;
if(resultado==1)
aef=_2;
else
token=-1;
break;
case _4:
gotoxy(x2,y1);
cout<<"4, ";
x2+=3;
if(resultado==1)
aef=_5;
else
token=-1;
break;
case _5:
gotoxy(x2,y1);
cout<<"5, ";
x2+=3;
if(resultado==1)
{
aef=_5;
}
else if(resultado==2&&(cadena=='e'||cadena=='E'))
{
aef=_6;
if(token!=7)
token=5;
}
else if(resultado==7||resultado==3)
{
token=7;
aef=_15;
}
else
token=-1;
break;
case _6:
gotoxy(x2,y1);
cout<<"6, ";
x2+=3;
if (resultado==3)
aef=_7;
else
token=-1;
break;
case _7:
gotoxy(x2,y1);
cout<<"7, ";
x2+=3;
if(resultado==1)
aef=_8;
else
token=-1;
break;
case _8:
gotoxy(x2,y1);
cout<<"8, ";
x2+=3;
if(resultado==1)
{
aef=_8;
}
else if(resultado==4)
{
aef=_9;
}
else if(resultado==7||resultado==3)
{
token=7;
aef=_15;
}
else token=-1;
break;
case _9:
gotoxy(x2,y1);
cout<<"9, ";
x2+=3;
if(resultado==1)
aef=_10;
else
token=-1;
break;
case _10:
gotoxy(x2,y1);
cout<<"10, ";
x2+=4;
if(resultado==1)
aef=_10;
else if(resultado==7||resultado==3)
{
token=7;
aef=_15;
}
else
token=-1;
break;
case _11:
gotoxy(x2,21);
cout<<"11, ";
x2+=4;
if(resultado==1||resultado==2)
aef=_11;
else if(resultado==6)
{
if(cadena[i+1]=='=')
{
i++;
gotoxy(x1,8);
cout<<"|";
}
aef=_12;
token=8;
}
else
token=-1;
break;
case _12:
gotoxy(x2,y1);
cout<<"12, ";
x2+=4;
if(resultado==1)
aef=_14;
else if(resultado==2)
aef=_13;
else
token=-1;
break;
case _13:
gotoxy(x2,y1);
cout<<"13, ";
x2+=4;
if(resultado==2)
aef=_13;
else
token=-1;
break;
case _14:
gotoxy(x2,y1);
cout<<"14, ";
x2+=4;
if(resultado==1)
aef=_14;
else
token=-1;
break;
case _15:
gotoxy(x2,y1);
cout<<"15, ";
x2+=4;
if(resultado==1)
aef=_2;
else if(resultado==3)
aef=_16;
else
token=-1;
break;
case _16:
gotoxy(x2,y1);
cout<<"16, ";
x2+=4;
if(resultado==1)
aef=_2;
else
token=-1;
break;
}
if(x2>=150)
{
x2=13;
y1++;
}
if(token==-1)
break;
Sleep(200);
}
if(token!=-1)
{
if(aef==_2||aef==_5||aef==_8||aef==_10||aef==_11||aef==_13||aef==_14)
{
gotoxy(x2,y1);
cout<<"La cadena si es valida joven";
gotoxy(20,17);
if(token==1)
cout<<"Numero entero sin signo";
else if(token==2)
cout<<"Numero entero con signo";
else if(token==3)
cout<<"Numero real sin signo";
else if(token==4)
cout<<"Numero real con signo";
else if(token==5)
cout<<"Numero exponencial";
else if(token==6)
cout<<"Identificador";
else if(token==7)
cout<<"Expresion aritmetica";
else if(token==8)
cout<<"Expresion relacional";
}
else
{
gotoxy(x2,y1);
cout<<"Error carnal :/ !";
gotoxy(20,17);
cout<<"La cadena no es valida joven";
}
}
else
{
gotoxy(x2,y1);
cout<<"Error carnal :/ !";
gotoxy(20,17);
cout<<"La cadena no es valida joven";
}
gotoxy(40,y1+2);
system("pause");
}
}
void gotoxy(int x, int y)
{
HANDLE hCon;
hCon = GetStdHandle(STD_OUTPUT_HANDLE);
COORD dwPos;
dwPos.X = x;
dwPos.Y = y;
SetConsoleCursorPosition(hCon,dwPos);
}
void marco(int IniX, int IniY, int FinX, int FinY)
{
gotoxy(IniX,IniY);
cout<<char(201);
gotoxy(FinX,IniY);
cout<<char(187);
gotoxy(IniX,FinY);
cout<<char(200);
gotoxy(FinX,FinY);
cout<<char(188);
for(int i=IniX+1; i<FinX; i++)
{
gotoxy(i,IniY);
cout<<char(205);
gotoxy(i,FinY);
cout<<char(205);
}
for(int i=IniY+1; i<FinY; i++)
{
gotoxy(IniX,i);
cout<<char(186);
gotoxy(FinX,i);
cout<<char(186);
}
}
void pantalla()
{
marco(0,0,119,29);
gotoxy(44,2);
cout<<"****Analizador Lexico ****";
marco(2,5,117,7);
gotoxy(4,6);
cout<<"Escribe la cadena: ";
marco(2,16,19,18);
gotoxy(4,17);
cout<<"Tipo de cadena:";
marco(2,20,12,22);
gotoxy(4,21);
cout<<"Estados:";
}
int estado(char a)
{
if(isdigit(a))
return 1;
else if(isalpha(a)||a=='_')
return 2;
else if(a=='+'||a=='-')
return 3;
else if(a=='.')
return 4;
else if(a=='E'||a=='e'||a=='^')
return 5;
else if(a=='<'||a=='>'||a=='='||a=='!')
return 6;
else if(a=='*'||a=='/'||a=='%')
return 7;
else
return 0;
}