-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathanalizadorLexico.cpp
131 lines (111 loc) · 2.69 KB
/
analizadorLexico.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
122
123
124
125
#include "analizadorLexico.h"
AnalizadorLexico::AnalizadorLexico(){
creaAutomatas();
}
void AnalizadorLexico::creaAutomatas(){
Afn[0] = conjuncion();
Afn[1] = disjuncion();
Afn[2] = negacion();
Afn[3] = condicional();
Afn[4] = bicondicional();
Afn[5] = parentesisIzq();
Afn[6] = parentesisDer();
Afn[7] = alfabeto();
Afn[8] = espacioBlanco();
}
Automata *AnalizadorLexico::conjuncion(){
return new Automata('&');
}
Automata *AnalizadorLexico::disjuncion(){
return new Automata('|');
}
Automata *AnalizadorLexico::negacion(){
return new Automata('!');
}
Automata *AnalizadorLexico::condicional(){
Automata *linea = new Automata('-');
Automata *mayorQue = new Automata('>');
return linea->concatenar(mayorQue);
}
Automata *AnalizadorLexico::bicondicional(){
Automata *menorQue = new Automata('<');
Automata *cond = condicional();
return menorQue->concatenar(cond);
}
Automata *AnalizadorLexico::parentesisIzq(){
return new Automata('(');
}
Automata *AnalizadorLexico::parentesisDer(){
return new Automata(')');
}
Automata *AnalizadorLexico::alfabeto(){
Automata *A[26];
const int abc = 65;
for(int i = 0; i < 26; i++){
A[i] = new Automata((char)abc+i);
}
for(int i = 1; i < 26; i++)
A[0]->unir(A[i]);
return A[0];
}
Automata *AnalizadorLexico::espacioBlanco(){
return new Automata(' ');
}
Lista<Token*> AnalizadorLexico::getTokens(string cadena){
string cadAux = cadena;
string cadStack;
Lista<Token*> Tokens;
Token *tok;
int pCad = 0;
for(int i=0; i<cadAux.size(); i++){
cadStack += cadAux[pCad];
tok = clasificaToken(cadStack);
if(tok->getTipo()!=0){
cadStack.clear();
if(tok->getTipo()!=Token::EspacioBlanco)
Tokens.pushFin(tok);
}
pCad++;
}
return Tokens;
}
Token *AnalizadorLexico::clasificaToken(string cadena){
Token *tok = new Token();
if(Afn[0]->evaluaCadena(cadena)){
tok->setTipo(Token::Conjuncion);
tok->setNombre(cadena);
}
if(Afn[1]->evaluaCadena(cadena)){
tok->setTipo(Token::Disjuncion);
tok->setNombre(cadena);
}
if(Afn[2]->evaluaCadena(cadena)){
tok->setTipo(Token::Negacion);
tok->setNombre(cadena);
}
if(Afn[3]->evaluaCadena(cadena)){
tok->setTipo(Token::Condicional);
tok->setNombre(cadena);
}
if(Afn[4]->evaluaCadena(cadena)){
tok->setTipo(Token::Bicondicional);
tok->setNombre(cadena);
}
if(Afn[5]->evaluaCadena(cadena)){
tok->setTipo(Token::ParentesisIzq);
tok->setNombre(cadena);
}
if(Afn[6]->evaluaCadena(cadena)){
tok->setTipo(Token::ParentesisDer);
tok->setNombre(cadena);
}
if(Afn[7]->evaluaCadena(cadena)){
tok->setTipo(Token::Proposicion);
tok->setNombre(cadena);
}
if(Afn[8]->evaluaCadena(cadena)){
tok->setTipo(Token::EspacioBlanco);
tok->setNombre(cadena);
}
return tok;
}