CALCULADORA SINTACTICO-LEXICO

Iniciado por blackber1, 3 Diciembre 2015, 04:37 AM

0 Miembros y 1 Visitante están viendo este tema.

blackber1

//QUISIERA QUE DE EL RESULTADO Y QUE PUEDA USAR POTENCIA
//ADEMAS DE AGREGARLE PI
//GRACIAS DE ANTEMANO
#include <stdio.h>
typedef enum
    /* book-keeping tokens */
   {ERROR,
    /* multicharacter tokens */
    PLUS,MINUS,
    /* special symbols */
    NUM,TIMES,LPAREN,RPAREN,ENDFILE,OVER,POW
   } TokenType;
int temp;
TokenType token;          // Tokens leídos
TokenType getToken();            // Analizador Léxico
void match (TokenType expected);      // Compara tokens
void E();               // Analizador Sintáctico E -> T E2 $
void E2();               // Analizador Sintáctico E2-> +T E2||E2->-T E2|epsilon
void T();               // Analizador Sintáctico T -> F T2
void T2();               // Analizador Sintáctico T2-> *F T2||T2-> /F T2|epsilon
void F();               // Analizador Sintáctico F -> num|(E)
/***********************************************
*  Compara token leido con token esperado     *
***********************************************/
void match(TokenType expected)
{ if (token == expected)
      token = getToken(); //regresarlo
  else
     printf("Error sintactico, se esperaba: otro token \n");
}



/***********************************************
*  Analizador Léxico                          *
***********************************************/
TokenType getToken()
{
   int c = getchar();
   while (c==' ') c=getchar();
   switch (c)
   {
      case '\t':
      case '+' : return PLUS;
      case '-' : return MINUS;
      case '*' : return TIMES;
                case '/' : return OVER;
                case '^' : return POW;
      case '(' : return LPAREN;
      case ')' : return RPAREN;
      case '\n':
      case EOF : return ENDFILE;
      default    : if (isdigit(c))
                  {
                      ungetc(c, stdin);
                        scanf("%d",&temp);
                        
                     return NUM;
                  }
               else
                  return ERROR;
   }
}

/***********************************************
*  Analizador Sintáctico                      *
***********************************************/

void E()                  // Analizador Sintáctico E -> T E2 $
{
  switch (token) {
      case NUM    : T(); E2();break;
      case LPAREN : T(); E2();break;
      default     : printf("Error sintactico en E(),se esperaba NUM o ( ");
  }
}

void E2()                // Analizador Sintáctico E2-> +T E2|epsilon
{
   switch ( token ) {
      case PLUS    : match(PLUS); T(); E2(); break;
      case MINUS    : match(MINUS); T(); E2(); break;
      case RPAREN   : break;
      case ENDFILE: break;
      default    : printf("Error sintactico en E2(), se esperaba: +,),EOF \n");
   }
}

void T()                 // Analizador Sintáctico T -> F T2
{
  switch (token) {
      case NUM      : F(); T2();break;
      case LPAREN   : F(); T2();break;
      default       : printf("Error sintactico en T(), se esperaba NUM o ( ");
   }
}

void T2()             // Analizador Sintáctico T2-> *F T2|epsilon
{
   switch ( token ) {
      case TIMES    : match(TIMES); F(); T2(); break;
      case OVER    : match(OVER); F(); T2(); break;
      case POW    : match(POW); F(); T2(); break;
      case MINUS: break;
      case PLUS    : break;

      case RPAREN    : break;
      case ENDFILE   : break;
      default    : printf("Error sintactico en T2(), se esperaba: *,+,),EOF \n");      
   }
}

void F()             // Analizador Sintáctico F -> num|(E)
{   
   switch ( token ) {
      case NUM   : match(NUM); break;
      case LPAREN : match(LPAREN); E(); match(RPAREN); break;
      default    : printf("Error sintactico en F(), se esperaba: numero , ( \n");
   }
}

/***********************************************
*  Función de inicio (Principal)              *
***********************************************/

int main()
{
 
   token = getToken();
   E();
   if (token!=ENDFILE)
      printf("Error sintactico, se esperaba terminar en : EOF \n");
   else
           printf("Resultado  \n");
         printf("Analisis sintactico terminado  \n");
   return 0;   
}