Merge branch 'master' of http://nitta-lab-www.is.konan-u.ac.jp/gitbucket/git/nitta-lab/AlgebraicDataflowArchitectureModel.git
commit 7af7e80b0c24643708d8ffb9107ce5c349f1d4a9
2 parents e3ae8a8 + 715ead2
yoichiro authored on 1 May 2020
Showing 3 changed files
View
40
AlgebraicDataflowArchitectureModel/src/algorithms/MethodBodyGenerator.java
import code.ast.MethodDeclaration;
import code.ast.TypeDeclaration;
import models.Edge;
import models.Node;
import models.algebra.Expression;
import models.algebra.InvalidMessage;
import models.algebra.ParameterizedIdentifierIsFutureWork;
import models.algebra.Symbol;
import models.algebra.Term;
import models.algebra.UnificationFailed;
import models.algebra.ValueUndefined;
import models.dataConstraintModel.ChannelMember;
import models.dataFlowModel.DataFlowModel;
 
// 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().toLowerCase(), type);
typeMap.put(type.getTypeName().substring(0,1).toLowerCase() + type.getTypeName().substring(1), type);
}
// Generate the body of each update or getter method.
try {
if (out.getIdentifierTemplate() == dst.getIdentifierTemplate()) {
if (pushPull.getOptions().get(0) == PushPullValue.PUSH) {
// push
MethodDeclaration update = getUpdateMethod(dstType);
String curState = d.getChannelGenerator().deriveUpdateExpressionOf(out, CodeGenerator.pushAccessor).toImplementation();
update.addFirstStatement(dstResourceName + " = " + curState + ";");
Expression updateExp = d.getChannelGenerator().deriveUpdateExpressionOf(out, CodeGenerator.pushAccessor);
String curState = updateExp.toImplementation();
String updateStatement;
if (updateExp instanceof Term && ((Term) updateExp).getSymbol().getImplOperatorType() == Symbol.Type.METHOD_WITH_SIDE_EFFECT) {
updateStatement = curState + ";";
} else {
updateStatement = dstResourceName + " = " + curState + ";";
}
if (update.getBody() == null || !update.getBody().getStatements().contains(updateStatement)) {
update.addFirstStatement(updateStatement);
}
MethodDeclaration getter = getGetterMethod(dstType);
getter.addStatement("return " + dstResourceName + ";");
if (getter.getBody() == null || getter.getBody().getStatements().size() == 0) {
getter.addStatement("return " + dstResourceName + ";");
}
// src side
MethodDeclaration srcUpdate = getUpdateMethod(srcType);
if (srcUpdate != null) srcUpdate.addStatement(dstResourceName + ".update(" + srcResourceName + ");");
} else {
// pull or push/pull
MethodDeclaration getter = getGetterMethod(dstType);
String curState = d.getChannelGenerator().deriveUpdateExpressionOf(out, CodeGenerator.pullAccessor).toImplementation();
getter.addStatement("return " + curState + ";");
if (getter.getBody() == null || getter.getBody().getStatements().size() == 0) {
String curState = d.getChannelGenerator().deriveUpdateExpressionOf(out, CodeGenerator.pullAccessor).toImplementation();
getter.addStatement("return " + curState + ";");
}
}
}
}
}
View
8
AlgebraicDataflowArchitectureModel/src/models/algebra/Symbol.java
return (operatorType == Type.INFIX);
}
public boolean isMethod() {
return (operatorType == Type.METHOD);
return (operatorType == Type.METHOD || operatorType == Type.METHOD_WITH_SIDE_EFFECT);
}
 
public Symbol[] getInverses() {
return inverses;
return (implOperatorType == Type.INFIX);
}
public boolean isImplMethod() {
return (implOperatorType == Type.METHOD);
return (implOperatorType == Type.METHOD || implOperatorType == Type.METHOD_WITH_SIDE_EFFECT);
}
 
public void setImplOperatorType(Type implOperatorType) {
this.implOperatorType = implOperatorType;
public enum Type {
PREFIX,
INFIX,
METHOD
METHOD,
METHOD_WITH_SIDE_EFFECT
}
public Memento createMemento() {
return new Memento(implName, implOperatorType);
View
AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java