副作用を持つメソッドの型を追加して、cons()をList#add()に正し変換できるようにした。
1 parent c0ef49b commit 715ead246cf3e06bb8c8a8ffc84a83a83507bf15
n-nittta authored on 30 Apr 2020
Showing 3 changed files
View
18
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;
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();
String updateStatement = 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);
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
2
■■■
AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java
public static final Symbol mul = new Symbol(Parser.MUL, 2, Symbol.Type.INFIX);;
public static final Symbol sub = new Symbol(Parser.SUB, 2, Symbol.Type.INFIX);
public static final Symbol div = new Symbol(Parser.DIV, 2, Symbol.Type.INFIX);
public static final Symbol minus = new Symbol(Parser.MINUS, 1);
public static final Symbol cons = new Symbol("cons", 2, Symbol.Type.PREFIX, "add", Symbol.Type.METHOD, new int[] {1, 0});
public static final Symbol cons = new Symbol("cons", 2, Symbol.Type.PREFIX, "add", Symbol.Type.METHOD_WITH_SIDE_EFFECT, new int[] {1, 0});
public static final Symbol head = new Symbol("head", 1, Symbol.Type.PREFIX, "head", Symbol.Type.METHOD);
public static final Symbol body = new Symbol("tail", 1, Symbol.Type.PREFIX, "tail", Symbol.Type.METHOD);
public static final Symbol cond = new Symbol("if", 3);
public static final Symbol eq = new Symbol("eq", 2, Symbol.Type.PREFIX, "==", Symbol.Type.INFIX);