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


0