-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfAuxs.c
executable file
·143 lines (121 loc) · 3.5 KB
/
fAuxs.c
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
136
137
138
139
140
141
142
143
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include "headers/fAuxs.h"
#include "headers/scanner.h"
extern FILE * out;
extern FILE * out_ensambler;
extern RegTS TS[];
extern char token_buffer[];
extern TOKEN token;
extern int flagToken;
/* ------------------- FUNCIONES AUXILIARES ------------------- */
void Match(TOKEN t)
{
if ( !(t == next_token()) ) sintax_error(t);
flagToken = 0;
}
TOKEN next_token()
{
if ( !flagToken )
{
token = scanner();
//printf("\t\t TOKEN: %d \n",token);
if ( token == LEXICALERROR ) lexical_error(token);
flagToken = 1;
if ( token == ID ) lookup(token_buffer, &token);
}
return token;
}
void lexical_error(int error)
{
printf("\t Lexical Error %d \n", error);
fprintf(out, "Lexical Error\n");
}
void sintax_error(TOKEN error)
{
char * mensaje;
switch(error){
case BEGIN: strcpy(mensaje,"Error de sintaxis: BEGIN"); break;
case END: strcpy(mensaje,"Error de sintaxis: END"); break;
case READ: strcpy(mensaje,"Error de sintaxis: READ"); break;
case WRITE: strcpy(mensaje,"Error de sintaxis: WRITE"); break;
case ID: strcpy(mensaje,"Error de sintaxis: ID"); break;
case INTLITERAL: strcpy(mensaje,"Error de sintaxis: INTLITERAL"); break;
case LPAREN: strcpy(mensaje,"Error de sintaxis: LPAREN"); break;
case RPAREN: strcpy(mensaje,"Error de sintaxis: RPAREN"); break;
case SEMICOLON: strcpy(mensaje,"Error de sintaxis: SEMICOLON"); break;
case COMMA: strcpy(mensaje,"Error de sintaxis: COMMA"); break;
case ASSIGNOP: strcpy(mensaje,"Error de sintaxis: ASSIGNOP"); break;
case PLUSSOP: strcpy(mensaje,"Error de sintaxis: PLUSOP"); break;
case MINUSOP: strcpy(mensaje,"Error de sintaxis: MINUSOP"); break;
case SCANEOF: strcpy(mensaje,"Error de sintaxis: SCANEOF"); break;
case PIPE: strcpy(mensaje,"Error de sintaxis: PIPE"); break;
default: break;
}
printf("%s \n", mensaje);
fprintf(out, "%s \n", mensaje);
}
void generate(char * accion, char * a, char * b, char * c)
{
printf("%s %s%c%s%c%s\n", accion, a, ',', b, ',', c);
fprintf(out,"%s %s%c%s%c%s\n", accion, a, ',', b, ',', c );
}
char * extract(REG_EXPRESION * preg)
{
/* Retorna la cadena del registro semantico */
return preg->name;
}
int lookup(char * id, TOKEN * t)
{
/* Determina si un identificador esta en la TS */
int i = 0;
while ( strcmp("$", TS[i].lexema_identifier) )
{
if ( !strcmp(id, TS[i].lexema_identifier) )
{
*t = TS[i].t;
return 1;
}
i++;
}
return 0;
}
void enter(char * id)
{
/* Agrega un identificador a la TS */
int i = 5;
while ( strcmp("$", TS[i].lexema_identifier) ) i++;
{
if ( i < 999 )
{
strcpy(TS[i].lexema_identifier, id );
TS[i].t = ID;
strcpy(TS[++i].lexema_identifier, "$" );
}
}
}
void check_id(char * s)
{
/* Si la cadena No esta en la Tabla de Simbolos la agrega,y si es el name de una variable genera la instruccion */
TOKEN t;
if ( !lookup(s, &t) )
{
enter(s);
generate("Declare", s, "Integer", "");
}
}
void start(void)
{
/* Inicializaciones Semanticas */
}
void finish(void)
{
/* Genera la instruccion para terminar la ejecucion del programa */
generate("Halt", "", "", "");
}
void assign(REG_EXPRESION izq, REG_EXPRESION der)
{
/* Genera la instruccion para la asignacion */
generate("Store", extract(&der), izq.name, "");
}