forked from memo-saldana/virtual-memory-manager
-
Notifications
You must be signed in to change notification settings - Fork 0
/
instruction_parser.py
99 lines (94 loc) · 4.64 KB
/
instruction_parser.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
import os
def parse_instructions():
instructions = []
# Input instruction file
user_input = input('Ingresa el nombre (PATH) del archivo de instrucciones: ')
file_path = user_input.rstrip('\r')
# Check that instruction file exists before parsing
if not os.path.isfile(file_path):
print('El archivo no existe. Revisa el nombre ingresado.')
print('Terminando ejecución por error de input.')
exit()
with open(file_path.rstrip('\r')) as file:
# Read all lines, and split them into an array, with ith line at lines[i]
lines = file.read().splitlines()
"""
Possible options
A - 3 args, all numbers
P - 2 args, all numbers
L - 1 arg, number
F - 0 args
E - 0 args
C - all comments
"""
for i, line in enumerate(lines):
words = ' '.join(line.split()).split(' ')
# Manage all valid cases
if words[0] == 'A':
# Checks instruction arguments
if(len(words) < 4):
print('Cantidad inválida de argumentos en línea ', i+1, '.', sep="")
print('Instrucción \'A\' espera 3 argumentos, recibió ', len(words)-1,'.', sep="")
print('No se ejecutará esta instrucción.')
else:
instruction = [words[0]]
# Tries to convert to number and adds to parsed instruction
try:
instruction.append(int(words[1]))
instruction.append(int(words[2]))
instruction.append(int(words[3]))
if instruction[3] not in [0,1]:
print("El argumento 3 es inválido, esperando (0|1), se recibió ", instruction[3])
else:
instructions.append(instruction)
except ValueError:
print("Uno de los argumentos en la línea", i+1, "no es válido.", sep="")
print('No se ejecutará esta instrucción.')
exit()
elif words[0] == 'P':
# Checks instruction arguments
if(len(words) < 3):
print('Cantidad inválida de argumentos en línea ', i+1, '.', sep="")
print('Instrucción \'P\' espera 3 argumentos, recibió ', len(words)-1,'.', sep="")
print('No se ejecutará esta instrucción.')
else:
instruction = [words[0]]
# Tries to convert to number and adds to parsed instruction
try:
instruction.append(int(words[1]))
instruction.append(int(words[2]))
instructions.append(instruction)
except ValueError:
print("Uno de los argumentos en la línea", i+1, "no es válido.")
print('No se ejecutará esta instrucción.')
elif words[0] == 'L':
# Checks instruction arguments
if(len(words) < 2):
print('Cantidad inválida de argumentos en línea ', i+1, '.', sep="")
print('Instrucción \'L\' espera 3 argumentos, recibió ', len(words)-1,'.', sep="")
print('No se ejecutará esta instrucción.')
else:
instruction = [words[0]]
# Tries to convert to number and adds to parsed instruction
try:
instruction.append(int(words[1]))
instructions.append(instruction)
except ValueError:
print("Uno de los argumentos en la línea", i+1, "no es válido.")
print('No se ejecutará esta instrucción.')
elif words[0] == 'C':
instruction = [words[0]]
# Joins comment that will be printed out and adds it to the instruction
instruction.append(' '.join(words[1::]))
instructions.append(instruction)
elif words[0]== 'E':
instruction = [words[0]]
instructions.append(instruction)
elif words[0] == 'F':
instruction = [words[0]]
instructions.append(instruction)
else:
# Manage invalid instruction
print("Instrucción inválida en la línea ", i+1, ".", sep="")
print('No se ejecutará esta instrucción.')
return instructions