Commit eeb6ff0e authored by Javier Costa's avatar Javier Costa
Browse files

Done if and while

parent 4cce3a1b
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -3,6 +3,9 @@ package tfm;
import com.github.javaparser.JavaParser;
import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.visitor.VoidVisitor;
import edg.graphlib.Vertex;
import guru.nidi.graphviz.engine.Format;
import guru.nidi.graphviz.engine.Graphviz;
import tfm.graphs.CFGGraph;
import tfm.graphs.Graph;
import tfm.graphs.PDGGraph;
@@ -14,6 +17,7 @@ import tfm.visitors.PDGVisitor;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

import static guru.nidi.graphviz.model.Factory.graph;
import static guru.nidi.graphviz.model.Factory.node;
@@ -22,7 +26,7 @@ public class Main {

    private static long t0;

    public static void main(String[] args) throws FileNotFoundException {
    public static void main(String[] args) throws IOException {
        File file = new File("/home/jacosro/IdeaProjects/TFM/src/main/java/tfm/programs/Example1.java");
        CompilationUnit compilationUnit = JavaParser.parse(file);

@@ -43,8 +47,13 @@ public class Main {
                "*         GRAPHVIZ         *\n" +
                "****************************"
        );
//        Graphviz.fromString(graph.toGraphvizRepresentation()).render(Format.PNG).toFile(new File("graph"));
        Logger.log(graph.toGraphvizRepresentation());
        Logger.log();
//        for (Vertex<?, ?> vertex : graph.getVerticies()) {
//            PDGNode node = (PDGNode) vertex;
//            Logger.format("node %s. Level %s\n", node.getId(), node.getLevel());
//        }
        Logger.format("Done in %.2f ms", (tt - t0) / 10e6);
    }

+1 −0
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ import tfm.arcs.data.ArcData;
import tfm.nodes.Node;

import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
+44 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ import tfm.variables.actions.VariableDefinition;
import javax.swing.plaf.nimbus.State;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public abstract class PDGGraph extends Graph<PDGNode> {

@@ -52,6 +53,21 @@ public abstract class PDGGraph extends Graph<PDGNode> {
        this.addArc(dataDataDependencyArc);
    }

    public List<PDGNode> getNodesAtLevel(int level) {
        return getVerticies().stream()
                .map(vertex -> (PDGNode) vertex)
                .filter(node -> node.getLevel() == level)
                .collect(Collectors.toList());
    }

    public int getLevels() {
        return getVerticies().stream()
                .map(vertex -> (PDGNode) vertex)
                .max(Comparator.comparingInt(PDGNode::getLevel))
                .map(PDGNode::getLevel)
                .get() + 1;
    }

    @Override
    public String toGraphvizRepresentation() {
        String lineSep = System.lineSeparator();
@@ -60,6 +76,33 @@ public abstract class PDGGraph extends Graph<PDGNode> {
                .map(vertex -> ((Node) vertex).toGraphvizRepresentation())
                .collect(Collectors.joining(lineSep));

        StringBuilder rankedNodes = new StringBuilder();

        // No level 0 is needed (only one node)
        for (int i = 0; i < getLevels(); i++) {
            List<PDGNode> levelNodes = getNodesAtLevel(i);

            if (levelNodes.size() <= 1) {
                continue;
            }

            // rank same
            rankedNodes.append("{ rank = same; ")
                    .append(levelNodes.stream()
                        .map(node -> String.valueOf(node.getId()))
                        .collect(Collectors.joining(";")))
                    .append(" }")
                    .append(lineSep);

            // invisible arrows for ordering
            rankedNodes.append(levelNodes.stream()
                        .sorted(Comparator.comparingInt(PDGNode::getId))
                        .map(node -> String.valueOf(node.getId()))
                        .collect(Collectors.joining(" -> ")))
                    .append("[style = invis];")
                    .append(lineSep);
        }

        String arrows =
                getArrows().stream()
                        .sorted(Comparator.comparingInt(arrow -> ((Node) arrow.getFrom()).getId()))
@@ -70,6 +113,7 @@ public abstract class PDGGraph extends Graph<PDGNode> {
        return "digraph g{" + lineSep +
                "splines=true;" + lineSep +
                nodesDeclaration + lineSep +
                rankedNodes.toString() +
                arrows + lineSep +
                "}";
    }
+23 −0
Original line number Diff line number Diff line
@@ -2,10 +2,13 @@ package tfm.nodes;

import com.github.javaparser.ast.stmt.Statement;
import tfm.arcs.Arc;
import tfm.arcs.pdg.ControlDependencyArc;
import tfm.graphs.Graph;
import tfm.graphs.PDGGraph;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class PDGNode extends Node {

@@ -52,4 +55,24 @@ public class PDGNode extends Node {
                controlTo
        );
    }

    public List<ControlDependencyArc> getControlDependencies() {
        return getIncomingArrows().stream()
                .filter(arrow -> ((Arc) arrow).isControlDependencyArrow())
                .map(arc -> (ControlDependencyArc) arc)
                .collect(Collectors.toList());
    }

    public int getLevel() {
        return getLevel(this);
    }

    private int getLevel(PDGNode node) {
        List<ControlDependencyArc> dependencies = node.getControlDependencies();

        if (dependencies.isEmpty())
            return 0;

        return 1 + getLevel((PDGNode) dependencies.get(0).getFrom());
    }
}
+12 −5
Original line number Diff line number Diff line
@@ -8,16 +8,23 @@ public class Example1 {
        int x = 1;
        int y = 2;

        if (x < y) {
//        if (x < y) {
            while (x < y) {
//                y = x;

                while(y < x) {
                    y += x;
                    x = y;
                }

                x++;
            }

            y = x + 1;
        } else {
            x = 4;
            y *= x;
        }
//        } else {
//            x = 4;
//            y *= x;
//        }

        int e = (Integer) x;

Loading