From 900ca3e3797fe319831ce651b2dc62280595ec5d Mon Sep 17 00:00:00 2001 From: L0P0P Date: Wed, 3 Jul 2024 22:06:40 +0200 Subject: [PATCH] (wip) upgraded cfgnode management --- progs/test.py | 1 + src/ast/Python3VisitorImpl.java | 29 +++++++++++++------- src/reachingDefinition/CFGNode.java | 26 ++++++++++-------- src/reachingDefinition/ControlFlowGraph.java | 6 ++-- 4 files changed, 37 insertions(+), 25 deletions(-) diff --git a/progs/test.py b/progs/test.py index beea762..c9bd261 100644 --- a/progs/test.py +++ b/progs/test.py @@ -7,3 +7,4 @@ def test(): m = 1 for i in range(10): m = i + 1 + None diff --git a/src/ast/Python3VisitorImpl.java b/src/ast/Python3VisitorImpl.java index df0a830..f49070d 100644 --- a/src/ast/Python3VisitorImpl.java +++ b/src/ast/Python3VisitorImpl.java @@ -6,6 +6,7 @@ import parser.Python3ParserBaseVisitor; import parser.Python3Parser.*; import reachingDefinition.*; +import reachingDefinition.CFGNode.*; import org.antlr.v4.runtime.tree.TerminalNode; @@ -15,7 +16,7 @@ */ public class Python3VisitorImpl extends Python3ParserBaseVisitor { - private ControlFlowGraph cfg = new ControlFlowGraph(new CFGNode(true)); + private ControlFlowGraph cfg = null; public ControlFlowGraph getCFG() { return this.cfg; @@ -28,7 +29,9 @@ public ControlFlowGraph getCFG() { * ``` root : NEWLINE* (simple_stmts | compound_stmt)* EOF; ``` */ public Node visitRoot(RootContext ctx) { - ArrayList childs = new ArrayList(); + ArrayList childs = new ArrayList<>(); + + cfg = new ControlFlowGraph(new CFGNode(ctx.getStart().getLine(), true)); for (int i = 0; i < ctx.getChildCount(); i++) { var child = ctx.getChild(i); @@ -49,7 +52,7 @@ public Node visitRoot(RootContext ctx) { * ``` simple_stmts : simple_stmt (';' simple_stmt)* ';'? NEWLINE ; ``` */ public Node visitSimple_stmts(Simple_stmtsContext ctx) { - ArrayList stmts = new ArrayList(); + ArrayList stmts = new ArrayList<>(); for (Simple_stmtContext stm : ctx.simple_stmt()) { stmts.add(visit(stm)); @@ -131,18 +134,19 @@ public Node visitAssignment(AssignmentContext ctx) { Node assign = visit(ctx.augassign()); Node rhr = visit(ctx.exprlist(1)); - CFGNode assignNode = new CFGNode(false); + CFGNode assignNode = new CFGNode(ctx.getStart().getLine(), false); + /* for (int i = cfg.getNodes().size(); i > 0; i--) { if (cfg.getNodeById(i).isStmt()) { cfg.getNodeById(i).addSuccessor(assignNode); assignNode.addPredecessor(cfg.getNodeById(i)); break; } - } + }*/ - assignNode.addPredecessor(cfg.getNodeById(cfg.getNodes().size())); - cfg.getNodeById(cfg.getNodes().size()).addSuccessor(assignNode); + assignNode.addPredecessor(cfg.getNodeByLine(cfg.getNodes().size())); + cfg.getNodeByLine(cfg.getNodes().size()).addSuccessor(assignNode); cfg.addNode(assignNode); return new AssignmentNode(lhr, assign, rhr); @@ -176,7 +180,7 @@ public Node visitImport_stm(Import_stmContext ctx) { Node dottedName = visit(ctx.dotted_name()); - ArrayList names = new ArrayList(); + ArrayList names = new ArrayList<>(); for (var s : ctx.NAME()) { names.add(s.toString()); @@ -191,7 +195,7 @@ public Node visitImport_stm(Import_stmContext ctx) { * ``` dotted_name : NAME ('.' NAME)* ; ``` */ public Node visitDotted_name(Dotted_nameContext ctx) { - ArrayList names = new ArrayList(); + ArrayList names = new ArrayList<>(); for (var name : ctx.NAME()) { names.add(name); @@ -206,6 +210,11 @@ public Node visitDotted_name(Dotted_nameContext ctx) { * ``` funcdef : 'def' NAME '(' paramlist? ')' ':' block ; ``` */ public Node visitFuncdef(FuncdefContext ctx) { + CFGNode funcNode = new CFGNode(ctx.getStart().getLine(), true); + funcNode.addPredecessor(cfg.getNodeByLine(cfg.getNodes().size())); + cfg.getNodeByLine(cfg.getNodes().size()).addSuccessor(funcNode); + cfg.addNode(funcNode); + Node paramlist = null; if (ctx.paramlist() != null) { @@ -226,7 +235,7 @@ public Node visitFuncdef(FuncdefContext ctx) { * ``` */ public Node visitParamlist(ParamlistContext ctx) { - ArrayList params = new ArrayList(); + ArrayList params = new ArrayList<>(); for (ParamdefContext s : ctx.paramdef()) { params.add(visit(s)); diff --git a/src/reachingDefinition/CFGNode.java b/src/reachingDefinition/CFGNode.java index a5d5899..f105c7b 100644 --- a/src/reachingDefinition/CFGNode.java +++ b/src/reachingDefinition/CFGNode.java @@ -1,10 +1,12 @@ package reachingDefinition; import java.util.*; -public class CFGNode { - private static int line = 1; +/** + * Class representing a node in the Control Flow Graph. + */ - private int id; +public class CFGNode { + private int line; // Set of definitions generated from this node private final Set gen; @@ -20,8 +22,8 @@ public class CFGNode { private final boolean isStmt; - public CFGNode(boolean isStmt) { - this.id = CFGNode.line++; + public CFGNode(int line, boolean isStmt) { + this.line = line; this.gen = new HashSet<>(); this.kill = new HashSet<>(); this.successors = new ArrayList<>(); @@ -35,12 +37,12 @@ public boolean isStmt() { return this.isStmt; } - public int getId() { - return this.id; + public int getLine() { + return this.line; } - public int setId(int id) { - return this.id = id; + public int setLine(int line) { + return this.line = line; } public Set getGen() { @@ -151,7 +153,7 @@ public void removeOut(String var) { public String toPrint(String prefix) { StringBuilder sb = new StringBuilder(); - sb.append(prefix + "Node " + this.id + "\n"); + sb.append(prefix + "Node " + this.line + "\n"); sb.append(prefix + "\tGen: [ "); for (String var : this.gen) { sb.append(var + " "); @@ -162,11 +164,11 @@ public String toPrint(String prefix) { } sb.append("]\n" + prefix + "\tSuccessors: [ "); for (CFGNode node : this.successors) { - sb.append(node.getId() + " "); + sb.append(node.getLine() + " "); } sb.append("]\n" + prefix + "\tPredecessors: [ "); for (CFGNode node : this.predecessors) { - sb.append(node.getId() + " "); + sb.append(node.getLine() + " "); } sb.append("]\n" + prefix + "\tIn: [ "); for (String var : this.in) { diff --git a/src/reachingDefinition/ControlFlowGraph.java b/src/reachingDefinition/ControlFlowGraph.java index a6ade95..93a0ea7 100644 --- a/src/reachingDefinition/ControlFlowGraph.java +++ b/src/reachingDefinition/ControlFlowGraph.java @@ -64,9 +64,9 @@ public void generateGenKillSets() { } } - public CFGNode getNodeById(int id) { + public CFGNode getNodeByLine(int line) { for (CFGNode node : this.nodes) { - if (node.getId() == id) { + if (node.getLine() == line) { return node; } } @@ -118,7 +118,7 @@ public void removeEdge(CFGNode from, CFGNode to) { public String toPrint(String prefix) { StringBuilder sb = new StringBuilder(); sb.append(prefix + "ControlFlowGraph\n"); - sb.append(prefix + "Entry block: " + this.entryBlock.getId() + "\n"); + sb.append(prefix + "Entry block: " + this.entryBlock.getLine() + "\n"); sb.append(prefix + "Nodes:\n"); for (CFGNode node : this.nodes) { sb.append(node.toPrint(prefix + "\t"));