aboutsummaryrefslogtreecommitdiffstats
path: root/src/asm_pass3.py
diff options
context:
space:
mode:
authorJan Tuomi <jans.tuomi@gmail.com>2023-04-10 21:10:16 +0300
committerJan Tuomi <jans.tuomi@gmail.com>2023-04-10 23:55:17 +0300
commit9a6001ad380e83a545188b58145387593b117b48 (patch)
treea991cea5e5163b18c0666de89a7eccd55308b227 /src/asm_pass3.py
parent56fd37c60eb0d58ed4762340ddc85b74347bcd71 (diff)
Refactor into multipass compiler
Diffstat (limited to 'src/asm_pass3.py')
-rw-r--r--src/asm_pass3.py46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/asm_pass3.py b/src/asm_pass3.py
new file mode 100644
index 0000000..5365e3b
--- /dev/null
+++ b/src/asm_pass3.py
@@ -0,0 +1,46 @@
+from dataclasses import dataclass
+from assembler_ops import *
+from assembler_eval import *
+from asm_pass2 import *
+
+@dataclass
+class Result3Line:
+ line_num: int
+ address: int
+ parts: list[str]
+
+@dataclass
+class Result3:
+ lines: list[Result3Line]
+ options: Options
+ operations: OpExpansionDict
+ labels: dict[str, int]
+
+def pass_3(result2: Result2) -> Result3:
+ result_lines: list[Result3Line] = []
+ labels: dict[str, int] = {}
+ address = 0
+
+ for line in result2.lines:
+ keyword, *args = line.parts
+ match keyword:
+ case "@address":
+ address = eval(args[0])
+ continue
+ case "@label":
+ labels[args[0]] = address
+ continue
+ case _:
+ result_lines.append(Result3Line(
+ line_num=line.line_num,
+ parts=line.parts,
+ address=address,
+ ))
+ address += 1
+
+ return Result3(
+ operations=result2.operations,
+ options=result2.options,
+ lines=result_lines,
+ labels=labels,
+ )