diff options
| author | Jan Tuomi <jans.tuomi@gmail.com> | 2023-04-10 21:10:16 +0300 |
|---|---|---|
| committer | Jan Tuomi <jans.tuomi@gmail.com> | 2023-04-10 23:55:17 +0300 |
| commit | 9a6001ad380e83a545188b58145387593b117b48 (patch) | |
| tree | a991cea5e5163b18c0666de89a7eccd55308b227 /src/asm_pass3.py | |
| parent | 56fd37c60eb0d58ed4762340ddc85b74347bcd71 (diff) | |
Refactor into multipass compiler
Diffstat (limited to 'src/asm_pass3.py')
| -rw-r--r-- | src/asm_pass3.py | 46 |
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, + ) |
