//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;
}