diff --git a/AlgebraicDataflowArchitectureModel/models/CustomerOffice.model b/AlgebraicDataflowArchitectureModel/models/CustomerOffice.model index 3a460e2..4f94bd2 100644 --- a/AlgebraicDataflowArchitectureModel/models/CustomerOffice.model +++ b/AlgebraicDataflowArchitectureModel/models/CustomerOffice.model @@ -1,33 +1,33 @@ channel C_CustomerAOff_In { - out customerA.off(c, setOff(x)) == x - out customerA.off(c, e) == c + out customerA_off(c:String, setOff(x)) == x + out customerA_off(c, e) == c } channel C_CustomerBOff_In { - out customerB.off(c, setOff(x)) == x - out customerB.off(c, e) == c + out customerB_off(c:String, setOff(x)) == x + out customerB_off(c, e) == c } channel C_CompanyC1Add_In { - out companyC1.add(a, setAdd(y)) == y - out companyC1.add(a, e) == a + out companyC1_add(a:String, setAdd(y)) == y + out companyC1_add(a, e) == a } channel C_CompanyC2Add_In { - out companyC2.add(a, setAdd(y)) == y - out companyC2.add(a, e) == a + out companyC2_add(a:String, setAdd(y)) == y + out companyC2_add(a, e) == a } channel CA { - in customerA.off(c, sync(z, u, v)) == z - in companyC1.add(a1, sync(z, u, v)) == u - in companyC2.add(a2, sync(z, u, v)) == v - out customerA.add(a3, sync(z, u, v)) == if(eq(z, C1), u, if(eq(z, C2), v, nil)) + in customerA_off(c, sync(z, u, v)) == z + in companyC1_add(a1, sync(z, u, v)) == u + in companyC2_add(a2, sync(z, u, v)) == v + out customerA_add(a3:String, sync(z, u, v)) == if(eq(z, C1), u, if(eq(z, C2), v, nil)) } channel CB { - in customerB.off(c, sync(z, u, v)) == z - in companyC1.add(a1, sync(z, u, v)) == u - in companyC2.add(a2, sync(z, u, v)) == v - out customerB.add(a3, sync(z, u, v)) == if(eq(z, C1), u, if(eq(z, C2), v, nil)) + in customerB_off(c, sync(z, u, v)) == z + in companyC1_add(a1, sync(z, u, v)) == u + in companyC2_add(a2, sync(z, u, v)) == v + out customerB_add(a3:String, sync(z, u, v)) == if(eq(z, C1), u, if(eq(z, C2), v, nil)) } diff --git a/AlgebraicDataflowArchitectureModel/models/Game.model b/AlgebraicDataflowArchitectureModel/models/Game.model index 0a00659..4ad4a36 100644 --- a/AlgebraicDataflowArchitectureModel/models/Game.model +++ b/AlgebraicDataflowArchitectureModel/models/Game.model @@ -1,27 +1,27 @@ channel CIO { - out force(f, action(x)) == x - out time(t, action(x)) == t + 0.01 + out force(f:Double, action(x)) == x + out time(t:Double, action(x)) == t + 0.01 out force(f, e) == x out time(t, e) == t + 0.01 } channel CIO2 { - out velocity(v, setVel(x)) == x + out velocity(v:Double, setVel(x)) == x out velocity(v, e) == x } channel C1 { in force(f, update1(y, m)) == y - in mass(m, update1(y, m)) == m - out acceleration(a, update1(y, m)) == y / m + in mass(m:Double, update1(y, m)) == m + out acceleration(a:Double, update1(y, m)) == y / m } channel C2 { in acceleration(a, update2(z)) == z - out velocity(v, update2(z)) == v + 0.01 * z + out velocity(v:Double, update2(z)) == v + 0.01 * z } channel C3 { in velocity(v, update3(u)) == u - out position(p, update3(u)) == p + 0.01 * u + out position(p:Double, update3(u)) == p + 0.01 * u } \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/models/Kinetics.model b/AlgebraicDataflowArchitectureModel/models/Kinetics.model index fb8e17d..5218206 100644 --- a/AlgebraicDataflowArchitectureModel/models/Kinetics.model +++ b/AlgebraicDataflowArchitectureModel/models/Kinetics.model @@ -1,20 +1,20 @@ channel CIO { - out force(f, action(x)) == x - out time(t, action(x)) == t + 0.01 + out force(f:Double, action(x)) == x + out time(t:Double, action(x)) == t + 0.01 } channel C1 { in force(f, update1(y, m)) == y in mass(m, update1(y, m)) == m - out acceleration(a, update1(y, m)) == y / m + out acceleration(a:Double, update1(y, m)) == y / m } channel C2 { in acceleration(a, update2(z)) == z - out velocity(v, update2(z)) == v + 0.01 * z + out velocity(v:Double, update2(z)) == v + 0.01 * z } channel C3 { in velocity(v, update3(u)) == u - out position(p, update3(u)) == p + 0.01 * u + out position(p:Double, update3(u)) == p + 0.01 * u } \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/models/POS.model b/AlgebraicDataflowArchitectureModel/models/POS.model index bb5dd66..eabfc49 100644 --- a/AlgebraicDataflowArchitectureModel/models/POS.model +++ b/AlgebraicDataflowArchitectureModel/models/POS.model @@ -1,18 +1,18 @@ channel CIO { - out payment(p, purchase(x)) == x + out payment(p:Int, purchase(x)) == x } channel C1 { in payment(p, update1(y)) == y - out points(l, update1(y)) == floor(y * 0.05) + out points(l:Int, update1(y)) == floor(y * 0.05) } channel C2 { in payment(p, update2(z)) == z - out history(h, update2(z)) == cons(z, h) + out history(h:List, update2(z)) == cons(z, h) } channel C3 { in history(h, update3(u)) == u - out total(t, update3(u)) == sum(u) + out total(t:Int, update3(u)) == sum(u) } \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/models/POS2.model b/AlgebraicDataflowArchitectureModel/models/POS2.model index 51a8c90..442079b 100644 --- a/AlgebraicDataflowArchitectureModel/models/POS2.model +++ b/AlgebraicDataflowArchitectureModel/models/POS2.model @@ -1,18 +1,18 @@ channel CIO { - out payment(p, purchase(x)) == x + out payment(p:Int, purchase(x)) == x } channel C1 { in payment(p1, update1(y)) == y - out points(l, update1(y)) == floor(y * 0.05) + out points(l:Int, update1(y)) == floor(y * 0.05) } channel C2 { in payment(p1, update2(z)) == z - out history(h, update2(z)) == cons(z, h) + out history(h:List, update2(z)) == cons(z, h) } channel C3 { in history(h, update3(u)) == cons(u, h) - out total(t, update3(u)) == u + t + out total(t:Int, update3(u)) == u + t } \ No newline at end of file diff --git a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java index eebbb57..732bdfd 100644 --- a/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java +++ b/AlgebraicDataflowArchitectureModel/src/models/dataConstraintModel/DataConstraintModel.java @@ -13,7 +13,13 @@ protected HashMap identifierTemplates = null; protected HashMap channelGenerators = null; protected HashMap ioChannelGenerators = null; + protected HashMap types = null; protected HashMap symbols = null; + public static final Type typeInt = new Type("Int", "int"); + public static final Type typeFloat = new Type("Float", "float"); + public static final Type typeDouble = new Type("Double", "double"); + public static final Type typeList = new Type("List", "List"); + public static final Type typeBoolean = new Type("Bool", "boolean"); public static final Symbol add = new Symbol(Parser.ADD, 2, Symbol.Type.INFIX); 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); @@ -24,11 +30,6 @@ 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); - public static final Type typeInt = new Type("Int", "int"); - public static final Type typeFloat = new Type("Float", "float"); - public static final Type typeDouble = new Type("Double", "double"); - public static final Type typeList = new Type("List", "List"); - public static final Type typeBoolean = new Type("Bool", "boolean"); static { add.setInverses(new Symbol[] {sub, sub}); @@ -43,7 +44,13 @@ identifierTemplates = new HashMap<>(); channelGenerators = new HashMap<>(); ioChannelGenerators = new HashMap<>(); - symbols = new HashMap<>(); + types = new HashMap<>(); + addType(typeInt); + addType(typeFloat); + addType(typeDouble); + addType(typeList); + addType(typeBoolean); + symbols = new HashMap<>(); addSymbol(add); addSymbol(mul); addSymbol(sub); @@ -116,6 +123,14 @@ } } + public void addType(Type type) { + types.put(type.getTypeName(), type); + } + + public Type getType(String name) { + return types.get(name); + } + public void addSymbol(Symbol symbol) { symbols.put(symbol.getName(), symbol); } diff --git a/AlgebraicDataflowArchitectureModel/src/parser/Parser.java b/AlgebraicDataflowArchitectureModel/src/parser/Parser.java index 8df86b4..eb41993 100644 --- a/AlgebraicDataflowArchitectureModel/src/parser/Parser.java +++ b/AlgebraicDataflowArchitectureModel/src/parser/Parser.java @@ -10,6 +10,7 @@ import models.algebra.Expression; import models.algebra.Symbol; import models.algebra.Term; +import models.algebra.Type; import models.algebra.Variable; import models.dataConstraintModel.ChannelMember; import models.dataConstraintModel.IdentifierTemplate; @@ -41,6 +42,7 @@ public static final String OUT = "out"; public static final String EQUALS = "=="; public static final String COMMA = ","; + public static final String COLON = ":"; public Parser(BufferedReader reader) { this.reader = reader; @@ -135,6 +137,12 @@ stateTransition.setMessageExpression(((Term) leftTerm).getChild(1)); stateTransition.setNextStateExpression(rightTerm); channelMember.setStateTransition(stateTransition); + if (identifier.getResourceStateType() == null && ((Term) leftTerm).getChild(0) instanceof Variable) { + Variable stateVar = (Variable) ((Term) leftTerm).getChild(0); + if (stateVar.getType() != null) { + identifier.setResourceStateType(stateVar.getType()); + } + } return channelMember; } @@ -179,11 +187,21 @@ symbol.setArity(arity); exp = term; } else { + // constant or variable try { Double d = Double.parseDouble(symbolName); exp = new Constant(symbolName); } catch (NumberFormatException e) { - exp = new Variable(symbolName); + if (symbolName.contains(COLON)) { + String variable[] = symbolName.split(COLON); + Type type = model.getType(variable[1]); + if (type == null) { + type = new Type(variable[1], variable[1]); + } + exp = new Variable(variable[0], type); + } else { + exp = new Variable(symbolName); + } } } if (minus != null) {