From 8714c5cbd7dcd5f00ac0323a2502c0eef232f6cb Mon Sep 17 00:00:00 2001 From: Sophie Coudert <sophie.coudert@telecom-paris.fr> Date: Thu, 23 May 2024 15:34:52 +0200 Subject: [PATCH] Stx2Avatar point: blocks handling : state part in progress --- .../AvatarActionOnSignal.java | 5 ++ .../tosysmlv2/AvatarFromSysML.java | 80 +++++++++++++++++++ .../tosysmlv2/AvatarFromSysMLLexer.java | 4 +- .../tosysmlv2/AvatarFromSysMLParser.java | 28 ++++--- .../tosysmlv2/AvatarFromSysMLSyntax.java | 19 ++--- .../tosysmlv2/javacup/AvatarFromSysML.jcup | 28 ++++--- 6 files changed, 131 insertions(+), 33 deletions(-) diff --git a/src/main/java/avatartranslator/AvatarActionOnSignal.java b/src/main/java/avatartranslator/AvatarActionOnSignal.java index cadfa837c2..80ce4f618d 100644 --- a/src/main/java/avatartranslator/AvatarActionOnSignal.java +++ b/src/main/java/avatartranslator/AvatarActionOnSignal.java @@ -77,6 +77,11 @@ public class AvatarActionOnSignal extends AvatarStateMachineElement { actionAttr = null; } + public AvatarActionOnSignal(String _name, Object _referenceObject, AvatarStateMachineOwner _block) { + super( _name, _referenceObject, _block, true, false ); + values = new LinkedList<String>(); + actionAttr = null; + } public AvatarSignal getSignal() { return signal; } diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java index 2bf3a6767e..73e351b2a8 100644 --- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java @@ -51,6 +51,7 @@ public class AvatarFromSysML { private StxModel stxSpec; private HashMap<StxSignal, AvatarSignal> signalMap; private HashMap<StxBlock, AvatarBlock> blockMap; + private HashMap<StxState, AvatarStateMachineElement> stateMap; private AvatarBlock getBlock(StxBlock _b) { AvatarBlock b = blockMap.get(_b); if (b == null) { @@ -70,6 +71,52 @@ public class AvatarFromSysML { } return b; } + private AvatarAttribute getAttributeByName(String _name, AvatarBlock _block) { + List<AvatarAttribute> l = _block.getAttributes(); + int size = l.size(); + for (int i = 0; i < size; i++) + if(l.get(i).getName().equals(_name)) return l.get(i); + return null; + } + private AvatarStateMachineElement getState(StxState _s, AvatarBlock _b) { + AvatarStateMachineElement s = stateMap.get(_s); + if (s == null) { + switch(_s.getType()) { + case AvatarFromSysMLSyntax.STXSTARTSTATE : + s = new AvatarStartState("StartState", null, _b); + break; + case AvatarFromSysMLSyntax.STXSTOPSTATE : + s = new AvatarStopState("StopState", null, _b); + break; + case AvatarFromSysMLSyntax.STXSTANDARDSTATE : + s = new AvatarState(_s.getName(), null, _b); + break; + case AvatarFromSysMLSyntax.STXRANDOMSTATE : + s = new AvatarRandom(_s.getName(), null, _b); + break; + case AvatarFromSysMLSyntax.STXCOUNTSTATE : + s = new AvatarQueryOnSignal(_s.getName(), getSignal(_s.getSignal()), + getAttributeByName(_s.getVariable(),_b), null, _b); + break; + case AvatarFromSysMLSyntax.STXSENDSTATE : + case AvatarFromSysMLSyntax.STXRECEIVESTATE : + s = new AvatarActionOnSignal(_s.getName(), null, _b); + break; + case AvatarFromSysMLSyntax.STXPRESENDSTATE : + case AvatarFromSysMLSyntax.STXPRERECEIVESTATE : break; + case AvatarFromSysMLSyntax.STXSETTIMERSTATE : + s = new AvatarSetTimer(_s.getName(), null, _b); + break; + case AvatarFromSysMLSyntax.STXRESETTIMERSTATE : + s = new AvatarResetTimer(_s.getName(), null, _b); + break; + case AvatarFromSysMLSyntax.STXEXPIRETIMERSTATE : + s = new AvatarExpireTimer(_s.getName(), null, _b); + } + if (s != null) stateMap.put(_s, s); + } + return s; + } public void sysMLtoSpec(String _txt) { AvatarFromSysMLParser parser = @@ -211,6 +258,39 @@ public class AvatarFromSysML { AvatarSignal as = getSignal(ss); theBlock.addSignal(as); } + // add states + StxState[] states = blk.getStates(); + AvatarStateMachine asm = theBlock.getStateMachine(); + size = states.length; + for (int i = 0; i < size; i++) { + AvatarStateMachineElement theState = getState(states[i], theBlock); + switch(states[i].getType()) { + case AvatarFromSysMLSyntax.STXSTARTSTATE : + break; + case AvatarFromSysMLSyntax.STXSTOPSTATE : + break; + case AvatarFromSysMLSyntax.STXSTANDARDSTATE : + break; + case AvatarFromSysMLSyntax.STXRANDOMSTATE : + break; + case AvatarFromSysMLSyntax.STXCOUNTSTATE : + break; + case AvatarFromSysMLSyntax.STXSENDSTATE : + break; + case AvatarFromSysMLSyntax.STXRECEIVESTATE : + break; + case AvatarFromSysMLSyntax.STXPRESENDSTATE : + break; + case AvatarFromSysMLSyntax.STXPRERECEIVESTATE : + break; + case AvatarFromSysMLSyntax.STXSETTIMERSTATE : + break; + case AvatarFromSysMLSyntax.STXRESETTIMERSTATE : + break; + case AvatarFromSysMLSyntax.STXEXPIRETIMERSTATE : + } + } + } } private void buildBlocks(){ diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLLexer.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLLexer.java index 88e77b9b39..eca981f1fd 100644 --- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLLexer.java +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLLexer.java @@ -1,4 +1,4 @@ -/* The following code was generated by JFlex 1.4.3 on 22/05/2024 14:29 */ +/* The following code was generated by JFlex 1.4.3 on 23/05/2024 14:27 */ package avatartranslator.tosysmlv2; import java_cup.runtime.*; @@ -9,7 +9,7 @@ import avatartranslator.tosysmlv2.AvatarFromSysMLSyntax.*; /** * This class is a scanner generated by * <a href="http://www.jflex.de/">JFlex</a> 1.4.3 - * on 22/05/2024 14:29 from the specification file + * on 23/05/2024 14:27 from the specification file * <tt>__AvatarFromSysMLLexer__.jflex</tt> */ public class AvatarFromSysMLLexer implements java_cup.runtime.Scanner { diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParser.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParser.java index b18da4f38c..0d5f342f35 100644 --- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParser.java +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParser.java @@ -1018,17 +1018,27 @@ public class AvatarFromSysMLParser extends java_cup.runtime.lr_parser { } } private ArrayList<StxBlock> blockHierarchy; - private void pushBlock() { blockHierarchy.add(theBlock); theBlock = null; } + private ArrayList<HashMap<String,StxAttribute>> attributeHierarchy; + private void pushBlock() { + blockHierarchy.add(theBlock); + theBlock = null; + attributeHierarchy.add(attributeMap); + attributeMap = new HashMap<String,StxAttribute>(); + } private void popBlock() { theBlock = blockHierarchy.get(blockHierarchy.size() -1); blockHierarchy.remove(blockHierarchy.size() -1); + attributeMap = attributeHierarchy.get(attributeHierarchy.size() -1); + attributeHierarchy.remove(attributeHierarchy.size() -1); } private StxAttribute theAttribute; + private HashMap<String,StxAttribute> attributeMap; private void getAttribute(String _name, String _type) { - theAttribute = new StxAttribute(_name, _type); - } - private void getConstant(String _name, String _type) { - theAttribute = new StxAttribute(_name, _type); + theAttribute = attributeMap.get(_name); + if (theAttribute == null) { + theAttribute = new StxAttribute(_name, _type); + attributeMap.put(_name, theAttribute); + } } private void getMethod(String _name) { theStructure = new StxMethod(_name); @@ -2357,7 +2367,7 @@ class CUP$AvatarFromSysMLParser$actions { Location tpxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.peek()).xright; Object tp = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); - getConstant(id.getAvatarName(), (String) tp); + getAttribute(id.getAvatarName(), (String) tp); theBlock.addConstant(theAttribute); theAttribute.setLeft(rxleft); lexer.setGetStringValue(true); @@ -2610,7 +2620,7 @@ class CUP$AvatarFromSysMLParser$actions { { Object RESULT =null; - theBlock.setStates(stateMap); + theBlock.setStates(stateMap.values().toArray(new StxState[0])); stateMap = null; CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stateMachine",57, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); @@ -2622,7 +2632,7 @@ class CUP$AvatarFromSysMLParser$actions { { Object RESULT =null; - theBlock.setStates(stateMap); + theBlock.setStates(stateMap.values().toArray(new StxState[0])); stateMap = null; CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stateMachine",57, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-2), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); @@ -2634,7 +2644,7 @@ class CUP$AvatarFromSysMLParser$actions { { Object RESULT =null; - theBlock.setStates(stateMap); + theBlock.setStates(stateMap.values().toArray(new StxState[0])); stateMap = null; CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("stateMachine",57, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java index 9b67ffd9f1..20b89b0ed3 100644 --- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java @@ -60,9 +60,6 @@ public class AvatarFromSysMLSyntax { public static final byte STXSETTIMERSTATE = 9; public static final byte STXRESETTIMERSTATE = 10; public static final byte STXEXPIRETIMERSTATE = 11; - public static final byte STXPRESETTIMERSTATE = 12; - public static final byte STXPRERESETTIMERSTATE = 13; - public static final byte STXPREEXPIRETIMERSTATE = 14; public static final byte STXTRIVIALTRANSITION = 0; public static final byte STXSENDTRANSITION = 1; public static final byte STXRECEIVETRANSITION = 2; @@ -258,17 +255,13 @@ public class AvatarFromSysMLSyntax { public String getInit() { return init; } } - public static class StxTimer extends StxElement { - String name; + public static class StxTimer extends StxAttribute { public StxTimer(Location _left, Location _right, String _name){ - super(_left, _right); - name = _name; + super(_left, _right, _name, ""); } public StxTimer(String _name){ - super(); - name = _name; + super(_name, ""); } - public String getName() { return name; } } public static class StxBlock extends StxElement { String name; @@ -278,7 +271,7 @@ public class AvatarFromSysMLSyntax { ArrayList<StxMethod> methods; ArrayList<StxSignal> signals; ArrayList<StxTimer> timers; - HashMap<String, StxState> states; + StxState[] states; public StxBlock(Location _left, Location _right, String _name) { super(_left, _right); name = _name; @@ -298,8 +291,8 @@ public class AvatarFromSysMLSyntax { timers = new ArrayList<StxTimer>(); } public void setFather(StxBlock _father) { father = _father; } - public HashMap<String, StxState> getStates() { return states; } - public void setStates(HashMap<String, StxState> m) {states = m; } + public StxState[] getStates() { return states; } + public void setStates(StxState[] l) { states = l; } public boolean addAttribute(StxAttribute a){ boolean result = true; for (StxAttribute att : attributes) result &= (! att.getName().equals(a.getName())); diff --git a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup index 8b936a05bf..64d14618bd 100644 --- a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup +++ b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup @@ -95,17 +95,27 @@ parser code {: } } private ArrayList<StxBlock> blockHierarchy; - private void pushBlock() { blockHierarchy.add(theBlock); theBlock = null; } + private ArrayList<HashMap<String,StxAttribute>> attributeHierarchy; + private void pushBlock() { + blockHierarchy.add(theBlock); + theBlock = null; + attributeHierarchy.add(attributeMap); + attributeMap = new HashMap<String,StxAttribute>(); + } private void popBlock() { theBlock = blockHierarchy.get(blockHierarchy.size() -1); blockHierarchy.remove(blockHierarchy.size() -1); + attributeMap = attributeHierarchy.get(attributeHierarchy.size() -1); + attributeHierarchy.remove(attributeHierarchy.size() -1); } private StxAttribute theAttribute; + private HashMap<String,StxAttribute> attributeMap; private void getAttribute(String _name, String _type) { - theAttribute = new StxAttribute(_name, _type); - } - private void getConstant(String _name, String _type) { - theAttribute = new StxAttribute(_name, _type); + theAttribute = attributeMap.get(_name); + if (theAttribute == null) { + theAttribute = new StxAttribute(_name, _type); + attributeMap.put(_name, theAttribute); + } } private void getMethod(String _name) { theStructure = new StxMethod(_name); @@ -552,7 +562,7 @@ constantDecl ::= ; constantDeclHEADER ::= READONLY:r ATTRIBUTE IDENT:id COLON typIdent:tp {: - getConstant(id.getAvatarName(), (String) tp); + getAttribute(id.getAvatarName(), (String) tp); theBlock.addConstant(theAttribute); theAttribute.setLeft(rxleft); lexer.setGetStringValue(true); @@ -626,15 +636,15 @@ timerDecl ::= // STATE MACHINE %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% stateMachine ::= stateMachineBegin stateMachineBegin LBRAC stateMachineItems RBRAC {: - theBlock.setStates(stateMap); + theBlock.setStates(stateMap.values().toArray(new StxState[0])); stateMap = null; :} | stateMachineBegin LBRAC RBRAC {: - theBlock.setStates(stateMap); + theBlock.setStates(stateMap.values().toArray(new StxState[0])); stateMap = null; :} | stateMachineBegin SEMICOLON {: - theBlock.setStates(stateMap); + theBlock.setStates(stateMap.values().toArray(new StxState[0])); stateMap = null; :} ; -- GitLab