Fix argument insertion

This commit is contained in:
Jan-Niclas Loosen
2025-10-18 14:08:20 +02:00
parent 64061d8b79
commit 081a7132fc
3 changed files with 32 additions and 12 deletions

View File

@@ -41,13 +41,20 @@ class MaMa:
# Decodes string MaMa instructions to function callables
@staticmethod
def decode(micro: str) -> Tuple[str, Optional[List[int]]]:
def decode(micro: str) -> Tuple[str, Optional[List[Any]]]:
if "(" in micro:
name, rest = micro.split("(", 1)
args_str = rest[:-1]
if args_str.strip() == "":
args_str = rest[:-1].strip()
if args_str == "":
return name, []
args = [int(a.strip()) for a in args_str.split(",")]
args = []
for a in args_str.split(","):
a = a.strip()
try:
a = int(a)
except ValueError:
pass # keep symbolic argument (e.g., 'n')
args.append(a)
return name, args
return micro, None

View File

@@ -26,17 +26,29 @@ class MaMaMa(MaMa):
# Flatten macros recursively
def __flatten_macro(self) -> None:
def expand(prog: Dict[int, str], stack: List[str]) -> List[Tuple[str, List[str]]]:
def expand(prog: Dict[int, str], stack: List[str], env: Dict[str, Any]) -> List[Tuple[str, List[str]]]:
out: List[Tuple[str, List[str]]] = []
for _, micro in sorted(prog.items()):
name, args = self.decode(micro)
# substitute arguments if defined in env
if args:
args = [env.get(str(a), a) for a in args]
micro = f"{name}({','.join(map(str, args))})"
if name in self.macros:
out.extend(expand(self.macros[name]["prog"], stack + [name]))
macro = self.macros[name]
params = macro.get("args") or []
new_env = env.copy()
if args and params:
for p, v in zip(params, args):
new_env[p] = v
out.extend(expand(macro["prog"], stack + [name], new_env))
else:
out.append((micro, list(stack)))
return out
expanded = expand(self.prog, [])
expanded = expand(self.prog, [], {})
self.prog = {i: call for i, (call, _) in enumerate(expanded)}
self._macro_trace = {i: macros for i, (_, macros) in enumerate(expanded)}

View File

@@ -14,7 +14,7 @@ if __name__ == "__main__":
8: 'leq(14)',
9: 'ldo(-1)',
10: 'ldo(-1)',
11: 'subs',
11: 'sub',
12: 'sto(-2)',
13: 'ujp(6)',
14: 'ldo(-1)',
@@ -27,11 +27,12 @@ if __name__ == "__main__":
}
# Create and execute MaMa instance
machine = MaMaMa(prog, [4, 6])
machine = MaMaMa(['equal0(3)', 'stop', 'push(10)', 'stop'], [4, 6, 0])
machine.add_macro('subs', {
0: "sub",
})
machine.add_macro('equal0', [
'push(0)',
'equal(n)'
], ["n"])
# Visualize finished execution using journal
gui = MaMaGUI(machine)