Título: CALCULADORA SINTACTICO-LEXICO Publicado por: blackber1 en 3 Diciembre 2015, 04:37 am //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; } |