-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser.py
73 lines (63 loc) · 2.09 KB
/
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
"""
this module contains functions that work to parse instructions into components/tokens
"""
from code import destination
from code import jump
from code import computation
def replace(symbol, symbol_table):
"""
This function looks up & replaces a symbol with the corresponding assigned number
:param symbol: the symbol to look up
:param symbol_table: the symbol table to look up in
:return: the assigned number
"""
return symbol_table.get(symbol)
def strip_space(line):
"""
This functions strips trailing white spaces & trailing comments
:param line: the line to strip
:return: return the stripped line
"""
head, part, tail = line.partition("//")
return head.strip()
def a_instruction(instruction, symbol_table):
"""
This function converts a-instructions to their binary form
:param symbol_table: symbol table to lookup
:param instruction: the instruction to convert
:return: the binary representation of the instruction
"""
inst = instruction.replace("@", "")
try:
number = int(inst)
except ValueError:
number = replace(inst, symbol_table)
code = "{0:b}".format(number)
return code.zfill(16)
def c_instruction(instruction):
"""
This function handles c-instructions
:param instruction: the instruction
:return: binary representation
"""
dest, *_ = instruction.rpartition("=")
*_, compjmp = instruction.rpartition("=")
comp = compjmp.rsplit(";")[0]
jmp = (compjmp.rsplit(";") + [""])[1]
dmnem = destination(dest)
jmnen = jump(jmp)
cmnem = computation(comp)
return "111" + cmnem + dmnem + jmnen
def assemble(instruction, symbol_table):
"""
This functions identifies the instruction type i.e. a-instruction or c-instruction &
calls the corresponding function to unpack
:param symbol_table: symbol table to do lookup
:param instruction: the instruction to unpack
:return: th
"""
if instruction.startswith("@"):
code = a_instruction(instruction, symbol_table)
else:
code = c_instruction(instruction)
return code