-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcomponentes.py
More file actions
159 lines (131 loc) · 3.88 KB
/
componentes.py
File metadata and controls
159 lines (131 loc) · 3.88 KB
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
#!/usr/bin/env python
# coding=utf-8
import string
import sys
import os
######################################################################################
##
## Define varias clases que definen cada uno de los diferentes componentes lexicos
##
##
##
######################################################################################
# Clase generica que define un componente lexico
class Componente:
def __init__(self):
self.cat= str(self.__class__.__name__)
#este metodo mostrará por pantalla un componente lexico
def __str__(self):
s=[]
for k,v in self.__dict__.items():
if k!= "cat": s.append("%s: %s" % (k,v))
if s:
return "%s (%s)" % (self.cat,", ".join(s))
else:
return self.cat
#definicion de las clases que representan cada uno de los componentes lexicos
#Algunas tendran camps adicionales para almacenar informacion importante (valor de un numero, etc)
#clases para los simbolos de puntuacion y operadores
class OpAsigna(Componente):
def __init__(self, nl):
Componente.__init__(self)
self.linea = nl
class LlaveAp(Componente):
def __init__(self, nl):
Componente.__init__(self)
self.linea = nl
class LlaveCi(Componente):
def __init__(self, nl):
Componente.__init__(self)
self.linea = nl
class ParentAp(Componente):
def __init__(self, nl):
Componente.__init__(self)
self.linea = nl
class ParentCi(Componente):
def __init__(self, nl):
Componente.__init__(self)
self.linea = nl
class CorAp(Componente):
def __init__(self, nl):
Componente.__init__(self)
self.linea = nl
class CorCi(Componente):
def __init__(self, nl):
Componente.__init__(self)
self.linea = nl
class Punto(Componente):
def __init__(self, nl):
Componente.__init__(self)
self.linea = nl
class Coma(Componente):
def __init__(self, nl):
Componente.__init__(self)
self.linea = nl
class PtoComa(Componente):
def __init__(self, nl):
Componente.__init__(self)
self.linea = nl
class DosPtos(Componente):
def __init__(self, nl):
Componente.__init__(self)
self.linea = nl
# Clase que define la categoria OpAdd
class OpAdd(Componente):
#debe almacenarse de que operador se trata
def __init__(self, opadd, nl):
Componente.__init__(self)
if (opadd == "+"):
self.valor = "OpSuma"
else:
self.valor = "OpResta"
self.linea = nl
# Clase que define la categoria OpMult
#Debe alnmacenarse que operador es
class OpMult(Componente):
def __init__(self, opmult, nl):
Componente.__init__(self)
if (opmult == "*"):
self.valor = "OpMul"
else:
self.valor = "OpDiv"
self.linea = nl
#clase para representar los numeros.
#Puede dividirse en 2 para representar los enteros y los reales de forma independiente
#Si se opta por una sola categoria debe alamcenarse el tipo de los datos ademas del valor
class Numero (Componente):
def __init__(self, v, tipo, nl):
Componente.__init__(self)
self.valor= v
self.linea=nl
#clase para representar los identificadores.
class Identif (Componente):
def __init__(self, v, nl=0):
Componente.__init__(self)
self.valor= v
self.linea=nl
#Clase que reprresenta las palabras reservadas.
#Sera una clase independiente de los identificadores para facilitar el analisis sintactico
class PR(Componente):
def __init__(self, v,nl):
Componente.__init__(self)
self.valor = v
self.linea=nl
# Clase que define la categoria OpRel
#Debe almacenarse que operador es concretamente
class OpRel (Componente):
def __init__(self,oprel,nl):
Componente.__init__(self)
if oprel == "<":
self.valor = "SimMenor"
elif oprel == "<=":
self.valor = "SimMenorIgual"
elif oprel == "<>":
self.valor = "SimDist"
elif oprel == ">":
self.valor = "SimMayor"
elif oprel == ">=":
self.valor = "SimMayorIgual"
elif oprel == "=":
self.valor = "SimIgual"
self.linea = nl