Ayuda!!!

Tema en 'Webmasters, programadores y diseñadores' iniciado por Janade, 1 Dic 2017.

  1. Janade

    Janade Becerro

    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 :D ****";
    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;
    }
     

Compartir esta página