C/Visual C - CALCULADORA SINTACTICO-LEXICO

 
Vista:
sin imagen de perfil

CALCULADORA SINTACTICO-LEXICO

Publicado por Luis (1 intervención) el 04/12/2015 18:24:45
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
//COMO PODRIA GUARDAR EL RESULTADO Y AGREGARLE PI
 
#include <stdio.h>
typedef enum
    /* book-keeping tokens */
   {ERROR,
    /* multicharacter tokens */
    PLUS,
    /* special symbols */
    NUM,TIMES,LPAREN,RPAREN,ENDFILE,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|epsilon
void T();					// Analizador Sintáctico T -> F T2
void T2();					// Analizador Sintáctico 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 TIMES;
		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 POW	: 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 POW	: match(POW); 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);match(POW); 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 %f \n",&temp);
 
			getchar();
 
	return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder