From dfd4b4f30538d93a3170731a4156da41deff2cfa Mon Sep 17 00:00:00 2001 From: Jan-Niclas Loosen Date: Sat, 17 Jan 2026 00:14:44 +0100 Subject: [PATCH] Wire offline message --- Project-02-03-04/Source.gv.png | Bin 84215 -> 0 bytes Project-02-03-04/cfg_build.py | 77 ++++++++++++++++++++++++++------- 2 files changed, 62 insertions(+), 15 deletions(-) delete mode 100644 Project-02-03-04/Source.gv.png diff --git a/Project-02-03-04/Source.gv.png b/Project-02-03-04/Source.gv.png deleted file mode 100644 index ff30cc42d476143d3cede2cc5fb2cc1cdb8c0e15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84215 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 diff --git a/Project-02-03-04/cfg_build.py b/Project-02-03-04/cfg_build.py index 1ef59dd..4e7ebfa 100644 --- a/Project-02-03-04/cfg_build.py +++ b/Project-02-03-04/cfg_build.py @@ -9,6 +9,13 @@ import compiler import syntax +# ------------------------------------------------- +# Global function environment +# ------------------------------------------------- + +FUNCTIONS = {} # name -> (func_start, func_end) + + # ------------------------------------------------- # Expressions — NO CFG NODES # ------------------------------------------------- @@ -64,13 +71,21 @@ class SEQ(compiler.SEQ): class IF(compiler.IF): def cfa(self, pred, end): - cond = CFG_DIAMOND(self) + # decision node (condition only) + cond = CFG_DIAMOND(self.cond) pred.add_child(cond) + # explicit branch entries + then_entry = CFG_Node() + else_entry = CFG_Node() + cond.add_child(then_entry) + cond.add_child(else_entry) + + # join node join = CFG_Node() - then_end = self.exp1.cfa(cond, end) - else_end = self.exp2.cfa(cond, end) + then_end = self.exp1.cfa(then_entry, end) + else_end = self.exp2.cfa(else_entry, end) if then_end is not None: then_end.add_child(join) @@ -82,13 +97,19 @@ class IF(compiler.IF): class WHILE(compiler.WHILE): def cfa(self, pred, end): - cond = CFG_DIAMOND(self) + # loop condition + cond = CFG_DIAMOND(self.cond) pred.add_child(cond) - body_end = self.body.cfa(cond, end) - if body_end is not None: - body_end.add_child(cond) + # body entry + body_entry = CFG_Node() + cond.add_child(body_entry) + body_end = self.body.cfa(body_entry, end) + if body_end is not None: + body_end.add_child(cond) # back-edge + + # loop exit after = CFG_Node() cond.add_child(after) @@ -96,21 +117,47 @@ class WHILE(compiler.WHILE): # ------------------------------------------------- -# Functions / calls +# Functions / calls (interprocedural CFG) # ------------------------------------------------- class CALL(compiler.CALL): def cfa(self, pred, end): - n = CFG_CALL(self) - pred.add_child(n) - return n + call = CFG_CALL(self) + pred.add_child(call) + + # continuation after return + cont = CFG_Node() + + if self.f_name not in FUNCTIONS: + raise RuntimeError(f"Call to undefined function '{self.f_name}'") + + f_start, f_end = FUNCTIONS[self.f_name] + + # call → function entry + call.add_child(f_start) + + # function exit → continuation + f_end.add_child(cont) + + return cont class DECL(compiler.DECL): def cfa(self, pred, end): - entry = CFG_Node(self) - pred.add_child(entry) - return self.body.cfa(entry, end) + # function entry / exit + f_start = CFG_Node(self) + f_end = CFG_Node(self) + + # register function + FUNCTIONS[self.f_name] = (f_start, f_end) + + # build function body + body_end = self.body.cfa(f_start, f_end) + if body_end is not None: + body_end.add_child(f_end) + + # function declaration does not alter current control flow + return pred class LET(compiler.LET): @@ -130,5 +177,5 @@ class RETURN(syntax.EXPRESSION): def cfa(self, pred, end): n = CFG_RETURN(self) pred.add_child(n) - n.add_child(end) # direct jump to global END + n.add_child(end) # return to function exit return None # no fallthrough