
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;
}
- CALCULADORA.rar(1,1 KB)
Valora esta pregunta


0