-
Notifications
You must be signed in to change notification settings - Fork 0
/
lexicalanalyzer.h
170 lines (125 loc) · 7.13 KB
/
lexicalanalyzer.h
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
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#ifndef LEXICALANALYZER_H
#define LEXICALANALYZER_H
#include <list>
#include <string>
#include <Map>
#include "y.tab.h"
#include "symbolstable.h"
#include <iostream>
using namespace std;
#define F -2 //estado final
#define EOF 22 //columna de fin de archivo
#define INVALID -4 //para devolver cuando el token no es valido, o en pasos intermedios
static const int state [23][23] ={
/*
(,)
{,}
[,]
','
tab ';'
letra digito F,C i d D . - _ blanco, \n (+) / & @ " > < : ! (=) otro EOF */
{ 1 , 0 , 1 , 1 , 1 , 1 , 0 , 11 , 2 , 0 , 0 , F , F , 18, 0 , 16, 13, 12, 14, 15, F , 0 , 0}, //0
{ 1 , 1 , 1 , 1 , 1 , 1 , F , F , 1 , F , F , F , F , F , F , F , F , F , F , F , F , F , F}, //1
{ 0 , 0 , 0 , 3 , 5 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, //2
{ 0 , 4 , 0 , 0 , 0 , 0 , 0 , 4 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, //3
{ F , 4 , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F}, //4
{ 0 , 6 , 0 , 0 , 0 , 0 , 7 , 6 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, //5
{ 0 , 6 , 0 , 0 , 0 , 0 , 7 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, //6
{ F , 7 , F , F , 8 , 8 , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F}, //7
{ 0 , 9 , 0 , 0 , 0 , 0 , 0 , 10 , 0 , 0 , 0 , 10, 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, //8
{ F , 9 , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F}, //9
{ 0 , 9 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0}, //10
{ F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F}, //11
{ F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F}, //12
{ F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F , F}, //13
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , F , 0 , 0}, //14
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , F , 0 , 0}, //15
{ 16 , 16 , 16, 16, 16, 16, 16, 16 , 16 , 16 , 0 , 17, 16 , 16, 16, F , 16, 16, 16, 16, 16 , 16, 0}, //16
{ 16 , 16 , 16, 16, 16, 16, 16, 16 , 16 , 16 , 16, 17, 16 , 16, 16, F , 16, 16, 16, 16, 16 , 16, 0}, //17
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 19, 0 , 0 , 0 , 0 , 0 , 0 , F , 0 , 0}, //18
{ 20 , 20 , 20, 20, 20, 20, 20, 20 , 20 , 20 , 0 , 20, 20 , 20, 21, 20, 20, 20, 20, 20, 20 , 20, 0}, //19
{ 20 , 20 , 20, 20, 20, 20, 20, 20 , 20 , 20 , 0 , 20, 20 , 20, 20, 20, 20, 20, 20, 20, 20 , 20, 0}, //20
{ 20 , 20 , 22, 20, 20, 20, 20, 20 , 20 , 20 , 0 , 20, 20 , 20, 20, 20, 20, 20, 20, 20, 20 , 20, 0}, //21
{ 22 , 22 , 22, 22, 22, 22, 22, 22 , 22 , 22 , F , 22, 22 , 22, 22, 22, 22, 22, 22, 22, 22 , 22, F} //22
};
class LexicalAnalyzer
{
public:
LexicalAnalyzer(const char * textfile, list<string> * warnings, list<string> * errors, SymbolsTable * symbolsTable);
int yylex();
list <string> getTokens();
//ESTA ES SOLO PARA TESTEO, DE ESTO SE ENCARGA EL PARSER,LLAMO A YYLEX
void reconocerTokens();
//devuelve la cantidad de lineas leidas hasta el momento (o lo que es lo mismo, la linea en la que esta parado el lexico en este momento)
int getLine();
private:
SymbolsTable * symbolsTable;
list<string> * warnings;
list <string> * errors;
int lines = 1;
map <string, int> reservedWords;
//Para imprimir al final
list <string> recognizedTokens;
void addRecognized(string * buffer, int token);
//Contendra el contenido del archivo. Se usa como entrada.
list<char> file;
//matriz de acciones semanticas
int (LexicalAnalyzer::*semanticActions [23][23])(string*,char);
//dado un char, devuelve su columna correspondiente
int getColumn(char c);
void initState();
void initReservedWords();
void error(string str);
/** Acciones semanticas **/
//Accion semantica de acumulación: agrega char a la entrada.
int ASA(string * buffer, char c);
//Accion semantica para token invalido
int ASTI(string * buffer, char c);
//Accion semantica para token invalido
int ASTI_EOF(string * buffer, char c);
//Accion semantica para cuando no se tiene que almacenar ni descartar
int ASV(string * buffer, char c);
//Accion semantica para sumar lineas
int ASL(string * buffer, char c);
//Accion semantica operadores aritmeticos simples
int AS_opSimple(string * buffer, char c);
//Accion semantica Verifica si es PR y devuelve, si no: identificador.
int AS_id_pr(string * buffer, char c);
// idem anterior pero no devuelve char
int AS_id_pr_EOF(string * buffer, char c);
//Acción semantica error de prefijo numerico
int ASEPN(string * buffer, char c);
//Acción semantica error entero mal escrito (error lexico)
int ASEE(string * buffer, char c);
//Accion semantica reconoce entero
int ASE(string * buffer, char c);
//Accion semantica error doble
int ASED(string * buffer, char c);
//Accion semantica reconoce doble
int ASD(string * buffer, char c);
//Accion semantica reconoce doble sobre final de archivo
int ASD_EOF(string * buffer, char c);
//Accion semantica reconoce operadores dobles. Consume char
int ASOPD(string * buffer, char c);
//Accion semantica accion que reconoce operadores simples. Devuelve char
int ASOP(string * buffer, char c);
//Accion semantica que reconoce operadores simples sobre final de archivo. Devuelve char
int ASOP_EOF(string * buffer, char c);
//Accion semantica que reconoce cadena
int ASCAD(string * buffer, char c);
//Accion semantica que reconoce error cadena
int ASEC(string * buffer, char c);
//Accion semantica que reconoce anotacion
int ASAN(string * buffer, char c);
//Accion semantica que reconoce anotacion sobre fin de archivo
int ASAN_EOF(string * buffer, char c);
//Accion semantica que reconoce entero sobre fin de archivo
int ASE_EOF(string * buffer, char c);
//Accion semantica error cadena fin de archivo
int ASEC_EOF (string * buffer, char c);
//Accion semantica error comentario
int ASECOM (string * buffer, char c);
//Accion semantica error comentario en EOF
int ASECOM_EOF (string * buffer, char c);
};
#endif // LEXICALANALIZER_H