Dev - C++ - CALCULADORA SINTACTICO-LEXICO

 
Vista:
sin imagen de perfil

CALCULADORA SINTACTICO-LEXICO

Publicado por Luis (1 intervención) el 30/11/2015 16:54:21
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
134
135
//QUISIERA QUE DE EL RESULTADO Y PODER AGREGAR PI A LA CALCULADORA.
//AQUI DEJO EL CODIGO.
#include <stdio.h>
typedef enum
    /* book-keeping tokens */
   {ERROR,
    /* multicharacter tokens */
    PLUS,MINUS,
    /* special symbols */
    NUM,TIMES,LPAREN,RPAREN,ENDFILE,OVER,POT,
   } 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 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                      * 
 ***********************************************/
 
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 POT 	: match(POT); 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("Analisis sintactico terminado \n");
	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