diff --git a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup index 04f2b0ae2a185664f8405d3e852277be0bdd39d7..7da60d4225d1be5523d6fadfe0177a76382883f0 100644 --- a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup +++ b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup @@ -2,12 +2,14 @@ package avatartranslator.fromsml; import java_cup.runtime.*; parser code {: + void setStringExpr(boolean _b) { ((SCANNERCLASS) getScanner()).setStringExpr(_b); } :} /* Terminals (tokens returned by the scanner). */ terminal Integer INT; terminal Boolean BOOL; +terminal String STRINGEXPR; terminal EQ, LPAR, RPAR, LBRAC, RBRAC, COMMA, SEMICOLON, COLON, POINT, EQUAL, GETS; @@ -172,9 +174,9 @@ bfChDecl ::= PART channelname COLON BFIFO_T EQUAL BFIFO_T LPAR RELATION_F EQUAL // SIGNAL BINDING $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ signalBinding ::= inSignalBinding | outSignalBinding; -insignalBinding ::= BINDING COLON INSIGNALBINDING_T BIND blockChain POINT signalname EQUAL channelname SEMICOLON +inSignalBinding ::= BINDING COLON INSIGNALBINDING_T BIND blockChain POINT signalname EQUAL channelname SEMICOLON ; -outsignalBinding ::= BINDING COLON OUTSIGNALBINDING_T BIND blockChain POINT signalname EQUAL channelname SEMICOLON +outSignalBinding ::= BINDING COLON OUTSIGNALBINDING_T BIND blockChain POINT signalname EQUAL channelname SEMICOLON ; // MESSAGE DECLARATION $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ @@ -208,8 +210,47 @@ redefineField ::= // BLOCK DECLARATION $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ -blockDecl ::= blockDeclHEADER blockDeclBODY; -blockDeclHEADER ::= - | PART DEF BLOCKNAME specializes AVBLOCK_T - | PART DEF AVATARNAME specializes AVBLOCK_T +blockDecl ::= + | PART blockname COLON AVBLOCK_T LBRAC RBRAC + | PART blockname COLON AVBLOCK_T LBRAC blockDeclBODY RBRAC ; +blockDeclBODY ::= + | blockItem + | blockDeclBODY +; +blockItem ::= + attributeDecl + | methodDecl + | signalDecl + | timerDecl + | stateMachine + | blockDecl +; + +// ATTRIBUTE DECLARATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +attributeDecl ::= + attributeDeclHEADER SEMICOLON + | attributeDeclHEADER gets STRINGEXPR SEMICOLON +; +attributeDeclHEADER ::= + ATTRIBUTE attributename COLON typIdent {: setStringExpr(true); :} +; + +// METHOD DECLARATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +methodDecl ::= voidMethodDecl | calcMethodDecl; +voidMethodDecl ::= + ACTION attributename COLON AVATARVOIDMETHOD_T LBRAC RBRAC + | ACTION attributename COLON AVATARVOIDMETHOD_T LBRAC fieldDecls RBRAC +; +calcMethodDecl ::= + CALC attributename COLON AVATARCALCMETHOD_T LBRAC RBRAC + | CALC attributename COLON AVATARCALCMETHOD_T LBRAC calcMethodItems RBRAC +; +calcMethodItems ::= + calcMethodItem + | calcMethodItem calcMethodItems +; +calcMethodItem ::= + fieldDecl + | RETURN COLON typIdent SEMICOLON +; \ No newline at end of file diff --git a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jflex b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jflex index f978d55f3f17aed1c56fd2d17648513887963696..d34257b62bed7a41d6e2e2ebd45b17f22a38d12f 100644 --- a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jflex +++ b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jflex @@ -32,7 +32,8 @@ import java.util.HashSet; // "<=" { return new Symbol(XX#Symb.LEQ, yyline, yycolumn); } // ">=" { return new Symbol(XX#Symb.GEQ, yyline, yycolumn); } -fonctions + private boolean getstringexpr = true; + public setStringExpr(boolean _b) { getstringexpr = _b; } %} Space = [\ \n\r\t\f] @@ -74,6 +75,11 @@ expireTimerChannelName = "'@ch:expire." AvIdent "'" [^\n\r]+ { } "\n" { yybegin(YYINITIAL); } } +<GETEXPR> { + [^;]+ { return new Symbol(XX#Symb.STRINGEXPR, yyline, yycolumn, yytext()); } + ";" { yybegin(YYINITIAL); return new Symbol(XX#Symb.COLON, yyline, yycolumn); } +} + <YYINITIAL> { {Space} {} "//" { yybegin(COMMENTLINE); } @@ -93,7 +99,8 @@ expireTimerChannelName = "'@ch:expire." AvIdent "'" ":" { return new Symbol(XX#Symb.COLON, yyline, yycolumn); } "." { return new Symbol(XX#Symb.POINT, yyline, yycolumn); } "=" { return new Symbol(XX#Symb.EQUAL, yyline, yycolumn); } - ":=" { return new Symbol(XX#Symb.GETS, yyline, yycolumn); } + ":=" { if (getstringexpr) yybegin(GETEXPR); + return new Symbol(XX#Symb.GETS, yyline, yycolumn); } "'@lossy'" { return new Symbol(XX#Symb.LOSSY_F, yyline, yycolumn); } "'@max_size'" { return new Symbol(XX#Symb.MAXSIZE_F, yyline, yycolumn); }