Skip to content
Snippets Groups Projects
Commit 7e2eefdf authored by Sophie Coudert's avatar Sophie Coudert
Browse files

detection of errors in request parameters in progress

parent e650abe8
No related branches found
No related tags found
4 merge requests!504merge first stable version of Avatar-SysML V2,!503merge the first stable version of the Avatar-SysML parser/generator,!501Avatar sys ml 04 2024,!498Avatar sys ml 04 2024 (first merge request, only for verification)
/* The following code was generated by JFlex 1.4.3 on 06/06/2024 14:48 */
/* The following code was generated by JFlex 1.4.3 on 06/06/2024 17:02 */
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 06/06/2024 14:48 from the specification file
* on 06/06/2024 17:02 from the specification file
* <tt>__AvatarFromSysMLLexer__.jflex</tt>
*/
public class AvatarFromSysMLLexer implements java_cup.runtime.Scanner {
......
Source diff could not be displayed: it is too large. Options to address this: view the blob.
......@@ -473,7 +473,7 @@ public class AvatarFromSysMLSymbols {
static final int receiveRequestBegin = 101;
static final int privateParam = 21;
static final int startStateBegin = 105;
static final int call = 155;
static final int call = 156;
static final int receiveAssign = 141;
static final int specializes = 5;
static final int calcMethodDeclBegin = 61;
......@@ -482,7 +482,7 @@ public class AvatarFromSysMLSymbols {
static final int transitionActionBegin = 136;
static final int block2Param = 20;
static final int standardState = 65;
static final int stxCallParams = 157;
static final int stxCallParams = 158;
static final int featureList = 3;
static final int presendState = 71;
static final int inSignalBinding = 32;
......@@ -498,11 +498,12 @@ public class AvatarFromSysMLSymbols {
static final int stopStateBegin = 107;
static final int signalBinding = 31;
static final int receiveAssignSeq = 140;
static final int stxCallParam = 153;
static final int stxCallParam = 154;
static final int fieldDecl = 12;
static final int setTimerState = 73;
static final int stateMachineItem = 59;
static final int trivialRequestBegin = 99;
static final int delayKeyword = 146;
static final int weightLabel = 144;
static final int messageLine = 138;
static final int randomParam = 121;
......@@ -534,7 +535,7 @@ public class AvatarFromSysMLSymbols {
static final int simpleRequest = 80;
static final int messageDecl = 34;
static final int datatypeDeclHEADER = 10;
static final int expr = 150;
static final int expr = 151;
static final int stopState = 66;
static final int randomAction = 119;
static final int calcMethodItem = 54;
......@@ -554,7 +555,7 @@ public class AvatarFromSysMLSymbols {
static final int constantDeclHEADER = 62;
static final int blockDeclBODY = 45;
static final int trivialRequest = 81;
static final int stxCall = 148;
static final int stxCall = 149;
static final int countAction = 122;
static final int expireTimerStateBegin = 116;
static final int relationDecl = 13;
......@@ -562,7 +563,7 @@ public class AvatarFromSysMLSymbols {
static final int blockItem = 46;
static final int outMessageDeclBegin = 42;
static final int transitionLabels = 130;
static final int comma = 154;
static final int comma = 155;
static final int delayParam = 90;
static final int relParams = 17;
static final int targetParam = 120;
......@@ -600,13 +601,13 @@ public class AvatarFromSysMLSymbols {
static final int transitionBegin = 129;
static final int timerDecl = 56;
static final int transitionAction = 131;
static final int stxRvalue = 146;
static final int stxRvalue = 147;
static final int sendState = 67;
static final int block1Param = 19;
static final int complexIdent = 151;
static final int iexpr = 149;
static final int complexIdent = 152;
static final int iexpr = 150;
static final int datatypeDecl = 9;
static final int callBegin = 156;
static final int callBegin = 157;
static final int countParam = 123;
static final int expireTimerState = 75;
static final int prereceiveState = 72;
......@@ -616,7 +617,7 @@ public class AvatarFromSysMLSymbols {
static final int requestArgs = 82;
static final int stateMachineItems = 58;
static final int request = 79;
static final int stxExpr = 147;
static final int stxExpr = 148;
static final int setTimerStateBegin = 114;
static final int delayExpr = 91;
static final int attributeDeclHEADER = 49;
......@@ -625,7 +626,7 @@ public class AvatarFromSysMLSymbols {
static final int nbfChDecl = 29;
static final int receiveAssigns = 139;
static final int stateMachineBegin = 117;
static final int stxCallBegin = 152;
static final int stxCallBegin = 153;
static final int transitionLabel = 142;
static final int countStateBegin = 111;
}
......
......@@ -184,6 +184,23 @@ parser code {:
private void getTransition(int _index) {
theTransition = theState.getTransition(_index);
}
private Location indexArg;
private Location delayArg;
private Location channelArg;
private Location payloadArg;
private Location settimerArg;
private Location resettimerArg;
private Location expiretimerArg;
private boolean argOK;
private void clearRequestArgs() {
indexArg = null;
delayArg = null;
channelArg = null;
payloadArg = null;
settimerArg = null;
resettimerArg = null;
expiretimerArg = null;
}
private ArrayList<StxTerm> argList;
private ArrayList<StxAction> actionList;
......@@ -273,7 +290,7 @@ non terminal state, startState, standardState, stopState, sendState, receiveStat
non terminal randomAction, targetParam, randomParam, countAction, countParam, transition, doActions,
actionSeq, act, termList, transitionBegin, transitionLabels, transitionAction, receiveAction, assign,
target, fullIdent, transitionActionBegin, receiveActionBegin, messageLine, receiveAssigns, receiveAssignSeq,
receiveAssign, transitionLabel, distributionLabel, weightLabel, extraLabel;
receiveAssign, transitionLabel, distributionLabel, weightLabel, extraLabel, delayKeyword;
non terminal StxTerm stxRvalue;
non terminal StxExpr stxExpr;
......@@ -967,9 +984,15 @@ startState ::=
;
startStateBegin ::= ENTRY:z ACTION IDENT:id COLON AVSTARTSTATE_T {:
getState(id.getAvatarName());
theState.setType(AvatarFromSysMLSyntax.STXSTARTSTATE);
theState.setLeft(zxright);
requestIndex = 0;
if (! theState.declare() ) {
addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() +
" is already declared", theState.getLeft()) );
requestIndex = -1;
} else {
theState.setType(AvatarFromSysMLSyntax.STXSTARTSTATE);
theState.setLeft(zxright);
requestIndex = 0;
}
:};
standardState ::=
standardStateBegin SEMICOLON:q {:
......@@ -984,10 +1007,16 @@ standardState ::=
;
standardStateBegin ::= STATE:z IDENT:id COLON AVSTANDARDSTATE_T {:
getState(id.getAvatarName());
theState.setType(AvatarFromSysMLSyntax.STXSTANDARDSTATE);
theState.setName(id.getAvatarName());
theState.setLeft(zxright);
requestIndex = 0;
if (! theState.declare() ) {
addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() +
" is already declared", theState.getLeft()) );
requestIndex = -1;
} else {
theState.setType(AvatarFromSysMLSyntax.STXSTANDARDSTATE);
theState.setName(id.getAvatarName());
theState.setLeft(zxright);
requestIndex = 0;
}
:};
stopState ::=
stopStateBegin SEMICOLON:q {:
......@@ -999,8 +1028,14 @@ stopState ::=
;
stopStateBegin ::= EXIT:z ACTION IDENT:id COLON AVSTOPSTATE_T {:
getState(id.getAvatarName());
theState.setType(AvatarFromSysMLSyntax.STXSTOPSTATE);
theState.setLeft(zxright);
if (! theState.declare() ) {
addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() +
" is already declared", theState.getLeft()) );
requestIndex = -1;
} else {
theState.setType(AvatarFromSysMLSyntax.STXSTOPSTATE);
theState.setLeft(zxright);
}
:};
sendState ::=
sendStateBegin SEMICOLON:q {:
......@@ -1015,9 +1050,15 @@ sendState ::=
;
sendStateBegin ::= STATE:z IDENT:id COLON AVSENDSTATE_T {:
getState(id.getAvatarName());
theState.setType(AvatarFromSysMLSyntax.STXSENDSTATE);
theState.setLeft(zxright);
requestIndex = 0;
if (! theState.declare() ) {
addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() +
" is already declared", theState.getLeft()) );
requestIndex = -1;
} else {
theState.setType(AvatarFromSysMLSyntax.STXSENDSTATE);
theState.setLeft(zxright);
requestIndex = 0;
}
:};
receiveState ::=
receiveStateBegin SEMICOLON:q {:
......@@ -1032,9 +1073,15 @@ receiveState ::=
;
receiveStateBegin ::= STATE:z IDENT:id COLON AVRECEIVESTATE_T {:
getState(id.getAvatarName());
theState.setType(AvatarFromSysMLSyntax.STXRECEIVESTATE);
theState.setLeft(zxright);
requestIndex = 0;
if (! theState.declare() ) {
addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() +
" is already declared", theState.getLeft()) );
requestIndex = -1;
} else {
theState.setType(AvatarFromSysMLSyntax.STXRECEIVESTATE);
theState.setLeft(zxright);
requestIndex = 0;
}
:};
randomState ::=
randomStateBegin EQUAL AVRANDOMSTATE_T LPAR randomAction COMMA requestParam RPAR SEMICOLON:q {:
......@@ -1049,9 +1096,15 @@ randomState ::=
;
randomStateBegin ::= STATE:z IDENT:id COLON AVRANDOMSTATE_T {:
getState(id.getAvatarName());
theState.setType(AvatarFromSysMLSyntax.STXRANDOMSTATE);
theState.setLeft(zxright);
requestIndex = 0;
if (! theState.declare() ) {
addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() +
" is already declared", theState.getLeft()) );
requestIndex = -1;
} else {
theState.setType(AvatarFromSysMLSyntax.STXRANDOMSTATE);
theState.setLeft(zxright);
requestIndex = 0;
}
:};
countState ::=
countStateBegin EQUAL AVCOUNTSTATE_T LPAR countAction RPAR SEMICOLON:q {:
......@@ -1066,9 +1119,15 @@ countState ::=
;
countStateBegin ::= STATE:z IDENT:id COLON AVCOUNTSTATE_T {:
getState(id.getAvatarName());
theState.setType(AvatarFromSysMLSyntax.STXCOUNTSTATE);
theState.setLeft(zxright);
requestIndex = 0;
if (! theState.declare() ) {
addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() +
" is already declared", theState.getLeft()) );
requestIndex = -1;
} else {
theState.setType(AvatarFromSysMLSyntax.STXCOUNTSTATE);
theState.setLeft(zxright);
requestIndex = 0;
}
:};
presendState ::=
presendStateBegin EQUAL AVPRESENDSTATE_T LPAR requestParam RPAR SEMICOLON:q {:
......@@ -1077,9 +1136,15 @@ presendState ::=
;
presendStateBegin ::= STATE:z IDENT:id COLON AVPRESENDSTATE_T {:
getState(id.getAvatarName());
theState.setType(AvatarFromSysMLSyntax.STXPRESENDSTATE);
theState.setLeft(zxright);
requestIndex = 0;
if (! theState.declare() ) {
addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() +
" is already declared", theState.getLeft()) );
requestIndex = -1;
} else {
theState.setType(AvatarFromSysMLSyntax.STXPRESENDSTATE);
theState.setLeft(zxright);
requestIndex = 0;
}
:};
prereceiveState ::=
prereceiveStateBegin EQUAL AVPRERECEIVESTATE_T LPAR requestParam RPAR SEMICOLON:q {:
......@@ -1088,9 +1153,15 @@ prereceiveState ::=
;
prereceiveStateBegin ::= STATE:z IDENT:id COLON AVPRERECEIVESTATE_T {:
getState(id.getAvatarName());
theState.setType(AvatarFromSysMLSyntax.STXPRERECEIVESTATE);
theState.setLeft(zxright);
requestIndex = 0;
if (! theState.declare() ) {
addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() +
" is already declared", theState.getLeft()) );
requestIndex = -1;
} else {
theState.setType(AvatarFromSysMLSyntax.STXPRERECEIVESTATE);
theState.setLeft(zxright);
requestIndex = 0;
}
:};
setTimerState ::=
setTimerStateBegin EQUAL AVSETTIMERSTATE_T LPAR requestParam RPAR SEMICOLON:q {:
......@@ -1105,9 +1176,15 @@ setTimerState ::=
;
setTimerStateBegin ::= STATE:z IDENT:id COLON AVSETTIMERSTATE_T {:
getState(id.getAvatarName());
theState.setType(AvatarFromSysMLSyntax.STXSETTIMERSTATE);
theState.setLeft(zxright);
requestIndex = 0;
if (! theState.declare() ) {
addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() +
" is already declared", theState.getLeft()) );
requestIndex = -1;
} else {
theState.setType(AvatarFromSysMLSyntax.STXSETTIMERSTATE);
theState.setLeft(zxright);
requestIndex = 0;
}
:};
resetTimerState ::=
resetTimerStateBegin EQUAL AVRESETTIMERSTATE_T LPAR requestParam RPAR SEMICOLON:q {:
......@@ -1122,9 +1199,15 @@ resetTimerState ::=
;
resetTimerStateBegin ::= STATE:z IDENT:id COLON AVRESETTIMERSTATE_T {:
getState(id.getAvatarName());
theState.setType(AvatarFromSysMLSyntax.STXRESETTIMERSTATE);
theState.setLeft(zxright);
requestIndex = 0;
if (! theState.declare() ) {
addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() +
" is already declared", theState.getLeft()) );
requestIndex = -1;
} else {
theState.setType(AvatarFromSysMLSyntax.STXRESETTIMERSTATE);
theState.setLeft(zxright);
requestIndex = 0;
}
:};
expireTimerState ::=
expireTimerStateBegin EQUAL AVEXPIRETIMERSTATE_T LPAR requestParam RPAR SEMICOLON:q {:
......@@ -1139,9 +1222,15 @@ expireTimerState ::=
;
expireTimerStateBegin ::= STATE:z IDENT:id COLON AVEXPIRETIMERSTATE_T {:
getState(id.getAvatarName());
theState.setType(AvatarFromSysMLSyntax.STXEXPIRETIMERSTATE);
theState.setLeft(zxright);
requestIndex = 0;
if (! theState.declare() ) {
addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, zxleft, "State " + id.getAvatarName() +
" is already declared", theState.getLeft()) );
requestIndex = -1;
} else {
theState.setType(AvatarFromSysMLSyntax.STXEXPIRETIMERSTATE);
theState.setLeft(zxright);
requestIndex = 0;
}
:};
// STATES PARAMETERS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
......@@ -1153,25 +1242,36 @@ poolParam ::=
requestParam ::= REQUEST_F EQUAL request;
requestList ::= request | request COMMA requestList;
request ::=
IF:i iexpr:e QUEST simpleRequest:q ELSE NOKREQUEST_U LPAR INT RPAR {:
getTransition(requestIndex);
theTransition.setGuard(e);
theTransition.setRleft(ixleft);
theTransition.setRright(qxright);
requestIndex++;
IF:i iexpr:e QUEST simpleRequest:q ELSE NOKREQUEST_U LPAR INT:n RPAR {:
if ( requestIndex >= 0) {
if (n != requestIndex + 1) {
addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, nxleft,
" request index must be the request range in the request list (beginning at 1)", null) );
}
getTransition(requestIndex);
theTransition.setGuard(e);
theTransition.setRleft(ixleft);
theTransition.setRright(qxright);
requestIndex++;
}
:}
| simpleRequest:i {:
getTransition(requestIndex);
theTransition.setRleft(ixleft);
theTransition.setRright(ixright);
requestIndex++;
:}
;
if ( requestIndex >= 0) {
getTransition(requestIndex);
theTransition.setRleft(ixleft);
theTransition.setRright(ixright);
requestIndex++;
}
:};
simpleRequest ::= trivialRequest | sendRequest | receiveRequest
| setTimerRequest | resetTimerRequest | expireTimerRequest;
trivialRequest ::=
IMMEDIATEREQUEST_U {:
IMMEDIATEREQUEST_U:i {:
if (!(requestIndex == 0)) {
addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, ixleft,
" immediate request has index 1 and thus can only be used as first request", null) );
}
getTransition(requestIndex);
theTransition.setType(AvatarFromSysMLSyntax.STXTRIVIALTRANSITION);
:}
......@@ -1180,79 +1280,138 @@ trivialRequest ::=
trivialRequestBegin ::= TRIVIALREQUEST_T LPAR {:
getTransition(requestIndex);
theTransition.setType(AvatarFromSysMLSyntax.STXTRIVIALTRANSITION);
clearRequestArgs();
:};
sendRequest ::= sendRequestBegin requestArgs RPAR;
sendRequestBegin ::= SENDREQUEST_T LPAR {:
getTransition(requestIndex);
theTransition.setType(AvatarFromSysMLSyntax.STXSENDTRANSITION);
clearRequestArgs();
:};
receiveRequest ::= receiveRequestBegin requestArgs RPAR;
receiveRequestBegin ::= RECEIVEREQUEST_T LPAR {:
getTransition(requestIndex);
theTransition.setType(AvatarFromSysMLSyntax.STXRECEIVETRANSITION);
clearRequestArgs();
:};
setTimerRequest ::= setTimerRequestBegin requestArgs RPAR;
setTimerRequestBegin ::= SETTIMERREQUEST_T LPAR {:
getTransition(requestIndex);
theTransition.setType(AvatarFromSysMLSyntax.STXSETTIMERTRANSITION);
clearRequestArgs();
:};
resetTimerRequest ::= resetTimerRequestBegin requestArgs RPAR;
resetTimerRequestBegin ::= RESETTIMERREQUEST_T LPAR {:
getTransition(requestIndex);
theTransition.setType(AvatarFromSysMLSyntax.STXRESETTIMERTRANSITION);
clearRequestArgs();
:};
expireTimerRequest ::= expireTimerRequestBegin requestArgs RPAR;
expireTimerRequestBegin ::= EXPIRETIMERREQUEST_T LPAR {:
getTransition(requestIndex);
theTransition.setType(AvatarFromSysMLSyntax.STXEXPIRETIMERTRANSITION);
clearRequestArgs();
:};
requestArgs ::= requestArg | requestArg COMMA requestArgs;
requestArg ::= indexParam | delayParam | channelParam | payloadParam | settimerParam | resettimerParam | expiretimerParam;
indexParam ::= INDEX_F EQUAL INT;
delayParam ::= DELAY_F EQUAL delayExpr;
indexParam ::= INDEX_F:f EQUAL INT:i {:
if (indexArg != null)
addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING,fxleft, "index parameter has already been set", indexArg));
if (i != requestIndex + 1)
addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING,fxleft, "the index of a request must be its range (beginning at 1)",
null));
if (indexArg == null) indexArg = fxleft;
:};
delayParam ::= delayKeyword EQUAL delayExpr;
delayKeyword ::= DELAY_F:d {:
if (delayArg != null) {
addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, dxleft, "delay parameter has already been set", delayArg));
argOK = false;
}
else {
delayArg = dxleft;
argOK = true;
}
:};
delayExpr ::=
iexpr:e {: theTransition.setMinDelay(e); :}
iexpr:e {: if (argOK) theTransition.setMinDelay(e); :}
| delayRandomExpr
;
delayRandomExpr ::=
BOUNDRANDOM_U LPAR iexpr:i COMMA iexpr:a RPAR {:
theTransition.setMinDelay(i);
theTransition.setMaxDelay(a);
if(argOK) {
theTransition.setMinDelay(i);
theTransition.setMaxDelay(a);
}
:}
;
payloadParam ::=
payloadParamBegin IDENT LPAR termList RPAR {:
theTransition.setSendPayload(argList);
argList = null;
if (argOK) {
theTransition.setSendPayload(argList);
argList = null;
}
:}
| payloadParamBegin IDENT LPAR RPAR
| payloadParamBegin IDENT
| payloadParamBegin TIMERSETMSG_T LPAR stxExpr:e RPAR {:
argList.add(e);
theTransition.setSendPayload(argList);
argList = null;
if (argOK) {
argList.add(e);
theTransition.setSendPayload(argList);
argList = null;
}
:}
| payloadParamBegin TIMERRESETMSG_T LPAR RPAR {:
argList = null;
:}
;
payloadParamBegin ::= PAYLOAD_F EQUAL {: argList= new ArrayList<StxTerm>(); :};
payloadParamBegin ::= PAYLOAD_F:p EQUAL {:
if (payloadArg != null) {
addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, pxleft, "payload parameter has already been set", payloadArg));
argOK = false;
}
else {
payloadArg = pxleft;
argOK = true;
argList= new ArrayList<StxTerm>();
}
:};
channelParam ::= CHANNEL_F EQUAL IDENT:id {:
theTransition.setSignalName(theBlock.getName(), id.getAvatarName());
commTransitions.add(theTransition);
channelParam ::= CHANNEL_F:c EQUAL IDENT:id {:
if (channelArg != null)
addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, "channel parameter has already been set", channelArg));
else {
theTransition.setSignalName(theBlock.getName(), id.getAvatarName());
commTransitions.add(theTransition);
channelArg = cxleft;
}
:};
settimerParam ::= CHANNEL_F EQUAL IDENT:id POINT SET_TM {: // '@payload' = '#TimerSetMsg'(10)
theTransition.setTimer(id.getAvatarName());
settimerParam ::= CHANNEL_F:c EQUAL IDENT:id POINT SET_TM {:
if (settimerArg != null)
addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, "timer channel parameter has already been set", settimerArg));
else {
theTransition.setTimer(id.getAvatarName());
settimerArg = cxleft;
}
:};
resettimerParam ::= CHANNEL_F EQUAL IDENT:id POINT RESET_TM {:
theTransition.setTimer(id.getAvatarName());
resettimerParam ::= CHANNEL_F:c EQUAL IDENT:id POINT RESET_TM {:
if (resettimerArg != null)
addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, "timer channel parameter has already been set", settimerArg));
else {
theTransition.setTimer(id.getAvatarName());
resettimerArg = cxleft;
}
:};
expiretimerParam ::= CHANNEL_F EQUAL IDENT:id POINT EXPIRE_TM {:
theTransition.setTimer(id.getAvatarName());
expiretimerParam ::= CHANNEL_F:c EQUAL IDENT:id POINT EXPIRE_TM {:
if (expiretimerArg != null)
addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, cxleft, "timer channel parameter has already been set", settimerArg));
else {
theTransition.setTimer(id.getAvatarName());
expiretimerArg = cxleft;
}
:};
termList ::=
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment