diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Constant.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Constant.java index 50207b6..eb5e89b 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Constant.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Constant.java @@ -48,4 +48,9 @@ } return symbol.getImplName(); } + + @Override + public String accept(IExpressionVisitor visitor, String[] sideEffects) { + return visitor.visit(this, sideEffects); + } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Expression.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Expression.java index 7695979..88a25ac 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Expression.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Expression.java @@ -25,6 +25,8 @@ return getSubTerms(Variable.class); } + public abstract String accept(IExpressionVisitor visitor, String[] sideEffects); + /** * Get the implementation of this expression. * @param sideEffects an array with an optional implementation that should be written before the evaluation of this expression diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java index 6702d3f..d5c5e55 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Field.java @@ -43,4 +43,9 @@ public String toImplementation(String[] sideEffects) { return "this." + super.toImplementation(sideEffects); } + + @Override + public String accept(IExpressionVisitor visitor, String[] sideEffects) { + return visitor.visit(this, sideEffects); + } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/IExpressionVisitor.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/IExpressionVisitor.java new file mode 100644 index 0000000..a8a88f5 --- /dev/null +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/IExpressionVisitor.java @@ -0,0 +1,18 @@ +package models.algebra; + +import models.dataConstraintModel.JsonAccessor; +import models.dataConstraintModel.JsonTerm; + +public interface IExpressionVisitor { + String visit(Term term, String[] sideEffects); + + String visit(Field field, String[] sideEffects); + + String visit(Constant constant, String[] sideEffects); + + String visit(Variable variable, String[] sideEffects); + + String visit(JsonTerm jsonTerm, String[] sideEffects); + + String visit(JsonAccessor jsonAccessor, String[] sideEffects); +} diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Term.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Term.java index d259620..1798c20 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Term.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Term.java @@ -47,7 +47,7 @@ } return type; } - + public boolean addChild(Expression child) { if (getArity() != -1 && children.size() >= getArity()) return false; children.add(child); @@ -59,7 +59,7 @@ children.set(n, child); return true; } - + public void addChild(Expression child, boolean bForced) { if (!bForced && getArity() != -1 && children.size() >= getArity()) return; children.add(child); @@ -153,7 +153,7 @@ return unifiedTerm; } else { return null; - } + } } public Expression reduce() { @@ -445,4 +445,9 @@ } } } + + @Override + public String accept(IExpressionVisitor visitor, String[] sideEffects) { + return visitor.visit(this, sideEffects); + } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/algebra/Variable.java b/AlgebraicDataflowArchitectureModel/src/models/algebra/Variable.java index fa0095b..47e8c10 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/algebra/Variable.java +++ b/AlgebraicDataflowArchitectureModel/src/models/algebra/Variable.java @@ -10,13 +10,13 @@ super(); this.name = name; } - + public Variable(String name, Type type) { super(); this.name = name; this.type = type; } - + public String getName() { return name; } @@ -24,11 +24,11 @@ public Type getType() { return type; } - + public void setType(Type type) { this.type = type; } - + @Override public HashMap getSubTerms(Class clazz) { HashMap subTerms = new HashMap<>(); @@ -48,18 +48,18 @@ public Expression unify(Expression another) { return (Expression) another.clone(); } - + @Override public Expression getInverseMap(Expression outputValue, Position targetPos) { if (targetPos.isEmpty()) return outputValue; return null; } - + @Override public boolean contains(Expression exp) { return equals(exp); } - + @Override public boolean equals(Object another) { if (!(another instanceof Variable)) return false; @@ -84,4 +84,9 @@ public String toImplementation(String[] sideEffects) { return name; } + + @Override + public String accept(IExpressionVisitor visitor, String[] sideEffects) { + return visitor.visit(this, sideEffects); + } } diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonAccessor.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonAccessor.java index 43e428c..f16a0ce 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonAccessor.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonAccessor.java @@ -6,14 +6,7 @@ import java.util.Map; import java.util.Set; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.LambdaAbstraction; -import models.algebra.Position; -import models.algebra.Symbol; -import models.algebra.Term; -import models.algebra.Type; -import models.algebra.Variable; +import models.algebra.*; public class JsonAccessor extends Term { @@ -219,6 +212,11 @@ } @Override + public String accept(IExpressionVisitor visitor, String[] sideEffects) { + return visitor.visit(this, sideEffects); + } + + @Override public Object clone() { JsonAccessor newTerm = new JsonAccessor(symbol); for (Expression e: children) { diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java index 6f32281..ed5e46f 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/JsonTerm.java @@ -5,11 +5,7 @@ import java.util.Map; import java.util.Set; -import models.algebra.Constant; -import models.algebra.Expression; -import models.algebra.Symbol; -import models.algebra.Term; -import models.algebra.Variable; +import models.algebra.*; import parser.Parser; public class JsonTerm extends Term { @@ -56,7 +52,7 @@ JsonTerm unifiedTerm = new JsonTerm(); Set keySet = new HashSet<>(); keySet.addAll(this.keySet()); - keySet.addAll(anotherTerm.keySet()); + keySet.addAll(anotherTerm.keySet()); for (String key: keySet) { if (this.keySet().contains(key)) { if (anotherTerm.keySet().contains(key)) { @@ -104,4 +100,9 @@ sideEffects[0] += impl; return temp; } + + @Override + public String accept(IExpressionVisitor visitor, String[] sideEffects) { + return visitor.visit(this, sideEffects); + } }