Skip to content
Snippets Groups Projects
Commit 8e6b8d64 authored by Javier Costa's avatar Javier Costa
Browse files

Control dependency on PDGVisitor

parent 25684b8a
No related branches found
No related tags found
No related merge requests found
......@@ -16,28 +16,28 @@ import java.io.FileNotFoundException;
public class Main {
public static void main(String[] args) throws FileNotFoundException {
File file = new File("/home/jacosro/IdeaProjects/TFM/src/main/java/tfm/programs/Example2.java");
File file = new File("/home/jacosro/IdeaProjects/TFM/src/main/java/tfm/programs/Example1.java");
CompilationUnit compilationUnit = JavaParser.parse(file);
CFGGraph cfgGraph = new CFGGraph() {
// CFGGraph cfgGraph = new CFGGraph() {
// @Override
// protected String getRootNodeData() {
// return "Start";
// }
// };
PDGGraph pdgGraph = new PDGGraph() {
@Override
protected String getRootNodeData() {
return "Start";
return "Entry";
}
};
// PDGGraph pdgGraph = new PDGGraph() {
// @Override
// protected String getRootNodeData() {
// return "Entry";
// }
// };
VoidVisitor<Void> voidVisitor = new CFGVisitor(cfgGraph);
VoidVisitor<PDGVertex> voidVisitor = new PDGVisitor(pdgGraph);
compilationUnit.accept(voidVisitor, null);
compilationUnit.accept(voidVisitor, pdgGraph.getRootVertex());
// compilationUnit.accept(new PDGVisitor(pdgGraph), pdgGraph.getRootVertex());
System.out.println(cfgGraph);
System.out.println(cfgGraph.toGraphvizRepresentation());
System.out.println(pdgGraph);
// System.out.println(cfgGraph.toGraphvizRepresentation());
}
}
package tfm.graphlib.arcs.pdg;
import tfm.graphlib.arcs.Arc;
import tfm.graphlib.arcs.data.VoidArcData;
import tfm.graphlib.arcs.data.ArcData;
import tfm.graphlib.nodes.Vertex;
public class ControlDependencyArc extends Arc<VoidArcData> {
public class ControlDependencyArc extends Arc<ArcData> {
public ControlDependencyArc(Vertex from, Vertex to) {
super(from, to);
......@@ -24,4 +24,12 @@ public class ControlDependencyArc extends Arc<VoidArcData> {
public boolean isDataDependencyArrow() {
return false;
}
@Override
public String toString() {
return String.format("ControlDependencyArc{%s -> %s}",
((Vertex) getFrom()).getId(),
((Vertex) getTo()).getId()
);
}
}
package tfm.graphlib.graphs;
import com.github.javaparser.ast.Node;
import edg.graphlib.Arrow;
import tfm.graphlib.arcs.cfg.ControlFlowArc;
import tfm.graphlib.arcs.data.ArcData;
import tfm.graphlib.arcs.data.VoidArcData;
import tfm.graphlib.nodes.CFGVertex;
public abstract class CFGGraph extends Graph<CFGVertex> {
......
package tfm.graphlib.nodes;
import tfm.graphlib.arcs.data.ArcData;
import tfm.graphlib.arcs.data.VoidArcData;
import tfm.graphlib.graphs.Graph;
......
......@@ -14,29 +14,31 @@ public class PDGVertex extends Vertex {
}
public String toString() {
List<Arc> dataFrom = new ArrayList<>();
List<Arc> dataTo = new ArrayList<>();
List<Arc> controlFrom = new ArrayList<>();
List<Arc> controlTo = new ArrayList<>();
List<Integer> dataFrom = new ArrayList<>();
List<Integer> dataTo = new ArrayList<>();
List<Integer> controlFrom = new ArrayList<>();
List<Integer> controlTo = new ArrayList<>();
getIncomingArrows().forEach(arrow -> {
Arc arc = (Arc) arrow;
Vertex from = (Vertex) arc.getFrom();
if (arc.isDataDependencyArrow()) {
dataFrom.add(arc);
dataFrom.add(from.getId());
} else if (arc.isControlDependencyArrow()) {
controlFrom.add(arc);
controlFrom.add(from.getId());
}
});
getOutgoingArrows().forEach(arrow -> {
Arc arc = (Arc) arrow;
Vertex to = (Vertex) arc.getTo();
if (arc.isDataDependencyArrow()) {
dataTo.add(arc);
dataTo.add(to.getId());
} else if (arc.isControlDependencyArrow()) {
controlTo.add(arc);
controlTo.add(to.getId());
}
});
......
package tfm.graphlib.utils;
import com.github.javaparser.ast.expr.AssignExpr;
import com.github.javaparser.ast.expr.Expression;
import com.github.javaparser.ast.expr.VariableDeclarationExpr;
import com.github.javaparser.ast.stmt.ExpressionStmt;
import java.util.ArrayList;
import java.util.List;
public class VariableExtractor {
private List<String> declaredVariables;
private List<String> usedVariables;
private VariableExtractor() {
declaredVariables = new ArrayList<>();
usedVariables = new ArrayList<>();
}
public static VariableExtractor parse(Expression expression) {
VariableExtractor extractor = new VariableExtractor();
extractor.parse(expression);
return extractor;
}
private void parse(AssignExpr assignExpr) {
}
private void parse(VariableDeclarationExpr variableDeclarationExpr) {
}
}
package tfm.graphlib.visitors;
import com.github.javaparser.ast.expr.AssignExpr;
import com.github.javaparser.ast.stmt.ExpressionStmt;
import com.github.javaparser.ast.stmt.IfStmt;
import com.github.javaparser.ast.stmt.WhileStmt;
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
import tfm.graphlib.arcs.data.ArcData;
import tfm.graphlib.arcs.data.VoidArcData;
import tfm.graphlib.graphs.PDGGraph;
import tfm.graphlib.nodes.PDGVertex;
......@@ -16,11 +17,37 @@ public class PDGVisitor extends VoidVisitorAdapter<PDGVertex> {
}
@Override
public void visit(ExpressionStmt n, PDGVertex arg) {
PDGVertex node = graph.addVertex(n.getExpression().toString());
public void visit(ExpressionStmt n, PDGVertex parent) {
PDGVertex expressionNode = graph.addVertex(n.getExpression().toString());
graph.addControlDependencyArc(arg, node);
graph.addControlDependencyArc(parent, expressionNode);
super.visit(n, arg);
n.getExpression().ifAssignExpr(assignExpr -> {
assignExpr.getTarget().ifVariableDeclarationExpr(variableDeclarationExpr -> {
variableDeclarationExpr.getVariables().forEach(variableDeclarator -> {
String name = variableDeclarator.getName().asString();
});
});
});
super.visit(n, parent);
}
@Override
public void visit(IfStmt ifStmt, PDGVertex parent) {
PDGVertex ifNode = graph.addVertex(ifStmt.getCondition().toString());
graph.addControlDependencyArc(parent, ifNode);
super.visit(ifStmt, ifNode);
}
@Override
public void visit(WhileStmt whileStmt, PDGVertex parent) {
PDGVertex whileNode = graph.addVertex(whileStmt.getCondition().toString());
graph.addControlDependencyArc(parent, whileNode);
super.visit(whileStmt, whileNode);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment