From 188cba7fa6cbee94f99c23f03d33c31d376e2589 Mon Sep 17 00:00:00 2001 From: Jan-Niclas Loosen Date: Fri, 23 Jan 2026 11:32:20 +0100 Subject: [PATCH] First acceptable solution --- Project-02-03-04/Source.gv.png | Bin 62486 -> 64551 bytes Project-02-03-04/cfg/CFG.py | 200 ++++--------- Project-02-03-04/cfg/CFG_Node.py | 77 +++-- Project-02-03-04/cfg_build.py | 2 - Project-02-03-04/generate_after_dot_files.py | 91 ------ Project-02-03-04/generate_before_dot_files.py | 62 ---- Project-02-03-04/main.py | 39 +-- .../after/argsParamsExample_cfg_after.dot | 21 -- .../mistraltests/after/complex_cfg_after.dot | 125 -------- .../after/condition_cfg_after.dot | 24 -- .../after/defSemiExample_cfg_after.dot | 43 --- .../mistraltests/after/example_cfg_after.dot | 67 ----- .../after/factorial_cfg_after.dot | 266 ------------------ .../after/faulty_if_cfg_after.dot | 6 - .../mistraltests/after/func_cfg_after.dot | 50 ---- .../mistraltests/after/geq_cfg_after.dot | 16 -- .../after/ggT_euclid_rec_cfg_after.dot | 65 ----- .../mistraltests/after/homework_cfg_after.dot | 109 ------- ...iple-let-with-same-func-name_cfg_after.dot | 34 --- .../after/multiple-let_cfg_after.dot | 44 --- .../mistraltests/after/or_cfg_after.dot | 20 -- .../mistraltests/after/p1_cfg_after.dot | 21 -- .../mistraltests/after/p2_cfg_after.dot | 38 --- .../mistraltests/after/p3_cfg_after.dot | 125 -------- .../mistraltests/after/p4_cfg_after.dot | 25 -- .../mistraltests/after/p6_cfg_after.dot | 103 ------- .../after/side_effect_cfg_after.dot | 40 --- .../after/simpleSequence_cfg_after.dot | 59 ---- .../after/simple_dfa_cfg_after.dot | 21 -- .../after/simple_if_2_cfg_after.dot | 16 -- .../after/simple_if_3_cfg_after.dot | 16 -- .../after/simple_if_4_cfg_after.dot | 16 -- .../after/simple_if_5_cfg_after.dot | 20 -- .../after/simple_if_6_cfg_after.dot | 24 -- .../after/simple_if_7_cfg_after.dot | 20 -- .../after/simple_if_cfg_after.dot | 12 - .../mistraltests/after/square_cfg_after.dot | 21 -- .../after/validProgram_cfg_after.dot | 92 ------ .../mistraltests/after/while_2_cfg_after.dot | 11 - .../mistraltests/after/while_cfg_after.dot | 50 ---- .../after/wrapped-ggT_cfg_after.dot | 76 ----- .../mistraltests/after/wrapper_cfg_after.dot | 49 ---- .../before/argsParamsExample_cfg_before.dot | 19 -- .../before/complex_cfg_before.dot | 123 -------- .../before/condition_cfg_before.dot | 22 -- .../before/defSemiExample_cfg_before.dot | 41 --- .../before/example_cfg_before.dot | 66 ----- .../before/factorial_cfg_before.dot | 264 ----------------- .../before/faulty_if_cfg_before.dot | 4 - .../mistraltests/before/func_cfg_before.dot | 48 ---- .../mistraltests/before/geq_cfg_before.dot | 14 - .../before/ggT_euclid_rec_cfg_before.dot | 63 ----- .../before/homework_cfg_before.dot | 108 ------- ...ple-let-with-same-func-name_cfg_before.dot | 32 --- .../before/multiple-let_cfg_before.dot | 42 --- .../mistraltests/before/or_cfg_before.dot | 18 -- .../mistraltests/before/p1_cfg_before.dot | 19 -- .../mistraltests/before/p2_cfg_before.dot | 36 --- .../mistraltests/before/p3_cfg_before.dot | 123 -------- .../mistraltests/before/p4_cfg_before.dot | 23 -- .../mistraltests/before/p6_cfg_before.dot | 101 ------- .../before/side_effect_cfg_before.dot | 38 --- .../before/simpleSequence_cfg_before.dot | 57 ---- .../before/simple_dfa_cfg_before.dot | 19 -- .../before/simple_if_2_cfg_before.dot | 14 - .../before/simple_if_3_cfg_before.dot | 14 - .../before/simple_if_4_cfg_before.dot | 14 - .../before/simple_if_5_cfg_before.dot | 18 -- .../before/simple_if_6_cfg_before.dot | 22 -- .../before/simple_if_7_cfg_before.dot | 18 -- .../before/simple_if_cfg_before.dot | 10 - .../mistraltests/before/square_cfg_before.dot | 19 -- .../before/validProgram_cfg_before.dot | 90 ------ .../before/while_2_cfg_before.dot | 9 - .../mistraltests/before/while_cfg_before.dot | 48 ---- .../before/wrapped-ggT_cfg_before.dot | 74 ----- .../before/wrapper_cfg_before.dot | 47 ---- Project-02-03-04/test_cfg_refactoring.py | 88 ------ Project-02-03-04/tramcodes/example.tram | 42 +++ 79 files changed, 163 insertions(+), 3860 deletions(-) delete mode 100644 Project-02-03-04/generate_after_dot_files.py delete mode 100644 Project-02-03-04/generate_before_dot_files.py delete mode 100644 Project-02-03-04/mistraltests/after/argsParamsExample_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/complex_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/condition_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/defSemiExample_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/example_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/factorial_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/faulty_if_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/func_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/geq_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/ggT_euclid_rec_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/homework_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/multiple-let-with-same-func-name_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/multiple-let_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/or_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/p1_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/p2_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/p3_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/p4_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/p6_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/side_effect_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/simpleSequence_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/simple_dfa_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/simple_if_2_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/simple_if_3_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/simple_if_4_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/simple_if_5_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/simple_if_6_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/simple_if_7_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/simple_if_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/square_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/validProgram_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/while_2_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/while_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/wrapped-ggT_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/after/wrapper_cfg_after.dot delete mode 100644 Project-02-03-04/mistraltests/before/argsParamsExample_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/complex_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/condition_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/defSemiExample_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/example_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/factorial_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/faulty_if_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/func_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/geq_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/ggT_euclid_rec_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/homework_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/multiple-let-with-same-func-name_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/multiple-let_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/or_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/p1_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/p2_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/p3_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/p4_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/p6_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/side_effect_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/simpleSequence_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/simple_dfa_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/simple_if_2_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/simple_if_3_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/simple_if_4_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/simple_if_5_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/simple_if_6_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/simple_if_7_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/simple_if_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/square_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/validProgram_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/while_2_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/while_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/wrapped-ggT_cfg_before.dot delete mode 100644 Project-02-03-04/mistraltests/before/wrapper_cfg_before.dot delete mode 100644 Project-02-03-04/test_cfg_refactoring.py create mode 100644 Project-02-03-04/tramcodes/example.tram diff --git a/Project-02-03-04/Source.gv.png b/Project-02-03-04/Source.gv.png index 7d29a74faa98732317ba9a40807c0abd5cf8c98b..f5245bfba661dfc77919cff7b4d0bc6bec61959d 100644 GIT binary patch literal 64551 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 literal 62486 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%0D^`9K*5yRVVssPU*_w9(+4byVj*Ya?THkhIKm(R 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 diff --git a/Project-02-03-04/cfg/CFG.py b/Project-02-03-04/cfg/CFG.py index 316a618..0e9a16d 100644 --- a/Project-02-03-04/cfg/CFG.py +++ b/Project-02-03-04/cfg/CFG.py @@ -1,92 +1,60 @@ -from typing import Any - +from typing import Any, Callable, Set from .CFG_Node import * - class CFG: - def __init__(self, in_node: CFG_Node, out_node: CFG_Node, ast=None): - self.in_node = in_node - self.out_node = out_node + def __init__(self, ast): + start = CFG_START() + start.dot_style = 'style=filled, color=gray' + end = CFG_END() + end.dot_style = 'style=filled, color=gray' + + last = ast.cfa(start, end) + if last is not None: + last.add_child(end) + + self.START = start + self.END = end self.ast = ast - - # If AST is provided, filter the graph by removing empty nodes - if ast is not None: - self._filter_graph() - - def _filter_graph(self): - """ - Filter the CFG by removing empty nodes and rewiring edges. - This should be done once during construction, not during to_dot(). - """ - # Collect all nodes in the graph - all_nodes = set() - self._collect_nodes(self.in_node, all_nodes) - - # Identify nodes to remove - nodes_to_remove = [node for node in all_nodes if self._should_remove_node(node)] - - # Remove nodes and rewrite edges + + # Remove empty nodes and rewire edges + all_nodes = self.nodes() + nodes_to_remove = [node for node in all_nodes if node.is_empty()] for node in nodes_to_remove: - self._remove_node_and_rewire(node) - - def _collect_nodes(self, node, node_set): - """Recursively collect all nodes in the graph""" + self.__remove_and_rewire(node) + + def nodes(self): + all_nodes = set() + self.__collect_nodes(self.START, all_nodes) + return all_nodes + + def __collect_nodes(self, node, node_set): if node in node_set: return node_set.add(node) for child in node.children: - self._collect_nodes(child, node_set) + self.__collect_nodes(child, node_set) - def _should_remove_node(self, node): - """Determine if a node should be removed from the graph""" - # Remove empty nodes (nodes with no meaningful content) - # Check for both None and "None" string - if hasattr(node, 'label') and ((node.label is None) or (node.label == "None")): - # Nodes with AST nodes should NOT be removed - they will get labels from AST - if node.ast_node is not None: - return False - # Also keep global START nodes (they have label=None but should be shown) - if hasattr(node, 'dot_label') and node.dot_label() == "START": - return False - # Remove nodes that have no AST and no meaningful label - return True - - # Remove global END nodes (those without function names) - if hasattr(node, 'dot_label'): - if node.dot_label() in ["END"]: - # Keep function-specific END nodes, skip global ones - if hasattr(node, 'label') and node.label and '(' in node.label and ')' in node.label: - return False - else: - return True - - return False - - def _remove_node_and_rewire(self, node): - """Remove a node from the graph and rewire edges to bypass it""" - # Store original children before modification + def __remove_and_rewire(self, node): original_children = list(node.children) - - # For each parent, rewire edges to bypass this node + for parent in list(node.parents): if node in parent.children: - # Find appropriate targets based on node type - if hasattr(node, 'dot_shape') and node.dot_shape() == "diamond": - # For diamond nodes, preserve T/F branches + # For diamond nodes, preserve the true and false bodies + if isinstance(node, CFG_DIAMOND): targets = [] if len(original_children) >= 1: - true_target = self._find_first_non_empty_child(original_children[0]) + true_target = self.__first_filled_child(original_children[0]) if true_target: targets.append(true_target) if len(original_children) >= 2: - false_target = self._find_first_non_empty_child(original_children[1]) + false_target = self.__first_filled_child(original_children[1]) if false_target: targets.append(false_target) + # For regular nodes, find all non-empty targets else: - # For regular nodes, find all non-empty targets targets = [] for child in original_children: - target = self._find_first_non_empty_child(child) + target = self.__first_filled_child(child) if target and target not in targets: targets.append(target) @@ -101,97 +69,49 @@ class CFG: node.parents.clear() node.children.clear() - def _find_first_non_empty_child(self, node): - """Find the first non-empty descendant of a node""" - if not self._should_remove_node(node): + def __first_filled_child(self, node): + if not node.is_empty(): return node - # Recursively check children for child in sorted(node.children, key=lambda n: n.id): - result = self._find_first_non_empty_child(child) + result = self.__first_filled_child(child) if result is not None: return result - return None def to_dot(self) -> str: - """ - Convert the CFG to DOT format. - This method should ONLY handle formatting, not graph modifications. - All graph filtering and modifications should be done in the constructor. - """ - visited = set() - lines = ["digraph CFG {"] - lines.append(' node [fontname="Helvetica"];') - - def node_label(node: CFG_Node) -> str | None | Any: - # Use custom label if available - if hasattr(node, 'label') and node.label: - # Remove node ID from label for certain node types - if isinstance(node, (CFG_START, CFG_END, CFG_CALL, CFG_RETURN)): - return node.label - else: - return node.label - - # Base label from the node - base = node.dot_label() if hasattr(node, "dot_label") else "" - - # Semantic label from AST - if node.ast_node is not None: - semantic = str(node.ast_node) - label_content = f"{base}\n{semantic}" if base else semantic - return label_content - - return base if base else None - - def node_shape(node: CFG_Node) -> str: - return node.dot_shape() if hasattr(node, "dot_shape") else "box" - - def node_style(node: CFG_Node) -> str: - # Add styling for special node types - styles = [] - if hasattr(node, 'label') and node.label: - if node.label.startswith('CALL') or node.label.startswith('RET'): - styles.append('style=filled') - styles.append('color=orange') - elif node.label.startswith('START') or node.label.startswith('END'): - styles.append('style=filled') - styles.append('color=green') - return ', '.join(styles) if styles else '' - - def visit(node: CFG_Node): - if node.id in visited: - return - - visited.add(node.id) - - label = node_label(node) - if label is None: - # This shouldn't happen if the constructor did its job properly - return - - shape = node_shape(node) - style = node_style(node) + lines = ["digraph CFG {", ' node [fontname="Helvetica"];'] + def emit(node: CFG_Node): + label = node.dot_label() + shape = node.dot_shape + style = node.dot_style style_str = f", {style}" if style else "" - lines.append( - f' n{node.id} [label="{label}", shape={shape}{style_str}];' - ) + lines.append(f' n{node.id} [label="{label}", shape={shape}{style_str}];') - # Add edges to children for i, child in enumerate(sorted(node.children, key=lambda n: n.id)): - # Add edge labels for diamond nodes (conditional branches) edge_label = "" - if hasattr(node, 'dot_shape') and node.dot_shape() == "diamond": + if isinstance(node, CFG_DIAMOND): if i == 0: edge_label = ' [label="T"]' elif i == 1: edge_label = ' [label="F"]' - lines.append(f" n{node.id} -> n{child.id}{edge_label};") - visit(child) - # Start the CFG traversal from the entry node - visit(self.in_node) + self.traverse(emit, start=self.START) lines.append("}") - return "\n".join(lines) \ No newline at end of file + return "\n".join(lines) + + # Reusable traversal function + def traverse(self, fn: Callable[[CFG_Node], Any], start: CFG_Node | None = None) -> None: + start = start or self.START + visited: Set[int] = set() + + def visit(node: CFG_Node): + if node.id in visited: + return + visited.add(node.id) + fn(node) + for child in sorted(node.children, key=lambda n: n.id): + visit(child) + visit(start) \ No newline at end of file diff --git a/Project-02-03-04/cfg/CFG_Node.py b/Project-02-03-04/cfg/CFG_Node.py index 0a9fa81..512b5e3 100644 --- a/Project-02-03-04/cfg/CFG_Node.py +++ b/Project-02-03-04/cfg/CFG_Node.py @@ -5,7 +5,10 @@ class CFG_Node: self.ast_node = ast_node self.children = set() self.parents = set() - self.label = None # Optional label for the node + + self.label = None + self.dot_shape = 'box' + self.dot_style = '' self.id = CFG_Node.__counter CFG_Node.__counter += 1 @@ -36,44 +39,58 @@ class CFG_Node: parent.children.remove(self) self.parents.remove(parent) - def __str__(self): - if self.label: - return f"CFG_Node({self.id}, label='{self.label}')" - elif self.ast_node: - return f"CFG_Node({self.id}, ast={type(self.ast_node).__name__})" - else: - return f"CFG_Node({self.id})" + def dot_label(self): + # Prioritize custom label + if self.label is not None: + return self.label - def __repr__(self): - return self.__str__() + # Build label from AST node + if self.ast_node is not None: + return str(self.ast_node) + return None + + def is_filled(self): + return not self.is_empty() + + def is_empty(self): + # Node is empty if it has no label and no related AST node + if self.label is None or self.label == "None": + if self.ast_node is not None: + # Node belongs to a ast node + return False + return True + # Node is required for the control flow + return False class CFG_START(CFG_Node): - def dot_shape(self): - return "box" - - def dot_label(self): - return "START" - + def __init__(self, ast_node=None): + super().__init__(ast_node) + self.dot_shape = "ellipse" + self.dot_style = 'style=filled, color=green' + self.label = "START" class CFG_END(CFG_Node): - def dot_shape(self): - return "box" - - def dot_label(self): - return "END" - + def __init__(self, ast_node=None): + super().__init__(ast_node) + self.dot_shape = "ellipse" + self.dot_style = 'style=filled, color=green' + self.label = "END" class CFG_DIAMOND(CFG_Node): - def dot_shape(self): - return "diamond" - + def __init__(self, ast_node=None): + super().__init__(ast_node) + self.dot_shape = "diamond" + self.label = "" class CFG_CALL(CFG_Node): - def dot_shape(self): - return "box" - + def __init__(self, ast_node=None): + super().__init__(ast_node) + self.dot_style = 'style=filled, color=orange' + self.dot_shape = "box" class CFG_RETURN(CFG_Node): - def dot_shape(self): - return "box" + def __init__(self, ast_node=None): + super().__init__(ast_node) + self.dot_style = 'style=filled, color=orange' + self.dot_shape = "box" diff --git a/Project-02-03-04/cfg_build.py b/Project-02-03-04/cfg_build.py index 482959f..c88e4ec 100644 --- a/Project-02-03-04/cfg_build.py +++ b/Project-02-03-04/cfg_build.py @@ -125,7 +125,6 @@ class IF(compiler.IF): # Attach junction node diamond = CFG_DIAMOND(self.cond) - diamond.label = "" cond_node.add_child(diamond) # Define start and end entry and unwraps expressions @@ -164,7 +163,6 @@ class WHILE(compiler.WHILE): # Attach junction node diamond = CFG_DIAMOND(self.cond) - diamond.label = "" comp_node.add_child(diamond) # Unwrap the loop body diff --git a/Project-02-03-04/generate_after_dot_files.py b/Project-02-03-04/generate_after_dot_files.py deleted file mode 100644 index f47f5ea..0000000 --- a/Project-02-03-04/generate_after_dot_files.py +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env python3 - -import sys -import os -from pathlib import Path - -# Add the current directory to Python path so we can import our modules -sys.path.insert(0, '/home/janniclas/Projekte/Construction-of-Compilers/Project-02-03-04') - -import triplayacc as yacc -import cfg_build -import syntax -from cfg.CFG import CFG -from cfg.CFG_Node import (CFG_START, CFG_END) - -def make_cfg(ast): - start = CFG_START() - end = CFG_END() - - last = ast.cfa(start, end) - if last is not None: - last.add_child(end) - - return CFG(start, end, ast) - -def generate_dot_files(): - base = Path("triplaprograms") - programs = sorted([f for f in base.glob("*.tripla")]) - - output_dir = Path("mistraltests/after") - output_dir.mkdir(exist_ok=True, parents=True) - - for path in programs: - try: - print(f"Processing {path.name}...") - - # Reset the global FUNCTIONS registry - cfg_build.FUNCTIONS.clear() - - source = path.read_text() - ast = yacc.parser.parse(source) - - # Create CFG - cfg = make_cfg(ast) - - # Generate dot file - dot_str = cfg.to_dot() - - # Save to file - output_path = output_dir / f"{path.stem}_cfg_after.dot" - with open(output_path, "w") as f: - f.write(dot_str) - - print(f"Saved: {output_path}") - - except Exception as e: - print(f"Error processing {path.name}: {e}") - continue - -def compare_dot_files(): - """Compare before and after dot files to ensure they're the same""" - before_dir = Path("mistraltests/before") - after_dir = Path("mistraltests/after") - - before_files = sorted(before_dir.glob("*_cfg_before.dot")) - after_files = sorted(after_dir.glob("*_cfg_after.dot")) - - print("\nComparing dot files...") - - mismatches = [] - - for before_file, after_file in zip(before_files, after_files): - before_content = before_file.read_text() - after_content = after_file.read_text() - - if before_content == after_content: - print(f"✓ {before_file.stem} - MATCH") - else: - print(f"✗ {before_file.stem} - MISMATCH") - mismatches.append((before_file, after_file)) - - if mismatches: - print(f"\n{mismatches} files have mismatches!") - for before_file, after_file in mismatches: - print(f" {before_file.name} vs {after_file.name}") - else: - print("\nAll dot files match! The refactoring was successful.") - -if __name__ == "__main__": - generate_dot_files() - compare_dot_files() \ No newline at end of file diff --git a/Project-02-03-04/generate_before_dot_files.py b/Project-02-03-04/generate_before_dot_files.py deleted file mode 100644 index 4f7bd93..0000000 --- a/Project-02-03-04/generate_before_dot_files.py +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env python3 - -import sys -import os -from pathlib import Path - -# Add the current directory to Python path so we can import our modules -sys.path.insert(0, '/home/janniclas/Projekte/Construction-of-Compilers/Project-02-03-04') - -import triplayacc as yacc -import cfg_build -import syntax -from cfg.CFG import CFG -from cfg.CFG_Node import (CFG_START, CFG_END) - -def make_cfg(ast): - start = CFG_START() - end = CFG_END() - - last = ast.cfa(start, end) - if last is not None: - last.add_child(end) - - return CFG(start, end) - -def generate_dot_files(): - base = Path("triplaprograms") - programs = sorted([f for f in base.glob("*.tripla")]) - - output_dir = Path("mistraltests/before") - output_dir.mkdir(exist_ok=True, parents=True) - - for path in programs: - try: - print(f"Processing {path.name}...") - - # Reset the global FUNCTIONS registry - cfg_build.FUNCTIONS.clear() - - source = path.read_text() - ast = yacc.parser.parse(source) - - # Create CFG - cfg = make_cfg(ast) - - # Generate dot file - dot_str = cfg.to_dot() - - # Save to file - output_path = output_dir / f"{path.stem}_cfg_before.dot" - with open(output_path, "w") as f: - f.write(dot_str) - - print(f"Saved: {output_path}") - - except Exception as e: - print(f"Error processing {path.name}: {e}") - continue - -if __name__ == "__main__": - generate_dot_files() - print("Done generating 'before' dot files.") \ No newline at end of file diff --git a/Project-02-03-04/main.py b/Project-02-03-04/main.py index f9a49e4..b701381 100644 --- a/Project-02-03-04/main.py +++ b/Project-02-03-04/main.py @@ -1,23 +1,19 @@ -import triplayacc as yacc -import cfg_build -import syntax - -from pathlib import Path -from graphviz import Source -from vistram.tram import * - -import tkinter as tk -from vistram.vistram import MachineUI - -import matplotlib.pyplot as plt -import matplotlib.image as mpimg -import lib.console as cnsl import os - -from cfg.CFG import CFG -from cfg.CFG_Node import (CFG_START, CFG_END) +import tkinter as tk +from pathlib import Path import matplotlib +import matplotlib.image as mpimg +import matplotlib.pyplot as plt +from graphviz import Source + +import lib.console as cnsl +import syntax +import triplayacc as yacc +from cfg.CFG import CFG +from vistram.tram import * +from vistram.vistram import MachineUI + matplotlib.use("TkAgg") # Assembles the AST into TRAM code @@ -26,14 +22,7 @@ def assemble(ast): return code + [halt()] def make_cfg(ast): - start = CFG_START() - end = CFG_END() - - last = ast.cfa(start, end) - if last is not None: - last.add_child(end) - - return CFG(start, end, ast) + return CFG(ast) # Renders a diagram of the AST def render_diagram(dot_string: str): diff --git a/Project-02-03-04/mistraltests/after/argsParamsExample_cfg_after.dot b/Project-02-03-04/mistraltests/after/argsParamsExample_cfg_after.dot deleted file mode 100644 index 7181248..0000000 --- a/Project-02-03-04/mistraltests/after/argsParamsExample_cfg_after.dot +++ /dev/null @@ -1,21 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n1 [label="START", shape=box]; - n1 -> n7; - n7 [label="1", shape=box]; - n7 -> n8; - n8 [label="2", shape=box]; - n8 -> n9; - n9 [label="3", shape=box]; - n9 -> n10; - n10 [label="CALL a", shape=box, style=filled, color=orange]; - n10 -> n3; - n3 [label="START a(x, y, z)", shape=box, style=filled, color=green]; - n3 -> n6; - n6 [label="x", shape=box]; - n6 -> n4; - n4 [label="END a(x, y, z)", shape=box, style=filled, color=green]; - n4 -> n12; - n12 [label="RET a", shape=box, style=filled, color=orange]; - n10 -> n12; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/complex_cfg_after.dot b/Project-02-03-04/mistraltests/after/complex_cfg_after.dot deleted file mode 100644 index d31f776..0000000 --- a/Project-02-03-04/mistraltests/after/complex_cfg_after.dot +++ /dev/null @@ -1,125 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n14 [label="START", shape=box]; - n14 -> n65; - n65 [label="10", shape=box]; - n65 -> n66; - n66 [label="CALL f1", shape=box, style=filled, color=orange]; - n66 -> n16; - n16 [label="START f1(b)", shape=box, style=filled, color=green]; - n16 -> n21; - n21 [label="b", shape=box]; - n21 -> n22; - n22 [label="0", shape=box]; - n22 -> n23; - n23 [label="b == 0", shape=box]; - n23 -> n24; - n24 [label="", shape=diamond]; - n24 -> n28 [label="T"]; - n28 [label="0", shape=box]; - n28 -> n17; - n17 [label="END f1(b)", shape=box, style=filled, color=green]; - n17 -> n34; - n34 [label="RET f1", shape=box, style=filled, color=orange]; - n34 -> n17; - n17 -> n45; - n45 [label="RET f1", shape=box, style=filled, color=orange]; - n45 -> n58; - n58 [label="a", shape=box]; - n58 -> n59; - n59 [label="b", shape=box]; - n59 -> n60; - n60 [label="a * b", shape=box]; - n60 -> n61; - n61 [label="CALL g", shape=box, style=filled, color=orange]; - n61 -> n50; - n50 [label="START g(c)", shape=box, style=filled, color=green]; - n50 -> n53; - n53 [label="a", shape=box]; - n53 -> n54; - n54 [label="b", shape=box]; - n54 -> n55; - n55 [label="a * b", shape=box]; - n55 -> n56; - n56 [label="c", shape=box]; - n56 -> n57; - n57 [label="(a * b) * c", shape=box]; - n57 -> n51; - n51 [label="END g(c)", shape=box, style=filled, color=green]; - n51 -> n63; - n63 [label="RET g", shape=box, style=filled, color=orange]; - n63 -> n19; - n19 [label="END f2(a, b)", shape=box, style=filled, color=green]; - n19 -> n91; - n91 [label="RET f2", shape=box, style=filled, color=orange]; - n61 -> n63; - n17 -> n49; - n49 [label="RET f1", shape=box, style=filled, color=orange]; - n49 -> n58; - n17 -> n68; - n68 [label="RET f1", shape=box, style=filled, color=orange]; - n68 -> n70; - n70 [label="10", shape=box]; - n70 -> n83; - n83 [label="20", shape=box]; - n83 -> n84; - n84 [label="30", shape=box]; - n84 -> n85; - n85 [label="CALL max", shape=box, style=filled, color=orange]; - n85 -> n71; - n71 [label="START max(a, b)", shape=box, style=filled, color=green]; - n71 -> n74; - n74 [label="a", shape=box]; - n74 -> n75; - n75 [label="b", shape=box]; - n75 -> n76; - n76 [label="a > b", shape=box]; - n76 -> n77; - n77 [label="", shape=diamond]; - n77 -> n81 [label="T"]; - n81 [label="a", shape=box]; - n81 -> n72; - n72 [label="END max(a, b)", shape=box, style=filled, color=green]; - n72 -> n87; - n87 [label="RET max", shape=box, style=filled, color=orange]; - n87 -> n89; - n89 [label="CALL f2", shape=box, style=filled, color=orange]; - n89 -> n18; - n18 [label="START f2(a, b)", shape=box, style=filled, color=green]; - n18 -> n35; - n35 [label="a", shape=box]; - n35 -> n36; - n36 [label="b", shape=box]; - n36 -> n37; - n37 [label="a > b", shape=box]; - n37 -> n38; - n38 [label="", shape=diamond]; - n38 -> n42 [label="T"]; - n42 [label="a", shape=box]; - n42 -> n43; - n43 [label="CALL f1", shape=box, style=filled, color=orange]; - n43 -> n16; - n43 -> n45; - n38 -> n46 [label="F"]; - n46 [label="b", shape=box]; - n46 -> n47; - n47 [label="CALL f1", shape=box, style=filled, color=orange]; - n47 -> n16; - n47 -> n49; - n89 -> n91; - n77 -> n82 [label="F"]; - n82 [label="b", shape=box]; - n82 -> n72; - n85 -> n87; - n24 -> n29 [label="F"]; - n29 [label="b", shape=box]; - n29 -> n30; - n30 [label="1", shape=box]; - n30 -> n31; - n31 [label="b - 1", shape=box]; - n31 -> n32; - n32 [label="CALL f1", shape=box, style=filled, color=orange]; - n32 -> n16; - n32 -> n34; - n66 -> n68; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/condition_cfg_after.dot b/Project-02-03-04/mistraltests/after/condition_cfg_after.dot deleted file mode 100644 index 812791f..0000000 --- a/Project-02-03-04/mistraltests/after/condition_cfg_after.dot +++ /dev/null @@ -1,24 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n92 [label="START", shape=box]; - n92 -> n94; - n94 [label="2", shape=box]; - n94 -> n95; - n95 [label="x", shape=box]; - n95 -> n96; - n96 [label="2 < x", shape=box]; - n96 -> n97; - n97 [label="x", shape=box]; - n97 -> n98; - n98 [label="9", shape=box]; - n98 -> n99; - n99 [label="x > 9", shape=box]; - n99 -> n100; - n100 [label="(2 < x) && (x > 9)", shape=box]; - n100 -> n101; - n101 [label="", shape=diamond]; - n101 -> n105 [label="T"]; - n105 [label="1", shape=box]; - n101 -> n106 [label="F"]; - n106 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/defSemiExample_cfg_after.dot b/Project-02-03-04/mistraltests/after/defSemiExample_cfg_after.dot deleted file mode 100644 index 8152335..0000000 --- a/Project-02-03-04/mistraltests/after/defSemiExample_cfg_after.dot +++ /dev/null @@ -1,43 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n107 [label="START", shape=box]; - n107 -> n119; - n119 [label="1", shape=box]; - n119 -> n120; - n120 [label="CALL a", shape=box, style=filled, color=orange]; - n120 -> n109; - n109 [label="START a(x)", shape=box, style=filled, color=green]; - n109 -> n116; - n116 [label="x", shape=box]; - n116 -> n110; - n110 [label="END a(x)", shape=box, style=filled, color=green]; - n110 -> n122; - n122 [label="RET a", shape=box, style=filled, color=orange]; - n122 -> n124; - n124 [label="2", shape=box]; - n124 -> n125; - n125 [label="CALL b", shape=box, style=filled, color=orange]; - n125 -> n111; - n111 [label="START b(y)", shape=box, style=filled, color=green]; - n111 -> n117; - n117 [label="y", shape=box]; - n117 -> n112; - n112 [label="END b(y)", shape=box, style=filled, color=green]; - n112 -> n127; - n127 [label="RET b", shape=box, style=filled, color=orange]; - n127 -> n128; - n128 [label="3", shape=box]; - n128 -> n129; - n129 [label="CALL c", shape=box, style=filled, color=orange]; - n129 -> n113; - n113 [label="START c(z)", shape=box, style=filled, color=green]; - n113 -> n118; - n118 [label="z", shape=box]; - n118 -> n114; - n114 [label="END c(z)", shape=box, style=filled, color=green]; - n114 -> n131; - n131 [label="RET c", shape=box, style=filled, color=orange]; - n129 -> n131; - n125 -> n127; - n120 -> n122; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/example_cfg_after.dot b/Project-02-03-04/mistraltests/after/example_cfg_after.dot deleted file mode 100644 index 9626042..0000000 --- a/Project-02-03-04/mistraltests/after/example_cfg_after.dot +++ /dev/null @@ -1,67 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n132 [label="START", shape=box]; - n132 -> n167; - n167 [label="2", shape=box]; - n167 -> n168; - n168 [label="3", shape=box]; - n168 -> n169; - n169 [label="CALL f", shape=box, style=filled, color=orange]; - n169 -> n134; - n134 [label="START f(x, y, z)", shape=box, style=filled, color=green]; - n134 -> n137; - n137 [label="2", shape=box]; - n137 -> n138; - n138 [label="y = 2", shape=box]; - n138 -> n139; - n139 [label="3", shape=box]; - n139 -> n140; - n140 [label="z = 3", shape=box]; - n140 -> n160; - n160 [label="x", shape=box]; - n160 -> n161; - n161 [label="CALL g", shape=box, style=filled, color=orange]; - n161 -> n141; - n141 [label="START g(x)", shape=box, style=filled, color=green]; - n141 -> n144; - n144 [label="7", shape=box]; - n144 -> n145; - n145 [label="x = 7", shape=box]; - n145 -> n146; - n146 [label="y", shape=box]; - n146 -> n147; - n147 [label="0", shape=box]; - n147 -> n148; - n148 [label="y > 0", shape=box]; - n148 -> n149; - n149 [label="", shape=diamond]; - n149 -> n153 [label="T"]; - n153 [label="y", shape=box]; - n153 -> n154; - n154 [label="CALL g", shape=box, style=filled, color=orange]; - n154 -> n141; - n154 -> n156; - n156 [label="RET g", shape=box, style=filled, color=orange]; - n156 -> n159; - n159 [label="x", shape=box]; - n159 -> n142; - n142 [label="END g(x)", shape=box, style=filled, color=green]; - n142 -> n156; - n142 -> n163; - n163 [label="RET g", shape=box, style=filled, color=orange]; - n163 -> n164; - n164 [label="x", shape=box]; - n164 -> n165; - n165 [label="g(x) + x", shape=box]; - n165 -> n135; - n135 [label="END f(x, y, z)", shape=box, style=filled, color=green]; - n135 -> n171; - n171 [label="RET f", shape=box, style=filled, color=orange]; - n149 -> n157 [label="F"]; - n157 [label="8", shape=box]; - n157 -> n158; - n158 [label="x = 8", shape=box]; - n158 -> n159; - n161 -> n163; - n169 -> n171; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/factorial_cfg_after.dot b/Project-02-03-04/mistraltests/after/factorial_cfg_after.dot deleted file mode 100644 index 037fb22..0000000 --- a/Project-02-03-04/mistraltests/after/factorial_cfg_after.dot +++ /dev/null @@ -1,266 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n173 [label="START", shape=box]; - n173 -> n338; - n338 [label="3", shape=box]; - n338 -> n339; - n339 [label="CALL fac", shape=box, style=filled, color=orange]; - n339 -> n191; - n191 [label="START fac(x)", shape=box, style=filled, color=green]; - n191 -> n194; - n194 [label="x", shape=box]; - n194 -> n195; - n195 [label="1", shape=box]; - n195 -> n196; - n196 [label="x == 1", shape=box]; - n196 -> n197; - n197 [label="", shape=diamond]; - n197 -> n201 [label="T"]; - n201 [label="1", shape=box]; - n201 -> n192; - n192 [label="END fac(x)", shape=box, style=filled, color=green]; - n192 -> n207; - n207 [label="RET fac", shape=box, style=filled, color=orange]; - n207 -> n208; - n208 [label="x", shape=box]; - n208 -> n209; - n209 [label="fac((x - 1)) * x", shape=box]; - n209 -> n192; - n192 -> n223; - n223 [label="RET fac", shape=box, style=filled, color=orange]; - n223 -> n224; - n224 [label="x", shape=box]; - n224 -> n225; - n225 [label="fac((x - 1)) * x", shape=box]; - n225 -> n192; - n192 -> n239; - n239 [label="RET fac", shape=box, style=filled, color=orange]; - n239 -> n240; - n240 [label="x", shape=box]; - n240 -> n241; - n241 [label="fac((x - 1)) * x", shape=box]; - n241 -> n192; - n192 -> n255; - n255 [label="RET fac", shape=box, style=filled, color=orange]; - n255 -> n256; - n256 [label="x", shape=box]; - n256 -> n257; - n257 [label="fac((x - 1)) * x", shape=box]; - n257 -> n192; - n192 -> n271; - n271 [label="RET fac", shape=box, style=filled, color=orange]; - n271 -> n272; - n272 [label="x", shape=box]; - n272 -> n273; - n273 [label="fac((x - 1)) * x", shape=box]; - n273 -> n192; - n192 -> n287; - n287 [label="RET fac", shape=box, style=filled, color=orange]; - n287 -> n288; - n288 [label="x", shape=box]; - n288 -> n289; - n289 [label="fac((x - 1)) * x", shape=box]; - n289 -> n192; - n192 -> n303; - n303 [label="RET fac", shape=box, style=filled, color=orange]; - n303 -> n304; - n304 [label="x", shape=box]; - n304 -> n305; - n305 [label="fac((x - 1)) * x", shape=box]; - n305 -> n192; - n192 -> n319; - n319 [label="RET fac", shape=box, style=filled, color=orange]; - n319 -> n320; - n320 [label="x", shape=box]; - n320 -> n321; - n321 [label="fac((x - 1)) * x", shape=box]; - n321 -> n192; - n192 -> n335; - n335 [label="RET fac", shape=box, style=filled, color=orange]; - n335 -> n336; - n336 [label="x", shape=box]; - n336 -> n337; - n337 [label="fac((x - 1)) * x", shape=box]; - n337 -> n192; - n192 -> n341; - n341 [label="RET fac", shape=box, style=filled, color=orange]; - n197 -> n202 [label="F"]; - n202 [label="x", shape=box]; - n202 -> n203; - n203 [label="1", shape=box]; - n203 -> n204; - n204 [label="x - 1", shape=box]; - n204 -> n205; - n205 [label="CALL fac", shape=box, style=filled, color=orange]; - n205 -> n191; - n205 -> n207; - n191 -> n210; - n210 [label="x", shape=box]; - n210 -> n211; - n211 [label="1", shape=box]; - n211 -> n212; - n212 [label="x == 1", shape=box]; - n212 -> n213; - n213 [label="", shape=diamond]; - n213 -> n217 [label="T"]; - n217 [label="1", shape=box]; - n217 -> n192; - n213 -> n218 [label="F"]; - n218 [label="x", shape=box]; - n218 -> n219; - n219 [label="1", shape=box]; - n219 -> n220; - n220 [label="x - 1", shape=box]; - n220 -> n221; - n221 [label="CALL fac", shape=box, style=filled, color=orange]; - n221 -> n191; - n221 -> n223; - n191 -> n226; - n226 [label="x", shape=box]; - n226 -> n227; - n227 [label="1", shape=box]; - n227 -> n228; - n228 [label="x == 1", shape=box]; - n228 -> n229; - n229 [label="", shape=diamond]; - n229 -> n233 [label="T"]; - n233 [label="1", shape=box]; - n233 -> n192; - n229 -> n234 [label="F"]; - n234 [label="x", shape=box]; - n234 -> n235; - n235 [label="1", shape=box]; - n235 -> n236; - n236 [label="x - 1", shape=box]; - n236 -> n237; - n237 [label="CALL fac", shape=box, style=filled, color=orange]; - n237 -> n191; - n237 -> n239; - n191 -> n242; - n242 [label="x", shape=box]; - n242 -> n243; - n243 [label="1", shape=box]; - n243 -> n244; - n244 [label="x == 1", shape=box]; - n244 -> n245; - n245 [label="", shape=diamond]; - n245 -> n249 [label="T"]; - n249 [label="1", shape=box]; - n249 -> n192; - n245 -> n250 [label="F"]; - n250 [label="x", shape=box]; - n250 -> n251; - n251 [label="1", shape=box]; - n251 -> n252; - n252 [label="x - 1", shape=box]; - n252 -> n253; - n253 [label="CALL fac", shape=box, style=filled, color=orange]; - n253 -> n191; - n253 -> n255; - n191 -> n258; - n258 [label="x", shape=box]; - n258 -> n259; - n259 [label="1", shape=box]; - n259 -> n260; - n260 [label="x == 1", shape=box]; - n260 -> n261; - n261 [label="", shape=diamond]; - n261 -> n265 [label="T"]; - n265 [label="1", shape=box]; - n265 -> n192; - n261 -> n266 [label="F"]; - n266 [label="x", shape=box]; - n266 -> n267; - n267 [label="1", shape=box]; - n267 -> n268; - n268 [label="x - 1", shape=box]; - n268 -> n269; - n269 [label="CALL fac", shape=box, style=filled, color=orange]; - n269 -> n191; - n269 -> n271; - n191 -> n274; - n274 [label="x", shape=box]; - n274 -> n275; - n275 [label="1", shape=box]; - n275 -> n276; - n276 [label="x == 1", shape=box]; - n276 -> n277; - n277 [label="", shape=diamond]; - n277 -> n281 [label="T"]; - n281 [label="1", shape=box]; - n281 -> n192; - n277 -> n282 [label="F"]; - n282 [label="x", shape=box]; - n282 -> n283; - n283 [label="1", shape=box]; - n283 -> n284; - n284 [label="x - 1", shape=box]; - n284 -> n285; - n285 [label="CALL fac", shape=box, style=filled, color=orange]; - n285 -> n191; - n285 -> n287; - n191 -> n290; - n290 [label="x", shape=box]; - n290 -> n291; - n291 [label="1", shape=box]; - n291 -> n292; - n292 [label="x == 1", shape=box]; - n292 -> n293; - n293 [label="", shape=diamond]; - n293 -> n297 [label="T"]; - n297 [label="1", shape=box]; - n297 -> n192; - n293 -> n298 [label="F"]; - n298 [label="x", shape=box]; - n298 -> n299; - n299 [label="1", shape=box]; - n299 -> n300; - n300 [label="x - 1", shape=box]; - n300 -> n301; - n301 [label="CALL fac", shape=box, style=filled, color=orange]; - n301 -> n191; - n301 -> n303; - n191 -> n306; - n306 [label="x", shape=box]; - n306 -> n307; - n307 [label="1", shape=box]; - n307 -> n308; - n308 [label="x == 1", shape=box]; - n308 -> n309; - n309 [label="", shape=diamond]; - n309 -> n313 [label="T"]; - n313 [label="1", shape=box]; - n313 -> n192; - n309 -> n314 [label="F"]; - n314 [label="x", shape=box]; - n314 -> n315; - n315 [label="1", shape=box]; - n315 -> n316; - n316 [label="x - 1", shape=box]; - n316 -> n317; - n317 [label="CALL fac", shape=box, style=filled, color=orange]; - n317 -> n191; - n317 -> n319; - n191 -> n322; - n322 [label="x", shape=box]; - n322 -> n323; - n323 [label="1", shape=box]; - n323 -> n324; - n324 [label="x == 1", shape=box]; - n324 -> n325; - n325 [label="", shape=diamond]; - n325 -> n329 [label="T"]; - n329 [label="1", shape=box]; - n329 -> n192; - n325 -> n330 [label="F"]; - n330 [label="x", shape=box]; - n330 -> n331; - n331 [label="1", shape=box]; - n331 -> n332; - n332 [label="x - 1", shape=box]; - n332 -> n333; - n333 [label="CALL fac", shape=box, style=filled, color=orange]; - n333 -> n191; - n333 -> n335; - n339 -> n341; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/faulty_if_cfg_after.dot b/Project-02-03-04/mistraltests/after/faulty_if_cfg_after.dot deleted file mode 100644 index 2c955a9..0000000 --- a/Project-02-03-04/mistraltests/after/faulty_if_cfg_after.dot +++ /dev/null @@ -1,6 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n356 [label="START", shape=box]; - n356 -> n358; - n358 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/func_cfg_after.dot b/Project-02-03-04/mistraltests/after/func_cfg_after.dot deleted file mode 100644 index 8882b76..0000000 --- a/Project-02-03-04/mistraltests/after/func_cfg_after.dot +++ /dev/null @@ -1,50 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n359 [label="START", shape=box]; - n359 -> n382; - n382 [label="10", shape=box]; - n382 -> n383; - n383 [label="8", shape=box]; - n383 -> n384; - n384 [label="CALL func", shape=box, style=filled, color=orange]; - n384 -> n361; - n361 [label="START func(a, b)", shape=box, style=filled, color=green]; - n361 -> n364; - n364 [label="a", shape=box]; - n364 -> n365; - n365 [label="0", shape=box]; - n365 -> n366; - n366 [label="a > 0", shape=box]; - n366 -> n367; - n367 [label="b", shape=box]; - n367 -> n368; - n368 [label="a", shape=box]; - n368 -> n369; - n369 [label="b != a", shape=box]; - n369 -> n370; - n370 [label="(a > 0) && (b != a)", shape=box]; - n370 -> n371; - n371 [label="", shape=diamond]; - n371 -> n362 [label="T"]; - n362 [label="END func(a, b)", shape=box, style=filled, color=green]; - n362 -> n386; - n386 [label="RET func", shape=box, style=filled, color=orange]; - n371 -> n373 [label="F"]; - n373 [label="b", shape=box]; - n373 -> n374; - n374 [label="1", shape=box]; - n374 -> n375; - n375 [label="b + 1", shape=box]; - n375 -> n376; - n376 [label="b = (b + 1)", shape=box]; - n376 -> n377; - n377 [label="a", shape=box]; - n377 -> n378; - n378 [label="1", shape=box]; - n378 -> n379; - n379 [label="a - 1", shape=box]; - n379 -> n380; - n380 [label="a = (a - 1)", shape=box]; - n380 -> n366; - n384 -> n386; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/geq_cfg_after.dot b/Project-02-03-04/mistraltests/after/geq_cfg_after.dot deleted file mode 100644 index 79218ae..0000000 --- a/Project-02-03-04/mistraltests/after/geq_cfg_after.dot +++ /dev/null @@ -1,16 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n388 [label="START", shape=box]; - n388 -> n390; - n390 [label="1", shape=box]; - n390 -> n391; - n391 [label="0", shape=box]; - n391 -> n392; - n392 [label="1 >= 0", shape=box]; - n392 -> n393; - n393 [label="", shape=diamond]; - n393 -> n397 [label="T"]; - n397 [label="1", shape=box]; - n393 -> n398 [label="F"]; - n398 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/ggT_euclid_rec_cfg_after.dot b/Project-02-03-04/mistraltests/after/ggT_euclid_rec_cfg_after.dot deleted file mode 100644 index 151b313..0000000 --- a/Project-02-03-04/mistraltests/after/ggT_euclid_rec_cfg_after.dot +++ /dev/null @@ -1,65 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n405 [label="START", shape=box]; - n405 -> n439; - n439 [label="3528", shape=box]; - n439 -> n440; - n440 [label="3780", shape=box]; - n440 -> n441; - n441 [label="CALL ggT", shape=box, style=filled, color=orange]; - n441 -> n407; - n407 [label="START ggT(a, b)", shape=box, style=filled, color=green]; - n407 -> n410; - n410 [label="a", shape=box]; - n410 -> n411; - n411 [label="b", shape=box]; - n411 -> n412; - n412 [label="a == b", shape=box]; - n412 -> n413; - n413 [label="", shape=diamond]; - n413 -> n417 [label="T"]; - n417 [label="a", shape=box]; - n417 -> n408; - n408 [label="END ggT(a, b)", shape=box, style=filled, color=green]; - n408 -> n431; - n431 [label="RET ggT", shape=box, style=filled, color=orange]; - n431 -> n408; - n408 -> n438; - n438 [label="RET ggT", shape=box, style=filled, color=orange]; - n438 -> n408; - n408 -> n443; - n443 [label="RET ggT", shape=box, style=filled, color=orange]; - n413 -> n418 [label="F"]; - n418 [label="a", shape=box]; - n418 -> n419; - n419 [label="b", shape=box]; - n419 -> n420; - n420 [label="a > b", shape=box]; - n420 -> n421; - n421 [label="", shape=diamond]; - n421 -> n425 [label="T"]; - n425 [label="a", shape=box]; - n425 -> n426; - n426 [label="b", shape=box]; - n426 -> n427; - n427 [label="a - b", shape=box]; - n427 -> n428; - n428 [label="b", shape=box]; - n428 -> n429; - n429 [label="CALL ggT", shape=box, style=filled, color=orange]; - n429 -> n407; - n429 -> n431; - n421 -> n432 [label="F"]; - n432 [label="b", shape=box]; - n432 -> n433; - n433 [label="a", shape=box]; - n433 -> n434; - n434 [label="b - a", shape=box]; - n434 -> n435; - n435 [label="a", shape=box]; - n435 -> n436; - n436 [label="CALL ggT", shape=box, style=filled, color=orange]; - n436 -> n407; - n436 -> n438; - n441 -> n443; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/homework_cfg_after.dot b/Project-02-03-04/mistraltests/after/homework_cfg_after.dot deleted file mode 100644 index 1209859..0000000 --- a/Project-02-03-04/mistraltests/after/homework_cfg_after.dot +++ /dev/null @@ -1,109 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n445 [label="START", shape=box]; - n445 -> n499; - n499 [label="1", shape=box]; - n499 -> n500; - n500 [label="2", shape=box]; - n500 -> n501; - n501 [label="CALL f", shape=box, style=filled, color=orange]; - n501 -> n447; - n447 [label="START f(x, y)", shape=box, style=filled, color=green]; - n447 -> n452; - n452 [label="x", shape=box]; - n452 -> n453; - n453 [label="0", shape=box]; - n453 -> n454; - n454 [label="x == 0", shape=box]; - n454 -> n455; - n455 [label="", shape=diamond]; - n455 -> n467 [label="T"]; - n467 [label="2", shape=box]; - n467 -> n468; - n468 [label="y", shape=box]; - n468 -> n469; - n469 [label="2 * y", shape=box]; - n469 -> n470; - n470 [label="x", shape=box]; - n470 -> n471; - n471 [label="CALL g", shape=box, style=filled, color=orange]; - n471 -> n459; - n459 [label="START g(x, z)", shape=box, style=filled, color=green]; - n459 -> n462; - n462 [label="x", shape=box]; - n462 -> n463; - n463 [label="y", shape=box]; - n463 -> n464; - n464 [label="x * y", shape=box]; - n464 -> n465; - n465 [label="z", shape=box]; - n465 -> n466; - n466 [label="(x * y) + z", shape=box]; - n466 -> n460; - n460 [label="END g(x, z)", shape=box, style=filled, color=green]; - n460 -> n473; - n473 [label="RET g", shape=box, style=filled, color=orange]; - n473 -> n448; - n448 [label="END f(x, y)", shape=box, style=filled, color=green]; - n448 -> n488; - n488 [label="RET f", shape=box, style=filled, color=orange]; - n488 -> n489; - n489 [label="a * f(a,i)", shape=box]; - n489 -> n490; - n490 [label="a = (a * f(a,i))", shape=box]; - n490 -> n491; - n491 [label="i", shape=box]; - n491 -> n492; - n492 [label="1", shape=box]; - n492 -> n493; - n493 [label="i - 1", shape=box]; - n493 -> n494; - n494 [label="i = (i - 1)", shape=box]; - n494 -> n478; - n478 [label="i", shape=box]; - n478 -> n479; - n479 [label="0", shape=box]; - n479 -> n480; - n480 [label="i > 0", shape=box]; - n480 -> n481; - n481 [label="", shape=diamond]; - n481 -> n483 [label="T"]; - n483 [label="a", shape=box]; - n483 -> n484; - n484 [label="a", shape=box]; - n484 -> n485; - n485 [label="i", shape=box]; - n485 -> n486; - n486 [label="CALL f", shape=box, style=filled, color=orange]; - n486 -> n447; - n486 -> n488; - n481 -> n496 [label="F"]; - n496 [label="a", shape=box]; - n496 -> n497; - n497 [label="42", shape=box]; - n497 -> n498; - n498 [label="a + 42", shape=box]; - n498 -> n460; - n448 -> n503; - n503 [label="RET f", shape=box, style=filled, color=orange]; - n503 -> n505; - n505 [label="3", shape=box]; - n505 -> n506; - n506 [label="3", shape=box]; - n506 -> n507; - n507 [label="CALL g", shape=box, style=filled, color=orange]; - n507 -> n459; - n507 -> n509; - n509 [label="RET g", shape=box, style=filled, color=orange]; - n460 -> n509; - n459 -> n478; - n471 -> n473; - n455 -> n475 [label="F"]; - n475 [label="x", shape=box]; - n475 -> n476; - n476 [label="1", shape=box]; - n476 -> n477; - n477 [label="x + 1", shape=box]; - n477 -> n448; - n501 -> n503; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/multiple-let-with-same-func-name_cfg_after.dot b/Project-02-03-04/mistraltests/after/multiple-let-with-same-func-name_cfg_after.dot deleted file mode 100644 index c28cea6..0000000 --- a/Project-02-03-04/mistraltests/after/multiple-let-with-same-func-name_cfg_after.dot +++ /dev/null @@ -1,34 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n512 [label="START", shape=box]; - n512 -> n518; - n518 [label="5", shape=box]; - n518 -> n519; - n519 [label="CALL m", shape=box, style=filled, color=orange]; - n519 -> n514; - n514 [label="START m(a)", shape=box, style=filled, color=green]; - n514 -> n517; - n517 [label="a", shape=box]; - n517 -> n515; - n515 [label="END m(a)", shape=box, style=filled, color=green]; - n515 -> n521; - n521 [label="RET m", shape=box, style=filled, color=orange]; - n521 -> n529; - n529 [label="5", shape=box]; - n529 -> n530; - n530 [label="CALL m", shape=box, style=filled, color=orange]; - n530 -> n523; - n523 [label="START m(b)", shape=box, style=filled, color=green]; - n523 -> n526; - n526 [label="b", shape=box]; - n526 -> n527; - n527 [label="1", shape=box]; - n527 -> n528; - n528 [label="b + 1", shape=box]; - n528 -> n524; - n524 [label="END m(b)", shape=box, style=filled, color=green]; - n524 -> n532; - n532 [label="RET m", shape=box, style=filled, color=orange]; - n530 -> n532; - n519 -> n521; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/multiple-let_cfg_after.dot b/Project-02-03-04/mistraltests/after/multiple-let_cfg_after.dot deleted file mode 100644 index ea0334e..0000000 --- a/Project-02-03-04/mistraltests/after/multiple-let_cfg_after.dot +++ /dev/null @@ -1,44 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n534 [label="START", shape=box]; - n534 -> n540; - n540 [label="5", shape=box]; - n540 -> n541; - n541 [label="CALL n", shape=box, style=filled, color=orange]; - n541 -> n536; - n536 [label="START n(a)", shape=box, style=filled, color=green]; - n536 -> n539; - n539 [label="a", shape=box]; - n539 -> n537; - n537 [label="END n(a)", shape=box, style=filled, color=green]; - n537 -> n543; - n543 [label="RET n", shape=box, style=filled, color=orange]; - n543 -> n551; - n551 [label="5", shape=box]; - n551 -> n552; - n552 [label="CALL n", shape=box, style=filled, color=orange]; - n552 -> n536; - n552 -> n554; - n554 [label="RET n", shape=box, style=filled, color=orange]; - n554 -> n555; - n555 [label="5", shape=box]; - n555 -> n556; - n556 [label="CALL m", shape=box, style=filled, color=orange]; - n556 -> n545; - n545 [label="START m(a)", shape=box, style=filled, color=green]; - n545 -> n548; - n548 [label="a", shape=box]; - n548 -> n549; - n549 [label="1", shape=box]; - n549 -> n550; - n550 [label="a + 1", shape=box]; - n550 -> n546; - n546 [label="END m(a)", shape=box, style=filled, color=green]; - n546 -> n558; - n558 [label="RET m", shape=box, style=filled, color=orange]; - n558 -> n559; - n559 [label="n(5) + m(5)", shape=box]; - n556 -> n558; - n537 -> n554; - n541 -> n543; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/or_cfg_after.dot b/Project-02-03-04/mistraltests/after/or_cfg_after.dot deleted file mode 100644 index 47e1722..0000000 --- a/Project-02-03-04/mistraltests/after/or_cfg_after.dot +++ /dev/null @@ -1,20 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n561 [label="START", shape=box]; - n561 -> n563; - n563 [label="True", shape=box]; - n563 -> n564; - n564 [label="True", shape=box]; - n564 -> n565; - n565 [label="True", shape=box]; - n565 -> n566; - n566 [label="True == True", shape=box]; - n566 -> n567; - n567 [label="True || (True == True)", shape=box]; - n567 -> n568; - n568 [label="", shape=diamond]; - n568 -> n572 [label="T"]; - n572 [label="1", shape=box]; - n568 -> n573 [label="F"]; - n573 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/p1_cfg_after.dot b/Project-02-03-04/mistraltests/after/p1_cfg_after.dot deleted file mode 100644 index b5f7e47..0000000 --- a/Project-02-03-04/mistraltests/after/p1_cfg_after.dot +++ /dev/null @@ -1,21 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n574 [label="START", shape=box]; - n574 -> n582; - n582 [label="5", shape=box]; - n582 -> n583; - n583 [label="CALL g", shape=box, style=filled, color=orange]; - n583 -> n576; - n576 [label="START g(a)", shape=box, style=filled, color=green]; - n576 -> n579; - n579 [label="a", shape=box]; - n579 -> n580; - n580 [label="a", shape=box]; - n580 -> n581; - n581 [label="a * a", shape=box]; - n581 -> n577; - n577 [label="END g(a)", shape=box, style=filled, color=green]; - n577 -> n585; - n585 [label="RET g", shape=box, style=filled, color=orange]; - n583 -> n585; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/p2_cfg_after.dot b/Project-02-03-04/mistraltests/after/p2_cfg_after.dot deleted file mode 100644 index bb80e27..0000000 --- a/Project-02-03-04/mistraltests/after/p2_cfg_after.dot +++ /dev/null @@ -1,38 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n587 [label="START", shape=box]; - n587 -> n606; - n606 [label="10", shape=box]; - n606 -> n607; - n607 [label="CALL f1", shape=box, style=filled, color=orange]; - n607 -> n589; - n589 [label="START f1(b)", shape=box, style=filled, color=green]; - n589 -> n592; - n592 [label="b", shape=box]; - n592 -> n593; - n593 [label="0", shape=box]; - n593 -> n594; - n594 [label="b == 0", shape=box]; - n594 -> n595; - n595 [label="", shape=diamond]; - n595 -> n599 [label="T"]; - n599 [label="0", shape=box]; - n599 -> n590; - n590 [label="END f1(b)", shape=box, style=filled, color=green]; - n590 -> n605; - n605 [label="RET f1", shape=box, style=filled, color=orange]; - n605 -> n590; - n590 -> n609; - n609 [label="RET f1", shape=box, style=filled, color=orange]; - n595 -> n600 [label="F"]; - n600 [label="b", shape=box]; - n600 -> n601; - n601 [label="1", shape=box]; - n601 -> n602; - n602 [label="b - 1", shape=box]; - n602 -> n603; - n603 [label="CALL f1", shape=box, style=filled, color=orange]; - n603 -> n589; - n603 -> n605; - n607 -> n609; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/p3_cfg_after.dot b/Project-02-03-04/mistraltests/after/p3_cfg_after.dot deleted file mode 100644 index 4131dc0..0000000 --- a/Project-02-03-04/mistraltests/after/p3_cfg_after.dot +++ /dev/null @@ -1,125 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n611 [label="START", shape=box]; - n611 -> n662; - n662 [label="10", shape=box]; - n662 -> n663; - n663 [label="CALL f1", shape=box, style=filled, color=orange]; - n663 -> n613; - n613 [label="START f1(b)", shape=box, style=filled, color=green]; - n613 -> n618; - n618 [label="b", shape=box]; - n618 -> n619; - n619 [label="0", shape=box]; - n619 -> n620; - n620 [label="b == 0", shape=box]; - n620 -> n621; - n621 [label="", shape=diamond]; - n621 -> n625 [label="T"]; - n625 [label="0", shape=box]; - n625 -> n614; - n614 [label="END f1(b)", shape=box, style=filled, color=green]; - n614 -> n631; - n631 [label="RET f1", shape=box, style=filled, color=orange]; - n631 -> n614; - n614 -> n642; - n642 [label="RET f1", shape=box, style=filled, color=orange]; - n642 -> n655; - n655 [label="a", shape=box]; - n655 -> n656; - n656 [label="b", shape=box]; - n656 -> n657; - n657 [label="a * b", shape=box]; - n657 -> n658; - n658 [label="CALL g", shape=box, style=filled, color=orange]; - n658 -> n647; - n647 [label="START g(c)", shape=box, style=filled, color=green]; - n647 -> n650; - n650 [label="a", shape=box]; - n650 -> n651; - n651 [label="b", shape=box]; - n651 -> n652; - n652 [label="a * b", shape=box]; - n652 -> n653; - n653 [label="c", shape=box]; - n653 -> n654; - n654 [label="(a * b) * c", shape=box]; - n654 -> n648; - n648 [label="END g(c)", shape=box, style=filled, color=green]; - n648 -> n660; - n660 [label="RET g", shape=box, style=filled, color=orange]; - n660 -> n616; - n616 [label="END f2(a, b)", shape=box, style=filled, color=green]; - n616 -> n688; - n688 [label="RET f2", shape=box, style=filled, color=orange]; - n658 -> n660; - n614 -> n646; - n646 [label="RET f1", shape=box, style=filled, color=orange]; - n646 -> n655; - n614 -> n665; - n665 [label="RET f1", shape=box, style=filled, color=orange]; - n665 -> n667; - n667 [label="10", shape=box]; - n667 -> n680; - n680 [label="20", shape=box]; - n680 -> n681; - n681 [label="30", shape=box]; - n681 -> n682; - n682 [label="CALL max", shape=box, style=filled, color=orange]; - n682 -> n668; - n668 [label="START max(a, b)", shape=box, style=filled, color=green]; - n668 -> n671; - n671 [label="a", shape=box]; - n671 -> n672; - n672 [label="b", shape=box]; - n672 -> n673; - n673 [label="a > b", shape=box]; - n673 -> n674; - n674 [label="", shape=diamond]; - n674 -> n678 [label="T"]; - n678 [label="a", shape=box]; - n678 -> n669; - n669 [label="END max(a, b)", shape=box, style=filled, color=green]; - n669 -> n684; - n684 [label="RET max", shape=box, style=filled, color=orange]; - n684 -> n686; - n686 [label="CALL f2", shape=box, style=filled, color=orange]; - n686 -> n615; - n615 [label="START f2(a, b)", shape=box, style=filled, color=green]; - n615 -> n632; - n632 [label="a", shape=box]; - n632 -> n633; - n633 [label="b", shape=box]; - n633 -> n634; - n634 [label="a > b", shape=box]; - n634 -> n635; - n635 [label="", shape=diamond]; - n635 -> n639 [label="T"]; - n639 [label="a", shape=box]; - n639 -> n640; - n640 [label="CALL f1", shape=box, style=filled, color=orange]; - n640 -> n613; - n640 -> n642; - n635 -> n643 [label="F"]; - n643 [label="b", shape=box]; - n643 -> n644; - n644 [label="CALL f1", shape=box, style=filled, color=orange]; - n644 -> n613; - n644 -> n646; - n686 -> n688; - n674 -> n679 [label="F"]; - n679 [label="b", shape=box]; - n679 -> n669; - n682 -> n684; - n621 -> n626 [label="F"]; - n626 [label="b", shape=box]; - n626 -> n627; - n627 [label="1", shape=box]; - n627 -> n628; - n628 [label="b - 1", shape=box]; - n628 -> n629; - n629 [label="CALL f1", shape=box, style=filled, color=orange]; - n629 -> n613; - n629 -> n631; - n663 -> n665; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/p4_cfg_after.dot b/Project-02-03-04/mistraltests/after/p4_cfg_after.dot deleted file mode 100644 index 70de5bd..0000000 --- a/Project-02-03-04/mistraltests/after/p4_cfg_after.dot +++ /dev/null @@ -1,25 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n689 [label="START", shape=box]; - n689 -> n698; - n698 [label="10", shape=box]; - n698 -> n699; - n699 [label="8", shape=box]; - n699 -> n700; - n700 [label="CALL func", shape=box, style=filled, color=orange]; - n700 -> n691; - n691 [label="START func(a, b)", shape=box, style=filled, color=green]; - n691 -> n694; - n694 [label="b", shape=box]; - n694 -> n695; - n695 [label="1", shape=box]; - n695 -> n696; - n696 [label="b + 1", shape=box]; - n696 -> n697; - n697 [label="a = (b + 1)", shape=box]; - n697 -> n692; - n692 [label="END func(a, b)", shape=box, style=filled, color=green]; - n692 -> n702; - n702 [label="RET func", shape=box, style=filled, color=orange]; - n700 -> n702; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/p6_cfg_after.dot b/Project-02-03-04/mistraltests/after/p6_cfg_after.dot deleted file mode 100644 index 143f6c5..0000000 --- a/Project-02-03-04/mistraltests/after/p6_cfg_after.dot +++ /dev/null @@ -1,103 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n710 [label="START", shape=box]; - n710 -> n762; - n762 [label="2", shape=box]; - n762 -> n763; - n763 [label="3", shape=box]; - n763 -> n764; - n764 [label="CALL f", shape=box, style=filled, color=orange]; - n764 -> n712; - n712 [label="START f(a, b)", shape=box, style=filled, color=green]; - n712 -> n717; - n717 [label="a", shape=box]; - n717 -> n718; - n718 [label="0", shape=box]; - n718 -> n719; - n719 [label="a == 0", shape=box]; - n719 -> n720; - n720 [label="", shape=diamond]; - n720 -> n724 [label="T"]; - n724 [label="2", shape=box]; - n724 -> n725; - n725 [label="b", shape=box]; - n725 -> n726; - n726 [label="2 + b", shape=box]; - n726 -> n713; - n713 [label="END f(a, b)", shape=box, style=filled, color=green]; - n713 -> n760; - n760 [label="RET f", shape=box, style=filled, color=orange]; - n760 -> n761; - n761 [label="c * f((c - 1),d)", shape=box]; - n761 -> n728; - n728 [label="END g(a, c)", shape=box, style=filled, color=green]; - n728 -> n740; - n740 [label="RET g", shape=box, style=filled, color=orange]; - n740 -> n741; - n741 [label="2 + g(a,b)", shape=box]; - n741 -> n713; - n728 -> n772; - n772 [label="RET g", shape=box, style=filled, color=orange]; - n713 -> n766; - n766 [label="RET f", shape=box, style=filled, color=orange]; - n766 -> n768; - n768 [label="3", shape=box]; - n768 -> n769; - n769 [label="2", shape=box]; - n769 -> n770; - n770 [label="CALL g", shape=box, style=filled, color=orange]; - n770 -> n727; - n727 [label="START g(a, c)", shape=box, style=filled, color=green]; - n727 -> n730; - n730 [label="a", shape=box]; - n730 -> n731; - n731 [label="c", shape=box]; - n731 -> n732; - n732 [label="a + c", shape=box]; - n732 -> n733; - n733 [label="b", shape=box]; - n733 -> n734; - n734 [label="(a + c) + b", shape=box]; - n734 -> n728; - n727 -> n743; - n743 [label="c", shape=box]; - n743 -> n744; - n744 [label="0", shape=box]; - n744 -> n745; - n745 [label="c == 0", shape=box]; - n745 -> n746; - n746 [label="", shape=diamond]; - n746 -> n750 [label="T"]; - n750 [label="1", shape=box]; - n750 -> n751; - n751 [label="d", shape=box]; - n751 -> n752; - n752 [label="1 + d", shape=box]; - n752 -> n728; - n746 -> n753 [label="F"]; - n753 [label="c", shape=box]; - n753 -> n754; - n754 [label="c", shape=box]; - n754 -> n755; - n755 [label="1", shape=box]; - n755 -> n756; - n756 [label="c - 1", shape=box]; - n756 -> n757; - n757 [label="d", shape=box]; - n757 -> n758; - n758 [label="CALL f", shape=box, style=filled, color=orange]; - n758 -> n712; - n758 -> n760; - n770 -> n772; - n720 -> n735 [label="F"]; - n735 [label="2", shape=box]; - n735 -> n736; - n736 [label="a", shape=box]; - n736 -> n737; - n737 [label="b", shape=box]; - n737 -> n738; - n738 [label="CALL g", shape=box, style=filled, color=orange]; - n738 -> n727; - n738 -> n740; - n764 -> n766; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/side_effect_cfg_after.dot b/Project-02-03-04/mistraltests/after/side_effect_cfg_after.dot deleted file mode 100644 index d9f166c..0000000 --- a/Project-02-03-04/mistraltests/after/side_effect_cfg_after.dot +++ /dev/null @@ -1,40 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n773 [label="START", shape=box]; - n773 -> n792; - n792 [label="1", shape=box]; - n792 -> n793; - n793 [label="2", shape=box]; - n793 -> n794; - n794 [label="CALL f", shape=box, style=filled, color=orange]; - n794 -> n775; - n775 [label="START f(x, y)", shape=box, style=filled, color=green]; - n775 -> n785; - n785 [label="5", shape=box]; - n785 -> n786; - n786 [label="CALL g", shape=box, style=filled, color=orange]; - n786 -> n778; - n778 [label="START g(x)", shape=box, style=filled, color=green]; - n778 -> n781; - n781 [label="x", shape=box]; - n781 -> n782; - n782 [label="7", shape=box]; - n782 -> n783; - n783 [label="x + 7", shape=box]; - n783 -> n784; - n784 [label="y = (x + 7)", shape=box]; - n784 -> n779; - n779 [label="END g(x)", shape=box, style=filled, color=green]; - n779 -> n788; - n788 [label="RET g", shape=box, style=filled, color=orange]; - n788 -> n789; - n789 [label="x = g(5)", shape=box]; - n789 -> n791; - n791 [label="y", shape=box]; - n791 -> n776; - n776 [label="END f(x, y)", shape=box, style=filled, color=green]; - n776 -> n796; - n796 [label="RET f", shape=box, style=filled, color=orange]; - n786 -> n788; - n794 -> n796; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/simpleSequence_cfg_after.dot b/Project-02-03-04/mistraltests/after/simpleSequence_cfg_after.dot deleted file mode 100644 index 06fdcd8..0000000 --- a/Project-02-03-04/mistraltests/after/simpleSequence_cfg_after.dot +++ /dev/null @@ -1,59 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n798 [label="START", shape=box]; - n798 -> n829; - n829 [label="3", shape=box]; - n829 -> n830; - n830 [label="CALL f", shape=box, style=filled, color=orange]; - n830 -> n800; - n800 [label="START f(x)", shape=box, style=filled, color=green]; - n800 -> n803; - n803 [label="2", shape=box]; - n803 -> n804; - n804 [label="x", shape=box]; - n804 -> n805; - n805 [label="2 * x", shape=box]; - n805 -> n806; - n806 [label="x = (2 * x)", shape=box]; - n806 -> n807; - n807 [label="x", shape=box]; - n807 -> n808; - n808 [label="0", shape=box]; - n808 -> n809; - n809 [label="x > 0", shape=box]; - n809 -> n810; - n810 [label="", shape=diamond]; - n810 -> n814 [label="T"]; - n814 [label="x", shape=box]; - n814 -> n815; - n815 [label="1", shape=box]; - n815 -> n816; - n816 [label="x - 1", shape=box]; - n816 -> n817; - n817 [label="x = (x - 1)", shape=box]; - n817 -> n819; - n819 [label="x", shape=box]; - n819 -> n820; - n820 [label="0", shape=box]; - n820 -> n821; - n821 [label="x > 0", shape=box]; - n821 -> n822; - n822 [label="", shape=diamond]; - n822 -> n801 [label="T"]; - n801 [label="END f(x)", shape=box, style=filled, color=green]; - n801 -> n832; - n832 [label="RET f", shape=box, style=filled, color=orange]; - n822 -> n824 [label="F"]; - n824 [label="x", shape=box]; - n824 -> n825; - n825 [label="1", shape=box]; - n825 -> n826; - n826 [label="x - 1", shape=box]; - n826 -> n827; - n827 [label="x = (x - 1)", shape=box]; - n827 -> n819; - n810 -> n818 [label="F"]; - n818 [label="x", shape=box]; - n818 -> n819; - n830 -> n832; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/simple_dfa_cfg_after.dot b/Project-02-03-04/mistraltests/after/simple_dfa_cfg_after.dot deleted file mode 100644 index abc919b..0000000 --- a/Project-02-03-04/mistraltests/after/simple_dfa_cfg_after.dot +++ /dev/null @@ -1,21 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n834 [label="START", shape=box]; - n834 -> n842; - n842 [label="2", shape=box]; - n842 -> n843; - n843 [label="CALL g", shape=box, style=filled, color=orange]; - n843 -> n836; - n836 [label="START g(x, y)", shape=box, style=filled, color=green]; - n836 -> n839; - n839 [label="3", shape=box]; - n839 -> n840; - n840 [label="y = 3", shape=box]; - n840 -> n841; - n841 [label="x", shape=box]; - n841 -> n837; - n837 [label="END g(x, y)", shape=box, style=filled, color=green]; - n837 -> n845; - n845 [label="RET g", shape=box, style=filled, color=orange]; - n843 -> n845; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/simple_if_2_cfg_after.dot b/Project-02-03-04/mistraltests/after/simple_if_2_cfg_after.dot deleted file mode 100644 index 5e5a429..0000000 --- a/Project-02-03-04/mistraltests/after/simple_if_2_cfg_after.dot +++ /dev/null @@ -1,16 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n856 [label="START", shape=box]; - n856 -> n858; - n858 [label="True", shape=box]; - n858 -> n859; - n859 [label="False", shape=box]; - n859 -> n860; - n860 [label="True && False", shape=box]; - n860 -> n861; - n861 [label="", shape=diamond]; - n861 -> n865 [label="T"]; - n865 [label="1", shape=box]; - n861 -> n866 [label="F"]; - n866 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/simple_if_3_cfg_after.dot b/Project-02-03-04/mistraltests/after/simple_if_3_cfg_after.dot deleted file mode 100644 index 0d2f7ff..0000000 --- a/Project-02-03-04/mistraltests/after/simple_if_3_cfg_after.dot +++ /dev/null @@ -1,16 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n867 [label="START", shape=box]; - n867 -> n869; - n869 [label="True", shape=box]; - n869 -> n870; - n870 [label="False", shape=box]; - n870 -> n871; - n871 [label="True || False", shape=box]; - n871 -> n872; - n872 [label="", shape=diamond]; - n872 -> n876 [label="T"]; - n876 [label="1", shape=box]; - n872 -> n877 [label="F"]; - n877 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/simple_if_4_cfg_after.dot b/Project-02-03-04/mistraltests/after/simple_if_4_cfg_after.dot deleted file mode 100644 index f63855d..0000000 --- a/Project-02-03-04/mistraltests/after/simple_if_4_cfg_after.dot +++ /dev/null @@ -1,16 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n878 [label="START", shape=box]; - n878 -> n880; - n880 [label="1", shape=box]; - n880 -> n881; - n881 [label="2", shape=box]; - n881 -> n882; - n882 [label="1 > 2", shape=box]; - n882 -> n883; - n883 [label="", shape=diamond]; - n883 -> n887 [label="T"]; - n887 [label="1", shape=box]; - n883 -> n888 [label="F"]; - n888 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/simple_if_5_cfg_after.dot b/Project-02-03-04/mistraltests/after/simple_if_5_cfg_after.dot deleted file mode 100644 index a6b0aa6..0000000 --- a/Project-02-03-04/mistraltests/after/simple_if_5_cfg_after.dot +++ /dev/null @@ -1,20 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n889 [label="START", shape=box]; - n889 -> n891; - n891 [label="2", shape=box]; - n891 -> n892; - n892 [label="3", shape=box]; - n892 -> n893; - n893 [label="5", shape=box]; - n893 -> n894; - n894 [label="3 + 5", shape=box]; - n894 -> n895; - n895 [label="2 > (3 + 5)", shape=box]; - n895 -> n896; - n896 [label="", shape=diamond]; - n896 -> n900 [label="T"]; - n900 [label="1", shape=box]; - n896 -> n901 [label="F"]; - n901 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/simple_if_6_cfg_after.dot b/Project-02-03-04/mistraltests/after/simple_if_6_cfg_after.dot deleted file mode 100644 index d6791a9..0000000 --- a/Project-02-03-04/mistraltests/after/simple_if_6_cfg_after.dot +++ /dev/null @@ -1,24 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n902 [label="START", shape=box]; - n902 -> n904; - n904 [label="1", shape=box]; - n904 -> n905; - n905 [label="2", shape=box]; - n905 -> n906; - n906 [label="1 > 2", shape=box]; - n906 -> n907; - n907 [label="3", shape=box]; - n907 -> n908; - n908 [label="5", shape=box]; - n908 -> n909; - n909 [label="3 < 5", shape=box]; - n909 -> n910; - n910 [label="(1 > 2) || (3 < 5)", shape=box]; - n910 -> n911; - n911 [label="", shape=diamond]; - n911 -> n915 [label="T"]; - n915 [label="1", shape=box]; - n911 -> n916 [label="F"]; - n916 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/simple_if_7_cfg_after.dot b/Project-02-03-04/mistraltests/after/simple_if_7_cfg_after.dot deleted file mode 100644 index 1de6093..0000000 --- a/Project-02-03-04/mistraltests/after/simple_if_7_cfg_after.dot +++ /dev/null @@ -1,20 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n917 [label="START", shape=box]; - n917 -> n919; - n919 [label="2", shape=box]; - n919 -> n920; - n920 [label="0", shape=box]; - n920 -> n921; - n921 [label="2 == 0", shape=box]; - n921 -> n922; - n922 [label="False", shape=box]; - n922 -> n923; - n923 [label="(2 == 0) == False", shape=box]; - n923 -> n924; - n924 [label="", shape=diamond]; - n924 -> n928 [label="T"]; - n928 [label="1", shape=box]; - n924 -> n929 [label="F"]; - n929 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/simple_if_cfg_after.dot b/Project-02-03-04/mistraltests/after/simple_if_cfg_after.dot deleted file mode 100644 index b8b7222..0000000 --- a/Project-02-03-04/mistraltests/after/simple_if_cfg_after.dot +++ /dev/null @@ -1,12 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n847 [label="START", shape=box]; - n847 -> n849; - n849 [label="True", shape=box]; - n849 -> n850; - n850 [label="", shape=diamond]; - n850 -> n854 [label="T"]; - n854 [label="1", shape=box]; - n850 -> n855 [label="F"]; - n855 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/square_cfg_after.dot b/Project-02-03-04/mistraltests/after/square_cfg_after.dot deleted file mode 100644 index 9048a94..0000000 --- a/Project-02-03-04/mistraltests/after/square_cfg_after.dot +++ /dev/null @@ -1,21 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n930 [label="START", shape=box]; - n930 -> n938; - n938 [label="10", shape=box]; - n938 -> n939; - n939 [label="CALL square", shape=box, style=filled, color=orange]; - n939 -> n932; - n932 [label="START square(x)", shape=box, style=filled, color=green]; - n932 -> n935; - n935 [label="x", shape=box]; - n935 -> n936; - n936 [label="x", shape=box]; - n936 -> n937; - n937 [label="x * x", shape=box]; - n937 -> n933; - n933 [label="END square(x)", shape=box, style=filled, color=green]; - n933 -> n941; - n941 [label="RET square", shape=box, style=filled, color=orange]; - n939 -> n941; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/validProgram_cfg_after.dot b/Project-02-03-04/mistraltests/after/validProgram_cfg_after.dot deleted file mode 100644 index 089243d..0000000 --- a/Project-02-03-04/mistraltests/after/validProgram_cfg_after.dot +++ /dev/null @@ -1,92 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n943 [label="START", shape=box]; - n943 -> n983; - n983 [label="2", shape=box]; - n983 -> n984; - n984 [label="3", shape=box]; - n984 -> n985; - n985 [label="CALL mult", shape=box, style=filled, color=orange]; - n985 -> n945; - n945 [label="START mult(a, b)", shape=box, style=filled, color=green]; - n945 -> n950; - n950 [label="a", shape=box]; - n950 -> n951; - n951 [label="b", shape=box]; - n951 -> n952; - n952 [label="a * b", shape=box]; - n952 -> n946; - n946 [label="END mult(a, b)", shape=box, style=filled, color=green]; - n946 -> n977; - n977 [label="RET mult", shape=box, style=filled, color=orange]; - n977 -> n954; - n954 [label="END inc(a)", shape=box, style=filled, color=green]; - n954 -> n972; - n972 [label="RET inc", shape=box, style=filled, color=orange]; - n972 -> n954; - n954 -> n981; - n981 [label="RET inc", shape=box, style=filled, color=orange]; - n981 -> n948; - n948 [label="END add(a, b)", shape=box, style=filled, color=green]; - n948 -> n992; - n992 [label="RET add", shape=box, style=filled, color=orange]; - n992 -> n993; - n993 [label="CALL add", shape=box, style=filled, color=orange]; - n993 -> n947; - n947 [label="START add(a, b)", shape=box, style=filled, color=green]; - n947 -> n978; - n978 [label="a", shape=box]; - n978 -> n979; - n979 [label="CALL inc", shape=box, style=filled, color=orange]; - n979 -> n953; - n953 [label="START inc(a)", shape=box, style=filled, color=green]; - n953 -> n956; - n956 [label="b", shape=box]; - n956 -> n957; - n957 [label="0", shape=box]; - n957 -> n958; - n958 [label="b != 0", shape=box]; - n958 -> n959; - n959 [label="", shape=diamond]; - n959 -> n963 [label="T"]; - n963 [label="b", shape=box]; - n963 -> n964; - n964 [label="1", shape=box]; - n964 -> n965; - n965 [label="b - 1", shape=box]; - n965 -> n966; - n966 [label="b = (b - 1)", shape=box]; - n966 -> n967; - n967 [label="a", shape=box]; - n967 -> n968; - n968 [label="1", shape=box]; - n968 -> n969; - n969 [label="a + 1", shape=box]; - n969 -> n970; - n970 [label="CALL inc", shape=box, style=filled, color=orange]; - n970 -> n953; - n970 -> n972; - n959 -> n973 [label="F"]; - n973 [label="a", shape=box]; - n973 -> n974; - n974 [label="1", shape=box]; - n974 -> n975; - n975 [label="CALL mult", shape=box, style=filled, color=orange]; - n975 -> n945; - n975 -> n977; - n979 -> n981; - n993 -> n995; - n995 [label="RET add", shape=box, style=filled, color=orange]; - n948 -> n995; - n946 -> n987; - n987 [label="RET mult", shape=box, style=filled, color=orange]; - n987 -> n988; - n988 [label="4", shape=box]; - n988 -> n989; - n989 [label="5", shape=box]; - n989 -> n990; - n990 [label="CALL add", shape=box, style=filled, color=orange]; - n990 -> n947; - n990 -> n992; - n985 -> n987; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/while_2_cfg_after.dot b/Project-02-03-04/mistraltests/after/while_2_cfg_after.dot deleted file mode 100644 index 94838b2..0000000 --- a/Project-02-03-04/mistraltests/after/while_2_cfg_after.dot +++ /dev/null @@ -1,11 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n1026 [label="START", shape=box]; - n1026 -> n1028; - n1028 [label="True", shape=box]; - n1028 -> n1029; - n1029 [label="", shape=diamond]; - n1029 -> n1031 [label="T"]; - n1031 [label="3", shape=box]; - n1031 -> n1026; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/while_cfg_after.dot b/Project-02-03-04/mistraltests/after/while_cfg_after.dot deleted file mode 100644 index 3cf94ac..0000000 --- a/Project-02-03-04/mistraltests/after/while_cfg_after.dot +++ /dev/null @@ -1,50 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n997 [label="START", shape=box]; - n997 -> n1020; - n1020 [label="10", shape=box]; - n1020 -> n1021; - n1021 [label="8", shape=box]; - n1021 -> n1022; - n1022 [label="CALL func", shape=box, style=filled, color=orange]; - n1022 -> n999; - n999 [label="START func(a, b)", shape=box, style=filled, color=green]; - n999 -> n1002; - n1002 [label="a", shape=box]; - n1002 -> n1003; - n1003 [label="0", shape=box]; - n1003 -> n1004; - n1004 [label="a > 0", shape=box]; - n1004 -> n1005; - n1005 [label="b", shape=box]; - n1005 -> n1006; - n1006 [label="a", shape=box]; - n1006 -> n1007; - n1007 [label="b != a", shape=box]; - n1007 -> n1008; - n1008 [label="(a > 0) && (b != a)", shape=box]; - n1008 -> n1009; - n1009 [label="", shape=diamond]; - n1009 -> n1000 [label="T"]; - n1000 [label="END func(a, b)", shape=box, style=filled, color=green]; - n1000 -> n1024; - n1024 [label="RET func", shape=box, style=filled, color=orange]; - n1009 -> n1011 [label="F"]; - n1011 [label="b", shape=box]; - n1011 -> n1012; - n1012 [label="1", shape=box]; - n1012 -> n1013; - n1013 [label="b + 1", shape=box]; - n1013 -> n1014; - n1014 [label="b = (b + 1)", shape=box]; - n1014 -> n1015; - n1015 [label="a", shape=box]; - n1015 -> n1016; - n1016 [label="1", shape=box]; - n1016 -> n1017; - n1017 [label="a - 1", shape=box]; - n1017 -> n1018; - n1018 [label="a = (a - 1)", shape=box]; - n1018 -> n1004; - n1022 -> n1024; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/wrapped-ggT_cfg_after.dot b/Project-02-03-04/mistraltests/after/wrapped-ggT_cfg_after.dot deleted file mode 100644 index bea4728..0000000 --- a/Project-02-03-04/mistraltests/after/wrapped-ggT_cfg_after.dot +++ /dev/null @@ -1,76 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n1033 [label="START", shape=box]; - n1033 -> n1075; - n1075 [label="21", shape=box]; - n1075 -> n1076; - n1076 [label="49", shape=box]; - n1076 -> n1077; - n1077 [label="CALL wrapper", shape=box, style=filled, color=orange]; - n1077 -> n1035; - n1035 [label="START wrapper(a, b)", shape=box, style=filled, color=green]; - n1035 -> n1070; - n1070 [label="0", shape=box]; - n1070 -> n1071; - n1071 [label="CALL ggt", shape=box, style=filled, color=orange]; - n1071 -> n1038; - n1038 [label="START ggt(noneSense)", shape=box, style=filled, color=green]; - n1038 -> n1041; - n1041 [label="a", shape=box]; - n1041 -> n1042; - n1042 [label="b", shape=box]; - n1042 -> n1043; - n1043 [label="a == b", shape=box]; - n1043 -> n1044; - n1044 [label="", shape=diamond]; - n1044 -> n1048 [label="T"]; - n1048 [label="a", shape=box]; - n1048 -> n1039; - n1039 [label="END ggt(noneSense)", shape=box, style=filled, color=green]; - n1039 -> n1073; - n1073 [label="RET ggt", shape=box, style=filled, color=orange]; - n1073 -> n1036; - n1036 [label="END wrapper(a, b)", shape=box, style=filled, color=green]; - n1036 -> n1062; - n1062 [label="RET wrapper", shape=box, style=filled, color=orange]; - n1062 -> n1039; - n1036 -> n1069; - n1069 [label="RET wrapper", shape=box, style=filled, color=orange]; - n1069 -> n1039; - n1036 -> n1079; - n1079 [label="RET wrapper", shape=box, style=filled, color=orange]; - n1044 -> n1049 [label="F"]; - n1049 [label="a", shape=box]; - n1049 -> n1050; - n1050 [label="b", shape=box]; - n1050 -> n1051; - n1051 [label="a > b", shape=box]; - n1051 -> n1052; - n1052 [label="", shape=diamond]; - n1052 -> n1056 [label="T"]; - n1056 [label="a", shape=box]; - n1056 -> n1057; - n1057 [label="b", shape=box]; - n1057 -> n1058; - n1058 [label="a - b", shape=box]; - n1058 -> n1059; - n1059 [label="b", shape=box]; - n1059 -> n1060; - n1060 [label="CALL wrapper", shape=box, style=filled, color=orange]; - n1060 -> n1035; - n1060 -> n1062; - n1052 -> n1063 [label="F"]; - n1063 [label="b", shape=box]; - n1063 -> n1064; - n1064 [label="a", shape=box]; - n1064 -> n1065; - n1065 [label="b - a", shape=box]; - n1065 -> n1066; - n1066 [label="a", shape=box]; - n1066 -> n1067; - n1067 [label="CALL wrapper", shape=box, style=filled, color=orange]; - n1067 -> n1035; - n1067 -> n1069; - n1071 -> n1073; - n1077 -> n1079; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/after/wrapper_cfg_after.dot b/Project-02-03-04/mistraltests/after/wrapper_cfg_after.dot deleted file mode 100644 index 768ee06..0000000 --- a/Project-02-03-04/mistraltests/after/wrapper_cfg_after.dot +++ /dev/null @@ -1,49 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n1081 [label="START", shape=box]; - n1081 -> n1107; - n1107 [label="4", shape=box]; - n1107 -> n1108; - n1108 [label="10", shape=box]; - n1108 -> n1109; - n1109 [label="CALL wrapper", shape=box, style=filled, color=orange]; - n1109 -> n1083; - n1083 [label="START wrapper(number, threshold)", shape=box, style=filled, color=green]; - n1083 -> n1102; - n1102 [label="number", shape=box]; - n1102 -> n1103; - n1103 [label="CALL square", shape=box, style=filled, color=orange]; - n1103 -> n1086; - n1086 [label="START square(x)", shape=box, style=filled, color=green]; - n1086 -> n1089; - n1089 [label="x", shape=box]; - n1089 -> n1090; - n1090 [label="x", shape=box]; - n1090 -> n1091; - n1091 [label="x * x", shape=box]; - n1091 -> n1092; - n1092 [label="threshold", shape=box]; - n1092 -> n1093; - n1093 [label="(x * x) > threshold", shape=box]; - n1093 -> n1094; - n1094 [label="", shape=diamond]; - n1094 -> n1098 [label="T"]; - n1098 [label="x", shape=box]; - n1098 -> n1087; - n1087 [label="END square(x)", shape=box, style=filled, color=green]; - n1087 -> n1105; - n1105 [label="RET square", shape=box, style=filled, color=orange]; - n1105 -> n1084; - n1084 [label="END wrapper(number, threshold)", shape=box, style=filled, color=green]; - n1084 -> n1111; - n1111 [label="RET wrapper", shape=box, style=filled, color=orange]; - n1094 -> n1099 [label="F"]; - n1099 [label="x", shape=box]; - n1099 -> n1100; - n1100 [label="x", shape=box]; - n1100 -> n1101; - n1101 [label="x * x", shape=box]; - n1101 -> n1087; - n1103 -> n1105; - n1109 -> n1111; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/argsParamsExample_cfg_before.dot b/Project-02-03-04/mistraltests/before/argsParamsExample_cfg_before.dot deleted file mode 100644 index cd1446c..0000000 --- a/Project-02-03-04/mistraltests/before/argsParamsExample_cfg_before.dot +++ /dev/null @@ -1,19 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n7 [label="1", shape=box]; - n7 -> n8; - n8 [label="2", shape=box]; - n8 -> n9; - n9 [label="3", shape=box]; - n9 -> n10; - n10 [label="CALL a", shape=box, style=filled, color=orange]; - n10 -> n3; - n3 [label="START a(x, y, z)", shape=box, style=filled, color=green]; - n3 -> n6; - n6 [label="x", shape=box]; - n6 -> n4; - n4 [label="END a(x, y, z)", shape=box, style=filled, color=green]; - n4 -> n12; - n12 [label="RET a", shape=box, style=filled, color=orange]; - n10 -> n12; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/complex_cfg_before.dot b/Project-02-03-04/mistraltests/before/complex_cfg_before.dot deleted file mode 100644 index 0d795b3..0000000 --- a/Project-02-03-04/mistraltests/before/complex_cfg_before.dot +++ /dev/null @@ -1,123 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n65 [label="10", shape=box]; - n65 -> n66; - n66 [label="CALL f1", shape=box, style=filled, color=orange]; - n66 -> n16; - n16 [label="START f1(b)", shape=box, style=filled, color=green]; - n16 -> n21; - n21 [label="b", shape=box]; - n21 -> n22; - n22 [label="0", shape=box]; - n22 -> n23; - n23 [label="b == 0", shape=box]; - n23 -> n24; - n24 [label="", shape=diamond]; - n24 -> n28 [label="T"]; - n28 [label="0", shape=box]; - n28 -> n17; - n17 [label="END f1(b)", shape=box, style=filled, color=green]; - n17 -> n34; - n34 [label="RET f1", shape=box, style=filled, color=orange]; - n34 -> n17; - n17 -> n45; - n45 [label="RET f1", shape=box, style=filled, color=orange]; - n45 -> n58; - n58 [label="a", shape=box]; - n58 -> n59; - n59 [label="b", shape=box]; - n59 -> n60; - n60 [label="a * b", shape=box]; - n60 -> n61; - n61 [label="CALL g", shape=box, style=filled, color=orange]; - n61 -> n50; - n50 [label="START g(c)", shape=box, style=filled, color=green]; - n50 -> n53; - n53 [label="a", shape=box]; - n53 -> n54; - n54 [label="b", shape=box]; - n54 -> n55; - n55 [label="a * b", shape=box]; - n55 -> n56; - n56 [label="c", shape=box]; - n56 -> n57; - n57 [label="(a * b) * c", shape=box]; - n57 -> n51; - n51 [label="END g(c)", shape=box, style=filled, color=green]; - n51 -> n63; - n63 [label="RET g", shape=box, style=filled, color=orange]; - n63 -> n19; - n19 [label="END f2(a, b)", shape=box, style=filled, color=green]; - n19 -> n91; - n91 [label="RET f2", shape=box, style=filled, color=orange]; - n61 -> n63; - n17 -> n49; - n49 [label="RET f1", shape=box, style=filled, color=orange]; - n49 -> n58; - n17 -> n68; - n68 [label="RET f1", shape=box, style=filled, color=orange]; - n68 -> n70; - n70 [label="10", shape=box]; - n70 -> n83; - n83 [label="20", shape=box]; - n83 -> n84; - n84 [label="30", shape=box]; - n84 -> n85; - n85 [label="CALL max", shape=box, style=filled, color=orange]; - n85 -> n71; - n71 [label="START max(a, b)", shape=box, style=filled, color=green]; - n71 -> n74; - n74 [label="a", shape=box]; - n74 -> n75; - n75 [label="b", shape=box]; - n75 -> n76; - n76 [label="a > b", shape=box]; - n76 -> n77; - n77 [label="", shape=diamond]; - n77 -> n81 [label="T"]; - n81 [label="a", shape=box]; - n81 -> n72; - n72 [label="END max(a, b)", shape=box, style=filled, color=green]; - n72 -> n87; - n87 [label="RET max", shape=box, style=filled, color=orange]; - n87 -> n89; - n89 [label="CALL f2", shape=box, style=filled, color=orange]; - n89 -> n18; - n18 [label="START f2(a, b)", shape=box, style=filled, color=green]; - n18 -> n35; - n35 [label="a", shape=box]; - n35 -> n36; - n36 [label="b", shape=box]; - n36 -> n37; - n37 [label="a > b", shape=box]; - n37 -> n38; - n38 [label="", shape=diamond]; - n38 -> n42 [label="T"]; - n42 [label="a", shape=box]; - n42 -> n43; - n43 [label="CALL f1", shape=box, style=filled, color=orange]; - n43 -> n16; - n43 -> n45; - n38 -> n46 [label="F"]; - n46 [label="b", shape=box]; - n46 -> n47; - n47 [label="CALL f1", shape=box, style=filled, color=orange]; - n47 -> n16; - n47 -> n49; - n89 -> n91; - n77 -> n82 [label="F"]; - n82 [label="b", shape=box]; - n82 -> n72; - n85 -> n87; - n24 -> n29 [label="F"]; - n29 [label="b", shape=box]; - n29 -> n30; - n30 [label="1", shape=box]; - n30 -> n31; - n31 [label="b - 1", shape=box]; - n31 -> n32; - n32 [label="CALL f1", shape=box, style=filled, color=orange]; - n32 -> n16; - n32 -> n34; - n66 -> n68; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/condition_cfg_before.dot b/Project-02-03-04/mistraltests/before/condition_cfg_before.dot deleted file mode 100644 index bde78d7..0000000 --- a/Project-02-03-04/mistraltests/before/condition_cfg_before.dot +++ /dev/null @@ -1,22 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n94 [label="2", shape=box]; - n94 -> n95; - n95 [label="x", shape=box]; - n95 -> n96; - n96 [label="2 < x", shape=box]; - n96 -> n97; - n97 [label="x", shape=box]; - n97 -> n98; - n98 [label="9", shape=box]; - n98 -> n99; - n99 [label="x > 9", shape=box]; - n99 -> n100; - n100 [label="(2 < x) && (x > 9)", shape=box]; - n100 -> n101; - n101 [label="", shape=diamond]; - n101 -> n105 [label="T"]; - n105 [label="1", shape=box]; - n101 -> n106 [label="F"]; - n106 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/defSemiExample_cfg_before.dot b/Project-02-03-04/mistraltests/before/defSemiExample_cfg_before.dot deleted file mode 100644 index ee8067f..0000000 --- a/Project-02-03-04/mistraltests/before/defSemiExample_cfg_before.dot +++ /dev/null @@ -1,41 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n119 [label="1", shape=box]; - n119 -> n120; - n120 [label="CALL a", shape=box, style=filled, color=orange]; - n120 -> n109; - n109 [label="START a(x)", shape=box, style=filled, color=green]; - n109 -> n116; - n116 [label="x", shape=box]; - n116 -> n110; - n110 [label="END a(x)", shape=box, style=filled, color=green]; - n110 -> n122; - n122 [label="RET a", shape=box, style=filled, color=orange]; - n122 -> n124; - n124 [label="2", shape=box]; - n124 -> n125; - n125 [label="CALL b", shape=box, style=filled, color=orange]; - n125 -> n111; - n111 [label="START b(y)", shape=box, style=filled, color=green]; - n111 -> n117; - n117 [label="y", shape=box]; - n117 -> n112; - n112 [label="END b(y)", shape=box, style=filled, color=green]; - n112 -> n127; - n127 [label="RET b", shape=box, style=filled, color=orange]; - n127 -> n128; - n128 [label="3", shape=box]; - n128 -> n129; - n129 [label="CALL c", shape=box, style=filled, color=orange]; - n129 -> n113; - n113 [label="START c(z)", shape=box, style=filled, color=green]; - n113 -> n118; - n118 [label="z", shape=box]; - n118 -> n114; - n114 [label="END c(z)", shape=box, style=filled, color=green]; - n114 -> n131; - n131 [label="RET c", shape=box, style=filled, color=orange]; - n129 -> n131; - n125 -> n127; - n120 -> n122; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/example_cfg_before.dot b/Project-02-03-04/mistraltests/before/example_cfg_before.dot deleted file mode 100644 index 66d71b9..0000000 --- a/Project-02-03-04/mistraltests/before/example_cfg_before.dot +++ /dev/null @@ -1,66 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n167 [label="2", shape=box]; - n167 -> n168; - n168 [label="3", shape=box]; - n168 -> n169; - n169 [label="CALL f", shape=box, style=filled, color=orange]; - n169 -> n134; - n134 [label="START f(x, y, z)", shape=box, style=filled, color=green]; - n134 -> n137; - n137 [label="2", shape=box]; - n137 -> n138; - n138 [label="y = 2", shape=box]; - n138 -> n139; - n139 [label="3", shape=box]; - n139 -> n140; - n140 [label="z = 3", shape=box]; - n140 -> n160; - n160 [label="x", shape=box]; - n160 -> n161; - n161 [label="CALL g", shape=box, style=filled, color=orange]; - n161 -> n141; - n141 [label="START g(x)", shape=box, style=filled, color=green]; - n141 -> n144; - n144 [label="7", shape=box]; - n144 -> n145; - n145 [label="x = 7", shape=box]; - n145 -> n146; - n146 [label="y", shape=box]; - n146 -> n147; - n147 [label="0", shape=box]; - n147 -> n148; - n148 [label="y > 0", shape=box]; - n148 -> n149; - n149 [label="", shape=diamond]; - n149 -> n153 [label="T"]; - n153 [label="y", shape=box]; - n153 -> n154; - n154 [label="CALL g", shape=box, style=filled, color=orange]; - n154 -> n141; - n154 -> n156; - n156 [label="RET g", shape=box, style=filled, color=orange]; - n156 -> n159; - n159 [label="x", shape=box]; - n159 -> n142; - n142 [label="END g(x)", shape=box, style=filled, color=green]; - n142 -> n156; - n142 -> n163; - n163 [label="RET g", shape=box, style=filled, color=orange]; - n163 -> n164; - n164 [label="x", shape=box]; - n164 -> n165; - n165 [label="g(x) + x", shape=box]; - n165 -> n135; - n135 [label="END f(x, y, z)", shape=box, style=filled, color=green]; - n135 -> n171; - n171 [label="RET f", shape=box, style=filled, color=orange]; - n165 -> n135; - n149 -> n157 [label="F"]; - n157 [label="8", shape=box]; - n157 -> n158; - n158 [label="x = 8", shape=box]; - n158 -> n159; - n161 -> n163; - n169 -> n171; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/factorial_cfg_before.dot b/Project-02-03-04/mistraltests/before/factorial_cfg_before.dot deleted file mode 100644 index 0aeb4d9..0000000 --- a/Project-02-03-04/mistraltests/before/factorial_cfg_before.dot +++ /dev/null @@ -1,264 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n338 [label="3", shape=box]; - n338 -> n339; - n339 [label="CALL fac", shape=box, style=filled, color=orange]; - n339 -> n191; - n191 [label="START fac(x)", shape=box, style=filled, color=green]; - n191 -> n194; - n194 [label="x", shape=box]; - n194 -> n195; - n195 [label="1", shape=box]; - n195 -> n196; - n196 [label="x == 1", shape=box]; - n196 -> n197; - n197 [label="", shape=diamond]; - n197 -> n201 [label="T"]; - n201 [label="1", shape=box]; - n201 -> n192; - n192 [label="END fac(x)", shape=box, style=filled, color=green]; - n192 -> n207; - n207 [label="RET fac", shape=box, style=filled, color=orange]; - n207 -> n208; - n208 [label="x", shape=box]; - n208 -> n209; - n209 [label="fac((x - 1)) * x", shape=box]; - n209 -> n192; - n192 -> n223; - n223 [label="RET fac", shape=box, style=filled, color=orange]; - n223 -> n224; - n224 [label="x", shape=box]; - n224 -> n225; - n225 [label="fac((x - 1)) * x", shape=box]; - n225 -> n192; - n192 -> n239; - n239 [label="RET fac", shape=box, style=filled, color=orange]; - n239 -> n240; - n240 [label="x", shape=box]; - n240 -> n241; - n241 [label="fac((x - 1)) * x", shape=box]; - n241 -> n192; - n192 -> n255; - n255 [label="RET fac", shape=box, style=filled, color=orange]; - n255 -> n256; - n256 [label="x", shape=box]; - n256 -> n257; - n257 [label="fac((x - 1)) * x", shape=box]; - n257 -> n192; - n192 -> n271; - n271 [label="RET fac", shape=box, style=filled, color=orange]; - n271 -> n272; - n272 [label="x", shape=box]; - n272 -> n273; - n273 [label="fac((x - 1)) * x", shape=box]; - n273 -> n192; - n192 -> n287; - n287 [label="RET fac", shape=box, style=filled, color=orange]; - n287 -> n288; - n288 [label="x", shape=box]; - n288 -> n289; - n289 [label="fac((x - 1)) * x", shape=box]; - n289 -> n192; - n192 -> n303; - n303 [label="RET fac", shape=box, style=filled, color=orange]; - n303 -> n304; - n304 [label="x", shape=box]; - n304 -> n305; - n305 [label="fac((x - 1)) * x", shape=box]; - n305 -> n192; - n192 -> n319; - n319 [label="RET fac", shape=box, style=filled, color=orange]; - n319 -> n320; - n320 [label="x", shape=box]; - n320 -> n321; - n321 [label="fac((x - 1)) * x", shape=box]; - n321 -> n192; - n192 -> n335; - n335 [label="RET fac", shape=box, style=filled, color=orange]; - n335 -> n336; - n336 [label="x", shape=box]; - n336 -> n337; - n337 [label="fac((x - 1)) * x", shape=box]; - n337 -> n192; - n192 -> n341; - n341 [label="RET fac", shape=box, style=filled, color=orange]; - n197 -> n202 [label="F"]; - n202 [label="x", shape=box]; - n202 -> n203; - n203 [label="1", shape=box]; - n203 -> n204; - n204 [label="x - 1", shape=box]; - n204 -> n205; - n205 [label="CALL fac", shape=box, style=filled, color=orange]; - n205 -> n191; - n205 -> n207; - n191 -> n210; - n210 [label="x", shape=box]; - n210 -> n211; - n211 [label="1", shape=box]; - n211 -> n212; - n212 [label="x == 1", shape=box]; - n212 -> n213; - n213 [label="", shape=diamond]; - n213 -> n217 [label="T"]; - n217 [label="1", shape=box]; - n217 -> n192; - n213 -> n218 [label="F"]; - n218 [label="x", shape=box]; - n218 -> n219; - n219 [label="1", shape=box]; - n219 -> n220; - n220 [label="x - 1", shape=box]; - n220 -> n221; - n221 [label="CALL fac", shape=box, style=filled, color=orange]; - n221 -> n191; - n221 -> n223; - n191 -> n226; - n226 [label="x", shape=box]; - n226 -> n227; - n227 [label="1", shape=box]; - n227 -> n228; - n228 [label="x == 1", shape=box]; - n228 -> n229; - n229 [label="", shape=diamond]; - n229 -> n233 [label="T"]; - n233 [label="1", shape=box]; - n233 -> n192; - n229 -> n234 [label="F"]; - n234 [label="x", shape=box]; - n234 -> n235; - n235 [label="1", shape=box]; - n235 -> n236; - n236 [label="x - 1", shape=box]; - n236 -> n237; - n237 [label="CALL fac", shape=box, style=filled, color=orange]; - n237 -> n191; - n237 -> n239; - n191 -> n242; - n242 [label="x", shape=box]; - n242 -> n243; - n243 [label="1", shape=box]; - n243 -> n244; - n244 [label="x == 1", shape=box]; - n244 -> n245; - n245 [label="", shape=diamond]; - n245 -> n249 [label="T"]; - n249 [label="1", shape=box]; - n249 -> n192; - n245 -> n250 [label="F"]; - n250 [label="x", shape=box]; - n250 -> n251; - n251 [label="1", shape=box]; - n251 -> n252; - n252 [label="x - 1", shape=box]; - n252 -> n253; - n253 [label="CALL fac", shape=box, style=filled, color=orange]; - n253 -> n191; - n253 -> n255; - n191 -> n258; - n258 [label="x", shape=box]; - n258 -> n259; - n259 [label="1", shape=box]; - n259 -> n260; - n260 [label="x == 1", shape=box]; - n260 -> n261; - n261 [label="", shape=diamond]; - n261 -> n265 [label="T"]; - n265 [label="1", shape=box]; - n265 -> n192; - n261 -> n266 [label="F"]; - n266 [label="x", shape=box]; - n266 -> n267; - n267 [label="1", shape=box]; - n267 -> n268; - n268 [label="x - 1", shape=box]; - n268 -> n269; - n269 [label="CALL fac", shape=box, style=filled, color=orange]; - n269 -> n191; - n269 -> n271; - n191 -> n274; - n274 [label="x", shape=box]; - n274 -> n275; - n275 [label="1", shape=box]; - n275 -> n276; - n276 [label="x == 1", shape=box]; - n276 -> n277; - n277 [label="", shape=diamond]; - n277 -> n281 [label="T"]; - n281 [label="1", shape=box]; - n281 -> n192; - n277 -> n282 [label="F"]; - n282 [label="x", shape=box]; - n282 -> n283; - n283 [label="1", shape=box]; - n283 -> n284; - n284 [label="x - 1", shape=box]; - n284 -> n285; - n285 [label="CALL fac", shape=box, style=filled, color=orange]; - n285 -> n191; - n285 -> n287; - n191 -> n290; - n290 [label="x", shape=box]; - n290 -> n291; - n291 [label="1", shape=box]; - n291 -> n292; - n292 [label="x == 1", shape=box]; - n292 -> n293; - n293 [label="", shape=diamond]; - n293 -> n297 [label="T"]; - n297 [label="1", shape=box]; - n297 -> n192; - n293 -> n298 [label="F"]; - n298 [label="x", shape=box]; - n298 -> n299; - n299 [label="1", shape=box]; - n299 -> n300; - n300 [label="x - 1", shape=box]; - n300 -> n301; - n301 [label="CALL fac", shape=box, style=filled, color=orange]; - n301 -> n191; - n301 -> n303; - n191 -> n306; - n306 [label="x", shape=box]; - n306 -> n307; - n307 [label="1", shape=box]; - n307 -> n308; - n308 [label="x == 1", shape=box]; - n308 -> n309; - n309 [label="", shape=diamond]; - n309 -> n313 [label="T"]; - n313 [label="1", shape=box]; - n313 -> n192; - n309 -> n314 [label="F"]; - n314 [label="x", shape=box]; - n314 -> n315; - n315 [label="1", shape=box]; - n315 -> n316; - n316 [label="x - 1", shape=box]; - n316 -> n317; - n317 [label="CALL fac", shape=box, style=filled, color=orange]; - n317 -> n191; - n317 -> n319; - n191 -> n322; - n322 [label="x", shape=box]; - n322 -> n323; - n323 [label="1", shape=box]; - n323 -> n324; - n324 [label="x == 1", shape=box]; - n324 -> n325; - n325 [label="", shape=diamond]; - n325 -> n329 [label="T"]; - n329 [label="1", shape=box]; - n329 -> n192; - n325 -> n330 [label="F"]; - n330 [label="x", shape=box]; - n330 -> n331; - n331 [label="1", shape=box]; - n331 -> n332; - n332 [label="x - 1", shape=box]; - n332 -> n333; - n333 [label="CALL fac", shape=box, style=filled, color=orange]; - n333 -> n191; - n333 -> n335; - n339 -> n341; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/faulty_if_cfg_before.dot b/Project-02-03-04/mistraltests/before/faulty_if_cfg_before.dot deleted file mode 100644 index f7f9a82..0000000 --- a/Project-02-03-04/mistraltests/before/faulty_if_cfg_before.dot +++ /dev/null @@ -1,4 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n358 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/func_cfg_before.dot b/Project-02-03-04/mistraltests/before/func_cfg_before.dot deleted file mode 100644 index 11ffd24..0000000 --- a/Project-02-03-04/mistraltests/before/func_cfg_before.dot +++ /dev/null @@ -1,48 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n382 [label="10", shape=box]; - n382 -> n383; - n383 [label="8", shape=box]; - n383 -> n384; - n384 [label="CALL func", shape=box, style=filled, color=orange]; - n384 -> n361; - n361 [label="START func(a, b)", shape=box, style=filled, color=green]; - n361 -> n364; - n364 [label="a", shape=box]; - n364 -> n365; - n365 [label="0", shape=box]; - n365 -> n366; - n366 [label="a > 0", shape=box]; - n366 -> n367; - n367 [label="b", shape=box]; - n367 -> n368; - n368 [label="a", shape=box]; - n368 -> n369; - n369 [label="b != a", shape=box]; - n369 -> n370; - n370 [label="(a > 0) && (b != a)", shape=box]; - n370 -> n371; - n371 [label="", shape=diamond]; - n371 -> n373 [label="T"]; - n373 [label="b", shape=box]; - n373 -> n374; - n374 [label="1", shape=box]; - n374 -> n375; - n375 [label="b + 1", shape=box]; - n375 -> n376; - n376 [label="b = (b + 1)", shape=box]; - n376 -> n377; - n377 [label="a", shape=box]; - n377 -> n378; - n378 [label="1", shape=box]; - n378 -> n379; - n379 [label="a - 1", shape=box]; - n379 -> n380; - n380 [label="a = (a - 1)", shape=box]; - n380 -> n366; - n371 -> n362 [label="F"]; - n362 [label="END func(a, b)", shape=box, style=filled, color=green]; - n362 -> n386; - n386 [label="RET func", shape=box, style=filled, color=orange]; - n384 -> n386; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/geq_cfg_before.dot b/Project-02-03-04/mistraltests/before/geq_cfg_before.dot deleted file mode 100644 index 20d9ff9..0000000 --- a/Project-02-03-04/mistraltests/before/geq_cfg_before.dot +++ /dev/null @@ -1,14 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n390 [label="1", shape=box]; - n390 -> n391; - n391 [label="0", shape=box]; - n391 -> n392; - n392 [label="1 >= 0", shape=box]; - n392 -> n393; - n393 [label="", shape=diamond]; - n393 -> n397 [label="T"]; - n397 [label="1", shape=box]; - n393 -> n398 [label="F"]; - n398 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/ggT_euclid_rec_cfg_before.dot b/Project-02-03-04/mistraltests/before/ggT_euclid_rec_cfg_before.dot deleted file mode 100644 index 2aec34e..0000000 --- a/Project-02-03-04/mistraltests/before/ggT_euclid_rec_cfg_before.dot +++ /dev/null @@ -1,63 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n439 [label="3528", shape=box]; - n439 -> n440; - n440 [label="3780", shape=box]; - n440 -> n441; - n441 [label="CALL ggT", shape=box, style=filled, color=orange]; - n441 -> n407; - n407 [label="START ggT(a, b)", shape=box, style=filled, color=green]; - n407 -> n410; - n410 [label="a", shape=box]; - n410 -> n411; - n411 [label="b", shape=box]; - n411 -> n412; - n412 [label="a == b", shape=box]; - n412 -> n413; - n413 [label="", shape=diamond]; - n413 -> n417 [label="T"]; - n417 [label="a", shape=box]; - n417 -> n408; - n408 [label="END ggT(a, b)", shape=box, style=filled, color=green]; - n408 -> n431; - n431 [label="RET ggT", shape=box, style=filled, color=orange]; - n431 -> n408; - n408 -> n438; - n438 [label="RET ggT", shape=box, style=filled, color=orange]; - n438 -> n408; - n408 -> n443; - n443 [label="RET ggT", shape=box, style=filled, color=orange]; - n413 -> n418 [label="F"]; - n418 [label="a", shape=box]; - n418 -> n419; - n419 [label="b", shape=box]; - n419 -> n420; - n420 [label="a > b", shape=box]; - n420 -> n421; - n421 [label="", shape=diamond]; - n421 -> n425 [label="T"]; - n425 [label="a", shape=box]; - n425 -> n426; - n426 [label="b", shape=box]; - n426 -> n427; - n427 [label="a - b", shape=box]; - n427 -> n428; - n428 [label="b", shape=box]; - n428 -> n429; - n429 [label="CALL ggT", shape=box, style=filled, color=orange]; - n429 -> n407; - n429 -> n431; - n421 -> n432 [label="F"]; - n432 [label="b", shape=box]; - n432 -> n433; - n433 [label="a", shape=box]; - n433 -> n434; - n434 [label="b - a", shape=box]; - n434 -> n435; - n435 [label="a", shape=box]; - n435 -> n436; - n436 [label="CALL ggT", shape=box, style=filled, color=orange]; - n436 -> n407; - n436 -> n438; - n441 -> n443; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/homework_cfg_before.dot b/Project-02-03-04/mistraltests/before/homework_cfg_before.dot deleted file mode 100644 index 7597a44..0000000 --- a/Project-02-03-04/mistraltests/before/homework_cfg_before.dot +++ /dev/null @@ -1,108 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n499 [label="1", shape=box]; - n499 -> n500; - n500 [label="2", shape=box]; - n500 -> n501; - n501 [label="CALL f", shape=box, style=filled, color=orange]; - n501 -> n447; - n447 [label="START f(x, y)", shape=box, style=filled, color=green]; - n447 -> n452; - n452 [label="x", shape=box]; - n452 -> n453; - n453 [label="0", shape=box]; - n453 -> n454; - n454 [label="x == 0", shape=box]; - n454 -> n455; - n455 [label="", shape=diamond]; - n455 -> n467 [label="T"]; - n467 [label="2", shape=box]; - n467 -> n468; - n468 [label="y", shape=box]; - n468 -> n469; - n469 [label="2 * y", shape=box]; - n469 -> n470; - n470 [label="x", shape=box]; - n470 -> n471; - n471 [label="CALL g", shape=box, style=filled, color=orange]; - n471 -> n459; - n459 [label="START g(x, z)", shape=box, style=filled, color=green]; - n459 -> n462; - n462 [label="x", shape=box]; - n462 -> n463; - n463 [label="y", shape=box]; - n463 -> n464; - n464 [label="x * y", shape=box]; - n464 -> n465; - n465 [label="z", shape=box]; - n465 -> n466; - n466 [label="(x * y) + z", shape=box]; - n466 -> n460; - n460 [label="END g(x, z)", shape=box, style=filled, color=green]; - n460 -> n473; - n473 [label="RET g", shape=box, style=filled, color=orange]; - n473 -> n448; - n448 [label="END f(x, y)", shape=box, style=filled, color=green]; - n448 -> n488; - n488 [label="RET f", shape=box, style=filled, color=orange]; - n488 -> n489; - n489 [label="a * f(a,i)", shape=box]; - n489 -> n490; - n490 [label="a = (a * f(a,i))", shape=box]; - n490 -> n491; - n491 [label="i", shape=box]; - n491 -> n492; - n492 [label="1", shape=box]; - n492 -> n493; - n493 [label="i - 1", shape=box]; - n493 -> n494; - n494 [label="i = (i - 1)", shape=box]; - n494 -> n478; - n478 [label="i", shape=box]; - n478 -> n479; - n479 [label="0", shape=box]; - n479 -> n480; - n480 [label="i > 0", shape=box]; - n480 -> n481; - n481 [label="", shape=diamond]; - n481 -> n483 [label="T"]; - n483 [label="a", shape=box]; - n483 -> n484; - n484 [label="a", shape=box]; - n484 -> n485; - n485 [label="i", shape=box]; - n485 -> n486; - n486 [label="CALL f", shape=box, style=filled, color=orange]; - n486 -> n447; - n486 -> n488; - n481 -> n496 [label="F"]; - n496 [label="a", shape=box]; - n496 -> n497; - n497 [label="42", shape=box]; - n497 -> n498; - n498 [label="a + 42", shape=box]; - n498 -> n460; - n448 -> n503; - n503 [label="RET f", shape=box, style=filled, color=orange]; - n503 -> n505; - n505 [label="3", shape=box]; - n505 -> n506; - n506 [label="3", shape=box]; - n506 -> n507; - n507 [label="CALL g", shape=box, style=filled, color=orange]; - n507 -> n459; - n507 -> n509; - n509 [label="RET g", shape=box, style=filled, color=orange]; - n473 -> n448; - n460 -> n509; - n459 -> n478; - n471 -> n473; - n455 -> n475 [label="F"]; - n475 [label="x", shape=box]; - n475 -> n476; - n476 [label="1", shape=box]; - n476 -> n477; - n477 [label="x + 1", shape=box]; - n477 -> n448; - n501 -> n503; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/multiple-let-with-same-func-name_cfg_before.dot b/Project-02-03-04/mistraltests/before/multiple-let-with-same-func-name_cfg_before.dot deleted file mode 100644 index 2721f8f..0000000 --- a/Project-02-03-04/mistraltests/before/multiple-let-with-same-func-name_cfg_before.dot +++ /dev/null @@ -1,32 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n518 [label="5", shape=box]; - n518 -> n519; - n519 [label="CALL m", shape=box, style=filled, color=orange]; - n519 -> n514; - n514 [label="START m(a)", shape=box, style=filled, color=green]; - n514 -> n517; - n517 [label="a", shape=box]; - n517 -> n515; - n515 [label="END m(a)", shape=box, style=filled, color=green]; - n515 -> n521; - n521 [label="RET m", shape=box, style=filled, color=orange]; - n521 -> n529; - n529 [label="5", shape=box]; - n529 -> n530; - n530 [label="CALL m", shape=box, style=filled, color=orange]; - n530 -> n523; - n523 [label="START m(b)", shape=box, style=filled, color=green]; - n523 -> n526; - n526 [label="b", shape=box]; - n526 -> n527; - n527 [label="1", shape=box]; - n527 -> n528; - n528 [label="b + 1", shape=box]; - n528 -> n524; - n524 [label="END m(b)", shape=box, style=filled, color=green]; - n524 -> n532; - n532 [label="RET m", shape=box, style=filled, color=orange]; - n530 -> n532; - n519 -> n521; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/multiple-let_cfg_before.dot b/Project-02-03-04/mistraltests/before/multiple-let_cfg_before.dot deleted file mode 100644 index f9fa565..0000000 --- a/Project-02-03-04/mistraltests/before/multiple-let_cfg_before.dot +++ /dev/null @@ -1,42 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n540 [label="5", shape=box]; - n540 -> n541; - n541 [label="CALL n", shape=box, style=filled, color=orange]; - n541 -> n536; - n536 [label="START n(a)", shape=box, style=filled, color=green]; - n536 -> n539; - n539 [label="a", shape=box]; - n539 -> n537; - n537 [label="END n(a)", shape=box, style=filled, color=green]; - n537 -> n543; - n543 [label="RET n", shape=box, style=filled, color=orange]; - n543 -> n551; - n551 [label="5", shape=box]; - n551 -> n552; - n552 [label="CALL n", shape=box, style=filled, color=orange]; - n552 -> n536; - n552 -> n554; - n554 [label="RET n", shape=box, style=filled, color=orange]; - n554 -> n555; - n555 [label="5", shape=box]; - n555 -> n556; - n556 [label="CALL m", shape=box, style=filled, color=orange]; - n556 -> n545; - n545 [label="START m(a)", shape=box, style=filled, color=green]; - n545 -> n548; - n548 [label="a", shape=box]; - n548 -> n549; - n549 [label="1", shape=box]; - n549 -> n550; - n550 [label="a + 1", shape=box]; - n550 -> n546; - n546 [label="END m(a)", shape=box, style=filled, color=green]; - n546 -> n558; - n558 [label="RET m", shape=box, style=filled, color=orange]; - n558 -> n559; - n559 [label="n(5) + m(5)", shape=box]; - n556 -> n558; - n537 -> n554; - n541 -> n543; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/or_cfg_before.dot b/Project-02-03-04/mistraltests/before/or_cfg_before.dot deleted file mode 100644 index fdb47a7..0000000 --- a/Project-02-03-04/mistraltests/before/or_cfg_before.dot +++ /dev/null @@ -1,18 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n563 [label="True", shape=box]; - n563 -> n564; - n564 [label="True", shape=box]; - n564 -> n565; - n565 [label="True", shape=box]; - n565 -> n566; - n566 [label="True == True", shape=box]; - n566 -> n567; - n567 [label="True || (True == True)", shape=box]; - n567 -> n568; - n568 [label="", shape=diamond]; - n568 -> n572 [label="T"]; - n572 [label="1", shape=box]; - n568 -> n573 [label="F"]; - n573 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/p1_cfg_before.dot b/Project-02-03-04/mistraltests/before/p1_cfg_before.dot deleted file mode 100644 index 0d70588..0000000 --- a/Project-02-03-04/mistraltests/before/p1_cfg_before.dot +++ /dev/null @@ -1,19 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n582 [label="5", shape=box]; - n582 -> n583; - n583 [label="CALL g", shape=box, style=filled, color=orange]; - n583 -> n576; - n576 [label="START g(a)", shape=box, style=filled, color=green]; - n576 -> n579; - n579 [label="a", shape=box]; - n579 -> n580; - n580 [label="a", shape=box]; - n580 -> n581; - n581 [label="a * a", shape=box]; - n581 -> n577; - n577 [label="END g(a)", shape=box, style=filled, color=green]; - n577 -> n585; - n585 [label="RET g", shape=box, style=filled, color=orange]; - n583 -> n585; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/p2_cfg_before.dot b/Project-02-03-04/mistraltests/before/p2_cfg_before.dot deleted file mode 100644 index 8a13933..0000000 --- a/Project-02-03-04/mistraltests/before/p2_cfg_before.dot +++ /dev/null @@ -1,36 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n606 [label="10", shape=box]; - n606 -> n607; - n607 [label="CALL f1", shape=box, style=filled, color=orange]; - n607 -> n589; - n589 [label="START f1(b)", shape=box, style=filled, color=green]; - n589 -> n592; - n592 [label="b", shape=box]; - n592 -> n593; - n593 [label="0", shape=box]; - n593 -> n594; - n594 [label="b == 0", shape=box]; - n594 -> n595; - n595 [label="", shape=diamond]; - n595 -> n599 [label="T"]; - n599 [label="0", shape=box]; - n599 -> n590; - n590 [label="END f1(b)", shape=box, style=filled, color=green]; - n590 -> n605; - n605 [label="RET f1", shape=box, style=filled, color=orange]; - n605 -> n590; - n590 -> n609; - n609 [label="RET f1", shape=box, style=filled, color=orange]; - n595 -> n600 [label="F"]; - n600 [label="b", shape=box]; - n600 -> n601; - n601 [label="1", shape=box]; - n601 -> n602; - n602 [label="b - 1", shape=box]; - n602 -> n603; - n603 [label="CALL f1", shape=box, style=filled, color=orange]; - n603 -> n589; - n603 -> n605; - n607 -> n609; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/p3_cfg_before.dot b/Project-02-03-04/mistraltests/before/p3_cfg_before.dot deleted file mode 100644 index aca2b20..0000000 --- a/Project-02-03-04/mistraltests/before/p3_cfg_before.dot +++ /dev/null @@ -1,123 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n662 [label="10", shape=box]; - n662 -> n663; - n663 [label="CALL f1", shape=box, style=filled, color=orange]; - n663 -> n613; - n613 [label="START f1(b)", shape=box, style=filled, color=green]; - n613 -> n618; - n618 [label="b", shape=box]; - n618 -> n619; - n619 [label="0", shape=box]; - n619 -> n620; - n620 [label="b == 0", shape=box]; - n620 -> n621; - n621 [label="", shape=diamond]; - n621 -> n625 [label="T"]; - n625 [label="0", shape=box]; - n625 -> n614; - n614 [label="END f1(b)", shape=box, style=filled, color=green]; - n614 -> n631; - n631 [label="RET f1", shape=box, style=filled, color=orange]; - n631 -> n614; - n614 -> n642; - n642 [label="RET f1", shape=box, style=filled, color=orange]; - n642 -> n655; - n655 [label="a", shape=box]; - n655 -> n656; - n656 [label="b", shape=box]; - n656 -> n657; - n657 [label="a * b", shape=box]; - n657 -> n658; - n658 [label="CALL g", shape=box, style=filled, color=orange]; - n658 -> n647; - n647 [label="START g(c)", shape=box, style=filled, color=green]; - n647 -> n650; - n650 [label="a", shape=box]; - n650 -> n651; - n651 [label="b", shape=box]; - n651 -> n652; - n652 [label="a * b", shape=box]; - n652 -> n653; - n653 [label="c", shape=box]; - n653 -> n654; - n654 [label="(a * b) * c", shape=box]; - n654 -> n648; - n648 [label="END g(c)", shape=box, style=filled, color=green]; - n648 -> n660; - n660 [label="RET g", shape=box, style=filled, color=orange]; - n660 -> n616; - n616 [label="END f2(a, b)", shape=box, style=filled, color=green]; - n616 -> n688; - n688 [label="RET f2", shape=box, style=filled, color=orange]; - n658 -> n660; - n614 -> n646; - n646 [label="RET f1", shape=box, style=filled, color=orange]; - n646 -> n655; - n614 -> n665; - n665 [label="RET f1", shape=box, style=filled, color=orange]; - n665 -> n667; - n667 [label="10", shape=box]; - n667 -> n680; - n680 [label="20", shape=box]; - n680 -> n681; - n681 [label="30", shape=box]; - n681 -> n682; - n682 [label="CALL max", shape=box, style=filled, color=orange]; - n682 -> n668; - n668 [label="START max(a, b)", shape=box, style=filled, color=green]; - n668 -> n671; - n671 [label="a", shape=box]; - n671 -> n672; - n672 [label="b", shape=box]; - n672 -> n673; - n673 [label="a > b", shape=box]; - n673 -> n674; - n674 [label="", shape=diamond]; - n674 -> n678 [label="T"]; - n678 [label="a", shape=box]; - n678 -> n669; - n669 [label="END max(a, b)", shape=box, style=filled, color=green]; - n669 -> n684; - n684 [label="RET max", shape=box, style=filled, color=orange]; - n684 -> n686; - n686 [label="CALL f2", shape=box, style=filled, color=orange]; - n686 -> n615; - n615 [label="START f2(a, b)", shape=box, style=filled, color=green]; - n615 -> n632; - n632 [label="a", shape=box]; - n632 -> n633; - n633 [label="b", shape=box]; - n633 -> n634; - n634 [label="a > b", shape=box]; - n634 -> n635; - n635 [label="", shape=diamond]; - n635 -> n639 [label="T"]; - n639 [label="a", shape=box]; - n639 -> n640; - n640 [label="CALL f1", shape=box, style=filled, color=orange]; - n640 -> n613; - n640 -> n642; - n635 -> n643 [label="F"]; - n643 [label="b", shape=box]; - n643 -> n644; - n644 [label="CALL f1", shape=box, style=filled, color=orange]; - n644 -> n613; - n644 -> n646; - n686 -> n688; - n674 -> n679 [label="F"]; - n679 [label="b", shape=box]; - n679 -> n669; - n682 -> n684; - n621 -> n626 [label="F"]; - n626 [label="b", shape=box]; - n626 -> n627; - n627 [label="1", shape=box]; - n627 -> n628; - n628 [label="b - 1", shape=box]; - n628 -> n629; - n629 [label="CALL f1", shape=box, style=filled, color=orange]; - n629 -> n613; - n629 -> n631; - n663 -> n665; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/p4_cfg_before.dot b/Project-02-03-04/mistraltests/before/p4_cfg_before.dot deleted file mode 100644 index 7b0bba4..0000000 --- a/Project-02-03-04/mistraltests/before/p4_cfg_before.dot +++ /dev/null @@ -1,23 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n698 [label="10", shape=box]; - n698 -> n699; - n699 [label="8", shape=box]; - n699 -> n700; - n700 [label="CALL func", shape=box, style=filled, color=orange]; - n700 -> n691; - n691 [label="START func(a, b)", shape=box, style=filled, color=green]; - n691 -> n694; - n694 [label="b", shape=box]; - n694 -> n695; - n695 [label="1", shape=box]; - n695 -> n696; - n696 [label="b + 1", shape=box]; - n696 -> n697; - n697 [label="a = (b + 1)", shape=box]; - n697 -> n692; - n692 [label="END func(a, b)", shape=box, style=filled, color=green]; - n692 -> n702; - n702 [label="RET func", shape=box, style=filled, color=orange]; - n700 -> n702; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/p6_cfg_before.dot b/Project-02-03-04/mistraltests/before/p6_cfg_before.dot deleted file mode 100644 index 47befda..0000000 --- a/Project-02-03-04/mistraltests/before/p6_cfg_before.dot +++ /dev/null @@ -1,101 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n762 [label="2", shape=box]; - n762 -> n763; - n763 [label="3", shape=box]; - n763 -> n764; - n764 [label="CALL f", shape=box, style=filled, color=orange]; - n764 -> n712; - n712 [label="START f(a, b)", shape=box, style=filled, color=green]; - n712 -> n717; - n717 [label="a", shape=box]; - n717 -> n718; - n718 [label="0", shape=box]; - n718 -> n719; - n719 [label="a == 0", shape=box]; - n719 -> n720; - n720 [label="", shape=diamond]; - n720 -> n724 [label="T"]; - n724 [label="2", shape=box]; - n724 -> n725; - n725 [label="b", shape=box]; - n725 -> n726; - n726 [label="2 + b", shape=box]; - n726 -> n713; - n713 [label="END f(a, b)", shape=box, style=filled, color=green]; - n713 -> n760; - n760 [label="RET f", shape=box, style=filled, color=orange]; - n760 -> n761; - n761 [label="c * f((c - 1),d)", shape=box]; - n761 -> n728; - n728 [label="END g(a, c)", shape=box, style=filled, color=green]; - n728 -> n740; - n740 [label="RET g", shape=box, style=filled, color=orange]; - n740 -> n741; - n741 [label="2 + g(a,b)", shape=box]; - n741 -> n713; - n728 -> n772; - n772 [label="RET g", shape=box, style=filled, color=orange]; - n713 -> n766; - n766 [label="RET f", shape=box, style=filled, color=orange]; - n766 -> n768; - n768 [label="3", shape=box]; - n768 -> n769; - n769 [label="2", shape=box]; - n769 -> n770; - n770 [label="CALL g", shape=box, style=filled, color=orange]; - n770 -> n727; - n727 [label="START g(a, c)", shape=box, style=filled, color=green]; - n727 -> n730; - n730 [label="a", shape=box]; - n730 -> n731; - n731 [label="c", shape=box]; - n731 -> n732; - n732 [label="a + c", shape=box]; - n732 -> n733; - n733 [label="b", shape=box]; - n733 -> n734; - n734 [label="(a + c) + b", shape=box]; - n734 -> n728; - n727 -> n743; - n743 [label="c", shape=box]; - n743 -> n744; - n744 [label="0", shape=box]; - n744 -> n745; - n745 [label="c == 0", shape=box]; - n745 -> n746; - n746 [label="", shape=diamond]; - n746 -> n750 [label="T"]; - n750 [label="1", shape=box]; - n750 -> n751; - n751 [label="d", shape=box]; - n751 -> n752; - n752 [label="1 + d", shape=box]; - n752 -> n728; - n746 -> n753 [label="F"]; - n753 [label="c", shape=box]; - n753 -> n754; - n754 [label="c", shape=box]; - n754 -> n755; - n755 [label="1", shape=box]; - n755 -> n756; - n756 [label="c - 1", shape=box]; - n756 -> n757; - n757 [label="d", shape=box]; - n757 -> n758; - n758 [label="CALL f", shape=box, style=filled, color=orange]; - n758 -> n712; - n758 -> n760; - n770 -> n772; - n720 -> n735 [label="F"]; - n735 [label="2", shape=box]; - n735 -> n736; - n736 [label="a", shape=box]; - n736 -> n737; - n737 [label="b", shape=box]; - n737 -> n738; - n738 [label="CALL g", shape=box, style=filled, color=orange]; - n738 -> n727; - n738 -> n740; - n764 -> n766; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/side_effect_cfg_before.dot b/Project-02-03-04/mistraltests/before/side_effect_cfg_before.dot deleted file mode 100644 index 992d749..0000000 --- a/Project-02-03-04/mistraltests/before/side_effect_cfg_before.dot +++ /dev/null @@ -1,38 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n792 [label="1", shape=box]; - n792 -> n793; - n793 [label="2", shape=box]; - n793 -> n794; - n794 [label="CALL f", shape=box, style=filled, color=orange]; - n794 -> n775; - n775 [label="START f(x, y)", shape=box, style=filled, color=green]; - n775 -> n785; - n785 [label="5", shape=box]; - n785 -> n786; - n786 [label="CALL g", shape=box, style=filled, color=orange]; - n786 -> n778; - n778 [label="START g(x)", shape=box, style=filled, color=green]; - n778 -> n781; - n781 [label="x", shape=box]; - n781 -> n782; - n782 [label="7", shape=box]; - n782 -> n783; - n783 [label="x + 7", shape=box]; - n783 -> n784; - n784 [label="y = (x + 7)", shape=box]; - n784 -> n779; - n779 [label="END g(x)", shape=box, style=filled, color=green]; - n779 -> n788; - n788 [label="RET g", shape=box, style=filled, color=orange]; - n788 -> n789; - n789 [label="x = g(5)", shape=box]; - n789 -> n791; - n791 [label="y", shape=box]; - n791 -> n776; - n776 [label="END f(x, y)", shape=box, style=filled, color=green]; - n776 -> n796; - n796 [label="RET f", shape=box, style=filled, color=orange]; - n786 -> n788; - n794 -> n796; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/simpleSequence_cfg_before.dot b/Project-02-03-04/mistraltests/before/simpleSequence_cfg_before.dot deleted file mode 100644 index 08a3eb6..0000000 --- a/Project-02-03-04/mistraltests/before/simpleSequence_cfg_before.dot +++ /dev/null @@ -1,57 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n829 [label="3", shape=box]; - n829 -> n830; - n830 [label="CALL f", shape=box, style=filled, color=orange]; - n830 -> n800; - n800 [label="START f(x)", shape=box, style=filled, color=green]; - n800 -> n803; - n803 [label="2", shape=box]; - n803 -> n804; - n804 [label="x", shape=box]; - n804 -> n805; - n805 [label="2 * x", shape=box]; - n805 -> n806; - n806 [label="x = (2 * x)", shape=box]; - n806 -> n807; - n807 [label="x", shape=box]; - n807 -> n808; - n808 [label="0", shape=box]; - n808 -> n809; - n809 [label="x > 0", shape=box]; - n809 -> n810; - n810 [label="", shape=diamond]; - n810 -> n814 [label="T"]; - n814 [label="x", shape=box]; - n814 -> n815; - n815 [label="1", shape=box]; - n815 -> n816; - n816 [label="x - 1", shape=box]; - n816 -> n817; - n817 [label="x = (x - 1)", shape=box]; - n817 -> n819; - n819 [label="x", shape=box]; - n819 -> n820; - n820 [label="0", shape=box]; - n820 -> n821; - n821 [label="x > 0", shape=box]; - n821 -> n822; - n822 [label="", shape=diamond]; - n822 -> n824 [label="T"]; - n824 [label="x", shape=box]; - n824 -> n825; - n825 [label="1", shape=box]; - n825 -> n826; - n826 [label="x - 1", shape=box]; - n826 -> n827; - n827 [label="x = (x - 1)", shape=box]; - n827 -> n819; - n822 -> n801 [label="F"]; - n801 [label="END f(x)", shape=box, style=filled, color=green]; - n801 -> n832; - n832 [label="RET f", shape=box, style=filled, color=orange]; - n810 -> n818 [label="F"]; - n818 [label="x", shape=box]; - n818 -> n819; - n830 -> n832; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/simple_dfa_cfg_before.dot b/Project-02-03-04/mistraltests/before/simple_dfa_cfg_before.dot deleted file mode 100644 index e286ef2..0000000 --- a/Project-02-03-04/mistraltests/before/simple_dfa_cfg_before.dot +++ /dev/null @@ -1,19 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n842 [label="2", shape=box]; - n842 -> n843; - n843 [label="CALL g", shape=box, style=filled, color=orange]; - n843 -> n836; - n836 [label="START g(x, y)", shape=box, style=filled, color=green]; - n836 -> n839; - n839 [label="3", shape=box]; - n839 -> n840; - n840 [label="y = 3", shape=box]; - n840 -> n841; - n841 [label="x", shape=box]; - n841 -> n837; - n837 [label="END g(x, y)", shape=box, style=filled, color=green]; - n837 -> n845; - n845 [label="RET g", shape=box, style=filled, color=orange]; - n843 -> n845; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/simple_if_2_cfg_before.dot b/Project-02-03-04/mistraltests/before/simple_if_2_cfg_before.dot deleted file mode 100644 index 6101c67..0000000 --- a/Project-02-03-04/mistraltests/before/simple_if_2_cfg_before.dot +++ /dev/null @@ -1,14 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n858 [label="True", shape=box]; - n858 -> n859; - n859 [label="False", shape=box]; - n859 -> n860; - n860 [label="True && False", shape=box]; - n860 -> n861; - n861 [label="", shape=diamond]; - n861 -> n865 [label="T"]; - n865 [label="1", shape=box]; - n861 -> n866 [label="F"]; - n866 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/simple_if_3_cfg_before.dot b/Project-02-03-04/mistraltests/before/simple_if_3_cfg_before.dot deleted file mode 100644 index c9e2241..0000000 --- a/Project-02-03-04/mistraltests/before/simple_if_3_cfg_before.dot +++ /dev/null @@ -1,14 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n869 [label="True", shape=box]; - n869 -> n870; - n870 [label="False", shape=box]; - n870 -> n871; - n871 [label="True || False", shape=box]; - n871 -> n872; - n872 [label="", shape=diamond]; - n872 -> n876 [label="T"]; - n876 [label="1", shape=box]; - n872 -> n877 [label="F"]; - n877 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/simple_if_4_cfg_before.dot b/Project-02-03-04/mistraltests/before/simple_if_4_cfg_before.dot deleted file mode 100644 index e5bfdce..0000000 --- a/Project-02-03-04/mistraltests/before/simple_if_4_cfg_before.dot +++ /dev/null @@ -1,14 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n880 [label="1", shape=box]; - n880 -> n881; - n881 [label="2", shape=box]; - n881 -> n882; - n882 [label="1 > 2", shape=box]; - n882 -> n883; - n883 [label="", shape=diamond]; - n883 -> n887 [label="T"]; - n887 [label="1", shape=box]; - n883 -> n888 [label="F"]; - n888 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/simple_if_5_cfg_before.dot b/Project-02-03-04/mistraltests/before/simple_if_5_cfg_before.dot deleted file mode 100644 index db30339..0000000 --- a/Project-02-03-04/mistraltests/before/simple_if_5_cfg_before.dot +++ /dev/null @@ -1,18 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n891 [label="2", shape=box]; - n891 -> n892; - n892 [label="3", shape=box]; - n892 -> n893; - n893 [label="5", shape=box]; - n893 -> n894; - n894 [label="3 + 5", shape=box]; - n894 -> n895; - n895 [label="2 > (3 + 5)", shape=box]; - n895 -> n896; - n896 [label="", shape=diamond]; - n896 -> n900 [label="T"]; - n900 [label="1", shape=box]; - n896 -> n901 [label="F"]; - n901 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/simple_if_6_cfg_before.dot b/Project-02-03-04/mistraltests/before/simple_if_6_cfg_before.dot deleted file mode 100644 index baa632e..0000000 --- a/Project-02-03-04/mistraltests/before/simple_if_6_cfg_before.dot +++ /dev/null @@ -1,22 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n904 [label="1", shape=box]; - n904 -> n905; - n905 [label="2", shape=box]; - n905 -> n906; - n906 [label="1 > 2", shape=box]; - n906 -> n907; - n907 [label="3", shape=box]; - n907 -> n908; - n908 [label="5", shape=box]; - n908 -> n909; - n909 [label="3 < 5", shape=box]; - n909 -> n910; - n910 [label="(1 > 2) || (3 < 5)", shape=box]; - n910 -> n911; - n911 [label="", shape=diamond]; - n911 -> n915 [label="T"]; - n915 [label="1", shape=box]; - n911 -> n916 [label="F"]; - n916 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/simple_if_7_cfg_before.dot b/Project-02-03-04/mistraltests/before/simple_if_7_cfg_before.dot deleted file mode 100644 index f77dcec..0000000 --- a/Project-02-03-04/mistraltests/before/simple_if_7_cfg_before.dot +++ /dev/null @@ -1,18 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n919 [label="2", shape=box]; - n919 -> n920; - n920 [label="0", shape=box]; - n920 -> n921; - n921 [label="2 == 0", shape=box]; - n921 -> n922; - n922 [label="False", shape=box]; - n922 -> n923; - n923 [label="(2 == 0) == False", shape=box]; - n923 -> n924; - n924 [label="", shape=diamond]; - n924 -> n928 [label="T"]; - n928 [label="1", shape=box]; - n924 -> n929 [label="F"]; - n929 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/simple_if_cfg_before.dot b/Project-02-03-04/mistraltests/before/simple_if_cfg_before.dot deleted file mode 100644 index 1973e77..0000000 --- a/Project-02-03-04/mistraltests/before/simple_if_cfg_before.dot +++ /dev/null @@ -1,10 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n849 [label="True", shape=box]; - n849 -> n850; - n850 [label="", shape=diamond]; - n850 -> n854 [label="T"]; - n854 [label="1", shape=box]; - n850 -> n855 [label="F"]; - n855 [label="0", shape=box]; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/square_cfg_before.dot b/Project-02-03-04/mistraltests/before/square_cfg_before.dot deleted file mode 100644 index 563c2da..0000000 --- a/Project-02-03-04/mistraltests/before/square_cfg_before.dot +++ /dev/null @@ -1,19 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n938 [label="10", shape=box]; - n938 -> n939; - n939 [label="CALL square", shape=box, style=filled, color=orange]; - n939 -> n932; - n932 [label="START square(x)", shape=box, style=filled, color=green]; - n932 -> n935; - n935 [label="x", shape=box]; - n935 -> n936; - n936 [label="x", shape=box]; - n936 -> n937; - n937 [label="x * x", shape=box]; - n937 -> n933; - n933 [label="END square(x)", shape=box, style=filled, color=green]; - n933 -> n941; - n941 [label="RET square", shape=box, style=filled, color=orange]; - n939 -> n941; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/validProgram_cfg_before.dot b/Project-02-03-04/mistraltests/before/validProgram_cfg_before.dot deleted file mode 100644 index fc5fa21..0000000 --- a/Project-02-03-04/mistraltests/before/validProgram_cfg_before.dot +++ /dev/null @@ -1,90 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n983 [label="2", shape=box]; - n983 -> n984; - n984 [label="3", shape=box]; - n984 -> n985; - n985 [label="CALL mult", shape=box, style=filled, color=orange]; - n985 -> n945; - n945 [label="START mult(a, b)", shape=box, style=filled, color=green]; - n945 -> n950; - n950 [label="a", shape=box]; - n950 -> n951; - n951 [label="b", shape=box]; - n951 -> n952; - n952 [label="a * b", shape=box]; - n952 -> n946; - n946 [label="END mult(a, b)", shape=box, style=filled, color=green]; - n946 -> n977; - n977 [label="RET mult", shape=box, style=filled, color=orange]; - n977 -> n954; - n954 [label="END inc(a)", shape=box, style=filled, color=green]; - n954 -> n972; - n972 [label="RET inc", shape=box, style=filled, color=orange]; - n972 -> n954; - n954 -> n981; - n981 [label="RET inc", shape=box, style=filled, color=orange]; - n981 -> n948; - n948 [label="END add(a, b)", shape=box, style=filled, color=green]; - n948 -> n992; - n992 [label="RET add", shape=box, style=filled, color=orange]; - n992 -> n993; - n993 [label="CALL add", shape=box, style=filled, color=orange]; - n993 -> n947; - n947 [label="START add(a, b)", shape=box, style=filled, color=green]; - n947 -> n978; - n978 [label="a", shape=box]; - n978 -> n979; - n979 [label="CALL inc", shape=box, style=filled, color=orange]; - n979 -> n953; - n953 [label="START inc(a)", shape=box, style=filled, color=green]; - n953 -> n956; - n956 [label="b", shape=box]; - n956 -> n957; - n957 [label="0", shape=box]; - n957 -> n958; - n958 [label="b != 0", shape=box]; - n958 -> n959; - n959 [label="", shape=diamond]; - n959 -> n963 [label="T"]; - n963 [label="b", shape=box]; - n963 -> n964; - n964 [label="1", shape=box]; - n964 -> n965; - n965 [label="b - 1", shape=box]; - n965 -> n966; - n966 [label="b = (b - 1)", shape=box]; - n966 -> n967; - n967 [label="a", shape=box]; - n967 -> n968; - n968 [label="1", shape=box]; - n968 -> n969; - n969 [label="a + 1", shape=box]; - n969 -> n970; - n970 [label="CALL inc", shape=box, style=filled, color=orange]; - n970 -> n953; - n970 -> n972; - n959 -> n973 [label="F"]; - n973 [label="a", shape=box]; - n973 -> n974; - n974 [label="1", shape=box]; - n974 -> n975; - n975 [label="CALL mult", shape=box, style=filled, color=orange]; - n975 -> n945; - n975 -> n977; - n979 -> n981; - n993 -> n995; - n995 [label="RET add", shape=box, style=filled, color=orange]; - n948 -> n995; - n946 -> n987; - n987 [label="RET mult", shape=box, style=filled, color=orange]; - n987 -> n988; - n988 [label="4", shape=box]; - n988 -> n989; - n989 [label="5", shape=box]; - n989 -> n990; - n990 [label="CALL add", shape=box, style=filled, color=orange]; - n990 -> n947; - n990 -> n992; - n985 -> n987; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/while_2_cfg_before.dot b/Project-02-03-04/mistraltests/before/while_2_cfg_before.dot deleted file mode 100644 index 912d5a3..0000000 --- a/Project-02-03-04/mistraltests/before/while_2_cfg_before.dot +++ /dev/null @@ -1,9 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n1028 [label="True", shape=box]; - n1028 -> n1029; - n1029 [label="", shape=diamond]; - n1029 -> n1031 [label="T"]; - n1031 [label="3", shape=box]; - n1031 -> n1028; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/while_cfg_before.dot b/Project-02-03-04/mistraltests/before/while_cfg_before.dot deleted file mode 100644 index 6d0e4ff..0000000 --- a/Project-02-03-04/mistraltests/before/while_cfg_before.dot +++ /dev/null @@ -1,48 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n1020 [label="10", shape=box]; - n1020 -> n1021; - n1021 [label="8", shape=box]; - n1021 -> n1022; - n1022 [label="CALL func", shape=box, style=filled, color=orange]; - n1022 -> n999; - n999 [label="START func(a, b)", shape=box, style=filled, color=green]; - n999 -> n1002; - n1002 [label="a", shape=box]; - n1002 -> n1003; - n1003 [label="0", shape=box]; - n1003 -> n1004; - n1004 [label="a > 0", shape=box]; - n1004 -> n1005; - n1005 [label="b", shape=box]; - n1005 -> n1006; - n1006 [label="a", shape=box]; - n1006 -> n1007; - n1007 [label="b != a", shape=box]; - n1007 -> n1008; - n1008 [label="(a > 0) && (b != a)", shape=box]; - n1008 -> n1009; - n1009 [label="", shape=diamond]; - n1009 -> n1011 [label="T"]; - n1011 [label="b", shape=box]; - n1011 -> n1012; - n1012 [label="1", shape=box]; - n1012 -> n1013; - n1013 [label="b + 1", shape=box]; - n1013 -> n1014; - n1014 [label="b = (b + 1)", shape=box]; - n1014 -> n1015; - n1015 [label="a", shape=box]; - n1015 -> n1016; - n1016 [label="1", shape=box]; - n1016 -> n1017; - n1017 [label="a - 1", shape=box]; - n1017 -> n1018; - n1018 [label="a = (a - 1)", shape=box]; - n1018 -> n1004; - n1009 -> n1000 [label="F"]; - n1000 [label="END func(a, b)", shape=box, style=filled, color=green]; - n1000 -> n1024; - n1024 [label="RET func", shape=box, style=filled, color=orange]; - n1022 -> n1024; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/wrapped-ggT_cfg_before.dot b/Project-02-03-04/mistraltests/before/wrapped-ggT_cfg_before.dot deleted file mode 100644 index 528bd8e..0000000 --- a/Project-02-03-04/mistraltests/before/wrapped-ggT_cfg_before.dot +++ /dev/null @@ -1,74 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n1075 [label="21", shape=box]; - n1075 -> n1076; - n1076 [label="49", shape=box]; - n1076 -> n1077; - n1077 [label="CALL wrapper", shape=box, style=filled, color=orange]; - n1077 -> n1035; - n1035 [label="START wrapper(a, b)", shape=box, style=filled, color=green]; - n1035 -> n1070; - n1070 [label="0", shape=box]; - n1070 -> n1071; - n1071 [label="CALL ggt", shape=box, style=filled, color=orange]; - n1071 -> n1038; - n1038 [label="START ggt(noneSense)", shape=box, style=filled, color=green]; - n1038 -> n1041; - n1041 [label="a", shape=box]; - n1041 -> n1042; - n1042 [label="b", shape=box]; - n1042 -> n1043; - n1043 [label="a == b", shape=box]; - n1043 -> n1044; - n1044 [label="", shape=diamond]; - n1044 -> n1048 [label="T"]; - n1048 [label="a", shape=box]; - n1048 -> n1039; - n1039 [label="END ggt(noneSense)", shape=box, style=filled, color=green]; - n1039 -> n1073; - n1073 [label="RET ggt", shape=box, style=filled, color=orange]; - n1073 -> n1036; - n1036 [label="END wrapper(a, b)", shape=box, style=filled, color=green]; - n1036 -> n1062; - n1062 [label="RET wrapper", shape=box, style=filled, color=orange]; - n1062 -> n1039; - n1036 -> n1069; - n1069 [label="RET wrapper", shape=box, style=filled, color=orange]; - n1069 -> n1039; - n1036 -> n1079; - n1079 [label="RET wrapper", shape=box, style=filled, color=orange]; - n1044 -> n1049 [label="F"]; - n1049 [label="a", shape=box]; - n1049 -> n1050; - n1050 [label="b", shape=box]; - n1050 -> n1051; - n1051 [label="a > b", shape=box]; - n1051 -> n1052; - n1052 [label="", shape=diamond]; - n1052 -> n1056 [label="T"]; - n1056 [label="a", shape=box]; - n1056 -> n1057; - n1057 [label="b", shape=box]; - n1057 -> n1058; - n1058 [label="a - b", shape=box]; - n1058 -> n1059; - n1059 [label="b", shape=box]; - n1059 -> n1060; - n1060 [label="CALL wrapper", shape=box, style=filled, color=orange]; - n1060 -> n1035; - n1060 -> n1062; - n1052 -> n1063 [label="F"]; - n1063 [label="b", shape=box]; - n1063 -> n1064; - n1064 [label="a", shape=box]; - n1064 -> n1065; - n1065 [label="b - a", shape=box]; - n1065 -> n1066; - n1066 [label="a", shape=box]; - n1066 -> n1067; - n1067 [label="CALL wrapper", shape=box, style=filled, color=orange]; - n1067 -> n1035; - n1067 -> n1069; - n1071 -> n1073; - n1077 -> n1079; -} \ No newline at end of file diff --git a/Project-02-03-04/mistraltests/before/wrapper_cfg_before.dot b/Project-02-03-04/mistraltests/before/wrapper_cfg_before.dot deleted file mode 100644 index 81af31d..0000000 --- a/Project-02-03-04/mistraltests/before/wrapper_cfg_before.dot +++ /dev/null @@ -1,47 +0,0 @@ -digraph CFG { - node [fontname="Helvetica"]; - n1107 [label="4", shape=box]; - n1107 -> n1108; - n1108 [label="10", shape=box]; - n1108 -> n1109; - n1109 [label="CALL wrapper", shape=box, style=filled, color=orange]; - n1109 -> n1083; - n1083 [label="START wrapper(number, threshold)", shape=box, style=filled, color=green]; - n1083 -> n1102; - n1102 [label="number", shape=box]; - n1102 -> n1103; - n1103 [label="CALL square", shape=box, style=filled, color=orange]; - n1103 -> n1086; - n1086 [label="START square(x)", shape=box, style=filled, color=green]; - n1086 -> n1089; - n1089 [label="x", shape=box]; - n1089 -> n1090; - n1090 [label="x", shape=box]; - n1090 -> n1091; - n1091 [label="x * x", shape=box]; - n1091 -> n1092; - n1092 [label="threshold", shape=box]; - n1092 -> n1093; - n1093 [label="(x * x) > threshold", shape=box]; - n1093 -> n1094; - n1094 [label="", shape=diamond]; - n1094 -> n1098 [label="T"]; - n1098 [label="x", shape=box]; - n1098 -> n1087; - n1087 [label="END square(x)", shape=box, style=filled, color=green]; - n1087 -> n1105; - n1105 [label="RET square", shape=box, style=filled, color=orange]; - n1105 -> n1084; - n1084 [label="END wrapper(number, threshold)", shape=box, style=filled, color=green]; - n1084 -> n1111; - n1111 [label="RET wrapper", shape=box, style=filled, color=orange]; - n1094 -> n1099 [label="F"]; - n1099 [label="x", shape=box]; - n1099 -> n1100; - n1100 [label="x", shape=box]; - n1100 -> n1101; - n1101 [label="x * x", shape=box]; - n1101 -> n1087; - n1103 -> n1105; - n1109 -> n1111; -} \ No newline at end of file diff --git a/Project-02-03-04/test_cfg_refactoring.py b/Project-02-03-04/test_cfg_refactoring.py deleted file mode 100644 index 40d7250..0000000 --- a/Project-02-03-04/test_cfg_refactoring.py +++ /dev/null @@ -1,88 +0,0 @@ -#!/usr/bin/env python3 - -import sys -import os -from pathlib import Path - -# Add the current directory to Python path so we can import our modules -sys.path.insert(0, '/home/janniclas/Projekte/Construction-of-Compilers/Project-02-03-04') - -import triplayacc as yacc -import cfg_build -from cfg.CFG import CFG -from cfg.CFG_Node import (CFG_START, CFG_END) - -def test_cfg_refactoring(): - """Test that the CFG refactoring works correctly""" - - test_files = [ - 'example.tripla', - 'simpleSequence.tripla', - 'condition.tripla', - 'factorial.tripla' - ] - - print("Testing CFG refactoring...") - print("=" * 50) - - for filename in test_files: - print(f"\nTesting {filename}...") - - try: - # Reset the global FUNCTIONS registry - cfg_build.FUNCTIONS.clear() - - source = Path(f'triplaprograms/{filename}').read_text() - ast = yacc.parser.parse(source) - - # Create CFG the old way (without AST parameter) - start1 = CFG_START() - end1 = CFG_END() - last1 = ast.cfa(start1, end1) - if last1 is not None: - last1.add_child(end1) - cfg_old = CFG(start1, end1) # Old constructor - dot_old = cfg_old.to_dot() - - # Create CFG the new way (with AST parameter) - cfg_build.FUNCTIONS.clear() - start2 = CFG_START() - end2 = CFG_END() - last2 = ast.cfa(start2, end2) - if last2 is not None: - last2.add_child(end2) - cfg_new = CFG(start2, end2, ast) # New constructor - dot_new = cfg_new.to_dot() - - # Compare the outputs - if dot_old == dot_new: - print(f" ✓ PASS: DOT outputs are identical") - else: - print(f" ✗ FAIL: DOT outputs differ") - print(f" Old length: {len(dot_old)}") - print(f" New length: {len(dot_new)}") - return False - - # Verify basic structure - if 'digraph CFG' not in dot_new: - print(f" ✗ FAIL: Missing graph declaration") - return False - - if '->' not in dot_new: - print(f" ✗ FAIL: Missing edges") - return False - - print(f" ✓ PASS: Basic structure verified") - print(f" ✓ Generated DOT with {len(dot_new)} characters") - - except Exception as e: - print(f" ✗ FAIL: Exception occurred: {e}") - return False - - print("\n" + "=" * 50) - print("✓ All tests passed! CFG refactoring is working correctly.") - return True - -if __name__ == "__main__": - success = test_cfg_refactoring() - sys.exit(0 if success else 1) \ No newline at end of file diff --git a/Project-02-03-04/tramcodes/example.tram b/Project-02-03-04/tramcodes/example.tram new file mode 100644 index 0000000..defb037 --- /dev/null +++ b/Project-02-03-04/tramcodes/example.tram @@ -0,0 +1,42 @@ + GOTO L1 +L2: NOP + CONST 2 + STORE 1 0 + LOAD 1 0 + POP + CONST 3 + STORE 2 0 + LOAD 2 0 + POP + GOTO L3 +L4: NOP + CONST 7 + STORE 0 0 + LOAD 0 0 + POP + LOAD 1 1 + CONST 0 + GT + IFZERO L5 + LOAD 1 1 + INVOKE 1 L4 1 + GOTO L6 +L5: NOP + CONST 8 + STORE 0 0 + LOAD 0 0 +L6: NOP + POP + LOAD 0 0 + RETURN +L3: NOP + LOAD 0 0 + INVOKE 1 L4 0 + LOAD 0 0 + ADD + RETURN +L1: NOP + CONST 2 + CONST 3 + INVOKE 2 L2 0 + HALT