From 53f602ce93094d9c29b1b735e91fb20562a72325 Mon Sep 17 00:00:00 2001 From: quentin vicens <quentin.vicens@student-cs.fr> Date: Thu, 27 Mar 2025 15:25:30 +0100 Subject: [PATCH] ajout du rapport TP1 et TP2 --- Pystan/config/__pycache__/cfg.cpython-313.pyc | Bin 0 -> 8299 bytes .../constant_propagation.cpython-313.pyc | Bin 0 -> 8322 bytes .../__pycache__/iteration.cpython-313.pyc | Bin 0 -> 4985 bytes .../config/__pycache__/opsem.cpython-313.pyc | Bin 0 -> 3316 bytes .../config/__pycache__/syntax.cpython-313.pyc | Bin 0 -> 11454 bytes Pystan/config/constant_propagation.py | 81 ++++++++++++++---- Pystan/config/iteration.py | 33 ++++++- Pystan/config/opsem.py | 58 +++++++++---- Pystan/config/syntax.py | 9 +- 9 files changed, 147 insertions(+), 34 deletions(-) create mode 100644 Pystan/config/__pycache__/cfg.cpython-313.pyc create mode 100644 Pystan/config/__pycache__/constant_propagation.cpython-313.pyc create mode 100644 Pystan/config/__pycache__/iteration.cpython-313.pyc create mode 100644 Pystan/config/__pycache__/opsem.cpython-313.pyc create mode 100644 Pystan/config/__pycache__/syntax.cpython-313.pyc diff --git a/Pystan/config/__pycache__/cfg.cpython-313.pyc b/Pystan/config/__pycache__/cfg.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3ffffab7a0737bfb74d5be43837053ddb87acb1 GIT binary patch literal 8299 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 BG&%qP literal 0 HcmV?d00001 diff --git a/Pystan/config/__pycache__/constant_propagation.cpython-313.pyc b/Pystan/config/__pycache__/constant_propagation.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a01b56edf7eafb1c391af416e2e46c43bb51549 GIT binary patch literal 8322 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 PQ^W6k>vMu_hW!5kTFq(U literal 0 HcmV?d00001 diff --git a/Pystan/config/__pycache__/iteration.cpython-313.pyc b/Pystan/config/__pycache__/iteration.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..048fa971e9575d16379fd23b74dae85249c0effd GIT binary patch literal 4985 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 literal 0 HcmV?d00001 diff --git a/Pystan/config/__pycache__/opsem.cpython-313.pyc b/Pystan/config/__pycache__/opsem.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06b6a357707d7d0870ab2b7b33ade29facc3a329 GIT binary patch literal 3316 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 literal 0 HcmV?d00001 diff --git a/Pystan/config/__pycache__/syntax.cpython-313.pyc b/Pystan/config/__pycache__/syntax.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f2696bbaf18113c95f76aef9b1c34a4d5329266 GIT binary patch literal 11454 zcmcIKU2_yilHD`iqxsZG8hs%IG$4TneHoC@2mV4xVau?>>p>W-A;zsyYZzPfi0T=P z#v49wu;J6*acgP4oa9^IS=>1S^kg~iBFx1-tbf2gv_eEM*TF`xar-iF+7raSUS@Uo zs7LA%tnICc$*!ra%FN2l%F3$ljX=Q5K>1nM?-T!3!!ZAgf6U@CDjQ!o80Iz;VF(jp zBaSod8xG<Su<ktLe1jvLz|=Dbm<ZRvMEIzq+o_KuJZ*JBYni3hMO)p_>gfi$SV&ov zqpe<O^+n4}3f(%IA#MZj2Yevv-iG%W_;SDpZSY<LUjg_^8@$iJR{=g`gZCTwYQWdn z$QLm1wScdS2DZspZs6+yzsm+6H1G|8-))1hFz}6l-(!QXq}tmH*nI_^RvBXiXx$&J z+9p%Tz#jnoK^uIvfo}qQvkkt+z#jtqVH<p{fo}nP*alx0ITCe8TBG&RT|CⅈJ{1 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 JDORbQ|3B7#X4U`z literal 0 HcmV?d00001 diff --git a/Pystan/config/constant_propagation.py b/Pystan/config/constant_propagation.py index a530c34..f7f78dd 100644 --- a/Pystan/config/constant_propagation.py +++ b/Pystan/config/constant_propagation.py @@ -82,26 +82,77 @@ def eval_bexp(env: abstract_env, e: BoolExpr) -> abstract_value[bool] | None: class Constant_propagation(Transfer[state]): variables: frozenset[str] - def __init__(self,instr): + + def __init__(self, instr): self.variables = variables_of_instr(instr) + def bottom(self) -> state: - ... + return None + def init_state(self) -> state: - ... - def join(self,s1:state,s2:state) -> state: - ... + return {v: abstract_value(None) for v in self.variables} + + def join(self, s1: state, s2: state) -> state: + if s1 is None: + return s2 + if s2 is None: + return s1 + result = {} + for var in self.variables: + v1 = s1.get(var, abstract_value(None)) + v2 = s2.get(var, abstract_value(None)) + if v1.value == v2.value: + result[var] = v1 + else: + result[var] = abstract_value(None) + return result - def included(self,s1: state,s2: state) -> bool: - ... + def included(self, s1: state, s2: state) -> bool: + if s1 is None: + return True + if s2 is None: + return False + for var in self.variables: + v1 = s1.get(var, abstract_value(None)) + v2 = s2.get(var, abstract_value(None)) + if v1.value != v2.value and v2.value is not None: + return False + return True - def tr_skip(self,s: state) -> state: - ... + def tr_skip(self, s: state) -> state: + return s - def tr_set(self,s: state,v: str,e: ArithExpr) -> state: - ... + def tr_set(self, s: state, v: str, e: ArithExpr) -> state: + if s is None: + return None + new_env = s.copy() + result = eval_aexp(s, e) + if result is None: + return None + new_env[v] = result + return new_env - def tr_test(self,s: state,c: BoolExpr) -> state: - ... + def tr_test(self, s: state, c: BoolExpr) -> state: + if s is None: + return None + result = eval_bexp(s, c) + if result is None: + return None + if result.value is False: + return None + elif result.value is True: + return s + else: + match c: + case BEEq(AEVar(x), AECst(cst)) if x in s: + env = s.copy() + env[x] = abstract_value(cst) + return env + case BEEq(AECst(cst), AEVar(x)) if x in s: + env = s.copy() + env[x] = abstract_value(cst) + return env + return s - def tr_err(self,s: state,e: Expr) -> state: - ... + def tr_err(self, s: state, e: Expr) -> state: + return None \ No newline at end of file diff --git a/Pystan/config/iteration.py b/Pystan/config/iteration.py index f911696..50dbbb4 100644 --- a/Pystan/config/iteration.py +++ b/Pystan/config/iteration.py @@ -43,4 +43,35 @@ def fixpoint_iteration[T](transfer: Transfer[T], cfg: Cfg) -> dict[Node,T]: output maps each node to the computed state """ - raise NotImplementedError + states: dict[Node, T] = {node: transfer.bottom() for node in cfg.g.nodes} + states[cfg.init_node] = transfer.init_state() + worklist: list[tuple[Node, Node, Label]] = [] + + for dest, label in cfg.init_node.succs: + worklist.append((cfg.init_node, dest, label)) + + while worklist: + src, dst, label = worklist.pop(0) + s_src = states[src] + if isinstance(label, LSkip): + s_new = transfer.tr_skip(s_src) + elif isinstance(label, LSet): + s_new = transfer.tr_set(s_src, label.var, label.expr) + elif isinstance(label, LTest): + s_new = transfer.tr_test(s_src, label.cond) + elif isinstance(label, LErr): + s_new = transfer.tr_err(s_src, label.err) + else: + raise ValueError(f"Étiquette inconnue: {label}") + + s_dst_old = states[dst] + + if not transfer.included(s_new, s_dst_old): + states[dst] = transfer.join(s_dst_old, s_new) + + for dest2, label2 in dst.succs: + worklist.append((dst, dest2, label2)) + + return states + +"""Les noeuds non atteignables sont les noeuds que le code ne peut jamais visité ici ils sont les cas ou les tests ne sont pas vérifés ce qui est impossible à visiter parce que les tests ont la condition 1""" \ No newline at end of file diff --git a/Pystan/config/opsem.py b/Pystan/config/opsem.py index 1313e98..e46b9fd 100644 --- a/Pystan/config/opsem.py +++ b/Pystan/config/opsem.py @@ -9,42 +9,66 @@ These functions return None when an error occur somewhere (Big step semantics) from syntax import * def eval_aexp(env: dict[str,int], exp: ArithExpr) -> int | None: - """evaluates an arithmetic expression""" + """evaluates an arithmetic expression safely""" match exp: case AECst(value): - raise NotImplementedError + return value case AEVar(var): - raise NotImplementedError - case AEUop(uop,expr): - raise NotImplementedError - case AEBop(bop,left_expr,right_expr): - raise NotImplementedError - case _: assert False + return env.get(var, None) + case AEUop(uop, expr): + val = eval_aexp(env, expr) + if val is None: + return None + if uop == Uop.OPP: + return -val + return None + case AEBop(bop, left_expr, right_expr): + v1 = eval_aexp(env, left_expr) + v2 = eval_aexp(env, right_expr) + if v1 is None or v2 is None: + return None + if bop == Bop.ADD: + return v1 + v2 + elif bop == Bop.MUL: + return v1 * v2 + elif bop == Bop.DIV: + if v2 == 0: + return None + return v1 // v2 + case _: + return None def eval_bexp(env: dict[str,int], exp:BoolExpr) -> bool | None: """evaluates a boolean expression""" match exp: case BEPlain(aexpr): - raise NotImplementedError + return eval_aexp(env,aexpr) != 0 case BEEq(left_expr,right_expr): - raise NotImplementedError + return eval_aexp(env,left_expr) == eval_aexp(env,right_expr) case BELeq(left_expr,right_expr): - raise NotImplementedError + return eval_aexp(env,left_expr) <= eval_aexp(env,right_expr) case BENeg(expr): - raise NotImplementedError + return not eval_bexp(env,expr) case _: assert False def eval_instr(env: dict[str,int], instr: Instr) -> dict[str,int] | None: """evaluates an instruction""" match instr: case ISkip(): - raise NotImplementedError + return env case ISet(var,expr): - raise NotImplementedError + new_env = env.copy() + new_env[var] = eval_aexp(new_env,expr) + return new_env case ISeq(first,second): - raise NotImplementedError + return eval_instr(eval_instr(env,first),second) case ICond(cond,true_branch,false_branch): - raise NotImplementedError + if eval_bexp(env,cond): + return eval_instr(env,true_branch) + else: + return eval_instr(env,false_branch) case ILoop(cond,body): - raise NotImplementedError + while eval_bexp(env,cond): + env = eval_instr(env,body) + return env case _: assert False diff --git a/Pystan/config/syntax.py b/Pystan/config/syntax.py index c0938bd..bc1c53f 100644 --- a/Pystan/config/syntax.py +++ b/Pystan/config/syntax.py @@ -67,7 +67,14 @@ class AEBop(ArithExpr): right_expr: ArithExpr def __str__(self): #TODO: only put parentheses if necessary - return f"({self.left_expr}) {self.bop} ({self.right_expr})" + if isinstance(self.left_expr, AEBop) and isinstance(self.right_expr, AEBop): + return f"({self.left_expr}) {self.bop} ({self.right_expr})" + if isinstance(self.left_expr, AEBop): + return f"({self.left_expr}) {self.bop} {self.right_expr}" + if isinstance(self.right_expr, AEBop): + return f"{self.left_expr} {self.bop} ({self.right})" + else: + return f"{self.left_expr} {self.bop} {self.right_expr}" @dataclass class BoolExpr(Expr): -- GitLab