Add multi-language logic exploration
This commit is contained in:
parent
9b4258c852
commit
9161889492
18 changed files with 1639 additions and 76 deletions
|
|
@ -271,11 +271,15 @@ class _FunctionLogicBuilder:
|
|||
if statement.orelse
|
||||
else condition.when_false
|
||||
)
|
||||
return self._merge("Branch merge", (*body_tails, *else_tails), statement)
|
||||
return self._converge(
|
||||
"Decision convergence",
|
||||
(*body_tails, *else_tails),
|
||||
statement,
|
||||
)
|
||||
|
||||
def _while(self, statement: ast.While, incoming: tuple[_Tail, ...]) -> tuple[_Tail, ...]:
|
||||
condition = self._condition(statement.test, incoming)
|
||||
after_id = self._node("merge", "After loop", statement)
|
||||
after_id = self._node("convergence", "Loop exit", statement)
|
||||
loop = _Loop(continue_id=condition.entry_id, break_id=after_id)
|
||||
body_tails = self._statements(statement.body, condition.when_true, loop=loop)
|
||||
for tail in body_tails:
|
||||
|
|
@ -299,7 +303,7 @@ class _FunctionLogicBuilder:
|
|||
f"{prefix} {_expression(statement.target)} in {_expression(statement.iter)}",
|
||||
statement,
|
||||
)
|
||||
after_id = self._node("merge", "After loop", statement)
|
||||
after_id = self._node("convergence", "Loop exit", statement)
|
||||
self._connect(incoming, loop_id)
|
||||
loop = _Loop(continue_id=loop_id, break_id=after_id)
|
||||
body_tails = self._statements(
|
||||
|
|
@ -343,7 +347,11 @@ class _FunctionLogicBuilder:
|
|||
)
|
||||
)
|
||||
pending = () if _is_catch_all(case) else (_Tail(case_id, "when_false", "NEXT CASE"),)
|
||||
return self._merge("Match merge", (*completed, *pending), statement)
|
||||
return self._converge(
|
||||
"Case convergence",
|
||||
(*completed, *pending),
|
||||
statement,
|
||||
)
|
||||
|
||||
def _try(
|
||||
self,
|
||||
|
|
@ -365,11 +373,15 @@ class _FunctionLogicBuilder:
|
|||
handler_id = self._node("except", f"except {exception}", handler)
|
||||
self._edge(try_id, "exception", handler_id, f"EXCEPT {exception}")
|
||||
branches.extend(self._statements(handler.body, (_Tail(handler_id),), loop=loop))
|
||||
merged = self._merge("Try merge", tuple(branches), statement)
|
||||
converged = self._converge(
|
||||
"Exception convergence",
|
||||
tuple(branches),
|
||||
statement,
|
||||
)
|
||||
if not statement.finalbody:
|
||||
return merged
|
||||
return converged
|
||||
finally_id = self._node("finally", "finally", statement.finalbody[0])
|
||||
self._connect(merged, finally_id)
|
||||
self._connect(converged, finally_id)
|
||||
return self._statements(statement.finalbody, (_Tail(finally_id),), loop=loop)
|
||||
|
||||
def _condition(
|
||||
|
|
@ -406,7 +418,7 @@ class _FunctionLogicBuilder:
|
|||
(_Tail(node_id, "when_false", "FALSE"),),
|
||||
)
|
||||
|
||||
def _merge(
|
||||
def _converge(
|
||||
self,
|
||||
label: str,
|
||||
incoming: tuple[_Tail, ...],
|
||||
|
|
@ -414,9 +426,9 @@ class _FunctionLogicBuilder:
|
|||
) -> tuple[_Tail, ...]:
|
||||
if not incoming:
|
||||
return ()
|
||||
merge_id = self._node("merge", label, source)
|
||||
self._connect(incoming, merge_id)
|
||||
return (_Tail(merge_id),)
|
||||
convergence_id = self._node("convergence", label, source)
|
||||
self._connect(incoming, convergence_id)
|
||||
return (_Tail(convergence_id),)
|
||||
|
||||
def _node(self, kind: str, label: str, source: ast.AST) -> str:
|
||||
if len(self.nodes) >= self.max_nodes:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue