diff --git a/examples/insertion_sort.ram b/examples/insertion_sort.ram new file mode 100644 index 0000000..c45cf99 --- /dev/null +++ b/examples/insertion_sort.ram @@ -0,0 +1,36 @@ +R[1] := 5 + 0 # Eingabelänge + +R[2] := 3 # erstes Element der Eingabe +R[3] := 6 +R[4] := 1 +R[5] := 10 +R[6] := 5 # letzes Element der Eingabe + + + +R[0] := R[1] + 2 +R[R[0]] := R[2] + 0 +R[0] := R[0] + 1 +R[R[0]] := R[3] + 0 +R[0] := R[0] + 1 +R[R[0]] := R[4] + 0 +R[0] := R[0] + 1 +R[R[0]] := R[5] + 0 +R[2] := 2 + 0 +if R[2] > R[1] goto 35 +R[0] := R[2] + 5 +R[4] := R[R[0]] + 0 +R[3] := R[2] - 1 +if R[3] <= 0 goto 31 +R[0] := R[3] + 5 +if R[4] >= R[R[0]] goto 31 +R[5] := R[3] + 6 +R[R[5]] := R[R[0]] + 0 +R[3] := R[3] - 1 +if 0 == 0 goto 24 +R[5] := R[3] + 6 +R[R[5]] := R[4] + 0 +R[2] := R[2] + 1 +if 0 == 0 goto 20 + +R[out] := 1 diff --git a/src/RAM.py b/src/RAM.py index cea12fa..da71194 100644 --- a/src/RAM.py +++ b/src/RAM.py @@ -1,5 +1,6 @@ from pathlib import Path import re +import sys class Expression: @@ -17,12 +18,12 @@ class Expression: p = r"R\[(?:(?P\d+)|R\[(?P\d+)])\]" m = re.match(p, exp) - if not m: raise Exception("no valid expression") + if not m: raise Exception(f"no valid expression in line {mem['pc']}") rd, rrd = m.group("rd", "rrd") if rd: return mem[int(rd)] elif rrd: return mem[mem[int(rrd)]] - else: raise Exception("no valid expression") + else: raise Exception(f"no valid expression in line {mem['pc']}") def eval(self, exp: str, mem: dict) -> int: m = re.match(self.named_bi_exp, exp) @@ -41,7 +42,8 @@ class Expression: if op == "+": return vl + vr if op == "*": return vl * vr if op == "div": return vl // vr - raise Exception("no valid expression") + + raise Exception(f"no valid expression in line {mem['pc']}") else: return self._eval_unary(exp, mem) @@ -57,7 +59,7 @@ class Assignment: def exec(self, exp: str, mem: dict) -> dict: m = re.match(self.pattern, exp) - if not m: raise Exception("not a expression") + if not m: raise Exception(f"not a expression in line {mem['pc']}") e, write_addr = m.group("e", "write_addr") # Look up Register @@ -84,7 +86,7 @@ class Condition: def exec(self, exp: str, mem: dict) -> dict: m = re.match(self.pattern, exp) - if not m: raise Exception("not a expression") + if not m: raise Exception(f"not a expression in line {mem['pc']}") e, line = m.group("e", "line") # Evaluate the expression in the if statement @@ -101,13 +103,29 @@ class RAM: def __init__(self, path: str): self.load_file(Path(path)) - print(self.instructions) - self.mem = {} self.mem["pc"] = 0 print(self.run()) - def load_file(self, path: Path) -> dict: + self.instruction_dump() + self.mem_dump() + + def instruction_dump(self): + print("╭" + "─"*34 + "╮") + for key in sorted(self.instructions.keys(), key=lambda x: f"{x:5}"): + print(f"│ {str(key):8}{str(self.instructions[key]):24}│") + print("╰" + "─"*34 + "╯") + + def mem_dump(self): + print("Memory") + print("╭" + "─"*22 + "╮") + print(f"│ {'address':10}{'val':10}│") + print("├" + "─"*22 + "┤") + for key in sorted(self.mem.keys(), key=lambda x: f"{x:5}"): + print(f"│ {str(key):10}{str(self.mem[key]):10}│") + print("╰" + "─"*22 + "╯") + + def load_file(self, path: Path): with open(path, "r") as f: raw_src_text = "".join(f.readlines()) @@ -144,4 +162,4 @@ class RAM: if __name__ == "__main__": - RAM("../examples/test.ram") + RAM(sys.argv[1])