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
|
from enum import Enum
from symbol import LexToken, TablaLex, tokens
def inicio_lexer(data):
tabla = TablaLex()
selector = ''
recol_string = ''
recol_caracter = ''
recol_comentario = ''
recol_operador = ''
for c in data + "\n":
print (c + ' (' + selector + ')')
if selector == '':
# Entradas a tokens
if c == '"':
selector = 'STRING_LIT'
continue
elif c == '\'':
selector = 'CHAR_LIT'
continue
elif c == '/':
recol_comentario = '/'
elif (c == '=' or c == '+' or c == '-' or c == '&' or c == '|') and len(recol_operador) == 0:
recol_operador = c
continue
elif c == '!' or c == '<' or c == '>':
recol_operador = c
continue
elif c == '{':
tabla.insertar(LexToken('{', None, None, 1))
elif c == '}':
tabla.insertar(LexToken('}', None, None, 1))
elif c == '(':
tabla.insertar(LexToken('(', None, None, 1))
elif c == ')':
tabla.insertar(LexToken(')', None, None, 1))
elif c == ',':
tabla.insertar(LexToken(',', None, None, 1))
elif c == ';':
tabla.insertar(LexToken(';', None, None, 1))
elif c == '*':
tabla.insertar(LexToken('*', None, None, 1))
# Apertura de comentario
if recol_comentario == '/' and c == '*':
selector = 'COMMENT'
recol_comentario = ''
continue
# Apertura de operador compuesto
if len(recol_operador) > 0:
rc = recol_operador + c
if (rc == '>=' or rc == '<=' or rc == '==' or rc == '!=' or
rc == '&&' or rc == '||' or rc == '++' or rc == '--'):
# Operador compuesto
tabla.insertar(LexToken(rc, None, None, 1))
recol_operador = ''
continue
else:
# Operador simple
tabla.insertar(LexToken(recol_operador, None, None, 1))
recol_operador = ''
# Cadenas de texto
if selector == 'STRING_LIT':
if c == '"':
tabla.insertar(LexToken('STRING_LIT', None, recol_string, 1))
selector = ''
recol_string = ''
else:
recol_string += c
continue
# Caracteres
if selector == 'CHAR_LIT':
if len(recol_caracter) > 1:
print ('Error: más de un caracter en una literal de caracter')
break
if c == '\'':
if len(recol_caracter) == 0:
print ('Error: literal de caracter vacía')
break
tabla.insertar(LexToken('CHAR_LIT', None, recol_caracter, 1))
selector = ''
recol_caracter = ''
continue
else:
recol_caracter += c
# Comentarios
if selector == 'COMMENT':
if c == '*':
recol_comentario = c
continue
elif recol_comentario == '*':
if c == '/':
selector = ''
recol_comentario = ''
continue
else:
recol_comentario = ''
continue
# Imprimir tabla de símbolos
print (str(tabla))
|