From cf9cb35e3a586f602983a329342c1750c42da1d6 Mon Sep 17 00:00:00 2001
From: Sophie Coudert <sophie.coudert@telecom-paris.fr>
Date: Sat, 18 May 2024 17:43:35 +0200
Subject: [PATCH] grammar algorithm in progress, nexts: state actions

---
 .../tosysmlv2/AvatarFromSysMLParserState.java |  3 +
 .../tosysmlv2/AvatarFromSysMLSyntax.java      |  7 +-
 .../tosysmlv2/javacup/AvatarFromSysML.jcup    | 88 ++++++++++++-------
 .../tosysmlv2/javacup/AvatarFromSysML.jflex   |  7 +-
 4 files changed, 70 insertions(+), 35 deletions(-)

diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParserState.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParserState.java
index 87ce814811..baf065d15b 100644
--- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParserState.java
+++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParserState.java
@@ -101,4 +101,7 @@ public class AvatarFromSysMLParserState {
     public void getTransition(int _index) {
         theTransition = theState.getTransition(_index);
     }
+
+    public ArrayList<String> argList;
+
 }
diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java
index 09903a5362..31b9de2fdb 100644
--- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java
+++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java
@@ -430,6 +430,7 @@ public class AvatarFromSysMLSyntax {
         private final int index;
         private String guard;
         private StxSignal signal;
+        private String timer;
         private ArrayList<String> sendPayload;
         private HashMap<String,String> receivePayload;
         private String minDelay;
@@ -463,8 +464,9 @@ public class AvatarFromSysMLSyntax {
         public void setSignal(StxSignal _s) { signal = _s; }
         public void setSendPayload(ArrayList<String> _p) { sendPayload = _p; }
         public void setReceivePayload(HashMap<String,String> _p) { receivePayload = _p; }
-        public void setMinDelay(String _s) { minDelay = _s; }
-        public void setMaxDelay(String _s) { maxDelay = _s; }
+        public void setTimer(String _s) { timer = _s; }
+         public void setMinDelay(String _s) { minDelay = _s; }
+       public void setMaxDelay(String _s) { maxDelay = _s; }
         public void setDelayDistributionLaw(String _s) { delayDistributionLaw = _s; }
         public void setDelayExtraNameA(String _s) { delayExtraNameA = _s; }
         public void setDelayExtraNameB(String _s) { delayExtraNameB = _s; }
@@ -475,6 +477,7 @@ public class AvatarFromSysMLSyntax {
         public byte getType() { return type; }
         public int getIndex() { return index; }
         public String getGuard() { return guard; }
+        public String getTimer() { return timer; }
         public StxSignal getSignal() { return signal; }
         public ArrayList<String> getSendPayload() { return sendPayload; }
         public HashMap<String, String> getReceivePayload() { return receivePayload; }
diff --git a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup
index 7a4dae9af5..045f65aa43 100644
--- a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup
+++ b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup
@@ -1,6 +1,8 @@
  
-package avatartranslator.fromsml;
+package avatartranslator.tosysmlV2;
 import java_cup.runtime.*;
+import avatartranslator.tosysmlV2.AvatarFromSysMLParserState.*;
+
 parser code {:
   void setStringExpr(boolean _b) { ((SCANNERCLASS) getScanner()).setStringExpr(_b); }
 :}
@@ -71,11 +73,11 @@ non terminal blockDecl, blockDeclBegin, blockDeclBODY, blockItem, attributeDecl,
 non terminal state, startState, standardState, stopState, sendState, receiveState, randomState, countState, presendState,
     prereceiveState, setTimerState, resetTimerState, expireTimerState, poolParam, requestParam, requestList, request,
     simpleRequest, trivialRequest, requestArgs, requestArg, sendRequest, receiveRequest, setTimerRequest, resetTimerRequest,
-    expireTimerRequest, indexParam, delayParam, delayExpr, randomExpr, payloadParam, channelParam, settimerParam,
+    expireTimerRequest, indexParam, delayParam, delayExpr, actionRandomExpr, delayRandomExpr, payloadParam, channelParam, settimerParam,
     resettimerParam, expiretimerParam, trivialRequestBegin, sendRequestBegin, receiveRequestBegin, setTimerRequestBegin,
     resetTimerRequestBegin, expireTimerRequestBegin, startStateBegin, standardStateBegin, stopStateBegin, sendStateBegin,
     receiveStateBegin, randomStateBegin, countStateBegin, presendStateBegin, prereceiveStateBegin, setTimerStateBegin,
-    resetTimerStateBegin, expireTimerStateBegin, stateMachineBegin;
+    resetTimerStateBegin, expireTimerStateBegin, stateMachineBegin, payloadParamBegin;
 
 non terminal randomAction, targetParam, randomParam, countAction, countParam, transition, transOptions, doActions, actions,
     actionSeq, act, leftHand, stringExprList;
@@ -578,9 +580,10 @@ requestParam ::= REQUEST_F EQUAL request;
 requestList ::= request | request COMMA requestList;
 request ::=
       IF STRINGEXPR:e simpleRequest ELSE NOKREQUEST_U LPAR INT RPAR {:
-        theRequest.setGuard(e);
+        theTransition.setGuard(e);
+        requestIndex++;
       :}
-    | simpleRequest
+    | simpleRequest {: requestIndex++; :}
 ;
 simpleRequest ::= trivialRequest | sendRequest | receiveRequest
     | setTimerRequest | resetTimerRequest | expireTimerRequest;
@@ -588,45 +591,38 @@ simpleRequest ::= trivialRequest | sendRequest | receiveRequest
 trivialRequest ::=
       IMMEDIATEREQUEST_U {:
         getRequest(requestIndex);
-        theRequest.setType(STXTRIVIALREQUEST);
-        requestIndex++;
+        theTransition.setType(STXTRIVIALREQUEST);
       :}
     | trivialRequestBegin requestArgs RPAR
 ;
 trivialRequestBegin ::= TRIVIALREQUEST_T LPAR {:
     getRequest(requestIndex);
-    theRequest.setType(STXTRIVIALREQUEST);
-    requestIndex++;
-:}
+    theTransition.setType(STXTRIVIALREQUEST);
+:};
 sendRequest ::= sendRequestBegin requestArgs RPAR;
 sendRequestBegin ::=  SENDREQUEST_T LPAR {:
     getRequest(requestIndex);
-    theRequest.setType(STXSENDREQUEST);
-    requestIndex++;
+    theTransition.setType(STXSENDREQUEST);
 :};
 receiveRequest ::= receiveRequestBegin requestArgs RPAR;
 receiveRequestBegin ::= RECEIVEREQUEST_T LPAR {:
     getRequest(requestIndex);
-    theRequest.setType(STXRECEIVEREQUEST);
-    requestIndex++;
+    theTransition.setType(STXRECEIVEREQUEST);
 :};
 setTimerRequest ::= setTimerRequestBegin requestArgs RPAR;
 setTimerRequestBegin ::= SETTIMERREQUEST_T LPAR {:
     getRequest(requestIndex);
-    theRequest.setType(STXSETTIMERREQUEST);
-    requestIndex++;
+    theTransition.setType(STXSETTIMERREQUEST);
 :};
 resetTimerRequest ::= resetTimerRequestBegin requestArgs RPAR;
 resetTimerRequestBegin ::= RESETTIMERREQUEST_T LPAR {:
     getRequest(requestIndex);
-    theRequest.setType(STXRESETTIMERREQUEST);
-    requestIndex++;
+    theTransition.setType(STXRESETTIMERREQUEST);
 :};
 expireTimerRequest ::= expireTimerRequestBegin requestArgs RPAR;
 expireTimerRequestBegin ::= EXPIRETIMERREQUEST_T LPAR {:
     getRequest(requestIndex);
-    theRequest.setType(STXEXPIRETIMERREQUEST);
-    requestIndex++;
+    theTransition.setType(STXEXPIRETIMERREQUEST);
 :};
 
 requestArgs ::= requestArg | requestArg requestArgs;
@@ -635,22 +631,44 @@ requestArg ::= indexParam | delayParam | channelParam | payloadParam | settimerP
 indexParam ::= INDEX_F EQUAL INT;
 delayParam ::= DELAY_F EQUAL delayExpr;
 delayExpr ::=
-      STRINGEXPR
-    | randomExpr
+      STRINGEXPR:e {: theTransition.setMinDelay(e); :}
+    | delayRandomExpr
+;
+delayRandomExpr ::=
+      BOUNDRANDOM_U LPAR STRINGEXPR:i COMMA STRINGEXPR:a RPAR {:
+        theTransition.setMinDelay(i);
+        theTransition.setMaxDelay(a);
+      :}
 ;
-randomExpr ::=
-      BOUNDRANDOM_U LPAR STRINGEXPR COMMA STRINGEXPR RPAR
+payloadParam ::=
+      payloadParamBegin IDENT LPAR stringExprList RPAR {:
+        setPayloadParam(false);
+        theTransaction.setSendPayload(argList);
+        argList = null;
+      :}
+    | payloadParamBegin IDENT LPAR RPAR {: setPayloadParam(false); :}
+    | payloadParamBegin IDENT {: setPayloadParam(false); :}
 ;
+payloadParamBegin ::= PAYLOAD_F EQUAL {: setPayloadParam(true); argList= new ArrayList<String>(); :};
 
-payloadParam ::= PAYLOAD_F EQUAL IDENT LPAR stringExprList RPAR;
-channelParam ::= CHANNEL_F EQUAL IDENT;
-settimerParam ::= CHANNEL_F EQUAL IDENT POINT SET_TM;
-resettimerParam ::= CHANNEL_F EQUAL IDENT POINT RESET_TM;
-expiretimerParam ::= CHANNEL_F EQUAL IDENT POINT EXPIRE_TM;
+channelParam ::= CHANNEL_F EQUAL IDENT:id {:
+    getSignal(theBlock.name,id.getAvatarName());
+    theTransaction.setSignal(theSignal);
+:};
+
+settimerParam ::= CHANNEL_F EQUAL IDENT:id POINT SET_TM {:
+    theTransaction.setTimer(id.getAvatarName());
+:};
+resettimerParam ::= CHANNEL_F EQUAL IDENT POINT RESET_TM {:
+    theTransaction.setTimer(id.getAvatarName());
+:};
+expiretimerParam ::= CHANNEL_F EQUAL IDENT POINT EXPIRE_TM {:
+    theTransaction.setTimer(id.getAvatarName());
+:};
 
 stringExprList ::=
-    STRINGEXPR
-    | stringExprList COMMA STRINGEXPR
+    STRINGEXPR:e {: argList.add(e); :}
+    | STRINGEXPR COMMA stringExprList  {: argList.add(e); :}
 ;
 // STATE ACTIONS ++++++++++++++++++++++++++++++++++++
 randomAction ::=
@@ -658,7 +676,13 @@ randomAction ::=
     | STATEACTION_F EQUAL ASSIGNMENT_T LPAR randomParam COMMA targetParam RPAR
 ;
 targetParam ::= TARGET_F EQUAL IDENT;
-randomParam ::= VALUE_F EQUAL randomExpr;
+randomParam ::= VALUE_F EQUAL actionRandomExpr;
+delayRandomExpr ::=
+      BOUNDRANDOM_U LPAR STRINGEXPR:i COMMA STRINGEXPR:a RPAR {:
+        theTransition.setMinDelay(i);
+        theTransition.setMaxDelay(a);
+      :}
+;
 
 countAction ::=
       STATEACTION_F EQUAL ASSIGNMENT_T LPAR targetParam COMMA countParam RPAR
diff --git a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jflex b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jflex
index 152260dfe9..103abd32b0 100644
--- a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jflex
+++ b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jflex
@@ -36,6 +36,8 @@ import java.util.HashSet;
     public void setStringValue(boolean _b)  { getStringValue = _b; }
     private StringBuffer stringAcc = new StringBuffer();
     private boolean delayParam = false;
+    private boolean payloadParam = false;
+    public void setPayloadParam(boolean _b){ payloadParam = _b; }
     private boolean tupleParam = false;
     private int nbLpar = 0;
 
@@ -167,7 +169,10 @@ timerBlockName = "'@tmr:" AvIdent "'"
  "=="            { return new Symbol(XX#Symb.EQ, yyline, yycolumn); }
  "true"          { return new Symbol(XX#Symb.BOOL, yyline, yycolumn, TRUE); }
  "false"         { return new Symbol(XX#Symb.BOOL, yyline, yycolumn, FALSE); }
-  "("            { return new Symbol(XX#Symb.LPAR, yyline, yycolumn); }
+  "("            { if (payloadParam) {
+                       stringExprAnchor(); oneShotArg = false; stringAcc.clear(); yyBegin(GETARG);
+                   }
+                   return new Symbol(XX#Symb.LPAR, yyline, yycolumn); }
   ")"            { return new Symbol(XX#Symb.RPAR, yyline, yycolumn); }
   "{"            { return new Symbol(XX#Symb.LBRAC, yyline, yycolumn); }
   "}"            { return new Symbol(XX#Symb.RBRAC, yyline, yycolumn); }
-- 
GitLab