Sunteți pe pagina 1din 16

#include <stdio.

h>

#include <stdlib.h>

int result;

int ver;

typedef enum

/* book-keeping tokens */

{ERROR,

/* multicharacter tokens */

PLUS,MINUS,

/* special symbols */

NUM,TIMES,LPAREN,RPAREN,ENDFILE,OVER,POT,

} TokenType;

int temp;

int op;

int g=1;

TokenType token; // Tokens leídos

TokenType getToken(); // Analizador Léxico

void match (TokenType expected); // Compara tokens

int E(); // Analizador Sintáctico E -> T E2 $

int E2(); // Analizador Sintáctico E2-> +T E2|epsilon

int T(); // Analizador Sintáctico T -> F T2

int T2(int); // Analizador Sintáctico T2-> *F T2|epsilon

int 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 POT;

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 *

***********************************************/

int E() // Analizador Sintáctico E -> T E2 $

g=1;

switch (token) {

case NUM : ver=T(); ver=E2(ver);break;

case LPAREN : ver=E2(T());break;

default : printf("Error sintactico en E(),se esperaba NUMERO o ( \n");g=0;

printf(" E = %d\n",ver);

return ver;

int E2(int Te) // Analizador Sintáctico E2-> +T E2|epsilon


{

int Es=Te;

switch ( token ) {

case PLUS : match(PLUS); Es+=T();/*printf("Es = %d\n",Es);*/ Es=E2(Es);


break;

case MINUS : match(MINUS); Es-=T(); E2(Es); break;

case RPAREN : break;

case ENDFILE: break;

default : printf("Error sintactico en E2(), se esperaba: *,+,-,),EOF \n");break;

// printf("E2 = %d\n",Es);

return Es;

int T() // Analizador Sintáctico T -> F T2

int Te;

switch (token) {

case NUM : Te =F(); Te= T2(Te); break;

case LPAREN : Te =F(); Te =T2(Te);break;

default : printf("Error sintactico en T(), se esperaba NUMERO o ( ");break;

printf("Número = %d\n",Te);

return Te;

}
int T2(int Te) // Analizador Sintáctico T2-> *F T2|epsilon

int Tes=Te;

switch ( token ) {

case TIMES : match(TIMES);Tes*=F();Tes=T2(Tes); break;

case PLUS : break;

case MINUS : break;

case RPAREN : break;

case ENDFILE : break;

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

return Tes;

int F() // Analizador Sintáctico F -> num|(E)

switch ( token ) {

case NUM : match(NUM); break;

case LPAREN : match(LPAREN); temp=E();ver=temp; match(RPAREN); break;

default : printf("Error sintactico en F(), se esperaba: numero , ( \n");

return temp;

/***********************************************

* Función de inicio (Principal) *

***********************************************/

int main() {
while(1){

printf("Ingresa una cadena: ");

token=getToken();/* carga token con el primer caracter para búsqueda


hacia adelante */

result=E();

if (token!=ENDFILE)

printf("ERROR \n");

if (token==ENDFILE && g==1)

printf("BIEN \n");

printf("Resultado = %d\n",result);

ver=0;

}
ASDR_MAS_POR

//E->TE2

//E2->+TE2|lamda

//T->FT2

//T2->*FT2|lamda

//F->mun|(E)

#include <stdio.h>

typedef enum

{ERROR,

PLUS,

NUM,TIMES,LPAREN,RPAREN,ENDFILE

} TokenType;

int temp;

TokenType token;

TokenType getToken();

void match (TokenType expected);

void E();

void E2();

void T();

void T2();

void F();

/***********************************************

* Compara token leido con token esperado *

***********************************************/

void match(TokenType expected)

{ if (token == expected)

token = getToken();

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 TIMES;

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()

switch (token) {

case NUM : T(); E2();break;

case LPAREN : T(); E2();break;

default: printf("Error sintactico en E(),se esperaba NUM o ( ");

void E2()

switch ( token ) {

case PLUS : match(PLUS); T(); E2(); break;

case RPAREN : break;

case ENDFILE: break;

default : printf("Error sintactico en E2(), se esperaba: +,),EOF \n");

void T()

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 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()

{
while (1){

printf("Ingresa una cadena: ");

token = getToken();

E();

if (token!=ENDFILE)

printf("Error sintactico, se esperaba terminar en : EOF \n");

else

printf("Analisis sintactico terminado \n\n");

return 0;

}
LOUDEN

//E->TE2

//E2->+TE2|lamda

//T->FT2

//T2->*FT2|lamda

//F->mun|(E)

#include <stdio.h>

typedef enum

{ERROR,

PLUS,

NUM,TIMES,LPAREN,RPAREN,ENDFILE

} TokenType;

int temp;

TokenType token;

TokenType getToken();

void match (TokenType expected);

void E();

void E2();

void T();

void T2();

void F();

/***********************************************

* Compara token leido con token esperado *

***********************************************/

void match(TokenType expected)

{ if (token == expected)

token = getToken();

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 TIMES;

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()

switch (token) {

case NUM : T(); E2();break;

case LPAREN : T(); E2();break;

default: printf("Error sintactico en E(),se esperaba NUM o ( ");

void E2()

switch ( token ) {

case PLUS : match(PLUS); T(); E2(); break;

case RPAREN : break;

case ENDFILE: break;

default : printf("Error sintactico en E2(), se esperaba: +,),EOF \n");

void T()

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 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()

while (1){
printf("Ingresa una cadena: ");

token = getToken();

E();

if (token!=ENDFILE)

printf("Error sintactico, se esperaba terminar en : EOF \n");

else

printf("Analisis sintactico terminado \n\n");

return 0;

S-ar putea să vă placă și