・出力するコードをTypeDeclarationのリストではなくて、CompilationUnitのリストにした。
・アルゴリズムのクラス名を論文に合わせた。
・メインクラスの名前を変更できるようにした。
・Editor内のファイル読み込み時の処理を整理した。
1 parent 68d977b commit daa83d498a62c2aa0377e56002225d51718db7f8
n-nittta authored on 3 May 2020
Showing 16 changed files
View
27
AlgebraicDataflowArchitectureModel/src/algorithms/CodeGenerator.java
 
import java.util.ArrayList;
 
import code.ast.Block;
import code.ast.CompilationUnit;
import code.ast.FieldDeclaration;
import code.ast.MethodDeclaration;
import code.ast.TypeDeclaration;
import code.ast.VariableDeclaration;
import models.dataFlowModel.StoreAttribute;
 
public class CodeGenerator {
public static final Type typeVoid = new Type("Void", "void");
 
static public ArrayList<TypeDeclaration> doGenerate(ResourceDependencyGraph graph, DataFlowModel model) {
ArrayList<TypeDeclaration> codes = new ArrayList<>();
public static String mainTypeName = "Main";
 
static public ArrayList<CompilationUnit> doGenerate(ResourceDependencyGraph graph, DataFlowModel model) {
ArrayList<CompilationUnit> codes = new ArrayList<>();
ArrayList<ResourceNode> resources = StoreResourceCheck(graph);
 
codes.add(new TypeDeclaration("Main"));
TypeDeclaration mainType = new TypeDeclaration(mainTypeName);
codes.add(new CompilationUnit(mainType));
for (ResourceNode rn : resources) {
boolean f = false;
String name = rn.getIdentifierTemplate().getResourceName().substring(0, 1).toUpperCase()
+ rn.getIdentifierTemplate().getResourceName().substring(1);
consstr = consstr.substring(0, consstr.length() - 1);
consstr += ")";
FieldDeclaration field = new FieldDeclaration(new Type(name, name),
rn.getIdentifierTemplate().getResourceName(), consstr);
codes.get(0).addField(field);
mainType.addField(field);
MethodDeclaration cons = new MethodDeclaration(name, true);
Block block = new Block();
for (Edge e : rn.getOutEdges()) {
ResourceDependency re = (ResourceDependency) e;
type.addMethod(io);
io = new MethodDeclaration(
((Term) cm.getStateTransition().getMessageExpression()).getSymbol().getImplName(),
false, typeVoid, params);
codes.get(0).addMethod(io);
mainType.addMethod(io);
}
}
}
}
rn.getIdentifierTemplate().getResourceName(), str));
}
type.addMethod(new MethodDeclaration("get" + type.getTypeName(),
rn.getIdentifierTemplate().getResourceStateType()));
codes.add(type);
codes.add(new CompilationUnit(type));
}
for (Node n : graph.getNodes()) {
ResourceNode rn = (ResourceNode) n;
MethodDeclaration get = new MethodDeclaration(
rn.getIdentifierTemplate().getResourceStateType());
get.setBody(new Block());
get.getBody().addStatement(
"return " + rn.getIdentifierTemplate().getResourceName() + "." + get.getName() + "();");
codes.get(0).addMethod(get);
mainType.addMethod(get);
}
return codes;
}
 
ArrayList<String> codes = new ArrayList<>();
for (TypeDeclaration type : codeTree) {
codes.add("public class " + type.getTypeName() + "{");
for (FieldDeclaration field : type.getFields()) {
if (type.getTypeName() != "Main") {
if (type.getTypeName() != mainTypeName) {
String cons = "\t" + "private " + field.getType().getImplementationTypeName() + " "
+ field.getName();
if (field.getType().equals(DataConstraintModel.typeList))
cons += " = new ArrayList<>()";
codes.add(cons);
}
}
codes.add("");
if (type.getTypeName() != "Main") {
if (type.getTypeName() != mainTypeName) {
if (!type.getConstructors().isEmpty()) {
String cons = "\t" + "public " + type.getTypeName() + "(";
for (VariableDeclaration constructor : type.getConstructors()) {
cons += constructor.getType().getTypeName() + " " + constructor.getName() + ",";
View
68
AlgebraicDataflowArchitectureModel/src/algorithms/DataStorageDecision.java 100644 → 0
package algorithms;
 
import java.util.HashSet;
 
import models.*;
import models.algebra.*;
import models.dataConstraintModel.ChannelMember;
import models.dataConstraintModel.DataConstraintModel;
import models.dataFlowModel.*;
 
public class DataStorageDecision {
static private HashSet<Node> arrivedNode = new HashSet<>();
 
static public void run(ResourceDependencyGraph graph) {
arrivedNode.clear();
for (Node n : graph.getNodes()) {
ResourceNode resource = (ResourceNode) n;
trackNode(resource);
}
}
 
static private void trackNode(ResourceNode resource) {
if (arrivedNode.contains(resource))
return;
arrivedNode.add(resource);
boolean flag = false;
for (Edge e : resource.getInEdges()) {
if (((PushPullAttribute) e.getAttribute()).getOptions().get(0) == PushPullValue.PUSH) {
trackNode((ResourceNode) e.getSource());
flag = true;
}
}
if (resource.getInEdges().size() == 0)
flag = true;
((StoreAttribute) resource.getAttribute()).setStored(flag);
if (resource.getIdentifierTemplate().getResourceStateType() == null) {
for (Edge e : resource.getInEdges()) {
for (ChannelMember cm : ((ResourceDependency) e).getChannelGenerator().getChannelMembers()) {
if (((PushPullAttribute) ((ResourceDependency) e).getAttribute()).getOptions()
.get(0) == PushPullValue.PUSH
&& cm.getStateTransition().getNextStateExpression().getClass() == Term.class) {
if (((Term) cm.getStateTransition().getNextStateExpression()).getSymbol().getName()
.equals("cons")) {
resource.getIdentifierTemplate().setResourceStateType(DataConstraintModel.typeList);
}
}
break;
}
}
for (Edge e : resource.getOutEdges()) {
for (ChannelMember cm : ((ResourceDependency) e).getChannelGenerator().getChannelMembers()) {
if (((PushPullAttribute) ((ResourceDependency) e).getAttribute()).getOptions()
.get(0) != PushPullValue.PUSH
&& cm.getStateTransition().getNextStateExpression().getClass() == Term.class) {
if (((Term) cm.getStateTransition().getNextStateExpression()).getSymbol().getName()
.equals("cons")) {
resource.getIdentifierTemplate().setResourceStateType(DataConstraintModel.typeList);
}
}
break;
}
}
if (resource.getIdentifierTemplate().getResourceStateType() == null)
resource.getIdentifierTemplate().setResourceStateType(DataConstraintModel.typeInt);
}
}
}
View
47
AlgebraicDataflowArchitectureModel/src/algorithms/DataStorageNecessity.java 100644 → 0
package algorithms;
 
import models.*;
import models.algebra.*;
import models.dataConstraintModel.*;
import models.dataFlowModel.*;
 
public class DataStorageNecessity {
static public ResourceDependencyGraph run(DataFlowModel model) {
ResourceDependencyGraph graph = model.getResourceDependencyGraph();
DataConstraintModel dcmodel = (DataConstraintModel) model;
for (ChannelGenerator generator : dcmodel.getChannelGenerators()) {
boolean flag = false;
for (ChannelMember member : ((DataflowChannelGenerator) generator).getOutputChannelMembers()) {
Expression curexp = member.getStateTransition().getCurStateExpression();
Expression nextexp = member.getStateTransition().getNextStateExpression();
for (Position pos : curexp.getVariables().keySet()) {
if (nextexp.contains(curexp.getVariables().get(pos))) {
flag = true;
}
}
}
for (Node node : graph.getNodes()) {
for (ChannelMember member : generator.getChannelMembers()) {
if (((ResourceNode) node).getIdentifierTemplate().equals(member.getIdentifierTemplate())) {
setStoreAttribute(flag, (ResourceNode) node);
}
}
}
}
for (Node node : graph.getNodes()) {
if (((ResourceNode) node).getPredecessors().size() > 1) {
setStoreAttribute(true, (ResourceNode) node);
} else if (((ResourceNode) node).getAttribute() == null) {
setStoreAttribute(false, (ResourceNode) node);
}
}
return graph;
}
 
static private void setStoreAttribute(boolean flag, ResourceNode node) {
StoreAttribute store = new StoreAttribute();
store.setNeeded(flag);
node.setAttribute(store);
}
}
View
32
AlgebraicDataflowArchitectureModel/src/algorithms/EdgeTransitionSelectable.java 100644 → 0
package algorithms;
 
import models.*;
import models.dataFlowModel.*;
 
public class EdgeTransitionSelectable {
static public void run(ResourceDependencyGraph graph) {
PushPullAttribute ppat = new PushPullAttribute();
ppat.addOption(PushPullValue.PUSHorPULL);
ppat.addOption(PushPullValue.PUSH);
ppat.addOption(PushPullValue.PULL);
for (Node n : graph.getNodes()) {
if (((StoreAttribute) ((ResourceNode) n).getAttribute()).isNeeded()) {
trackEdges(n);
}
}
for (Edge e : graph.getEdges()) {
if (((ResourceDependency) e).getAttribute() == null) {
((ResourceDependency) e).setAttribute(ppat);
}
}
}
 
static private void trackEdges(Node n) {
PushPullAttribute ppat = new PushPullAttribute();
ppat.addOption(PushPullValue.PUSH);
for (Edge e : ((ResourceNode) n).getInEdges()) {
((ResourceDependency) e).setAttribute(ppat);
}
}
}
View
68
AlgebraicDataflowArchitectureModel/src/algorithms/FinalDecisionOfStoringResourceStates.java 0 → 100644
package algorithms;
 
import java.util.HashSet;
 
import models.*;
import models.algebra.*;
import models.dataConstraintModel.ChannelMember;
import models.dataConstraintModel.DataConstraintModel;
import models.dataFlowModel.*;
 
public class FinalDecisionOfStoringResourceStates {
static private HashSet<Node> arrivedNode = new HashSet<>();
 
static public void doDecide(ResourceDependencyGraph graph) {
arrivedNode.clear();
for (Node n : graph.getNodes()) {
ResourceNode resource = (ResourceNode) n;
trackNode(resource);
}
}
 
static private void trackNode(ResourceNode resource) {
if (arrivedNode.contains(resource))
return;
arrivedNode.add(resource);
boolean flag = false;
for (Edge e : resource.getInEdges()) {
if (((PushPullAttribute) e.getAttribute()).getOptions().get(0) == PushPullValue.PUSH) {
trackNode((ResourceNode) e.getSource());
flag = true;
}
}
if (resource.getInEdges().size() == 0)
flag = true;
((StoreAttribute) resource.getAttribute()).setStored(flag);
if (resource.getIdentifierTemplate().getResourceStateType() == null) {
for (Edge e : resource.getInEdges()) {
for (ChannelMember cm : ((ResourceDependency) e).getChannelGenerator().getChannelMembers()) {
if (((PushPullAttribute) ((ResourceDependency) e).getAttribute()).getOptions()
.get(0) == PushPullValue.PUSH
&& cm.getStateTransition().getNextStateExpression().getClass() == Term.class) {
if (((Term) cm.getStateTransition().getNextStateExpression()).getSymbol().getName()
.equals("cons")) {
resource.getIdentifierTemplate().setResourceStateType(DataConstraintModel.typeList);
}
}
break;
}
}
for (Edge e : resource.getOutEdges()) {
for (ChannelMember cm : ((ResourceDependency) e).getChannelGenerator().getChannelMembers()) {
if (((PushPullAttribute) ((ResourceDependency) e).getAttribute()).getOptions()
.get(0) != PushPullValue.PUSH
&& cm.getStateTransition().getNextStateExpression().getClass() == Term.class) {
if (((Term) cm.getStateTransition().getNextStateExpression()).getSymbol().getName()
.equals("cons")) {
resource.getIdentifierTemplate().setResourceStateType(DataConstraintModel.typeList);
}
}
break;
}
}
if (resource.getIdentifierTemplate().getResourceStateType() == null)
resource.getIdentifierTemplate().setResourceStateType(DataConstraintModel.typeInt);
}
}
}
View
17
AlgebraicDataflowArchitectureModel/src/algorithms/MethodBodyGenerator.java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
 
import code.ast.CompilationUnit;
import code.ast.MethodDeclaration;
import code.ast.TypeDeclaration;
import models.Edge;
import models.Node;
import models.dataFlowModel.ResourceNode;
import models.dataFlowModel.StoreAttribute;
 
public class MethodBodyGenerator {
public static ArrayList<TypeDeclaration> doGenerate(ResourceDependencyGraph graph, DataFlowModel model, ArrayList<TypeDeclaration> types) {
public static ArrayList<CompilationUnit> doGenerate(ResourceDependencyGraph graph, DataFlowModel model, ArrayList<CompilationUnit> codes) {
Symbol floor = model.getSymbol("floor");
Symbol.Memento floorMem = null;
if (floor != null) {
floorMem = floor.createMemento();
}
 
// Create a map from type names (lower case) to their types.
Map<String, TypeDeclaration> typeMap = new HashMap<>();
for (TypeDeclaration type: types) {
typeMap.put(type.getTypeName().substring(0,1).toLowerCase() + type.getTypeName().substring(1), type);
for (CompilationUnit code: codes) {
for (TypeDeclaration type: code.types()) {
typeMap.put(type.getTypeName().substring(0,1).toLowerCase() + type.getTypeName().substring(1), type);
}
}
// Generate the body of each update or getter method.
try {
}
}
}
// for source nodes
TypeDeclaration mainType = typeMap.get("main");
String mainTypeName = CodeGenerator.mainTypeName.substring(0,1).toLowerCase() + CodeGenerator.mainTypeName.substring(1);
TypeDeclaration mainType = typeMap.get(mainTypeName);
for (Node n: graph.getNodes()) {
ResourceNode resource = (ResourceNode) n;
String resourceName = resource.getIdentifierTemplate().getResourceName();
TypeDeclaration type = typeMap.get(resourceName);
}
if (floor != null) floor.setMemento(floorMem);
if (sum != null) sum.setMemento(sumMem);
return types;
return codes;
}
 
private static MethodDeclaration getUpdateMethod(TypeDeclaration type, TypeDeclaration from) {
for (MethodDeclaration m: type.getMethods()) {
View
AlgebraicDataflowArchitectureModel/src/algorithms/NecessityOfStoringResourceStates.java 0 → 100644
View
AlgebraicDataflowArchitectureModel/src/algorithms/SelectableDataTransfers.java 0 → 100644
View
AlgebraicDataflowArchitectureModel/src/code/ast/CompilationUnit.java 0 → 100644
View
AlgebraicDataflowArchitectureModel/src/code/ast/ImportDeclaration.java 0 → 100644
View
AlgebraicDataflowArchitectureModel/src/graphicalrefactor/actions/PrototypeGenerateAction.java
View
AlgebraicDataflowArchitectureModel/src/graphicalrefactor/editor/Editor.java
View
AlgebraicDataflowArchitectureModel/src/tests/CodeGeneratorTest.java
View
AlgebraicDataflowArchitectureModel/src/tests/DataStorageDecisionTest.java
View
AlgebraicDataflowArchitectureModel/src/tests/DataStorageNecessityTest.java
View
AlgebraicDataflowArchitectureModel/src/tests/EdgeTransitionSelectableTest.java