-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathanalysisForLine.py
More file actions
170 lines (127 loc) · 5.47 KB
/
Copy pathanalysisForLine.py
File metadata and controls
170 lines (127 loc) · 5.47 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
158
159
160
161
162
163
164
165
166
167
168
169
170
'''Script que hace análisis por linea detectando data segment y codesegment, también es el main del
analisis PARSE'''
import re # biblioteca regular expression
import syntan # Importando syntax analysis
import lexemean
lineStates = [] # Lista para guardar (linea,estado)
state = False # Variable solo para debugear en consola y ver si ya detecta como correcto las instrucciones
type_segment = 0 # Variable para detectar el tipo de segmento
lineNumber = 0 # Contador de linea
def show(linea):
global type_segment
global lineNumber
lexema = ''
comprobable = ''
linea = linea.strip() # Eliminar los saltos de linea
lineNumber += 1 # Incrementando linea
# busca si en la linea esta la etiqueta .data
if re.findall(r'\.data', linea, re.IGNORECASE):
type_segment = 1
# busca si en la linea esta la etiqueta .code
if re.findall(r'\.code', linea, re.IGNORECASE):
type_segment = 2
# determina si se ha encontrado .data y ya esta en la siguiente linea
if type_segment == 1 and not re.findall(r'\.data', linea, re.IGNORECASE):
getDataSegment(linea, type_segment)
syntaxAnalysis(linea, type_segment, lineNumber)
# determina si se ha encontrado .code y ya esta en la siguiente linea
if type_segment == 2 and not re.findall(r'\.code', linea, re.IGNORECASE):
getCodeSegment(linea, type_segment)
syntaxAnalysis(linea, type_segment, lineNumber)
return (linea, type_segment, lineNumber)
def show2(linea, lineNumber):
global type_segment
# global lineNumber
lexema = ''
comprobable = ''
linea = linea.strip() # Eliminar los saltos de linea
lineNumber += 1 # Incrementando linea
# busca si en la linea esta la etiqueta .data
if re.findall(r'\.data', linea, re.IGNORECASE):
type_segment = 1
# busca si en la linea esta la etiqueta .code
if re.findall(r'\.code', linea, re.IGNORECASE):
type_segment = 2
# determina si se ha encontrado .data y ya esta en la siguiente linea
if type_segment == 1 and not re.findall(r'\.data', linea, re.IGNORECASE):
getDataSegment(linea, type_segment)
syntaxAnalysis(linea, type_segment, lineNumber)
# determina si se ha encontrado .code y ya esta en la siguiente linea
if type_segment == 2 and not re.findall(r'\.code', linea, re.IGNORECASE):
getCodeSegment(linea, type_segment)
syntaxAnalysis(linea, type_segment, lineNumber)
return (linea, type_segment, lineNumber)
def getDataSegment(linea, type_segment):
# print(linea, end="") # sustuir para que se muestre en ventana
return (linea, type_segment)
def getCodeSegment(linea, type_segment):
# print(linea, end="") # sustituir para que se muestre en ventana
return (linea, type_segment)
# funcion donde se hará el analisis parse
def syntaxAnalysis(linea, type_segment, lineNumber):
global lineStates
global state
if not linea: # Si la línea está en blanco, ignora el análisis
return
if type_segment == 1:
resultado = syntan.analizar_lineaDataSegment(linea)
if resultado:
instruccion, operando1, operando2 = resultado # Desmpaquetado en variables
lineStates.append((lineNumber, True))
state = True
'''# borrar desde aquí en entrega final, solo con fines de comprbacion en consola
print(
f'instruccion: {instruccion}, operando1: {operando1}, operando2: {operando2}')
print(state)
# ... hasta aquí'''
else:
lineStates.append((lineNumber, False))
state = False
'''
# borrar desde aquí en entrega final, solo con fines de comprbacion en consola
print(state)
# ... hasta aquí '''
if type_segment == 2:
resultado = syntan.analizar_lineaCodeSegment(linea)
print(resultado)
if resultado:
instruccion, operando1, operando2 = resultado # Desepaquetado en variables
lineStates.append((lineNumber, True))
state = True
'''# desde aquí borrar en entrega final, solo con fines de comprbacion en consola
print(
f'instruccion: {instruccion}, operando1: {operando1}, operando2: {operando2}')
print(state)
# ...hasta aqui'''
else:
lineStates.append((lineNumber, False))
state = False
'''# borrar desde aquí en entrega final, solo con fines de comprbacion en consola
print(state)
# ... hasta aquí'''
# Función para analizar los lexemas
def lexemeAnalysis(linea, isString):
lexema = ''
comprobable = ''
if not linea:
return ('', '')
for palabra in linea.split():
resultado = lexemean.lexemaAnalysis(palabra, isString)
if resultado is not None:
palab, isString, comprobable = resultado
print(f'Lexema: {palab} \t {comprobable}')
return palab, isString, comprobable,
else:
return ('', '')
return (palab, isString, comprobable)
'''def main():
global lineStates
show()
# implementar como indicador de errores en la GUI
incorrectLines = [line for line, state in lineStates if not state]
if not incorrectLines:
print("El código es correcto.")
else:
print("El código es incorrecto en las líneas:", incorrectLines)
if __name__ == "__main__":
main()'''