Ladies_Man

#Codegen Lab3 SSA-form COMPLETE

Oct 24th, 2016
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 23.50 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. public class optlab3 {
  4.  
  5.     Map<Vertex, Set<Vertex>> dominanceFrontier;
  6.     Map<Var, Set<Vertex>> varToUsageVertices;
  7.     Set<Var> uniqueVaribales;
  8.     Set<Vertex> postOrder;
  9.     Vertex root;
  10.     List<Integer> stack;
  11.     int counter;
  12.  
  13.     private boolean compareVertexSets(Set<Vertex> a, Set<Vertex> b) {
  14.         return a.size() == b.size();
  15.     }
  16.  
  17.     private void postOrder(Vertex v) {
  18.         v.succs.forEach(this::postOrder);
  19.         postOrder.add(v);
  20.     }
  21.  
  22.     private void generatePostOrder(Vertex root) {
  23.         System.out.println("Post order:");
  24.  
  25.         postOrder(root);
  26.  
  27.         postOrder.forEach(v -> System.out.print(v.name.toUpperCase() + " "));
  28.         System.out.println();
  29.     }
  30.  
  31.     private void generateVarToUsageVertices() {
  32.  
  33.         this.postOrder.forEach(v -> {
  34.             v.statements.forEach(stmt -> {
  35.                 Set<Vertex> additionalSet = varToUsageVertices.containsKey(stmt.lhs) ?
  36.                         varToUsageVertices.get(stmt.lhs) : new HashSet<Vertex>();
  37.  
  38.                 additionalSet.add(v);
  39.                 varToUsageVertices.put(stmt.lhs, additionalSet);
  40.             });
  41.         });
  42.  
  43.  
  44.         System.out.println("Var to UsageVertices:");
  45.         for (Var v : varToUsageVertices.keySet()) {
  46.             Set<Vertex> vSet = varToUsageVertices.get(v);
  47.             String s = "";
  48.             for (Vertex x : vSet)
  49.                 s += x.name.toUpperCase() + " ";
  50.             System.out.println("var: " + v.name + ": [" + s + "]");
  51.         }
  52.         System.out.println();
  53.     }
  54.  
  55.     private void generateDFGlobal() {
  56.  
  57.         postOrder.forEach(x -> {
  58.             dominanceFrontier.put(x, new HashSet<Vertex>());
  59.             x.succs.forEach(succ -> {
  60.                 if (x != succ.immediateDom) {
  61.                     dominanceFrontier.get(x).add(succ);
  62.  
  63.                     System.out.println("added succ " + succ.name);
  64.                 }
  65.             });
  66.             x.children.forEach(child -> {
  67.                 if (null != dominanceFrontier.get(child)) {
  68.                     dominanceFrontier.get(child).forEach(y -> {
  69.                         if (x != y.immediateDom) {
  70.                             dominanceFrontier.get(x).add(y);
  71.  
  72.                             System.out.println("added child " + y.name);
  73.                         }
  74.                     });
  75.                 }
  76.             });
  77.         });
  78.  
  79.  
  80.         System.out.println("Dominance Frontier:");
  81.         for (Vertex v : postOrder) {
  82.             Set<Vertex> vSet = dominanceFrontier.get(v);
  83.             String s = "";
  84.             for (Vertex x : vSet)
  85.                 s += x.name.toUpperCase() + " ";
  86.             System.out.println("vert: " + v.name.toUpperCase() + ": [" + s + "]");
  87.         }
  88.         System.out.println();
  89.     }
  90.  
  91.     private Set<Vertex> generateDFSet(Set<Vertex> vertexSet) {
  92.  
  93.         Set<Vertex> res = new HashSet<>();
  94.         vertexSet.forEach(x -> res.addAll(dominanceFrontier.get(x)));
  95.  
  96.  
  97.         String src = "";
  98.         for (Vertex x : vertexSet)
  99.             src += x.name.toUpperCase() + " ";
  100.  
  101.         System.out.println("DF-Set for [" + src + "]:");
  102.         String s = "";
  103.         for (Vertex x : res)
  104.             s += x.name.toUpperCase() + " ";
  105.         System.out.println("[" + s + "]");
  106.  
  107.         return res;
  108.     }
  109.  
  110.     private Set<Vertex> generateDFPSet(Set<Vertex> vertexSet) {
  111.  
  112.         Set<Vertex> res = new HashSet<Vertex>();
  113.         Set<Vertex> DFP = generateDFSet(vertexSet);
  114.         boolean change;
  115.  
  116.         do {
  117.             change = false;
  118.  
  119.             DFP.addAll(vertexSet);
  120.             DFP = generateDFSet(DFP);
  121.  
  122.             if (!compareVertexSets(DFP, res)) {
  123.                 res = new HashSet<>(DFP);
  124.                 change = true;
  125.             }
  126.         } while (change);
  127.  
  128.         return res;
  129.     }
  130.  
  131.     private void placePhi() {
  132.  
  133.         for (Var k : varToUsageVertices.keySet()) {
  134.  
  135.             System.out.println(k.name + ":");
  136.             Set<Vertex> phiSet = generateDFPSet(varToUsageVertices.get(k));
  137.  
  138.             for (Vertex x : phiSet) {
  139.  
  140.                 System.out.println("placing PHI");
  141.                 PhiStmt phi = new PhiStmt(x, k);
  142.  
  143.                 x.phis.add(phi);
  144.                 x.prependStmt(phi);
  145.             }
  146.  
  147.         }
  148.     }
  149.  
  150.     private int whichPred(Vertex childVertexToBeSearchedWithin,
  151.                           Vertex ancestorVertexToBeSearhedFor) {
  152.  
  153.         return childVertexToBeSearchedWithin.precs.indexOf(ancestorVertexToBeSearhedFor);
  154.     }
  155.  
  156.     String currTrav, prevTrav;
  157.  
  158.     private void traverse(Vertex v, Var p) {
  159.         currTrav = v.name;
  160.         //if (currTrav.equals(prevTrav)) return;
  161.  
  162.         System.out.println("\nTRV " + v.name.toUpperCase() +
  163.                 " [" + p.name + ", s: " + stack + ", ctr: " + counter + "]:");
  164.         //System.out.println("curr: " + currTrav + " prev: " + prevTrav);
  165.  
  166.         for (Stmt stmt : v.statements) {
  167.             System.out.println("  stmt: " + stmt);
  168.  
  169.             if (!stmt.isPhi) {
  170.                 System.out.print("    Rhs: " + stmt + " \t-> ");
  171.  
  172.                 stmt.renameRhsVar(p.name, stack.get(stack.size() - 1));
  173.  
  174.                 System.out.println(stmt);
  175.             }
  176.  
  177.             if (stmt.isAss && stmt.lhs.equals(p)) {
  178.                 System.out.print("    Lhs: " + stmt + " \t-> ");
  179.  
  180.                 stmt.renameLhsVar(p.name, counter);
  181.                 stack.add(counter);
  182.                 counter++;
  183.  
  184.                 System.out.println(stmt + " ctr++");
  185.             }
  186.         }
  187.  
  188.         System.out.println("s: " + stack + ", ctr: " + counter);
  189.  
  190.         v.succs.forEach(succ -> {
  191.  
  192.             int j = whichPred(succ, v);
  193.  
  194.             if (-1 != j) {
  195.                 System.out.println("  " + j + " = whichPred(" + succ.name + ", " + v.name + ")");
  196.                 System.out.println("  phis:");
  197.  
  198.                 succ.phis.forEach(phiStmt -> {
  199.                     if (p.equals(phiStmt.lhs)) {
  200.  
  201.                         System.out.print("    " + phiStmt + " \t-> ");
  202.  
  203.                         phiStmt.updateRhsVarVersion(stack.get(stack.size() - 1), j);
  204.  
  205.                         System.out.println(phiStmt);
  206.                     }
  207.  
  208.                 });
  209.             }
  210.         });
  211.  
  212.         prevTrav = v.name;
  213.  
  214.         v.children.forEach(child -> traverse(child, p));
  215.  
  216.         v.statements.forEach(stmt -> {
  217.             if (stmt.lhs.equals(p))
  218.                 stack.remove(stack.size() - 1);
  219.         });
  220.     }
  221.  
  222.     private void renameSingleVar(Var p) {
  223.  
  224.         stack.clear();
  225.         stack.add(0);
  226.         counter = 0;
  227.  
  228.         traverse(root, p);
  229.     }
  230.  
  231.     private void renameVars() {
  232.         this.varToUsageVertices.keySet().forEach(this::renameSingleVar);
  233.     }
  234.  
  235.  
  236.     /*
  237.     //   [A]
  238.     //  /   \
  239.     // [B]  [C]
  240.     //  \   /
  241.     //   [D]
  242.      */
  243.     private void buildCFGSample2() {
  244.  
  245.  
  246.  
  247.         Vertex a = new Vertex("a");
  248.         Vertex b = new Vertex("b");
  249.         Vertex c = new Vertex("c");
  250.         Vertex d = new Vertex("d");
  251.  
  252.         root = a;
  253.  
  254.         //=================== A ===================
  255.         Var leftPartA1 = new Var("x", "=");
  256.         Expr rightPartA1 = new Expr();
  257.         rightPartA1.vars.add(new Var("5"));
  258.         Expr rightPartA2 = new Expr();
  259.         rightPartA2.vars.add(new Var("x", "-"));
  260.         rightPartA2.vars.add(new Var("3"));
  261.         Expr rightPartA3 = new Expr();
  262.         rightPartA3.vars.add(new Var("1"));
  263.  
  264.         a.statements.add(new AssStmt(leftPartA1, rightPartA1));
  265.         a.statements.add(new AssStmt(new Var("x", "="), rightPartA2));
  266.         a.statements.add(new AssStmt(new Var("y", "="), rightPartA3));
  267.         a.statements.add(new BranchStmt(new Var("x"), "<", new Var("3"), b, c));
  268.         a.children.add(b);
  269.         a.children.add(d);
  270.         a.children.add(c);
  271.         a.succs.add(b);
  272.         a.succs.add(c);
  273.         a.succs.add(d);
  274.         a.immediateDom = null;
  275.  
  276.  
  277.         //=================== B ===================
  278.         Var leftPartB = new Var("t", "=");
  279.         Expr rightPartB1 = new Expr();
  280.         rightPartB1.vars.add(new Var("x", "*"));
  281.         rightPartB1.vars.add(new Var("2"));
  282.         Expr rightPartB2 = new Expr();
  283.         rightPartB2.vars.add(new Var("y"));
  284.  
  285.         b.statements.add(new AssStmt(new Var("y", "="), rightPartB1));
  286.         b.statements.add(new AssStmt(new Var("w", "="), rightPartB2));
  287.         b.precs.add(a);
  288.         b.succs.add(d);
  289.         b.immediateDom = a;
  290.  
  291.  
  292.         //=================== C ===================
  293.         Expr rightPartC1 = new Expr();
  294.         rightPartC1.vars.add(new Var("x", "-"));
  295.         rightPartC1.vars.add(new Var("3", "+"));
  296.         rightPartC1.vars.add(new Var("y", "*"));
  297.         rightPartC1.vars.add(new Var("y"));
  298.         Expr rightPartC2 = new Expr();
  299.         rightPartC2.vars.add(new Var("z", "+"));
  300.         rightPartC2.vars.add(new Var("9"));
  301.         Expr rightPartC3 = new Expr();
  302.         rightPartC3.vars.add(new Var("y"));
  303.  
  304.         c.statements.add(new AssStmt(new Var("y", "="), rightPartC1));
  305.         c.statements.add(new AssStmt(new Var("x", "="), rightPartC2));
  306.         c.statements.add(new AssStmt(new Var("x", "="), rightPartC3));
  307.         c.precs.add(b);
  308.         c.succs.add(d);
  309.         c.immediateDom = a;
  310.  
  311.  
  312.         //=================== D ===================
  313.         Expr rightPartD1 = new Expr();
  314.         rightPartD1.vars.add(new Var("x", "-"));
  315.         rightPartD1.vars.add(new Var("y"));
  316.         Expr rightPartD2 = new Expr();
  317.         rightPartD2.vars.add(new Var("x", "+"));
  318.         rightPartD2.vars.add(new Var("y"));
  319.         Expr rightPartD1Phi1 = new Expr();
  320.         rightPartD1Phi1.vars.add(new Var("y"));
  321.  
  322.         d.statements.add(new AssStmt(new Var("w", "="), rightPartD1));
  323.         d.statements.add(new AssStmt(new Var("z", "="), rightPartD2));
  324.         d.precs.add(b);
  325.         d.precs.add(c);
  326.         d.immediateDom = a;
  327.  
  328.         generatePostOrder(a);
  329.     }
  330.  
  331.     /*
  332.     //    /[ A ]\
  333.     //   /   |   \
  334.     //  /    |    \
  335.     // [B]  [C]   [D]
  336.     //  \    |    /
  337.     //   \   |   /
  338.     //    \[ E ]/
  339.      */
  340.     private void buildCFGSample3() {
  341.  
  342.         Vertex a = new Vertex("a");
  343.         Vertex b = new Vertex("b");
  344.         Vertex c = new Vertex("c");
  345.         Vertex d = new Vertex("d");
  346.         Vertex e = new Vertex("e");
  347.  
  348.         root = a;
  349.  
  350.         //=================== A ===================
  351.         Expr rightPartA1 = new Expr();
  352.         rightPartA1.vars.add(new Var("5"));
  353.         Expr rightPartA2 = new Expr();
  354.         rightPartA2.vars.add(new Var("x", "-"));
  355.         rightPartA2.vars.add(new Var("3"));
  356.         Expr rightPartA3 = new Expr();
  357.         rightPartA3.vars.add(new Var("1"));
  358.  
  359.         a.statements.add(new AssStmt(new Var("x", "="), rightPartA1));
  360.         a.statements.add(new AssStmt(new Var("w", "="), rightPartA2));
  361.         a.statements.add(new AssStmt(new Var("y", "="), rightPartA3));
  362.         a.statements.add(new BranchStmt(new Var("y"), "<", new Var("3"), b, c));
  363.         a.children.add(b);
  364.         a.children.add(c);
  365.         a.children.add(d);
  366.         a.children.add(e);
  367.         a.succs.add(b);
  368.         a.succs.add(c);
  369.         a.succs.add(d);
  370.         a.succs.add(e);
  371.  
  372.  
  373.         //=================== B ===================
  374.         Expr rightPartB1 = new Expr();
  375.         rightPartB1.vars.add(new Var("x", "*"));
  376.         rightPartB1.vars.add(new Var("(2", "-"));
  377.         rightPartB1.vars.add(new Var("y", "+"));
  378.         rightPartB1.vars.add(new Var("x", ")"));
  379.         Expr rightPartB2 = new Expr();
  380.         rightPartB2.vars.add(new Var("y"));
  381.  
  382.         b.statements.add(new AssStmt(new Var("y", "="), rightPartB1));
  383.         b.statements.add(new AssStmt(new Var("w", "="), rightPartB2));
  384.         b.precs.add(a);
  385.         b.succs.add(e);
  386.         b.immediateDom = a;
  387.  
  388.  
  389.         //=================== C ===================
  390.         Expr rightPartC1 = new Expr();
  391.         rightPartC1.vars.add(new Var("x", "-"));
  392.         rightPartC1.vars.add(new Var("3", "+"));
  393.         rightPartC1.vars.add(new Var("y", "*"));
  394.         rightPartC1.vars.add(new Var("y"));
  395.         Expr rightPartC2 = new Expr();
  396.         rightPartC2.vars.add(new Var("z", "+"));
  397.         rightPartC2.vars.add(new Var("9"));
  398.         Expr rightPartC3 = new Expr();
  399.         rightPartC3.vars.add(new Var("y"));
  400.  
  401.         //c.statements.add(new AssStmt(new Var("y", "="), rightPartC1));
  402.         c.statements.add(new AssStmt(new Var("w", "="), rightPartC2));
  403.         //c.statements.add(new AssStmt(new Var("x", "="), rightPartC3));
  404.         c.precs.add(a);
  405.         c.succs.add(e);
  406.         c.immediateDom = a;
  407.  
  408.  
  409.         //=================== D ===================
  410.         Expr rightPartD1 = new Expr();
  411.         rightPartD1.vars.add(new Var("x", "-"));
  412.         rightPartD1.vars.add(new Var("3"));
  413.         Expr rightPartD2 = new Expr();
  414.         rightPartD2.vars.add(new Var("x", "+"));
  415.         rightPartD2.vars.add(new Var("y))"));
  416.         Expr rightPartD3 = new Expr();
  417.         rightPartD3.vars.add(new Var("z", "-"));
  418.         rightPartD3.vars.add(new Var("3", "*"));
  419.         rightPartD3.vars.add(new Var("(5", "+"));
  420.         rightPartD3.vars.add(new Var("w", "+"));
  421.         rightPartD3.vars.add(new Var("y", ")"));
  422.  
  423.         d.statements.add(new AssStmt(new Var("w", "="), rightPartD1));
  424.         d.statements.add(new AssStmt(new Var("y", "="), rightPartD2));
  425.         d.statements.add(new AssStmt(new Var("w", "="), rightPartD3));
  426.         d.precs.add(a);
  427.         d.succs.add(e);
  428.         d.immediateDom = a;
  429.  
  430.         //=================== E ===================
  431.         Expr rightPartE1 = new Expr();
  432.         rightPartE1.vars.add(new Var("y"));
  433.         Expr rightPartE2 = new Expr();
  434.         rightPartE2.vars.add(new Var("x", "*"));
  435.         rightPartE2.vars.add(new Var("w"));
  436.  
  437.         e.statements.add(new AssStmt(new Var("x", "="), rightPartE1));
  438.         e.statements.add(new AssStmt(new Var("z", "="), rightPartE2));
  439.         e.precs.add(b);
  440.         e.precs.add(c);
  441.         e.precs.add(d);
  442.         e.immediateDom = a;
  443.  
  444.         generatePostOrder(a);
  445.     }
  446.  
  447.     public static void main(String args[]) {
  448.         optlab3 CFG = new optlab3();
  449.  
  450.         CFG.buildCFGSample3();
  451.  
  452.         CFG.generateDFGlobal();
  453.         CFG.generateVarToUsageVertices();
  454.  
  455.         CFG.printBaseBlocks();
  456.  
  457.         CFG.placePhi();
  458.  
  459.         CFG.renameVars();
  460.  
  461.         CFG.printGraph(3);
  462.         CFG.printBaseBlocks();
  463.     }
  464.  
  465.  
  466.  
  467.     private optlab3() {
  468.         this.postOrder = new LinkedHashSet<>();
  469.         this.dominanceFrontier = new HashMap<Vertex, Set<Vertex>>();
  470.         this.uniqueVaribales = new HashSet<Var>();
  471.         this.varToUsageVertices = new HashMap<Var, Set<Vertex>>();
  472.         this.stack = new ArrayList<Integer>();
  473.     }
  474.  
  475.     private void printGraph(int n) {
  476.         String str = "No graph representation";
  477.         switch (n) {
  478.             case 1:
  479.                 str = "\n" +
  480.                 "   [A]\n" +
  481.                 "  /   \\\n" +
  482.                 " [B]  [C]";
  483.                 break;
  484.             case 2:
  485.                 str = "\n" +
  486.                     "   [A]\n" +
  487.                     "  /   \\\n" +
  488.                     " [B]  [C]\n" +
  489.                     "  \\   /\n" +
  490.                     "   [D]";
  491.                 break;
  492.             case 3:
  493.                 str = "\n" +
  494.                     "    /[ A ]\\\n" +
  495.                     "   /   |   \\\n" +
  496.                     "  /    |    \\\n" +
  497.                     " [B]  [C]   [D]\n" +
  498.                     "  \\    |    /\n" +
  499.                     "   \\   |   /\n" +
  500.                     "    \\[ E ]/";
  501.                 break;
  502.             default:
  503.                 break;
  504.         }
  505.         System.out.println(str);
  506.     }
  507.  
  508.     private void printBaseBlocks() {
  509.         System.out.println("\n->");
  510.         dominanceFrontier.keySet().forEach(System.out::println);
  511.     }
  512.  
  513.    
  514. }
  515.  
  516.  
  517.  
  518.  
  519.  
  520. import java.util.*;
  521.  
  522. /**
  523.  * Created by anthony on 02.10.16.
  524.  */
  525. class Vertex implements Comparable<Vertex>{
  526.     String name;
  527.  
  528.     List<Vertex> precs;
  529.     Set<Vertex> succs;          //potomki v CFG
  530.     Set<Vertex> children;       //potomki v DOM tree
  531.  
  532.     Vertex immediateDom;        //the one and only and blizhaishiy
  533.  
  534.     List<Stmt> statements;
  535.     List<Stmt> phis;
  536.  
  537.     public void prependStmt(Stmt s) {
  538.         List<Stmt> tmp = new ArrayList<>(statements);
  539.         this.statements = new ArrayList<>();
  540.         this.statements.add(s);
  541.         this.statements.addAll(tmp);
  542.     }
  543.  
  544.     Vertex(String name) {
  545.         this.precs = new ArrayList<Vertex>();
  546.         this.succs = new HashSet<Vertex>();
  547.         this.children = new HashSet<Vertex>();
  548.  
  549.         this.statements = new ArrayList<Stmt>();
  550.         this.phis = new ArrayList<Stmt>();
  551.  
  552.         this.name = name;
  553.  
  554.         this.immediateDom = null;
  555.     }
  556.  
  557.     @Override
  558.     public int compareTo(Vertex o) {
  559.         return this.name.compareTo(o.name);
  560.     }
  561.  
  562.     @Override
  563.     public int hashCode() {
  564.         return name.hashCode() < 0 ? -name.hashCode() : name.hashCode();
  565.     }
  566.  
  567.     @Override
  568.     public boolean equals(Object o) {
  569.         if (this == o) return true;
  570.         if (o == null || getClass() != o.getClass()) return false;
  571.  
  572.         return ((Vertex)o).name.equals(this.name);
  573.     }
  574.  
  575.     @Override
  576.     public String toString() {
  577.         String stmts = "\n ";
  578.         for (Stmt s : statements)
  579.             stmts += "\t" + s.toString() + "\n";
  580.         stmts = stmts.substring(0, stmts.length() - 2);
  581.         return name.toUpperCase() + ": {" + stmts + "}\n";
  582.     }
  583. }
  584.  
  585.  
  586.  
  587.  
  588. /**
  589.  * Created by anthony on 02.10.16.
  590.  */
  591. public class AssStmt extends Stmt{
  592.  
  593.  
  594.     AssStmt(Var lhs, Expr rhs) {
  595.         this.lhs = lhs;
  596.         this.rhs = rhs;
  597.         this.isPhi = false;
  598.         this.isAss = true;
  599.     }
  600.  
  601.     @Override
  602.     public String toString() {
  603.         String s = lhs.toString();
  604.         for (Var v : rhs.vars) s += v.toString();
  605.         return s;
  606.     }
  607.  
  608.     @Override
  609.     public boolean updateRhsVarVersion(int version, int indexInRhs) {
  610.         return false;
  611.     }
  612. }
  613.  
  614.  
  615.  
  616.  
  617. /**
  618.  * Created by anthony on 02.10.16.
  619.  */
  620. public class PhiStmt extends Stmt{
  621.  
  622.     //i-th argument corresponds to i-th node of ancestors set
  623.  
  624.     PhiStmt(Vertex v, Var p) {
  625.         this.lhs = p;
  626.         this.rhs = new Expr();
  627.         this.isPhi = true;
  628.         this.isAss = true;
  629.  
  630.         v.precs.forEach(prec -> this.rhs.vars.add(p));
  631.         System.out.println(this.rhs.vars.size() + " vars were added into phi");
  632.     }
  633.  
  634.     @Override
  635.     public boolean updateRhsVarVersion(int version, int indexInRhs) {
  636.         if (this.rhs.vars.size() <= indexInRhs || -1 == indexInRhs)
  637.             return false;
  638.  
  639.         Var t = new Var(this.rhs.vars.get(indexInRhs).name);
  640.         t.version = version;
  641.         this.rhs.vars.set(indexInRhs, t);
  642.         return true;
  643.     }
  644.  
  645.     @Override
  646.     public String toString() {
  647.         String s =  lhs.toString() + "Ф( ";
  648.         for (Var v : rhs.vars)
  649.             s += v.name + "_" + v.version + " | ";
  650.         s = s.substring(0, s.length() - 2) + ")";
  651.         return s;
  652.     }
  653. }
  654.  
  655.  
  656.  
  657.  
  658.  
  659. import java.util.ArrayList;
  660.  
  661. /**
  662.  * Created by anthony on 02.10.16.
  663.  */
  664. public class BranchStmt extends Stmt{
  665.  
  666.     private String condition;
  667.     private Vertex positive;
  668.     private Vertex negative;
  669.  
  670.     @Override
  671.     public void renameRhsVar(String varName, int varVersion) {
  672.         //this.lhs = new Var(varName, varVersion);
  673.         this.lhs.version = varVersion;
  674.     }
  675.  
  676.     @Override
  677.     public boolean updateRhsVarVersion(int version, int indexInRhs) {
  678.         return false;
  679.     }
  680.  
  681.     BranchStmt(Var left, String condition, Var right, Vertex positive, Vertex negative) {
  682.         this.lhs = new Var(left.name);
  683.         this.rhs = new Expr();
  684.         this.rhs.vars.add(right);
  685.  
  686.         this.negative = negative;
  687.         this.positive = positive;
  688.  
  689.         this.isPhi = false;
  690.         this.isAss = false;
  691.         this.condition = condition;
  692.     }
  693.  
  694.     @Override
  695.     public String toString() {
  696.         String s = this.lhs.name + "_" + this.lhs.version + " " + this.condition + " " + this.rhs.vars.get(0).name +
  697.             " ? " + positive.name.toUpperCase() + " : " + negative.name.toUpperCase() + " ";
  698.         return s;
  699.     }
  700. }
  701.  
  702.  
  703.  
  704.  
  705. /**
  706.  * Created by anthony on 02.10.16.
  707.  */
  708. public abstract class Stmt {
  709.     Var lhs;
  710.     Expr rhs;
  711.  
  712.     boolean isPhi;
  713.     boolean isAss;
  714.  
  715.  
  716.  
  717.     public void renameRhsVar(String varName, int varVersion) {
  718.         int i = 0;
  719.         for (Var v : this.rhs.vars) {
  720.             if (varName.equals(v.name)) {
  721.                 Var t = new Var(varName, varVersion);
  722.                 t.sign = v.sign;
  723.                 this.rhs.vars.set(i, t);
  724.             }
  725.             i++;
  726.         }
  727.     }
  728.  
  729.     public boolean renameLhsVar(String varName, int varVersion) {
  730.         if (varName.equals(this.lhs.name)) {
  731.             Var t = new Var(varName, varVersion);
  732.             t.sign = "=";
  733.             this.lhs = t;
  734.             return true;
  735.         }
  736.         return false;
  737.     }
  738.  
  739.     public abstract boolean updateRhsVarVersion(int version, int indexInRhs);
  740.  
  741. }
  742.  
  743.  
  744.  
  745.  
  746. /**
  747.  * Created by anthony on 02.10.16.
  748.  */
  749.  
  750. public class Var {
  751.  
  752.     String name;
  753.     int version;
  754.     String sign;
  755.  
  756.     String rightPar;
  757.  
  758.     Var(String name, int version) {
  759.         this.rightPar = name.contains(")") ? ")+" : "";
  760.         this.name = name.contains(")") ? name.substring(0, 1) : name;
  761.         this.version = version;
  762.         this.sign = "";
  763.     }
  764.     Var(String name, String sign) {
  765.         this.rightPar = name.contains(")") ? ")+" : "";
  766.         this.name = name.contains(")") ? name.substring(0, 1) : name;
  767.         this.version = !"".equals(name) ? 0 : -1;
  768.         this.sign = sign;
  769.     }
  770.     Var(String name) {
  771.         this.rightPar = name.contains(")") ? ")+" : "";
  772.         this.name = name.contains(")") ? name.substring(0, 1) : name;
  773.         this.version = !"".equals(name) ? 0 : -1;
  774.         this.sign = "";
  775.     }
  776.  
  777.     private boolean isNumeric(String s) {
  778.         return s.matches("[-+()]?\\d*\\.?\\d+");
  779.     }
  780.  
  781.     @Override
  782.     public boolean equals(Object o) {
  783.         if (this == o) return true;
  784.         if (o == null || getClass() != o.getClass()) return false;
  785.  
  786.         return ((Var)o).name.equals(this.name);
  787.     }
  788.  
  789.     @Override
  790.     public int hashCode() {
  791.         return (name.hashCode() < 0) ? -name.hashCode() : name.hashCode();
  792.     }
  793.  
  794.     @Override
  795.     public String toString() {
  796.         String nameAndIndex = this.isNumeric(this.name) ? this.name : this.name + "_" + this.version + rightPar;
  797.  
  798.         return nameAndIndex + " " + this.sign + " ";
  799.     }
  800. }
  801.  
  802.  
  803.  
  804.  
  805.  
  806. import java.util.ArrayList;
  807. import java.util.List;
  808.  
  809. /**
  810.  * Created by anthony on 02.10.16.
  811.  */
  812. public class Expr {
  813.  
  814.     public List<Var> vars;
  815.  
  816.     Expr() {
  817.         this.vars = new ArrayList<Var>();
  818.         //this.vars.add(new Var("", ";"));
  819.     }
  820.     /*
  821.     void append(Var vs) {
  822.         Var enderVS = vars.get(vars.size() - 1);
  823.         vars.set(vars.size() - 1, vs);
  824.         vars.add(enderVS);
  825.     }
  826.  
  827.     public Var getLast() {
  828.         return vars.size() > 1 ? vars.get(vars.size() - 1) : null;
  829.     }
  830.  
  831.     List<Var> getVars() {
  832.         List<Var> clearList = new ArrayList<>(this.vars);
  833.         clearList.remove(this.vars.size() - 1);
  834.         return clearList;
  835.     }
  836.  
  837.     Var getVarByIndex(int version) {
  838.         return vars.size() > 1 ? vars.get(version) : null;
  839.     }
  840.  
  841.     void setVarByIndex(int version, Var v) {
  842.         this.vars.set(version, v);
  843.     }
  844.     */
  845.     @Override
  846.     public String toString() {
  847.         String e = "";
  848.         for (Var v : vars)
  849.             e += v.toString();
  850.         return e;
  851.     }
  852. }
Advertisement
Add Comment
Please, Sign In to add comment