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