-
Notifications
You must be signed in to change notification settings - Fork 0
/
funpiling_lexer.py
103 lines (88 loc) · 2.43 KB
/
funpiling_lexer.py
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
#-----------------------------------
# Jose Miguel Rady 920096
# Luis Ordaz 919790
#-----------------------------------
# Orientacion obtenida de la documentacion oficial de python
# http://www.dabeaz.com/ply/example.html
# Importa el modulo de PLY a ser utilizado para generar el analizador
# lexico
import ply.lex as lex
# --------------------Analizador Lexico-------------------------
# Lista de las palabras reservadas para el lenguaje
# Empleadas de esta forma como indicado por el tutorial para
# optimizar
reserved = {'main':'MAIN', 'if':'IF', 'else':'ELSE', 'print':'PRINT', 'bool': 'BOOL_ID','int':'INTEGER_ID', 'float':'FLOAT_ID', 'string':'STRING_ID','id':'ID','while':'WHILE','var':'VAR','void':'VOID', 'True': 'TRUE', 'False':'FALSE', 'return':'RETURN'}
# Lista de los nombres de los diferentes tokens (elementos terminales)
# Inclusion del grupo de palabras reservadas descrito previamente
tokens = [
'PLUS',
'MINUS',
'INTEGER',
'FLOAT',
'STRING',
'TIMES',
'DIVIDE',
'LPARENTH',
'RPARENTH',
'LTHAN',
'GTHAN',
'DIFF',
'DEL',
'COMMA',
'LBRACE',
'RBRACE',
'EQUAL',
'SAME',
'COLON',
]+list(reserved.values())
# Expresiones regulares para los tokens simples
t_PLUS = r'\+'
t_MINUS = r'-'
t_TIMES = r'\*'
t_DIVIDE = r'/'
t_LPARENTH = r'\('
t_RPARENTH = r'\)'
t_LTHAN = r'\<'
t_GTHAN = r'\>'
t_DIFF = r'\<\>'
t_DEL = r'\;'
t_COMMA = r'\,'
t_LBRACE = r'\{'
t_RBRACE = r'\}'
t_EQUAL = r'\='
t_SAME = r'\=='
t_COLON = r'\:'
# Expresiones regulares para los tokens simples que incluyen
# acciones a ser realizadas
def t_ID(t):
r'[A-z][A-z|0-9|\_A-z|\_0-9]*'
t.type = reserved.get(t.value,'ID')
return t
def t_FLOAT(t):
r'[\-\+]?[0-9]+\.[0-9]+'
t.value = float(t.value)
return t
def t_INTEGER(t):
r'[\-\+]?[0-9]+'
t.value = int(t.value)
return t
def t_STRING(t):
r'\"(.)*\"'
return t
def t_BOOL(t):
r'(TRUE|FALSE)'
t.value = t.value
# Define la regla para obtener el numero de linea para el manejo de errores
def t_newline(t):
r'\n+'
t.lexer.lineno += len(t.value)
# Caracteres que son ignorados: espacios, tabs y comentarios
t_ignore = ' \t'
t_ignore_COMMENT = r'//.*'
# Regla para el manejo de errores para identificar aquellos
# elementos que no pertenezcan al lexico
def t_error(t):
print("Caracter ilegal '%s'" % t.value[0])
t.lexer.skip(1)
# Creacion del analizador lexico que provee el modulo PLY
lexer = lex.lex()