-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.cpp
121 lines (95 loc) · 3.43 KB
/
main.cpp
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
#include "TabladeSimbolos.h"
#include "AnalizadorLexico.h"
#include "Parser.h"
#include <iostream>
static list<QString> warnings, errores, tokens, reglasReconocidas;
static TablaDeSimbolos tablaDeSimbolos;
static GeneradorDeCodigo codGen(&tablaDeSimbolos);
/** FUNCIONES AUXILIARES DE IMPRESION **/
void imprimirTokens() {
cout << "\n\nTokens identificados: \n";
cout << "****** ************** \n\n";
if (tokens.size()>0) {
for (list<QString>::iterator it = tokens.begin(); it!= tokens.end(); it++) {
cout << it->toStdString();
}
}
cout << "\n";
}
void imprimirErrores() {
cout << "\n\nErrores: " << errores.size() << ". ";
cout << "\n********";
if (errores.size()>0) {
for (list<QString>::iterator it = errores.begin(); it!= errores.end(); it++) {
cout << it->toStdString();
}
}
cout << "\n";
}
void imprimirWarnings() {
cout << "\nWarnings: " << warnings.size() << ". ";
cout << "\n*********";
if (warnings.size()>0) {
for (list<QString>::iterator it = warnings.begin(); it!= warnings.end(); it++) {
cout << it->toStdString();
}
}
cout << "\n";
}
void imprimirTabladeSimbolos() {
cout << "\nTabla de simbolos: ";
cout << "\n***** ** *********\n";
list<QString> entradas = tablaDeSimbolos.imprimir();
for (list<QString>::iterator it = entradas.begin(); it!= entradas.end(); it++) {
cout << it->toStdString();
}
}
void imprimirReglas() {
cout << "\nReglas encontradas: ";
cout << "\n****** ************\n";
if (!reglasReconocidas.empty())
{ for (list<QString>::iterator it = reglasReconocidas.begin(); it!=reglasReconocidas.end(); it++)
cout << endl << it->toStdString();
} else
cout << "\nNo se reconocieron reglas\n\n";
}
const char * rutaSalida (const char * ruta) {
QString aux = ruta;
while (aux.at(aux.size()-1)!='\\') {
aux.remove(aux.length()-1,1);
}
aux += "codigo_assembler.asm";
char * ret = new char [aux.length()+1];
strcpy(ret, aux.toLatin1().constData());
return ret;
}
/** Programa principal **/
int main(int argc, char *argv[])
{
AnalizadorLexico * lex = new AnalizadorLexico (argv[1], &warnings, &errores, &tablaDeSimbolos);
Parser * parser = new Parser (&tablaDeSimbolos,lex,&codGen, &errores);
/** Se ejecuta el yyparse **/
int resultado = parser->yyparse();
cout << "\n\nCodigo fuente analizado: " << argv[1] << endl;
/** Ahora se imprimen todos los resultados **/
/**Impresiones viejas (TP 1 y 2)**/
//tokens = lex->getTokens();
//imprimirTokens();
//reglasReconocidas = parser->getReglasEncontradas();
//imprimirReglas();
imprimirErrores();
imprimirWarnings();
codGen.redefinirVariables(); //modifica tabla y variables
imprimirTabladeSimbolos();
if (resultado==1 || parser->hasError() || errores.size()>0) {
cout << "\nEl programa no esta bien escrito (yyparse=1 o flag error = true).\n";
cout << "No se genero codigo assembler.\n";
} else {
codGen.imprimirTercetos();
codGen.generarAssembler(rutaSalida(argv[1]));
cout << "\n\n\nEl programa ha sido escrito correctamente. \n";
cout << "Codigo assembler almacenado en: " << rutaSalida(argv[1]) << endl;
}
cout << "\n\nDisenio de Compiladores. TP 3,4 \nAlumnos: \n Roman y Zubeldia, Alfonso \n Rios, Bruno.\n\n";
return resultado;
}