-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparser.l
110 lines (85 loc) · 3.64 KB
/
parser.l
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
%option noyywrap
%{
#include "defs.h"
#include "gramatica/gramatica2.h"
#include "libreria.h"
#define TUPLAS 0
#define NOTERMINALES 1
#define TERMINALES 2
#define SIMBOLOINICIAL 3
#define PRODUCCIONES 4
#define FORMA_I 1
#define FORMA_F 2
#define NOMBRE_DE_ESTADO_I 3
#define NOMBRE_DE_ESTADO_F 4
#define ETIQUETA_I 5
#define ETIQUETA_F 6
#define ESTADO_F 7
#define TRANSICION 8
#define TRANSICION_ETIQUETA_I 9
#define TRANSICION_ETIQUETA_F 10
int tipoDeArchivo = 0;
int estado = 0;
int es_final = 0;
char * transicion;
char * nombreDeEstado;
gramatica_t gramatica;
%}
%%
([ ]) {}
(\r\n|\/\/.*\r\n) {}
(\t|\n|\/\/.*\n) {}
(.+)[ ]?= { if (tipoDeArchivo == GRAMATICA) { estado++; } else { REJECT; } }
[A-Z\\][ ]*->[ ]*([ ]*[A-Za-z\\]+[ ]*\|)*[ ]*[A-Za-z\\]+[ ]*(,)? {
if (tipoDeArchivo == GRAMATICA && estado == PRODUCCIONES) {
char * sinLlaves = reemplazar(yytext, "{", "");
char * sinComas = reemplazar(sinLlaves, ",", "");
char * sinEspacios = quitarEspacios(sinComas);
agregarProduccionDesdeCadena(gramatica, sinEspacios);
} else { REJECT; }
}
\{[ ]* {
if (tipoDeArchivo == GRAMATICA && estado == TERMINALES) {
} else { REJECT; }
}
[ ]*\([ ]*\{[ ]* {
if (tipoDeArchivo == GRAMATICA && estado == NOTERMINALES) {
} else { REJECT; }
}
[A-Z][ ]*(,) {
if (tipoDeArchivo == GRAMATICA && estado == SIMBOLOINICIAL) {
char * sinComas = reemplazar(yytext, ",", "");
char * sinEspacios = quitarEspacios(sinComas);
setearSimboloIncial(gramatica, *sinEspacios);
estado++;
} else if (tipoDeArchivo == GRAMATICA && estado == NOTERMINALES) {
char * sinComas = reemplazar(yytext, ",", "");
char * sinEspacios = quitarEspacios(sinComas);
agregarNoTerminal(gramatica, *sinEspacios);
} else { REJECT; }
}
[A-Za-z](,)? {
if (tipoDeArchivo == GRAMATICA && estado == NOTERMINALES) {
char * sinComas = reemplazar(yytext, ",", "");
char * sinEspacios = quitarEspacios(sinComas);
agregarNoTerminal(gramatica, *sinEspacios);
} else if (tipoDeArchivo == GRAMATICA && estado == TERMINALES) {
char * sinComas = reemplazar(yytext, ",", "");
char * sinEspacios = quitarEspacios(sinComas);
agregarTerminal(gramatica, *sinEspacios);
} else { REJECT; }
}
\}[ ]*,[ ]* {
if (tipoDeArchivo == GRAMATICA && (estado == NOTERMINALES || estado == TERMINALES || estado == PRODUCCIONES)) {
estado++;
} else { REJECT; }
}
[ ]*\}[ ]*\) {;
if (tipoDeArchivo == GRAMATICA && estado == PRODUCCIONES) {
} else { REJECT; }
}
(\{|\(|\))? {}
%%
int main(int argc, char ** argv) {
analizarEntrada(argc, argv);
}