From 51028555dedc7e02e10c41f8627c3d714fdeba8c Mon Sep 17 00:00:00 2001 From: Jan-Niclas Loosen Date: Thu, 22 Jan 2026 20:26:41 +0100 Subject: [PATCH] Remove edges in constructor --- Project-02-03-04/Source.gv.png | Bin 67273 -> 62486 bytes Project-02-03-04/cfg/CFG.py | 245 ++++++------ 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 | 364 +++++++++--------- .../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/prompt.txt | 1 + Project-02-03-04/test_cfg_refactoring.py | 88 +++++ 77 files changed, 3964 insertions(+), 309 deletions(-) create mode 100644 Project-02-03-04/generate_after_dot_files.py create mode 100644 Project-02-03-04/generate_before_dot_files.py create mode 100644 Project-02-03-04/mistraltests/after/argsParamsExample_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/complex_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/condition_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/defSemiExample_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/example_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/factorial_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/faulty_if_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/func_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/geq_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/ggT_euclid_rec_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/homework_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/multiple-let-with-same-func-name_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/multiple-let_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/or_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/p1_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/p2_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/p3_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/p4_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/p6_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/side_effect_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/simpleSequence_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/simple_dfa_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/simple_if_2_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/simple_if_3_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/simple_if_4_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/simple_if_5_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/simple_if_6_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/simple_if_7_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/simple_if_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/square_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/validProgram_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/while_2_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/while_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/wrapped-ggT_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/after/wrapper_cfg_after.dot create mode 100644 Project-02-03-04/mistraltests/before/argsParamsExample_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/complex_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/condition_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/defSemiExample_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/example_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/factorial_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/faulty_if_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/func_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/geq_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/ggT_euclid_rec_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/homework_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/multiple-let-with-same-func-name_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/multiple-let_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/or_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/p1_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/p2_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/p3_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/p4_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/p6_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/side_effect_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/simpleSequence_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/simple_dfa_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/simple_if_2_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/simple_if_3_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/simple_if_4_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/simple_if_5_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/simple_if_6_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/simple_if_7_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/simple_if_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/square_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/validProgram_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/while_2_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/while_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/wrapped-ggT_cfg_before.dot create mode 100644 Project-02-03-04/mistraltests/before/wrapper_cfg_before.dot create mode 100644 Project-02-03-04/prompt.txt create mode 100644 Project-02-03-04/test_cfg_refactoring.py diff --git a/Project-02-03-04/Source.gv.png b/Project-02-03-04/Source.gv.png index 57d604818ec8a7ca4bd06beea2668a09a8c070e2..7d29a74faa98732317ba9a40807c0abd5cf8c98b 100644 GIT binary patch literal 62486 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%0D^`9K*5yRVVssPU*_w9(+4byVj*Ya?THkhIKm(R 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 literal 67273 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 diff --git a/Project-02-03-04/cfg/CFG.py b/Project-02-03-04/cfg/CFG.py index 71e9b17..316a618 100644 --- a/Project-02-03-04/cfg/CFG.py +++ b/Project-02-03-04/cfg/CFG.py @@ -4,32 +4,127 @@ from .CFG_Node import * class CFG: - def __init__(self, in_node: CFG_Node, out_node: CFG_Node): + def __init__(self, in_node: CFG_Node, out_node: CFG_Node, ast=None): self.in_node = in_node self.out_node = out_node + 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 + 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""" + if node in node_set: + return + node_set.add(node) + for child in node.children: + 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 + 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 + targets = [] + if len(original_children) >= 1: + true_target = self._find_first_non_empty_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]) + if false_target: + targets.append(false_target) + else: + # For regular nodes, find all non-empty targets + targets = [] + for child in original_children: + target = self._find_first_non_empty_child(child) + if target and target not in targets: + targets.append(target) + + # Remove edge from parent to node + parent.remove_child(node, propagate=False) + + # Add edges from parent to targets + for target in targets: + parent.add_child(target, propagate=False) + + # Clear the node's connections + 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): + return node + + # Recursively check children + for child in sorted(node.children, key=lambda n: n.id): + result = self._find_first_non_empty_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() - visited_nodes = [] lines = ["digraph CFG {"] lines.append(' node [fontname="Helvetica"];') def node_label(node: CFG_Node) -> str | None | Any: - # Skip empty nodes (nodes with no meaningful content) - if hasattr(node, 'label') and node.label == "None": - return None - - # Skip global START/END nodes (those without function names) - if hasattr(node, 'dot_label'): - if node.dot_label() in ["START", "END"]: - # Keep function-specific START/END nodes, skip global ones - if hasattr(node, 'label') and node.label and '(' in node.label and ')' in node.label: - # This is a function START/END node, keep it - pass - else: - # This is a global START/END node, skip it - return None - # Use custom label if available if hasattr(node, 'label') and node.label: # Remove node ID from label for certain node types @@ -64,34 +159,16 @@ class CFG: styles.append('color=green') return ', '.join(styles) if styles else '' - def find_first_non_empty_child(node: CFG_Node): - if node_label(node) is not None: - return node - - # Recursively check children - for child in sorted(node.children, key=lambda n: n.id): - result = find_first_non_empty_child(child) - if result is not None: - return result - - return None - def visit(node: CFG_Node): if node.id in visited: return - label = node_label(node) - visited_nodes.append(node) # Track all visited nodes - - # Skip nodes that should not be included in the output - if label is None: - visited.add(node.id) - # Still need to visit children to maintain connectivity - for child in sorted(node.children, key=lambda n: n.id): - visit(child) - 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) @@ -101,74 +178,8 @@ class CFG: 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)): - # Skip edges to nodes that should not be included - child_label = node_label(child) - if child_label is None: - # For diamond nodes, we need to find the actual target nodes - # that the empty node connects to - if hasattr(node, 'dot_shape') and node.dot_shape() == "diamond": - # Find the first non-empty descendant of this empty node - actual_target = find_first_non_empty_child(child) - if actual_target is not None: - target_label = node_label(actual_target) - if target_label is not None: - # Add edge from diamond to actual target - edge_label = "" - if i == 0: - edge_label = ' [label="T"]' - elif i == 1: - edge_label = ' [label="F"]' - lines.append(f" n{node.id} -> n{actual_target.id}{edge_label};") - visit(actual_target) - continue - - # For regular nodes that connect to empty join nodes, - # we need to find where the join node connects to - if child_label is None and len(child.children) > 0: - # This might be a join node - find where it connects to - join_targets = [] - for grandchild in sorted(child.children, key=lambda n: n.id): - grandchild_label = node_label(grandchild) - if grandchild_label is not None: - join_targets.append(grandchild) - - # If we found targets, connect directly to them - if join_targets: - for target in join_targets: - lines.append(f" n{node.id} -> n{target.id};") - visit(target) - continue - - # Special handling for RETURN nodes that connect to empty cont nodes - # This is especially important for recursive function calls - if (label and (label.startswith("RET ") or label.startswith("CALL ")) and - child_label is None and len(child.children) > 0): - # This is a RETURN/CALL node connecting to an empty cont node - # Recursively find all non-empty targets that the cont node connects to - def find_all_targets(n): - """Recursively find all non-empty targets""" - targets = [] - if node_label(n) is not None: - targets.append(n) - else: - for grandchild in sorted(n.children, key=lambda n: n.id): - targets.extend(find_all_targets(grandchild)) - return targets - - cont_targets = find_all_targets(child) - - # Connect the RETURN/CALL node directly to the cont node's targets - if cont_targets: - for target in cont_targets: - lines.append(f" n{node.id} -> n{target.id};") - visit(target) - continue - - # Visit the child but don't create an edge - visit(child) - continue - # Add edge labels for diamond nodes (conditional branches) edge_label = "" if hasattr(node, 'dot_shape') and node.dot_shape() == "diamond": @@ -179,26 +190,6 @@ class CFG: lines.append(f" n{node.id} -> n{child.id}{edge_label};") visit(child) - - # Add special edges for recursive calls in function g - # This handles the specific case where RET g(y) should connect to the x variable - if label and label.startswith("RET g(y)"): - # Find the FINAL x variable node that leads to function end - final_x_node = None - for target_node in visited_nodes: - target_label = node_label(target_node) - if target_label == "x" and target_node.id != node.id: - # Check if this x node connects to END g(x) - for child in target_node.children: - child_label = node_label(child) - if child_label and child_label.startswith("END g(x)"): - final_x_node = target_node - break - if final_x_node: - break - - if final_x_node: - lines.append(f" n{node.id} -> n{final_x_node.id};") # Start the CFG traversal from the entry node visit(self.in_node) diff --git a/Project-02-03-04/generate_after_dot_files.py b/Project-02-03-04/generate_after_dot_files.py new file mode 100644 index 0000000..f47f5ea --- /dev/null +++ b/Project-02-03-04/generate_after_dot_files.py @@ -0,0 +1,91 @@ +#!/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 new file mode 100644 index 0000000..4f7bd93 --- /dev/null +++ b/Project-02-03-04/generate_before_dot_files.py @@ -0,0 +1,62 @@ +#!/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 bee2650..f9a49e4 100644 --- a/Project-02-03-04/main.py +++ b/Project-02-03-04/main.py @@ -1,182 +1,182 @@ -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 matplotlib -matplotlib.use("TkAgg") - -# Assembles the AST into TRAM code -def assemble(ast): - code = ast.code({}, 0) - 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) - -# Renders a diagram of the AST -def render_diagram(dot_string: str): - # Set DPI for PNG - os.environ["GV_FILE_DPI"] = "300" - - src = Source(dot_string, format="png", engine="dot") - png_path = src.render(cleanup=True) - - img = mpimg.imread(png_path) - - fig = plt.figure(figsize=(12, 12)) - fig.canvas.manager.window.wm_title("TRIPLA AST Viewer") - - plt.imshow(img) - plt.axis("off") - plt.show() - -# Pretty prints the AST -def pretty_print(node, indent=0): - prefix = " " * indent - print(f"{prefix}{type(node).__name__}:") - - for key, value in node.__dict__.items(): - if isinstance(value, syntax.EXPRESSION): - pretty_print(value, indent + 4) - - elif isinstance(value, list): - print(f"{prefix} {key}: [") - for element in value: - if isinstance(element, syntax.EXPRESSION): - pretty_print(element, indent + 4) - else: - print(" " * (indent + 4) + str(element)) - print(f"{prefix} ]") - - else: - print(f"{prefix} {key}: {value}") - - -if __name__ == "__main__": - print("\nTRIPLA Parser and TRIPLA to TRAM Compiler") - - while True: - mode = cnsl.prompt_choice("\nSelect action:", ["Parse .tripla", "Compile .tripla", "CFG for .tripla", "Exit"]) - - if mode == 3: - print("\nBye Bye.") - break - - base = Path(__file__).parent / "triplaprograms" - programs = sorted([f for f in base.glob("*.tripla")]) - if not programs: - print("\nNo .tripla files found.") - continue - - idx = cnsl.prompt_choice("\nSelect TRIPLA program:", [p.name for p in programs]) - path = programs[idx] - - source = path.read_text() - ast = yacc.parser.parse(source) - - if mode == 0: - # Pretty print - if cnsl.prompt_confirmation("\nPretty-print AST?"): - print("") - pretty_print(ast) - - # Export DOT - dot_str = ast.to_dot() - if cnsl.prompt_confirmation("Export AST as .dot file?"): - default = f"{path.stem}.dot" - filename = input(f"Filename [{default}]: ").strip() - if not filename: - filename = default - try: - base_dir = Path(__file__).parent - out_path = base_dir / filename - with open(out_path, "w") as f: - f.write(dot_str) - print(f"Saved DOT file as: {out_path}") - except Exception as e: - print(f"Could not save DOT file: {e}") - - # Display AST diagram - if cnsl.prompt_confirmation("Display AST diagram?"): - render_diagram(dot_str) - print("Rendered AST diagram.") - - elif mode == 1: - tram_code = assemble(ast) - - # Print TRAM code - if cnsl.prompt_confirmation("\nPrint TRAM code to console?"): - print("\nGenerated TRAM code:\n") - for instr in tram_code: - print(instr.toString()) - - # Save TRAM code - if cnsl.prompt_confirmation("Save TRAM code as .tram file?"): - base_dir = Path(__file__).parent / "tramcodes" - base_dir.mkdir(exist_ok=True) - - default = f"{path.stem}.tram" - filename = input(f"Filename [{default}]: ").strip() - if not filename: - filename = default - - out_path = base_dir / filename - with open(out_path, "w") as f: - for instr in tram_code: - f.write(instr.toString() + "\n") - - print(f"Saved TRAM code to: {out_path}") - - # Display TRAM code in Visual TRAM UI - if cnsl.prompt_confirmation("Display TRAM code in Visual TRAM UI?"): - root = tk.Tk() - ui = MachineUI(root) - ui.machine.initial_program = tram_code - ui.machine.reset() - root.mainloop() - - elif mode == 2: - cfg = make_cfg(ast) - - dot_str = cfg.to_dot() - if cnsl.prompt_confirmation("\nExport CFG as .dot file?"): - default = f"{path.stem}_cfg.dot" - filename = input(f"Filename [{default}]: ").strip() - if not filename: - filename = default - - out_path = Path(__file__).parent / filename - with open(out_path, "w") as f: - f.write(dot_str) - - print(f"Saved CFG DOT file as: {out_path}") - - if cnsl.prompt_confirmation("Display CFG diagram?"): - render_diagram(dot_str) - print("Rendered CFG diagram.") - - - - +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 matplotlib +matplotlib.use("TkAgg") + +# Assembles the AST into TRAM code +def assemble(ast): + code = ast.code({}, 0) + 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) + +# Renders a diagram of the AST +def render_diagram(dot_string: str): + # Set DPI for PNG + os.environ["GV_FILE_DPI"] = "300" + + src = Source(dot_string, format="png", engine="dot") + png_path = src.render(cleanup=True) + + img = mpimg.imread(png_path) + + fig = plt.figure(figsize=(12, 12)) + fig.canvas.manager.window.wm_title("TRIPLA AST Viewer") + + plt.imshow(img) + plt.axis("off") + plt.show() + +# Pretty prints the AST +def pretty_print(node, indent=0): + prefix = " " * indent + print(f"{prefix}{type(node).__name__}:") + + for key, value in node.__dict__.items(): + if isinstance(value, syntax.EXPRESSION): + pretty_print(value, indent + 4) + + elif isinstance(value, list): + print(f"{prefix} {key}: [") + for element in value: + if isinstance(element, syntax.EXPRESSION): + pretty_print(element, indent + 4) + else: + print(" " * (indent + 4) + str(element)) + print(f"{prefix} ]") + + else: + print(f"{prefix} {key}: {value}") + + +if __name__ == "__main__": + print("\nTRIPLA Parser and TRIPLA to TRAM Compiler") + + while True: + mode = cnsl.prompt_choice("\nSelect action:", ["Parse .tripla", "Compile .tripla", "CFG for .tripla", "Exit"]) + + if mode == 3: + print("\nBye Bye.") + break + + base = Path(__file__).parent / "triplaprograms" + programs = sorted([f for f in base.glob("*.tripla")]) + if not programs: + print("\nNo .tripla files found.") + continue + + idx = cnsl.prompt_choice("\nSelect TRIPLA program:", [p.name for p in programs]) + path = programs[idx] + + source = path.read_text() + ast = yacc.parser.parse(source) + + if mode == 0: + # Pretty print + if cnsl.prompt_confirmation("\nPretty-print AST?"): + print("") + pretty_print(ast) + + # Export DOT + dot_str = ast.to_dot() + if cnsl.prompt_confirmation("Export AST as .dot file?"): + default = f"{path.stem}.dot" + filename = input(f"Filename [{default}]: ").strip() + if not filename: + filename = default + try: + base_dir = Path(__file__).parent + out_path = base_dir / filename + with open(out_path, "w") as f: + f.write(dot_str) + print(f"Saved DOT file as: {out_path}") + except Exception as e: + print(f"Could not save DOT file: {e}") + + # Display AST diagram + if cnsl.prompt_confirmation("Display AST diagram?"): + render_diagram(dot_str) + print("Rendered AST diagram.") + + elif mode == 1: + tram_code = assemble(ast) + + # Print TRAM code + if cnsl.prompt_confirmation("\nPrint TRAM code to console?"): + print("\nGenerated TRAM code:\n") + for instr in tram_code: + print(instr.toString()) + + # Save TRAM code + if cnsl.prompt_confirmation("Save TRAM code as .tram file?"): + base_dir = Path(__file__).parent / "tramcodes" + base_dir.mkdir(exist_ok=True) + + default = f"{path.stem}.tram" + filename = input(f"Filename [{default}]: ").strip() + if not filename: + filename = default + + out_path = base_dir / filename + with open(out_path, "w") as f: + for instr in tram_code: + f.write(instr.toString() + "\n") + + print(f"Saved TRAM code to: {out_path}") + + # Display TRAM code in Visual TRAM UI + if cnsl.prompt_confirmation("Display TRAM code in Visual TRAM UI?"): + root = tk.Tk() + ui = MachineUI(root) + ui.machine.initial_program = tram_code + ui.machine.reset() + root.mainloop() + + elif mode == 2: + cfg = make_cfg(ast) + + dot_str = cfg.to_dot() + if cnsl.prompt_confirmation("\nExport CFG as .dot file?"): + default = f"{path.stem}_cfg.dot" + filename = input(f"Filename [{default}]: ").strip() + if not filename: + filename = default + + out_path = Path(__file__).parent / filename + with open(out_path, "w") as f: + f.write(dot_str) + + print(f"Saved CFG DOT file as: {out_path}") + + if cnsl.prompt_confirmation("Display CFG diagram?"): + render_diagram(dot_str) + print("Rendered CFG diagram.") + + + + diff --git a/Project-02-03-04/mistraltests/after/argsParamsExample_cfg_after.dot b/Project-02-03-04/mistraltests/after/argsParamsExample_cfg_after.dot new file mode 100644 index 0000000..7181248 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/argsParamsExample_cfg_after.dot @@ -0,0 +1,21 @@ +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 new file mode 100644 index 0000000..d31f776 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/complex_cfg_after.dot @@ -0,0 +1,125 @@ +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 new file mode 100644 index 0000000..812791f --- /dev/null +++ b/Project-02-03-04/mistraltests/after/condition_cfg_after.dot @@ -0,0 +1,24 @@ +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 new file mode 100644 index 0000000..8152335 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/defSemiExample_cfg_after.dot @@ -0,0 +1,43 @@ +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 new file mode 100644 index 0000000..9626042 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/example_cfg_after.dot @@ -0,0 +1,67 @@ +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 new file mode 100644 index 0000000..037fb22 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/factorial_cfg_after.dot @@ -0,0 +1,266 @@ +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 new file mode 100644 index 0000000..2c955a9 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/faulty_if_cfg_after.dot @@ -0,0 +1,6 @@ +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 new file mode 100644 index 0000000..8882b76 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/func_cfg_after.dot @@ -0,0 +1,50 @@ +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 new file mode 100644 index 0000000..79218ae --- /dev/null +++ b/Project-02-03-04/mistraltests/after/geq_cfg_after.dot @@ -0,0 +1,16 @@ +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 new file mode 100644 index 0000000..151b313 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/ggT_euclid_rec_cfg_after.dot @@ -0,0 +1,65 @@ +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 new file mode 100644 index 0000000..1209859 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/homework_cfg_after.dot @@ -0,0 +1,109 @@ +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 new file mode 100644 index 0000000..c28cea6 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/multiple-let-with-same-func-name_cfg_after.dot @@ -0,0 +1,34 @@ +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 new file mode 100644 index 0000000..ea0334e --- /dev/null +++ b/Project-02-03-04/mistraltests/after/multiple-let_cfg_after.dot @@ -0,0 +1,44 @@ +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 new file mode 100644 index 0000000..47e1722 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/or_cfg_after.dot @@ -0,0 +1,20 @@ +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 new file mode 100644 index 0000000..b5f7e47 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/p1_cfg_after.dot @@ -0,0 +1,21 @@ +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 new file mode 100644 index 0000000..bb80e27 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/p2_cfg_after.dot @@ -0,0 +1,38 @@ +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 new file mode 100644 index 0000000..4131dc0 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/p3_cfg_after.dot @@ -0,0 +1,125 @@ +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 new file mode 100644 index 0000000..70de5bd --- /dev/null +++ b/Project-02-03-04/mistraltests/after/p4_cfg_after.dot @@ -0,0 +1,25 @@ +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 new file mode 100644 index 0000000..143f6c5 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/p6_cfg_after.dot @@ -0,0 +1,103 @@ +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 new file mode 100644 index 0000000..d9f166c --- /dev/null +++ b/Project-02-03-04/mistraltests/after/side_effect_cfg_after.dot @@ -0,0 +1,40 @@ +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 new file mode 100644 index 0000000..06fdcd8 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/simpleSequence_cfg_after.dot @@ -0,0 +1,59 @@ +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 new file mode 100644 index 0000000..abc919b --- /dev/null +++ b/Project-02-03-04/mistraltests/after/simple_dfa_cfg_after.dot @@ -0,0 +1,21 @@ +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 new file mode 100644 index 0000000..5e5a429 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/simple_if_2_cfg_after.dot @@ -0,0 +1,16 @@ +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 new file mode 100644 index 0000000..0d2f7ff --- /dev/null +++ b/Project-02-03-04/mistraltests/after/simple_if_3_cfg_after.dot @@ -0,0 +1,16 @@ +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 new file mode 100644 index 0000000..f63855d --- /dev/null +++ b/Project-02-03-04/mistraltests/after/simple_if_4_cfg_after.dot @@ -0,0 +1,16 @@ +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 new file mode 100644 index 0000000..a6b0aa6 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/simple_if_5_cfg_after.dot @@ -0,0 +1,20 @@ +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 new file mode 100644 index 0000000..d6791a9 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/simple_if_6_cfg_after.dot @@ -0,0 +1,24 @@ +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 new file mode 100644 index 0000000..1de6093 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/simple_if_7_cfg_after.dot @@ -0,0 +1,20 @@ +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 new file mode 100644 index 0000000..b8b7222 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/simple_if_cfg_after.dot @@ -0,0 +1,12 @@ +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 new file mode 100644 index 0000000..9048a94 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/square_cfg_after.dot @@ -0,0 +1,21 @@ +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 new file mode 100644 index 0000000..089243d --- /dev/null +++ b/Project-02-03-04/mistraltests/after/validProgram_cfg_after.dot @@ -0,0 +1,92 @@ +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 new file mode 100644 index 0000000..94838b2 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/while_2_cfg_after.dot @@ -0,0 +1,11 @@ +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 new file mode 100644 index 0000000..3cf94ac --- /dev/null +++ b/Project-02-03-04/mistraltests/after/while_cfg_after.dot @@ -0,0 +1,50 @@ +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 new file mode 100644 index 0000000..bea4728 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/wrapped-ggT_cfg_after.dot @@ -0,0 +1,76 @@ +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 new file mode 100644 index 0000000..768ee06 --- /dev/null +++ b/Project-02-03-04/mistraltests/after/wrapper_cfg_after.dot @@ -0,0 +1,49 @@ +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 new file mode 100644 index 0000000..cd1446c --- /dev/null +++ b/Project-02-03-04/mistraltests/before/argsParamsExample_cfg_before.dot @@ -0,0 +1,19 @@ +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 new file mode 100644 index 0000000..0d795b3 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/complex_cfg_before.dot @@ -0,0 +1,123 @@ +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 new file mode 100644 index 0000000..bde78d7 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/condition_cfg_before.dot @@ -0,0 +1,22 @@ +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 new file mode 100644 index 0000000..ee8067f --- /dev/null +++ b/Project-02-03-04/mistraltests/before/defSemiExample_cfg_before.dot @@ -0,0 +1,41 @@ +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 new file mode 100644 index 0000000..66d71b9 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/example_cfg_before.dot @@ -0,0 +1,66 @@ +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 new file mode 100644 index 0000000..0aeb4d9 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/factorial_cfg_before.dot @@ -0,0 +1,264 @@ +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 new file mode 100644 index 0000000..f7f9a82 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/faulty_if_cfg_before.dot @@ -0,0 +1,4 @@ +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 new file mode 100644 index 0000000..11ffd24 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/func_cfg_before.dot @@ -0,0 +1,48 @@ +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 new file mode 100644 index 0000000..20d9ff9 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/geq_cfg_before.dot @@ -0,0 +1,14 @@ +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 new file mode 100644 index 0000000..2aec34e --- /dev/null +++ b/Project-02-03-04/mistraltests/before/ggT_euclid_rec_cfg_before.dot @@ -0,0 +1,63 @@ +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 new file mode 100644 index 0000000..7597a44 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/homework_cfg_before.dot @@ -0,0 +1,108 @@ +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 new file mode 100644 index 0000000..2721f8f --- /dev/null +++ b/Project-02-03-04/mistraltests/before/multiple-let-with-same-func-name_cfg_before.dot @@ -0,0 +1,32 @@ +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 new file mode 100644 index 0000000..f9fa565 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/multiple-let_cfg_before.dot @@ -0,0 +1,42 @@ +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 new file mode 100644 index 0000000..fdb47a7 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/or_cfg_before.dot @@ -0,0 +1,18 @@ +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 new file mode 100644 index 0000000..0d70588 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/p1_cfg_before.dot @@ -0,0 +1,19 @@ +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 new file mode 100644 index 0000000..8a13933 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/p2_cfg_before.dot @@ -0,0 +1,36 @@ +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 new file mode 100644 index 0000000..aca2b20 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/p3_cfg_before.dot @@ -0,0 +1,123 @@ +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 new file mode 100644 index 0000000..7b0bba4 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/p4_cfg_before.dot @@ -0,0 +1,23 @@ +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 new file mode 100644 index 0000000..47befda --- /dev/null +++ b/Project-02-03-04/mistraltests/before/p6_cfg_before.dot @@ -0,0 +1,101 @@ +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 new file mode 100644 index 0000000..992d749 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/side_effect_cfg_before.dot @@ -0,0 +1,38 @@ +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 new file mode 100644 index 0000000..08a3eb6 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/simpleSequence_cfg_before.dot @@ -0,0 +1,57 @@ +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 new file mode 100644 index 0000000..e286ef2 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/simple_dfa_cfg_before.dot @@ -0,0 +1,19 @@ +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 new file mode 100644 index 0000000..6101c67 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/simple_if_2_cfg_before.dot @@ -0,0 +1,14 @@ +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 new file mode 100644 index 0000000..c9e2241 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/simple_if_3_cfg_before.dot @@ -0,0 +1,14 @@ +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 new file mode 100644 index 0000000..e5bfdce --- /dev/null +++ b/Project-02-03-04/mistraltests/before/simple_if_4_cfg_before.dot @@ -0,0 +1,14 @@ +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 new file mode 100644 index 0000000..db30339 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/simple_if_5_cfg_before.dot @@ -0,0 +1,18 @@ +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 new file mode 100644 index 0000000..baa632e --- /dev/null +++ b/Project-02-03-04/mistraltests/before/simple_if_6_cfg_before.dot @@ -0,0 +1,22 @@ +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 new file mode 100644 index 0000000..f77dcec --- /dev/null +++ b/Project-02-03-04/mistraltests/before/simple_if_7_cfg_before.dot @@ -0,0 +1,18 @@ +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 new file mode 100644 index 0000000..1973e77 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/simple_if_cfg_before.dot @@ -0,0 +1,10 @@ +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 new file mode 100644 index 0000000..563c2da --- /dev/null +++ b/Project-02-03-04/mistraltests/before/square_cfg_before.dot @@ -0,0 +1,19 @@ +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 new file mode 100644 index 0000000..fc5fa21 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/validProgram_cfg_before.dot @@ -0,0 +1,90 @@ +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 new file mode 100644 index 0000000..912d5a3 --- /dev/null +++ b/Project-02-03-04/mistraltests/before/while_2_cfg_before.dot @@ -0,0 +1,9 @@ +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 new file mode 100644 index 0000000..6d0e4ff --- /dev/null +++ b/Project-02-03-04/mistraltests/before/while_cfg_before.dot @@ -0,0 +1,48 @@ +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 new file mode 100644 index 0000000..528bd8e --- /dev/null +++ b/Project-02-03-04/mistraltests/before/wrapped-ggT_cfg_before.dot @@ -0,0 +1,74 @@ +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 new file mode 100644 index 0000000..81af31d --- /dev/null +++ b/Project-02-03-04/mistraltests/before/wrapper_cfg_before.dot @@ -0,0 +1,47 @@ +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/prompt.txt b/Project-02-03-04/prompt.txt new file mode 100644 index 0000000..bdbd0ff --- /dev/null +++ b/Project-02-03-04/prompt.txt @@ -0,0 +1 @@ +The to_dot method does a lot of additional stuff, which needs to be done in the constructor. It should not be necessary to create or modify edges or remove nodes within. Instead, to dot should ALWAYS return exactly that graph, which is stored in CFG. For this reason, rewrite the constructor and use the parse ast. init the whole ast as seen in make_cfg in main. Than filter the full graph and make the rtequired modifications. to dot is only responsible for dot file formatting! Before you start, create for each tripla program in /triplacodes a dot file in /mistraltests/before. After your modifications again generate dot files in /mistraltests/after and compare for each, that the graphs are the same as before. IT IS IMPORTANT, that the created graphs are noch different afterwards. \ 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 new file mode 100644 index 0000000..40d7250 --- /dev/null +++ b/Project-02-03-04/test_cfg_refactoring.py @@ -0,0 +1,88 @@ +#!/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