Loading EDG/src/main/java/edg/constraint/ListConstraint.java +1 −1 Original line number Diff line number Diff line Loading @@ -2,7 +2,7 @@ package edg.constraint; public class ListConstraint extends AccessConstraint { public enum Position { H, T, S } public enum Position { H, T, S, HS } // H -> Head // T -> Tail // S -> Structure: Interested in the list structure but not in its elements (Only positive constraints) Loading EDG/src/main/java/edg/constraint/StructuralConstraint.java +4 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,10 @@ public class StructuralConstraint extends EdgeConstraint { constraint = new DataConstructorConstraint(operation, index + "S"); } public StructuralConstraint(Operation operation, ListConstraint.Position position) { constraint = new ListConstraint(operation, ListConstraint.Position.HS); } private StructuralConstraint(AccessConstraint constraint) { this.constraint = constraint; } Loading e-Knife/src/main/java/eknife/erlang/ValueEdgeGenerator.java +35 −14 Original line number Diff line number Diff line Loading @@ -84,9 +84,9 @@ public class ValueEdgeGenerator { // In case the parent is a List this structure is also necessary final Node parent = this.last.getParent(dataConstructor); if (parent.getType() == Node.Type.List) { StructuralConstraint sDc = new StructuralConstraint(AccessConstraint.Operation.Remove, childIndex + "/" + (this.last.getChildren(parent).size()-1)); this.last.addEdge(dataConstructor, parent, Edge.Type.ValueStructure, sDc); StructuralConstraint sLc = new StructuralConstraint(AccessConstraint.Operation.Remove, ListConstraint.Position.HS); this.last.addEdge(dataConstructor, parent, Edge.Type.ValueStructure, sLc); } switch(dataConstructorChild.getType()){ case DataConstructor: Loading Loading @@ -126,6 +126,11 @@ public class ValueEdgeGenerator { } else { this.last.addEdge(head, list, Edge.Type.Value, headConstraint); this.last.addEdge(tail, list, Edge.Type.Value, tailConstraint); if (this.last.getParent(list).getType() == Node.Type.List){ StructuralConstraint sLc = new StructuralConstraint(AccessConstraint.Operation.Remove, ListConstraint.Position.HS); this.last.addEdge(list, this.last.getParent(list), Edge.Type.ValueStructure, sLc); } } } } Loading Loading @@ -218,24 +223,40 @@ public class ValueEdgeGenerator { private void generateGeneratorPatternStructureEdges(Node parent, Node pattern){ switch(pattern.getType()){ case List: if (parent.getType() == Node.Type.Generator) this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, EmptyConstraint.getConstraint()); else { ListConstraint lc = new ListConstraint(AccessConstraint.Operation.Add, ListConstraint.Position.S); this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, lc); } generateGeneratorPatternStructureEdges(pattern); break; case DataConstructor: if (parent.getType() == Node.Type.Generator) this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, EmptyConstraint.getConstraint()); else { switch(parent.getType()){ case List: StructuralConstraint sLc = new StructuralConstraint(AccessConstraint.Operation.Add, ListConstraint.Position.HS); this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, sLc); case DataConstructor: StructuralConstraint sDc = new StructuralConstraint(AccessConstraint.Operation.Add, this.last.getChildIndex(pattern) + "/" + (this.last.getChildren(parent).size()-1)); this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, sDc); } // StructuralConstraint sLc = new StructuralConstraint(AccessConstraint.Operation.Add, ListConstraint.Position.HS); // this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, sLc); } generateGeneratorPatternStructureEdges(pattern); break; // case DataConstructor: // if (parent.getType() == Node.Type.Generator) // this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, EmptyConstraint.getConstraint()); // else { // switch(parent.getType()){ // case List: // StructuralConstraint sLc2 = new StructuralConstraint(AccessConstraint.Operation.Add, ListConstraint.Position.HS); // this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, sLc2); // case DataConstructor: // StructuralConstraint sDc2 = new StructuralConstraint(AccessConstraint.Operation.Add, // this.last.getChildIndex(pattern) + "/" + (this.last.getChildren(parent).size()-1)); // this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, sDc2); // } // } // generateGeneratorPatternStructureEdges(pattern); // break; case Literal: final Node genNode = this.last.getAncestor(parent, Node.Type.Generator); this.last.addEdge(pattern, genNode, Edge.Type.Value, EmptyConstraint.getConstraint()); Loading Loading
EDG/src/main/java/edg/constraint/ListConstraint.java +1 −1 Original line number Diff line number Diff line Loading @@ -2,7 +2,7 @@ package edg.constraint; public class ListConstraint extends AccessConstraint { public enum Position { H, T, S } public enum Position { H, T, S, HS } // H -> Head // T -> Tail // S -> Structure: Interested in the list structure but not in its elements (Only positive constraints) Loading
EDG/src/main/java/edg/constraint/StructuralConstraint.java +4 −0 Original line number Diff line number Diff line Loading @@ -14,6 +14,10 @@ public class StructuralConstraint extends EdgeConstraint { constraint = new DataConstructorConstraint(operation, index + "S"); } public StructuralConstraint(Operation operation, ListConstraint.Position position) { constraint = new ListConstraint(operation, ListConstraint.Position.HS); } private StructuralConstraint(AccessConstraint constraint) { this.constraint = constraint; } Loading
e-Knife/src/main/java/eknife/erlang/ValueEdgeGenerator.java +35 −14 Original line number Diff line number Diff line Loading @@ -84,9 +84,9 @@ public class ValueEdgeGenerator { // In case the parent is a List this structure is also necessary final Node parent = this.last.getParent(dataConstructor); if (parent.getType() == Node.Type.List) { StructuralConstraint sDc = new StructuralConstraint(AccessConstraint.Operation.Remove, childIndex + "/" + (this.last.getChildren(parent).size()-1)); this.last.addEdge(dataConstructor, parent, Edge.Type.ValueStructure, sDc); StructuralConstraint sLc = new StructuralConstraint(AccessConstraint.Operation.Remove, ListConstraint.Position.HS); this.last.addEdge(dataConstructor, parent, Edge.Type.ValueStructure, sLc); } switch(dataConstructorChild.getType()){ case DataConstructor: Loading Loading @@ -126,6 +126,11 @@ public class ValueEdgeGenerator { } else { this.last.addEdge(head, list, Edge.Type.Value, headConstraint); this.last.addEdge(tail, list, Edge.Type.Value, tailConstraint); if (this.last.getParent(list).getType() == Node.Type.List){ StructuralConstraint sLc = new StructuralConstraint(AccessConstraint.Operation.Remove, ListConstraint.Position.HS); this.last.addEdge(list, this.last.getParent(list), Edge.Type.ValueStructure, sLc); } } } } Loading Loading @@ -218,24 +223,40 @@ public class ValueEdgeGenerator { private void generateGeneratorPatternStructureEdges(Node parent, Node pattern){ switch(pattern.getType()){ case List: if (parent.getType() == Node.Type.Generator) this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, EmptyConstraint.getConstraint()); else { ListConstraint lc = new ListConstraint(AccessConstraint.Operation.Add, ListConstraint.Position.S); this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, lc); } generateGeneratorPatternStructureEdges(pattern); break; case DataConstructor: if (parent.getType() == Node.Type.Generator) this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, EmptyConstraint.getConstraint()); else { switch(parent.getType()){ case List: StructuralConstraint sLc = new StructuralConstraint(AccessConstraint.Operation.Add, ListConstraint.Position.HS); this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, sLc); case DataConstructor: StructuralConstraint sDc = new StructuralConstraint(AccessConstraint.Operation.Add, this.last.getChildIndex(pattern) + "/" + (this.last.getChildren(parent).size()-1)); this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, sDc); } // StructuralConstraint sLc = new StructuralConstraint(AccessConstraint.Operation.Add, ListConstraint.Position.HS); // this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, sLc); } generateGeneratorPatternStructureEdges(pattern); break; // case DataConstructor: // if (parent.getType() == Node.Type.Generator) // this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, EmptyConstraint.getConstraint()); // else { // switch(parent.getType()){ // case List: // StructuralConstraint sLc2 = new StructuralConstraint(AccessConstraint.Operation.Add, ListConstraint.Position.HS); // this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, sLc2); // case DataConstructor: // StructuralConstraint sDc2 = new StructuralConstraint(AccessConstraint.Operation.Add, // this.last.getChildIndex(pattern) + "/" + (this.last.getChildren(parent).size()-1)); // this.last.addEdge(pattern, parent, Edge.Type.ValueStructure, sDc2); // } // } // generateGeneratorPatternStructureEdges(pattern); // break; case Literal: final Node genNode = this.last.getAncestor(parent, Node.Type.Generator); this.last.addEdge(pattern, genNode, Edge.Type.Value, EmptyConstraint.getConstraint()); Loading