From eb7ce943ea237fdfe871965646522ba50233caee Mon Sep 17 00:00:00 2001 From: Ludovic Apvrille <ludovic.apvrille@telecom-paris.fr> Date: Mon, 27 Mar 2023 15:12:02 +0200 Subject: [PATCH] Adding contant value in Avatar: handling random, method call and receive message --- modeling/AVATAR/PressureController.xml | 40 +-- .../java/avatartranslator/AvatarBlock.java | 324 +++++++++--------- .../avatartranslator/AvatarSyntaxChecker.java | 2 +- .../java/ui/AvatarDesignPanelTranslator.java | 122 ++++--- src/main/java/ui/avatarbd/AvatarBDPanel.java | 2 +- 5 files changed, 259 insertions(+), 231 deletions(-) diff --git a/modeling/AVATAR/PressureController.xml b/modeling/AVATAR/PressureController.xml index 04a41b528f..7bda8ecf5a 100644 --- a/modeling/AVATAR/PressureController.xml +++ b/modeling/AVATAR/PressureController.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> -<TURTLEGMODELING version="1.0beta" ANIMATE_INTERACTIVE_SIMULATION="true" ACTIVATE_PENALTIES="false" UPDATE_INFORMATION_DIPLO_SIM="false" ANIMATE_WITH_INFO_DIPLO_SIM="true" OPEN_DIAG_DIPLO_SIM="false" LAST_SELECTED_MAIN_TAB="7" LAST_SELECTED_SUB_TAB="2"> +<TURTLEGMODELING version="1.0beta" ANIMATE_INTERACTIVE_SIMULATION="true" ACTIVATE_PENALTIES="false" UPDATE_INFORMATION_DIPLO_SIM="false" ANIMATE_WITH_INFO_DIPLO_SIM="true" OPEN_DIAG_DIPLO_SIM="false" LAST_SELECTED_MAIN_TAB="7" LAST_SELECTED_SUB_TAB="0"> <Modeling type="Avatar Requirement" nameTab="Requirements" > <AvatarRDPanel name="RequirementsSystemView" minX="10" maxX="2500" minY="10" maxY="1500" zoom="1.0" > @@ -21435,8 +21435,8 @@ F PressureSensor.SendingPressure --> MainController.HighPressure <extraparam> <blockType data="block" color="-4072719" /> <CryptoBlock value="false" /> -<Attribute access="0" var="1" id="branchToUse" value="false" type="4" typeOther="" /> -<Attribute access="0" var="1" id="pressure" value="" type="8" typeOther="" /> +<Attribute access="0" var="0" id="branchToUse" value="false" type="4" typeOther="" /> +<Attribute access="0" var="0" id="pressure" value="" type="8" typeOther="" /> <Method value="$int readingPressure()" /> <Method value="$bool isInCode()" /> <Signal value="out pressureValue(int value)" attached="true" /> @@ -22293,7 +22293,7 @@ F PressureSensor.SendingPressure --> MainController.HighPressure <new d="false" /> </CONNECTOR><SUBCOMPONENT type="-1" id="8869" index="25" uid="1437fa68-4b92-44e9-91fe-8798bebbadef" > <father id="8871" num="0" /> -<cdparam x="357" y="356" /> +<cdparam x="325" y="356" /> <sizeparam width="168" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> <hidden value="false" /> <enabled value="true" /> @@ -22706,7 +22706,7 @@ F PressureSensor.SendingPressure --> MainController.HighPressure </CONNECTOR><SUBCOMPONENT type="-1" id="9136" index="18" uid="9c1a9cbe-02d3-41fc-a7bb-43d88b954bcf" > <father id="9138" num="0" /> <cdparam x="697" y="476" /> -<sizeparam width="10" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> <hidden value="false" /> <enabled value="true" /> <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> @@ -22785,7 +22785,7 @@ F PressureSensor.SendingPressure --> MainController.HighPressure <SUBCOMPONENT type="-1" id="9147" index="23" uid="7e6ee145-5077-4747-8b2e-1e211643cf05" > <father id="9153" num="4" /> <cdparam x="674" y="402" /> -<sizeparam width="10" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> <hidden value="false" /> <enabled value="true" /> <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> @@ -22864,7 +22864,7 @@ F PressureSensor.SendingPressure --> MainController.HighPressure <SUBCOMPONENT type="-1" id="9162" index="28" uid="c1f02373-4f6d-4272-8771-88bdeb4b49fc" > <father id="9168" num="4" /> <cdparam x="462" y="508" /> -<sizeparam width="194" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<sizeparam width="194" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> <hidden value="false" /> <enabled value="true" /> <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> @@ -22943,7 +22943,7 @@ F PressureSensor.SendingPressure --> MainController.HighPressure <SUBCOMPONENT type="-1" id="9177" index="33" uid="10b045ca-0d74-4e84-95b4-4ef0d5b6f47a" > <father id="9183" num="4" /> <cdparam x="328" y="345" /> -<sizeparam width="194" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<sizeparam width="194" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> <hidden value="false" /> <enabled value="true" /> <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> @@ -22978,7 +22978,7 @@ F PressureSensor.SendingPressure --> MainController.HighPressure </CONNECTOR><SUBCOMPONENT type="-1" id="9188" index="34" uid="f28c32af-dedb-40a8-bc1a-bb8eb4ec6e29" > <father id="9190" num="0" /> <cdparam x="474" y="146" /> -<sizeparam width="10" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> <hidden value="false" /> <enabled value="true" /> <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> @@ -23013,7 +23013,7 @@ F PressureSensor.SendingPressure --> MainController.HighPressure </CONNECTOR><SUBCOMPONENT type="-1" id="9195" index="35" uid="4a776332-2d15-46a6-8791-ba62536e771e" > <father id="9197" num="0" /> <cdparam x="566" y="247" /> -<sizeparam width="10" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> <hidden value="false" /> <enabled value="true" /> <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> @@ -23048,7 +23048,7 @@ F PressureSensor.SendingPressure --> MainController.HighPressure </CONNECTOR><SUBCOMPONENT type="-1" id="9202" index="36" uid="aea74c6a-ac1c-4457-a44f-6f3258552d50" > <father id="9204" num="0" /> <cdparam x="590" y="304" /> -<sizeparam width="10" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> <hidden value="false" /> <enabled value="true" /> <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> @@ -23083,7 +23083,7 @@ F PressureSensor.SendingPressure --> MainController.HighPressure </CONNECTOR><SUBCOMPONENT type="-1" id="9209" index="37" uid="594a2866-a50c-47c9-bfc5-00fefa162705" > <father id="9211" num="0" /> <cdparam x="583" y="365" /> -<sizeparam width="44" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> <hidden value="false" /> <enabled value="true" /> <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> @@ -23118,7 +23118,7 @@ F PressureSensor.SendingPressure --> MainController.HighPressure </CONNECTOR><SUBCOMPONENT type="-1" id="9216" index="38" uid="e9de9ebf-5e06-4a2b-a92b-52fd4f4a1c82" > <father id="9218" num="0" /> <cdparam x="692" y="468" /> -<sizeparam width="10" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> <hidden value="false" /> <enabled value="true" /> <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> @@ -23153,7 +23153,7 @@ F PressureSensor.SendingPressure --> MainController.HighPressure </CONNECTOR><SUBCOMPONENT type="-1" id="9223" index="39" uid="088c80ff-b42e-48ca-8015-6607c60d1758" > <father id="9225" num="0" /> <cdparam x="695" y="548" /> -<sizeparam width="44" height="15" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<sizeparam width="50" height="25" minWidth="1" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> <hidden value="false" /> <enabled value="true" /> <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> @@ -23177,8 +23177,8 @@ F PressureSensor.SendingPressure --> MainController.HighPressure </SUBCOMPONENT> <COMPONENT type="5104" id="9236" index="10" uid="fe37ebcc-a627-47a4-aee8-bd47adbb7f1a" > -<cdparam x="587" y="448" /> -<sizeparam width="221" height="20" minWidth="30" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<cdparam x="597" y="448" /> +<sizeparam width="200" height="20" minWidth="30" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> <hidden value="false" /> <enabled value="true" /> <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> @@ -23197,8 +23197,8 @@ F PressureSensor.SendingPressure --> MainController.HighPressure </COMPONENT> <COMPONENT type="5103" id="9247" index="11" uid="e3e31799-f463-45a6-9d5a-681267a38a03" > -<cdparam x="646" y="570" /> -<sizeparam width="103" height="20" minWidth="30" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<cdparam x="651" y="570" /> +<sizeparam width="92" height="20" minWidth="30" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> <hidden value="false" /> <enabled value="true" /> <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> @@ -23349,8 +23349,8 @@ F PressureSensor.SendingPressure --> MainController.HighPressure </COMPONENT> <COMPONENT type="5104" id="9363" index="15" uid="b25d12e2-81af-4e5c-9a2c-a5bf9455bcb5" > -<cdparam x="451" y="275" /> -<sizeparam width="221" height="20" minWidth="30" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> +<cdparam x="461" y="275" /> +<sizeparam width="200" height="20" minWidth="30" minHeight="1" maxWidth="2000" maxHeight="2000" minDesiredWidth="0" minDesiredHeight="0" /> <hidden value="false" /> <enabled value="true" /> <cdrectangleparam minX="10" maxX="2500" minY="10" maxY="1500" /> diff --git a/src/main/java/avatartranslator/AvatarBlock.java b/src/main/java/avatartranslator/AvatarBlock.java index 866f007d8a..ab8835c89a 100644 --- a/src/main/java/avatartranslator/AvatarBlock.java +++ b/src/main/java/avatartranslator/AvatarBlock.java @@ -39,6 +39,7 @@ package avatartranslator; import myutil.NameChecker; +import myutil.TraceManager; import java.util.ArrayList; import java.util.LinkedList; @@ -63,7 +64,7 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne private int blockIndex; //Index of block in the Avatar Specification private String globalCode; - + private int booleanOffset; private int attributeOptRatio; private List<AvatarAttribute> constants; @@ -82,6 +83,126 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne attributeOptRatio = 1; } + public static boolean isAValidMethodCall(AvatarStateMachineOwner owner, String _s) { + int i; + + //TraceManager.addDev("****** method=" + _s); + String all = _s; + + int indexeq = _s.indexOf('='); + + if (indexeq != -1) { + _s = _s.substring(indexeq + 1, _s.length()).trim(); + //TraceManager.addDev("****** cut method: " + _s); + } + + int index0 = _s.indexOf("("); + int index1 = _s.indexOf(")"); + if ((index0 == -1) || (index1 == -1) || (index1 < index0)) { + //TraceManager.addDev("No parenthesis"); + return false; + } + + String method = _s.substring(0, index0); + + AvatarMethod am = owner.getAvatarMethodWithName(method); + if (am == null) { + //TraceManager.addDev("Method not found"); + return false; + } + + String[] actions; + AvatarAttribute aa; + String params = _s.substring(index0 + 1, index1).trim(); + //TraceManager.addDev("params=" + params); + if (params.length() == 0) { + if (am.getListOfAttributes().size() != 0) { + return false; + } + } else { + //TraceManager.addDev("params=" + params); + actions = params.split(","); + if (am.getListOfAttributes().size() != actions.length) { + return false; + } + + for (i = 0; i < actions.length; i++) { + //TraceManager.addDev("params=" + params + " actions=" + actions[i]); + // Must check the validity of this action + + if (am.getListOfAttributes().get(i).isInt()) { + if (AvatarSyntaxChecker.isAValidIntExpr(null, owner, actions[i].trim()) < 0) { + return false; + } + } else { + // Assume it is a bool attribute + if (AvatarSyntaxChecker.isAValidBoolExpr(null, owner, actions[i].trim()) < 0) { + return false; + } + } + + /*aa = getAvatarAttributeWithName(actions[i].trim()); + if (aa == null) { + //TraceManager.addDev("Failed for attribute " + actions[i]); + return false; + }*/ + } + } + + // Checking for return attributes + //TraceManager.addDev("Checking for return attributes"); + if (indexeq != -1) { + //TraceManager.addDev("Checking for return params"); + String retparams = all.substring(0, indexeq).trim(); + //TraceManager.addDev("Retparam=" + retparams); + + // multiple params + if (retparams.length() > 0) { + if (retparams.charAt(0) == '(') { + if (retparams.charAt(retparams.length() - 1) != ')') { + //TraceManager.addDev("Bad format for return params: " + retparams); + return false; + } + + retparams = retparams.substring(1, retparams.length() - 1).trim(); + actions = retparams.split(","); + if (am.getListOfReturnAttributes().size() != actions.length) { + return false; + } + + for (i = 0; i < actions.length; i++) { + //TraceManager.addDev("params=" + retparams + " actions=" + actions[i]); + aa = owner.getAvatarAttributeWithName(actions[i].trim()); + if (aa == null) { + //TraceManager.addDev("Failed for attribute " + actions[i]); + return false; + } else if (aa.isConstant()) { + return false; + } + } + + } else { + // Only one param. + aa = owner.getAvatarAttributeWithName(retparams); + if (aa == null) { + //TraceManager.addDev("Failed for return attribute " + retparams); + return false; + } else if (aa.isConstant()) { + return false; + } + + if (am.getListOfReturnAttributes().size() != 1) { + //TraceManager.addDev("Wrong number of return parameters in :" + retparams); + return false; + } + } + + } + } + //TraceManager.addDev("Ok for method " + _s); + + return true; + } // For code generation public void addGlobalCode(String _code) { @@ -102,24 +223,23 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne return globalCode; } + public AvatarBlock getFather() { + return father; + } // Relation with parent block public void setFather(AvatarBlock _father) { father = _father; } - public AvatarBlock getFather() { - return father; - } + /*public void addAttribute(AvatarAttribute _attribute) { + attributes.add(_attribute); + }*/ public AvatarStateMachine getStateMachine() { return asm; } - /*public void addAttribute(AvatarAttribute _attribute) { - attributes.add(_attribute); - }*/ - public void addMethod(AvatarMethod _method) { methods.add(_method); } @@ -128,7 +248,9 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne signals.add(_signal); } - public void clearAttributes() {attributes.clear();} + public void clearAttributes() { + attributes.clear(); + } public AvatarSignal addSignalIfApplicable(String name, int type, Object refObject) { AvatarSignal sig = getSignalByName(name); @@ -141,7 +263,6 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne } - public List<AvatarAttribute> getAttributes() { return attributes; } @@ -154,7 +275,6 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne return methods; } - public List<AvatarSignal> getSignals() { return signals; } @@ -282,7 +402,6 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne return false; } - public AvatarAttribute getAttribute(int _index) { return attributes.get(_index); } @@ -314,10 +433,10 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne } return -1; } - + public int getIndexOfConstantWithName(String _name) { int cpt = 0; - + if (constants == null) { return -1; } @@ -329,7 +448,7 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne } return -1; } - + public AvatarAttribute getConstantWithIndex(int index) { if (constants == null) { return null; @@ -406,118 +525,6 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne return null; } - public static boolean isAValidMethodCall(AvatarStateMachineOwner owner, String _s) { - int i; - - //TraceManager.addDev("****** method=" + _s); - String all = _s; - - int indexeq = _s.indexOf('='); - - if (indexeq != -1) { - _s = _s.substring(indexeq + 1, _s.length()).trim(); - //TraceManager.addDev("****** cut method: " + _s); - } - - int index0 = _s.indexOf("("); - int index1 = _s.indexOf(")"); - if ((index0 == -1) || (index1 == -1) || (index1 < index0)) { - //TraceManager.addDev("No parenthesis"); - return false; - } - - String method = _s.substring(0, index0); - - AvatarMethod am = owner.getAvatarMethodWithName(method); - if (am == null) { - //TraceManager.addDev("Method not found"); - return false; - } - - String params = _s.substring(index0 + 1, index1).trim(); - //TraceManager.addDev("params=" + params); - if (params.length() == 0) { - return am.getListOfAttributes().size() == 0; - } - //TraceManager.addDev("params=" + params); - String[] actions = params.split(","); - if (am.getListOfAttributes().size() != actions.length) { - return false; - } - - AvatarAttribute aa; - for (i = 0; i < actions.length; i++) { - //TraceManager.addDev("params=" + params + " actions=" + actions[i]); - // Must check tha validity of this action - - if (am.getListOfAttributes().get(i).isInt()) { - if (AvatarSyntaxChecker.isAValidIntExpr(null, owner, actions[i].trim()) < 0) { - return false; - } - } else { - // Assume it is a bool attribute - if (AvatarSyntaxChecker.isAValidBoolExpr(null, owner, actions[i].trim()) < 0) { - return false; - } - } - - /*aa = getAvatarAttributeWithName(actions[i].trim()); - if (aa == null) { - //TraceManager.addDev("Failed for attribute " + actions[i]); - return false; - }*/ - } - - // Checking for return attributes - if (indexeq != -1) { - //TraceManager.addDev("Checking for return params"); - String retparams = all.substring(0, indexeq).trim(); - //TraceManager.addDev("Retparam=" + retparams); - - // multiple params - if (retparams.length() > 0) { - if (retparams.charAt(0) == '(') { - if (retparams.charAt(retparams.length() - 1) != ')') { - //TraceManager.addDev("Bad format for return params: " + retparams); - return false; - } - - retparams = retparams.substring(1, retparams.length() - 1).trim(); - actions = retparams.split(","); - if (am.getListOfReturnAttributes().size() != actions.length) { - return false; - } - - for (i = 0; i < actions.length; i++) { - //TraceManager.addDev("params=" + retparams + " actions=" + actions[i]); - aa = owner.getAvatarAttributeWithName(actions[i].trim()); - if (aa == null) { - //TraceManager.addDev("Failed for attribute " + actions[i]); - return false; - } - } - - } else { - // Only one param. - aa = owner.getAvatarAttributeWithName(retparams); - if (aa == null) { - //TraceManager.addDev("Failed for return attribute " + retparams); - return false; - } - - if (am.getListOfReturnAttributes().size() != 1) { - //TraceManager.addDev("Wrong number of return parameters in :" + retparams); - return false; - } - } - - } - } - //TraceManager.addDev("Ok for method " + _s); - - return true; - } - public AvatarStateMachineElement getStateMachineElementFromReferenceObject(Object _o) { return asm.getStateMachineElementFromReferenceObject(_o); } @@ -737,7 +744,7 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne public ArrayList<AvatarElement> getAttributesOverMax(int maxV) { ArrayList<AvatarElement> outside = new ArrayList<>(); - for(AvatarAttribute aa: attributes) { + for (AvatarAttribute aa : attributes) { if (aa.isInt()) { if (aa.hasInitialValue()) { try { @@ -753,38 +760,38 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne } return outside; } - - + + //move boolean attributes to last positions in list attributes public void sortAttributes() { List<AvatarAttribute> newAttributes = new LinkedList<AvatarAttribute>(); - + for (AvatarAttribute attribute : attributes) { if (attribute.getType() != AvatarType.BOOLEAN) { newAttributes.add(attribute); } } - + booleanOffset = newAttributes.size(); - + for (AvatarAttribute attribute : attributes) { if (attribute.getType() == AvatarType.BOOLEAN) { newAttributes.add(attribute); } } - + attributes = newAttributes; } - + public int getBooleanOffset() { return booleanOffset; } - - + + public int getAttributeOptRatio() { return attributeOptRatio; } - + public void setAttributeOptRatio(int attributeOptRatio) { if (attributeOptRatio == 2 || attributeOptRatio == 4) { this.attributeOptRatio = attributeOptRatio; @@ -792,20 +799,19 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne this.attributeOptRatio = 1; } } - - + + public void removeConstantAttributes() { AvatarTransition at; - if ((constants == null) || (constants.size() == 0)) { List<AvatarAttribute> newAttributes = new LinkedList<>(); constants = new LinkedList<>(); - + for (AvatarAttribute attr : attributes) { boolean toKeep = false; - + if (attr.isTimer()) { toKeep = true; } @@ -817,10 +823,10 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne for (AvatarAction aa : at.getActions()) { if (aa instanceof AvatarActionAssignment) { - if (((AvatarActionAssignment) aa).leftHand.getName().compareTo(attr.name) == 0) { - //assigned - toKeep = true; - } + if (((AvatarActionAssignment) aa).leftHand.getName().compareTo(attr.name) == 0) { + //assigned + toKeep = true; + } } } } else if (elt instanceof AvatarActionOnSignal) { @@ -844,7 +850,6 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne } - if (toKeep) { break; } @@ -860,13 +865,12 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne } - public void removeUselessAttributes() { //AvatarTransition at; List<AvatarAttribute> toBeRemoved = new LinkedList<AvatarAttribute>(); - for(AvatarAttribute aa: attributes) { + for (AvatarAttribute aa : attributes) { if (aa.isTimer()) { if (!(asm.isTimerUsed(aa))) { toBeRemoved.add(aa); @@ -881,19 +885,19 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne } } - for(AvatarAttribute aa: toBeRemoved) { + for (AvatarAttribute aa : toBeRemoved) { attributes.remove(aa); } } // Returns the number of replaced queries - public int replaceQueriesWithReadSignal(AvatarSignal _origin, AvatarSignal _newSignal) { + public int replaceQueriesWithReadSignal(AvatarSignal _origin, AvatarSignal _newSignal) { List<AvatarQueryOnSignal> elts = new LinkedList<>(); AvatarQueryOnSignal aqos; // Getting all related ops - for(AvatarStateMachineElement elt: asm.getListOfElements()) { + for (AvatarStateMachineElement elt : asm.getListOfElements()) { if (elt instanceof AvatarQueryOnSignal) { aqos = (AvatarQueryOnSignal) elt; if (aqos.getSignal() == _origin) { @@ -903,7 +907,7 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne } // Replacing ops - for(AvatarQueryOnSignal q: elts) { + for (AvatarQueryOnSignal q : elts) { AvatarActionOnSignal aaosQuery = new AvatarActionOnSignal("query", _newSignal, q.getReferenceObject()); aaosQuery.addValue(q.getAttribute().getName()); asm.replace(q, aaosQuery); @@ -942,17 +946,17 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne public NameChecker.NamedElement[] getSubNamedElements() { NameChecker.NamedElement[] nes = new NameChecker.NamedElement[attributes.size() + methods.size() + signals.size()]; int index = 0; - for(AvatarAttribute aa: attributes) { + for (AvatarAttribute aa : attributes) { nes[index] = aa; - index ++; + index++; } - for(AvatarMethod am: methods) { + for (AvatarMethod am : methods) { nes[index] = am; - index ++; + index++; } - for(AvatarSignal as: signals) { + for (AvatarSignal as : signals) { nes[index] = as; - index ++; + index++; } return nes; } diff --git a/src/main/java/avatartranslator/AvatarSyntaxChecker.java b/src/main/java/avatartranslator/AvatarSyntaxChecker.java index 8c54b9ef82..46219fb6bd 100644 --- a/src/main/java/avatartranslator/AvatarSyntaxChecker.java +++ b/src/main/java/avatartranslator/AvatarSyntaxChecker.java @@ -83,7 +83,7 @@ public class AvatarSyntaxChecker { public static ArrayList<AvatarError> checkSyntaxWarnings(AvatarSpecification avspec) { ArrayList<AvatarError> warnings = new ArrayList<>(); - warnings.addAll(checkIsolatedElements(avspec)); + //warnings.addAll(checkIsolatedElements(avspec)); warnings.addAll(checkNames(avspec)); diff --git a/src/main/java/ui/AvatarDesignPanelTranslator.java b/src/main/java/ui/AvatarDesignPanelTranslator.java index 8ef2e7ce3d..80861b57c1 100644 --- a/src/main/java/ui/AvatarDesignPanelTranslator.java +++ b/src/main/java/ui/AvatarDesignPanelTranslator.java @@ -127,43 +127,44 @@ public class AvatarDesignPanelTranslator { addWarning(ce); } - - - ArrayList<AvatarError> list = AvatarSyntaxChecker.checkSyntaxErrors(as); - for (AvatarError ar : list) { - UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, AvatarError.errorStrings[ar.error]); - ce.setTDiagramPanel(adp.getAvatarBDPanel()); - Object o = ar.firstAvatarElement.getReferenceObject(); - if (o instanceof TGComponent) { - ce.setTGComponent((TGComponent) o); - ce.setTDiagramPanel(((TGComponent) o).getTDiagramPanel()); + if (checkingErrors.size() == 0) { + ArrayList<AvatarError> list = AvatarSyntaxChecker.checkSyntaxErrors(as); + for (AvatarError ar : list) { + UICheckingError ce = new UICheckingError(CheckingError.STRUCTURE_ERROR, AvatarError.errorStrings[ar.error]); + ce.setTDiagramPanel(adp.getAvatarBDPanel()); + Object o = ar.firstAvatarElement.getReferenceObject(); + if (o instanceof TGComponent) { + ce.setTGComponent((TGComponent) o); + ce.setTDiagramPanel(((TGComponent) o).getTDiagramPanel()); + } + addCheckingError(ce); } - addWarning(ce); - } - ArrayList<AvatarError> listW = AvatarSyntaxChecker.checkSyntaxWarnings(as); - for (AvatarError ar : listW) { - UICheckingError ce; - if (ar.firstAvatarElement != null) { - if (ar.secondAvatarElement == null) { - ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, - AvatarError.errorStrings[ar.error] + ": " + ar.firstAvatarElement.getName()); + + ArrayList<AvatarError> listW = AvatarSyntaxChecker.checkSyntaxWarnings(as); + for (AvatarError ar : listW) { + UICheckingError ce; + if (ar.firstAvatarElement != null) { + if (ar.secondAvatarElement == null) { + ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, + AvatarError.errorStrings[ar.error] + ": " + ar.firstAvatarElement.getName()); + } else { + ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, + AvatarError.errorStrings[ar.error] + ": " + + ar.firstAvatarElement.getName() + " / " + ar.secondAvatarElement.getName()); + } } else { ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, - AvatarError.errorStrings[ar.error] + ": " + - ar.firstAvatarElement.getName() + " / " + ar.secondAvatarElement.getName()); + AvatarError.errorStrings[ar.error]); } - } else { - ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, - AvatarError.errorStrings[ar.error]); - } - ce.setTDiagramPanel(adp.getAvatarBDPanel()); - Object o = ar.firstAvatarElement.getReferenceObject(); - if (o instanceof TGComponent) { - ce.setTGComponent((TGComponent) o); - ce.setTDiagramPanel(((TGComponent) o).getTDiagramPanel()); + ce.setTDiagramPanel(adp.getAvatarBDPanel()); + Object o = ar.firstAvatarElement.getReferenceObject(); + if (o instanceof TGComponent) { + ce.setTGComponent((TGComponent) o); + ce.setTDiagramPanel(((TGComponent) o).getTDiagramPanel()); + } + addWarning(ce); } - addWarning(ce); } adp.abdp.repaint(); @@ -1610,32 +1611,46 @@ public class AvatarDesignPanelTranslator { } private void manageAttribute(String _name, AvatarStateMachineOwner _ab, AvatarActionOnSignal _aaos, TDiagramPanel _tdp, TGComponent _tgc, - String _idOperator) { + String _idOperator, boolean writeOperation) { //TraceManager.addDev("Searching for attribute:" + _name); TAttribute ta = adp.getAvatarBDPanel().getAttribute(_name, _ab.getName()); if (ta == null) { // Must search among attributes of the created block AvatarAttribute aatmp = _ab.getAvatarAttributeWithName(_name); if (aatmp != null) { + if (aatmp.isConstant() && writeOperation) { + UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "Using constant parameter \"" + _name + + "\" in a receive operation: " + _idOperator); + ce.setTDiagramPanel(_tdp); + ce.setTGComponent(_tgc); + addCheckingError(ce); + return; + } _aaos.addValue(aatmp.getName()); return; } - - UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed parameter: " + _name + " in signal expression: " + _idOperator); - // TODO: adapt - // ce.setAvatarBlock(_ab); + UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed parameter \"" + _name + + "\" in signal expression: " + _idOperator); ce.setTDiagramPanel(_tdp); ce.setTGComponent(_tgc); addCheckingError(ce); - TraceManager.addDev("not found " + _name + " in block " + _ab.getName() + ". Attributes are:"); + /*TraceManager.addDev("not found " + _name + " in block " + _ab.getName() + ". Attributes are:"); for (AvatarAttribute aa : _ab.getAttributes()) { TraceManager.addDev("\t" + aa.getName()); } - TraceManager.addDev("\n"); + TraceManager.addDev("\n");*/ return; } + if (writeOperation && ta.isConstant()) { + UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "Using constant parameter \"" + _name + + "\" in a receive operation: " + _idOperator); + ce.setTDiagramPanel(_tdp); + ce.setTGComponent(_tgc); + addCheckingError(ce); + } + //TraceManager.addDev("Found: " + ta.getId()); List<String> v = new LinkedList<String>(); @@ -1682,7 +1697,8 @@ public class AvatarDesignPanelTranslator { ((ui.AvatarSignal) atas.getReferenceObject()).attachedToARelation = false; } //TraceManager.addDev("Spec:" + _as.toString()); - throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Signal used for sending " + asmdss.getValue() + " is not connected to a channel"); + throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Signal used for sending " + asmdss.getValue() + + " is not connected to a channel"); } if (atas.getReferenceObject() instanceof ui.AvatarSignal) { //TraceManager.addDev("Send/ Setting as attached " + atas); @@ -1713,7 +1729,7 @@ public class AvatarDesignPanelTranslator { if (tmp.isEmpty()) throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Empty parameter in signal expression: " + asmdss.getValue()); - this.manageAttribute(tmp, _ab, aaos, tdp, asmdss, asmdss.getValue()); + this.manageAttribute(tmp, _ab, aaos, tdp, asmdss, asmdss.getValue(), false); } if (aaos.getNbOfValues() != atas.getListOfAttributes().size()) { @@ -1973,7 +1989,8 @@ public class AvatarDesignPanelTranslator { asm.addElement(element); } - private void translateAvatarSMDReceiveSignal(TDiagramPanel tdp, AvatarSpecification _as, AvatarStateMachineOwner _ab, AvatarSMDReceiveSignal asmdrs) throws CheckingError { + private void translateAvatarSMDReceiveSignal(TDiagramPanel tdp, AvatarSpecification _as, AvatarStateMachineOwner _ab, + AvatarSMDReceiveSignal asmdrs) throws CheckingError { AvatarStateMachine asm = _ab.getStateMachine(); avatartranslator.AvatarSignal atas = _ab.getAvatarSignalWithName(asmdrs.getSignalName()); if (atas == null) @@ -1988,7 +2005,8 @@ public class AvatarDesignPanelTranslator { //TraceManager.addDev("Receive/ Setting as attached " + atas); ((ui.AvatarSignal) atas.getReferenceObject()).attachedToARelation = false; } - throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Signal used for receiving " + asmdrs.getValue() + " is not connected to a channel"); + throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Signal used for receiving " + asmdrs.getValue() + + " is not connected to a channel"); } if (atas.getReferenceObject() instanceof ui.AvatarSignal) { //TraceManager.addDev("Receive/ Setting as attached " + atas); @@ -2024,22 +2042,25 @@ public class AvatarDesignPanelTranslator { if (tmp.isEmpty()) throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Empty parameter in signal expression: " + asmdrs.getValue()); - this.manageAttribute(tmp, _ab, aaos, tdp, asmdrs, asmdrs.getValue()); + this.manageAttribute(tmp, _ab, aaos, tdp, asmdrs, asmdrs.getValue(), true); } if (aaos.getNbOfValues() != atas.getListOfAttributes().size()) - throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed signal receiving: " + asmdrs.getValue() + " -> nb of parameters does not match definition"); + throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed signal receiving: " + asmdrs.getValue() + + " -> nb of parameters does not match definition"); // Checking expressions passed as parameter for (int i = 0; i < aaos.getNbOfValues(); i++) { String theVal = aaos.getValue(i); if (atas.getListOfAttributes().get(i).isInt()) { if (AvatarSyntaxChecker.isAValidIntExpr(_as, _ab, theVal) < 0) - throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed signal receiving: " + asmdrs.getValue() + " -> value at index #" + i + " does not match definition"); + throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed signal receiving: " + asmdrs.getValue() + + " -> value at index #" + i + " does not match definition"); } else { // We assume it is a bool attribute if (AvatarSyntaxChecker.isAValidBoolExpr(_as, _ab, theVal) < 0) - throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed signal receiving: " + asmdrs.getValue() + " -> value at index #" + i + " does not match definition"); + throw new CheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed signal receiving: " + asmdrs.getValue() + + " -> value at index #" + i + " does not match definition"); } } @@ -2175,7 +2196,8 @@ public class AvatarDesignPanelTranslator { asmdquery.setAVATARID(element.getID()); } - private void translateAvatarSMDRandom(TDiagramPanel tdp, AvatarSpecification _as, AvatarStateMachineOwner _ab, AvatarSMDRandom asmdrand) throws CheckingError { + private void translateAvatarSMDRandom(TDiagramPanel tdp, AvatarSpecification _as, AvatarStateMachineOwner _ab, AvatarSMDRandom asmdrand) + throws CheckingError { AvatarStateMachine asm = _ab.getStateMachine(); final AvatarStateMachineElement element; @@ -2213,7 +2235,9 @@ public class AvatarDesignPanelTranslator { this.makeError(-3, tdp, _ab, asmdrand, "random", tmp1); // Checking type of variable -> must be an int else if (!(aa.isInt())) - this.makeError(error, tdp, _ab, asmdrand, ": variable of random must be of type \"int\"", tmp2); + this.makeError(error, tdp, _ab, asmdrand, ": variable of random must be of type \"int\"", tmp1); + else if (aa.isConstant()) + this.makeError(error, tdp, _ab, asmdrand, ": variable of random must not be constant", tmp1); arandom.setVariable(tmp1); } else { @@ -2458,7 +2482,7 @@ public class AvatarDesignPanelTranslator { //TraceManager.addDev("Action before modifyStringMethodCall :" + actionText); actionText = modifyStringMethodCall(actionText, block.getName()); - //TraceManager.addDev("Action after modifyStringMethodCall :" + actionText); + TraceManager.addDev("Action after modifyStringMethodCall :" + actionText); if (!AvatarBlock.isAValidMethodCall(block, actionText)) { UICheckingError ce = new UICheckingError(CheckingError.BEHAVIOR_ERROR, "Badly formed transition method call: " + actionText); diff --git a/src/main/java/ui/avatarbd/AvatarBDPanel.java b/src/main/java/ui/avatarbd/AvatarBDPanel.java index bd72db2438..f7a3a5d4b0 100644 --- a/src/main/java/ui/avatarbd/AvatarBDPanel.java +++ b/src/main/java/ui/avatarbd/AvatarBDPanel.java @@ -131,7 +131,7 @@ public class AvatarBDPanel extends TDiagramPanel { } public void updateSignalAttachement(AvatarBDBlock _b, AvatarBDPortConnector _conn) { - TraceManager.addDev("Update signal attachment for block " + _b.getBlockName()); + //TraceManager.addDev("Update signal attachment for block " + _b.getBlockName()); // Set all signals of B as non connected _b.setSignalsAsNonAttached(); -- GitLab