diff --git a/src/main/java/avatartranslator/AvatarDataType.java b/src/main/java/avatartranslator/AvatarDataType.java index f9e28f60bbe01f2405a9d0712ea1c53ae3a7f689..aa1431a270a299185c6a5486b246f71559301323 100644 --- a/src/main/java/avatartranslator/AvatarDataType.java +++ b/src/main/java/avatartranslator/AvatarDataType.java @@ -11,19 +11,27 @@ public class AvatarDataType { public final static int DATATYPE = 2; public static Map<String,AvatarDataType> dataTypeMap = new HashMap<String,AvatarDataType>(); private String name; - private List<String> fieldNames = new ArrayList<String>(); - private List<Integer> fieldTypes = new ArrayList<Integer>(); - private List<String> dataTypeNames = new ArrayList<String>(); - private int size = -1; + private List<String> fieldStrings; + private List<String> fieldNames; + private List<Integer> fieldTypes; + private List<String> dataTypeNames; + private int size; public AvatarDataType(String _name) { name = _name; + fieldStrings = new ArrayList<String>(); + fieldNames = new ArrayList<String>(); + fieldTypes = new ArrayList<Integer>(); + dataTypeNames = new ArrayList<String>(); + size = -1; } + public String getName() { return name; } public int getFullSize() { return size; } public int getNbFields() { return fieldNames.size(); } - String getFieldName(int _i) { return fieldNames.get(_i); } + public String getFieldName(int _i) { return fieldNames.get(_i); } + public String getFieldString(int _i) { return fieldStrings.get(_i); } public int getFieldType(int _i) { return fieldTypes.get(_i); } - String getDataTypeNameName(int _i) { return dataTypeNames.get(_i); } + public String getDataTypeNameName(int _i) { return dataTypeNames.get(_i); } public void addField(String _fieldName, int _fieldType, String _dataTypeName) { if (size != -1) return; // DataType has already been finalized if (_fieldType == AvatarDataType.INTEGER || _fieldType == AvatarDataType.BOOLEAN) @@ -41,15 +49,18 @@ public class AvatarDataType { int length = adt.getNbFields(); for (int i = 0; i < length; i++) { if (adt.getFieldType(i) == AvatarDataType.INTEGER || adt.getFieldType(i) == AvatarDataType.BOOLEAN) { + adt.fieldStrings.add(adt.fieldNames.get(i)); size += 1; continue; } - AvatarDataType fieldDataType = dataTypeMap.get(i); + AvatarDataType fieldDataType = dataTypeMap.get(adt.getDataTypeNameName(i)); if (fieldDataType == null) return; finalize(fieldDataType); // loops if recursion => recursive types are forbidden int fieldSize = fieldDataType.getFullSize(); if (fieldSize == -1) return; size += fieldSize; + for(int j=0; j<fieldSize; j++) + adt.fieldStrings.add(adt.fieldNames.get(i) + "__" + fieldDataType.getFieldString(i)); } adt.size = size; } diff --git a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java index 4f1573a6f3a68169e7b64e1132d2125aa05d8318..eeec4f2e6f74fbe005aa2ba4481ee9d0538e9a51 100644 --- a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java +++ b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysML.java @@ -53,19 +53,55 @@ public class Avatar2SysML { /** * Memorized while declaring channels, to be reused for generating states */ - class SignalInfo { + class MethodInfo { private String name; - private String msgtype; - private ArrayList<String> profile; - SignalInfo(String _name, String _msgtype) { + private String msgtype; // null for methods that are not signals + private ArrayList<String> fieldNames; + private ArrayList<Integer> fieldTypes; + private ArrayList<AvatarDataType> dataTypes; + private int returnType; + private AvatarDataType returnDataType; + + MethodInfo(String _name) { // for void methods name = _name; - msgtype = _msgtype; - profile = new ArrayList<String>(); + msgtype = null; + fieldNames = new ArrayList<String>(); + returnType = -1; + returnDataType = null; } - public void addField(String _fieldName){ profile.add(_fieldName); } - public String getName(){ return name; } - public String getMessageType(){ return msgtype; } - public List<String> getProfile(){ return profile; } + MethodInfo(String _name, int _returnType, AvatarDataType dt) { // for non-void methods + name = _name; + msgtype = null; + fieldNames = new ArrayList<String>(); + returnType = _returnType; + if (_returnType != AvatarDataType.DATATYPE) + returnDataType = null; + else + returnDataType = dt; + } + MethodInfo(String _name, String _msgtype) { // for signals + name = _name; + msgtype = _msgtype; + fieldNames = new ArrayList<String>(); + returnType = -1; + returnDataType = null; + } + public void addField(String _fieldName, int _type, AvatarDataType _dt){ + if (_type == AvatarDataType.DATATYPE) + dataTypes.add(_dt); + else if (!(_type == AvatarDataType.BOOLEAN || _type == AvatarDataType.INTEGER)) + return; // unknown type + fieldNames.add(_fieldName); + fieldTypes.add(_type); + } + public int getArity() { return fieldNames.size(); } + public String getName(){ return name; } + public String getMessageType(){ return msgtype; } + public int getReturnType(){ return returnType; } + public AvatarDataType getReturnDataType(){ return returnDataType; } + public String getFieldName(int i){ return fieldNames.get(i); } + public int getFieldType(int i){ return fieldTypes.get(i); } + public AvatarDataType getDataType(int i){ return dataTypes.get(i); } } /** * Memorized while naming states, to be reused for generating states @@ -89,12 +125,12 @@ public class Avatar2SysML { StringBuffer avsysml; HashSet<AvatarSignal> fifoSet = new HashSet<AvatarSignal>(); - HashMap<AvatarSignal, SignalInfo> signalMap = new HashMap<AvatarSignal, SignalInfo>(); + HashMap<AvatarMethod, MethodInfo> methodMap = new HashMap<AvatarMethod, MethodInfo>(); HashMap<AvatarStateMachineElement, StateInfo> stateMap = new HashMap<AvatarStateMachineElement, StateInfo>(); ArrayList<AvatarStateMachineElement> stateList = new ArrayList<AvatarStateMachineElement>(); ArrayList<AvatarAttribute> timerList = new ArrayList<AvatarAttribute>(); - void searcCountSignals() { + void searchCountSignals() { fifoSet.clear(); for(AvatarBlock block: avspec.getListOfBlocks()) { for(AvatarStateMachineElement sme : block.getStateMachine().getListOfElements()) { @@ -132,20 +168,54 @@ public class Avatar2SysML { StringBuffer avatar2SysML() { - signalMap.clear(); + methodMap.clear(); stateMap.clear(); stateList.clear(); blockChain.clear(); blockLinks = new StringBuffer(indentStep + "// Block Shortcut Links $$$$$$$$$$$$\n"); avsysml = new StringBuffer(header); indent += indentStep; - searcCountSignals();; + searchCountSignals();; + dataTypes2SysML(); communications2SysML(); blocks2SysML(); avsysml.append(blockLinks); avsysml.append("}\n"); return avsysml; } + String removeFieldName(String fullName, AvatarDataType dt) { + if (fullName == null || dt.getNbFields() == 0) return fullName; + String fieldString = dt.getFieldString(0); + if (fieldString.equals(fullName.substring(fullName.length() - fieldString.length()))) + return fullName.substring(0,fullName.length() - fieldString.length()); + else + return null; + } + void dataTypes2SysML(){ + if (avspec.getDataTypes() == null || avspec.getDataTypes().size() == 0) return; + avsysml.append("\n" + indent + "// DATATYPES $$$$$$$$$$$$$$$$$$$$$$$$\n"); + for(AvatarDataType dt : avspec.getDataTypes()){ + avsysml.append("\n" + indent + "attribute def " + dataTypeSysMLname(dt.getName()) + " :> '#AvatarDataType"); + int nbFields = dt.getNbFields(); + if (nbFields == 0) + avsysml.append(";\n"); + else { + avsysml.append(" { \n"); + indent += indentStep; + for (int i = 0; i < nbFields; i++) { + avsysml.append( indent + "attribute " + dt.getFieldName(i) + " : " ); + if (dt.getFieldType(i) == AvatarDataType.BOOLEAN) + avsysml.append("Boolean;\n"); + else if (dt.getFieldType(i) == AvatarDataType.INTEGER) + avsysml.append("Integer;\n"); + else + avsysml.append(dt.getDataTypeNameName(i) + ";\n"); + } + indent = indent.substring(indentStepSize); + avsysml.append(indent + "}\n"); + } + } + } void communications2SysML(){ int nbfiforelNumber = 0; int bfiforelNumber = 0; @@ -241,8 +311,8 @@ public class Avatar2SysML { String sig2SYSMLname = signalSysMLname(sig2.getName()); String message1SYSMLname = messageSysMLname(blk1,sig1.getName()); String message2SYSMLname = messageSysMLname(blk2,sig2.getName()); - SignalInfo sig1Info = new SignalInfo(sig1SYSMLname, message1SYSMLname); - SignalInfo sig2Info = new SignalInfo(sig2SYSMLname, message2SYSMLname); + MethodInfo sig1Info = new MethodInfo(sig1SYSMLname, message1SYSMLname); + MethodInfo sig2Info = new MethodInfo(sig2SYSMLname, message2SYSMLname); // Channel declaration ......................... @@ -266,19 +336,35 @@ public class Avatar2SysML { indent += indentStep; // message fields. SysML names preserve Avatar sender and receiver names int channelSize = sig1.getListOfAttributes().size(); - for (int j=0; j<channelSize; j++) { // browse channels' parameters - String attributeType = (sig1.getListOfAttributes().get(j).isInt() ? "Integer;\n" : "Boolean;\n"); - String fieldName1 = fieldSysMLname(sig1.getListOfAttributes().get(j).getName()); - String fieldName2 = fieldSysMLname(sig2.getListOfAttributes().get(j).getName()); - if (in2out) { - msg1Buf.append(indent + "attribute " + fieldName2 + " : " + attributeType); - msg2Buf.append(indent + "attribute " + fieldName1 + " redefines " + fieldName2 + ";\n"); - } else { - msg1Buf.append(indent + "attribute " + fieldName1 + " : " + attributeType); - msg2Buf.append(indent + "attribute " + fieldName2 + " redefines " + fieldName1 + ";\n"); - } - sig1Info.addField(fieldName1); - sig2Info.addField(fieldName2); + int j=0; + int type; + String attributeType; + String fieldName1; + String fieldName2; + while (j < channelSize ) { // browse channels' parameters + AvatarDataType dataType = sig1.getListOfAttributes().get(j).getDataType(); + if (dataType == null) { + attributeType = (sig1.getListOfAttributes().get(j).isInt() ? "Integer;\n" : "Boolean;\n"); + type = (sig1.getListOfAttributes().get(j).isInt() ? AvatarDataType.INTEGER : AvatarDataType.BOOLEAN); + fieldName1 = fieldSysMLname(sig1.getListOfAttributes().get(j).getName()); + fieldName2 = fieldSysMLname(sig2.getListOfAttributes().get(j).getName()); + j++; + } else { + attributeType = dataTypeSysMLname(dataType.getName()) + ";\n"; + type = AvatarDataType.DATATYPE; + fieldName1 = fieldSysMLname(removeFieldName(sig1.getListOfAttributes().get(j).getName(),dataType)); + fieldName2 = fieldSysMLname(removeFieldName(sig2.getListOfAttributes().get(j).getName(),dataType)); + j += dataType.getFullSize(); + } + if (in2out) { + msg1Buf.append(indent + "attribute " + fieldName2 + " : " + attributeType); + msg2Buf.append(indent + "attribute " + fieldName1 + " redefines " + fieldName2 + ";\n"); + } else { + msg1Buf.append(indent + "attribute " + fieldName1 + " : " + attributeType); + msg2Buf.append(indent + "attribute " + fieldName2 + " redefines " + fieldName1 + ";\n"); + } + sig1Info.addField(fieldName1, type, dataType); + sig2Info.addField(fieldName2, type, dataType); } indent = indent.substring(indentStepSize); msg1Buf.append(indent + "}\n"); @@ -287,60 +373,76 @@ public class Avatar2SysML { avsysml.append(msg1Buf); avsysml.append(msg2Buf); - signalMap.put(sig1,sig1Info); - signalMap.put(sig2,sig2Info); + methodMap.put(sig1,sig1Info); + methodMap.put(sig2,sig2Info); } } } - void attribute2SysML(AvatarAttribute aa) { - if (aa.isTimer()) - timerList.add(aa); + void method2SysML(AvatarMethod am){ + // "return tuple" not handled + String returnType; + List<AvatarAttribute> returns = am.getListOfReturnAttributes(); + AvatarDataType returnDataType; + MethodInfo methodInfo; + if(returns.size() == 0) { + returnType = null; + methodInfo = new MethodInfo(methodSysMLname(am.getName())); + } else { - avsysml.append(indent + "attribute " + attributeSysMLname(aa.getName()) + " : "); - if (aa.isInt()) avsysml.append("Integer"); - else // if (aa.isBool()) - avsysml.append("Boolean"); - if (aa.hasInitialValue()) avsysml.append(" := " + aa.getInitialValue().trim()); - avsysml.append(";\n"); + returnDataType = returns.get(0).getDataType(); + if (returnDataType == null) { + String avatarType = returns.get(0).getType().getStringType(); + if (avatarType.equals("int")) { + returnType = "Integer"; + methodInfo = new MethodInfo(methodSysMLname(am.getName()), AvatarDataType.INTEGER, null); + } else { + returnType = "Boolean"; + methodInfo = new MethodInfo(methodSysMLname(am.getName()), AvatarDataType.BOOLEAN, null); + } + } else { + returnType = dataTypeSysMLname(returnDataType.getName()); + methodInfo = new MethodInfo(methodSysMLname(am.getName()), AvatarDataType.DATATYPE, returnDataType); + } } - } - void field2SysML(AvatarAttribute aa, String prefix) { - avsysml.append(indent + prefix + "attribute " + fieldSysMLname(aa.getName()) + " : "); - if (aa.isInt()) avsysml.append("Integer;\n"); - else - avsysml.append("Boolean;\n"); - } - void method2SysML(AvatarMethod am){ - // "return tuple" not handled - String returnType = null; - if(am.getListOfReturnAttributes().size() == 1){ - String avatarType = am.getListOfReturnAttributes().get(0).getType().getStringType(); - if (avatarType.equals("int")) - returnType = "Integer"; - else - returnType = "Boolean"; - } - if (returnType == null) { + if (returnType == null) avsysml.append(indent + "action " + methodSysMLname(am.getName()) + ": '#AvatarVoidMethod' {\n"); - indent += indentStep; - for (AvatarAttribute aa : am.getListOfAttributes()) field2SysML(aa, "in "); - indent = indent.substring(indentStepSize); - avsysml.append(indent + "}\n"); - } else { + else avsysml.append(indent + "calc " + methodSysMLname(am.getName()) + ": '#AvatarCalcMethod' {\n"); - indent += indentStep; - for (AvatarAttribute aa : am.getListOfAttributes()) field2SysML(aa, "in "); - avsysml.append(indent + "return : " + returnType + ";\n"); - indent = indent.substring(indentStepSize); - avsysml.append(indent + "}\n"); + indent += indentStep; + + int j = 0; + int nbFields = am.getListOfAttributes().size(); + while (j < nbFields) { + AvatarAttribute aa = am.getListOfAttributes().get(j); + AvatarDataType fieldDataType = aa.getDataType(); + if (fieldDataType == null) { + if (aa.isInt()) { + avsysml.append(indent + "attribute " + fieldSysMLname(aa.getName()) + " : Integer;\n"); + methodInfo.addField(fieldSysMLname(aa.getName()), AvatarDataType.INTEGER, null); + } else { + avsysml.append(indent + "attribute " + fieldSysMLname(aa.getName()) + " : Boolean;\n"); + methodInfo.addField(fieldSysMLname(aa.getName()), AvatarDataType.BOOLEAN, null); + } + j++; + } else { + avsysml.append(indent + "attribute " + fieldSysMLname(removeFieldName(aa.getName(), fieldDataType)) + + " : " + dataTypeSysMLname(fieldDataType.getName())+ "\n"); + methodInfo.addField(fieldSysMLname(aa.getName()), AvatarDataType.DATATYPE, fieldDataType); + j += fieldDataType.getFullSize(); + } } + if (returnType != null) + avsysml.append(indent + "return : " + returnType + ";\n"); + indent = indent.substring(indentStepSize); + avsysml.append(indent + "}\n"); + methodMap.put(am, methodInfo); } void signal2SysML(AvatarSignal as){ - avsysml.append(indent + "part " + signalMap.get(as).getName() + " : " + + avsysml.append(indent + "part " + methodMap.get(as).getName() + " : " + (fifoSet.contains(as) ? "'#Fifo'" : "'#Channel'") + ";\n"); } // handling one block @@ -358,7 +460,30 @@ public class Avatar2SysML { // attributes -------------------- if (block.getAttributes() != null && block.getAttributes().size() != 0) { avsysml.append("\n" + indent + "// Attributes ---------------------\n"); - for (AvatarAttribute aa : block.getAttributes()) attribute2SysML(aa); + int j = 0; + int nbAttributes = block.getAttributes().size(); + while(j < nbAttributes) { + AvatarAttribute aa = block.getAttributes().get(j); + if (aa.isTimer()) { + timerList.add(aa); + j++; + } + else { + AvatarDataType dataType = aa.getDataType(); + if (dataType == null) { + avsysml.append(indent + "attribute " + attributeSysMLname(aa.getName()) + " : "); + if (aa.isInt()) avsysml.append("Integer"); + else avsysml.append("Boolean"); + if (aa.hasInitialValue()) avsysml.append(" := " + aa.getInitialValue().trim()); + avsysml.append(";\n"); + j++; + } else { + avsysml.append(indent + "attribute " + attributeSysMLname(removeFieldName(aa.getName(), dataType)) + + " : " + dataTypeSysMLname(dataType.getName()) + ";\n"); + j += dataType.getFullSize(); + } + } + } } // methods -------------------- if (block.getMethods() != null && block.getMethods().size() != 0) { @@ -509,7 +634,7 @@ public class Avatar2SysML { avsysml.append(indent + "state_action = '#Assignment'(\n"); indent += indentStep; avsysml.append(indent + "target = " + attributeSysMLname(((AvatarQueryOnSignal)asme).getAttribute().getName()) + ",\n"); - avsysml.append(indent + "value = " + signalMap.get(((AvatarQueryOnSignal)asme).getSignal()).getName() + ".amount()\n"); + avsysml.append(indent + "value = " + methodMap.get(((AvatarQueryOnSignal)asme).getSignal()).getName() + ".amount()\n"); indent = indent.substring(indentStepSize); avsysml.append(indent + ")\n"); indent = indent.substring(indentStepSize); @@ -577,7 +702,7 @@ public class Avatar2SysML { for (AvatarStateMachineElement aos: requirePreCom) { StateInfo stateinfo = stateMap.get(aos); if (aos instanceof AvatarActionOnSignal) { - SignalInfo signalinfo = signalMap.get(((AvatarActionOnSignal)aos).getSignal()); + MethodInfo signalinfo = methodMap.get(((AvatarActionOnSignal)aos).getSignal()); if (((AvatarActionOnSignal)aos).isSending()) { // preComm State @@ -761,13 +886,13 @@ public class Avatar2SysML { sysMLrequests.append(sendRequest2SysML(transindex, expr2SysML(minDelay), expr2SysML(maxDelay), - signalMap.get(((AvatarActionOnSignal)target).getSignal()), + methodMap.get(((AvatarActionOnSignal)target).getSignal()), ((AvatarActionOnSignal)target).getValues())); else if (requestType == 2) // Receive sysMLrequests.append(receiveRequest2SysML(transindex, expr2SysML(minDelay), expr2SysML(maxDelay), - signalMap.get(((AvatarActionOnSignal)target).getSignal()))); + methodMap.get(((AvatarActionOnSignal)target).getSignal()))); else if (requestType == 3) // Set sysMLrequests.append(setTimerRequest2SysML(transindex, expr2SysML(minDelay), @@ -794,7 +919,7 @@ public class Avatar2SysML { String doAction; indent += indentStep; if(requestType == 2) - doAction = receiveActions2SysML(signalMap.get(((AvatarActionOnSignal)target).getSignal()), ((AvatarActionOnSignal)target).getValues()); + doAction = receiveActions2SysML(methodMap.get(((AvatarActionOnSignal)target).getSignal()), ((AvatarActionOnSignal)target).getValues()); else doAction = transitionActions2SysM(at.getActions()); indent = indent.substring(indentStepSize); @@ -839,12 +964,12 @@ public class Avatar2SysML { return indent + "'#TrivialRequest'(transition_index= " + index + ", delay= '#bound_random'(" + min + ", " + max + "))"; } - String sendRequest2SysML(int index, String min, String max, SignalInfo chinfo, List<String> values) { + String sendRequest2SysML(int index, String min, String max, MethodInfo signalInfo, List<String> values) { StringBuffer result = new StringBuffer(indent + "'#SendRequest'(\n"); indent += indentStep; if (index != 1) result.append(indent + "transition_index= " + index + ",\n"); - result.append(indent + "channel= " + chinfo.getName() + ",\n"); + result.append(indent + "channel= " + signalInfo.getName() + ",\n"); if (max.equals("0")) { if (!min.equals("0")) result.append(indent + "delay= " + min + ",\n"); @@ -854,13 +979,25 @@ public class Avatar2SysML { else result.append(indent + "delay= '#bound_random'(" + min + ", " + max + "),\n"); - if (values.size() == 0) - result.append(indent + "payload= " + chinfo.getMessageType() + "()\n"); + int nbFields = signalInfo.getArity(); + if (nbFields == 0) + result.append(indent + "payload= " + signalInfo.getMessageType() + "()\n"); else { - result.append(indent + "payload= " + chinfo.getMessageType() + "(\n"); + result.append(indent + "payload= " + signalInfo.getMessageType() + "(\n"); indent += indentStep; - for(String vl : values) - result.append(indent + expr2SysML(vl) + ",\n"); + + int j = 0; + while (j < nbFields) { //for(String vl : values) + if (signalInfo.getFieldType(j) != AvatarDataType.DATATYPE) { + result.append(indent + expr2SysML(values.get(j)) + ",\n"); + j++; + } else { + AvatarDataType dt = signalInfo.getDataType(j); + result.append(indent + expr2SysML(removeFieldName(values.get(j), dt)) + ",\n"); + j += dt.getFullSize(); + } + } + result.replace(result.length()-2, result.length(), " )\n"); indent = indent.substring(indentStepSize); } @@ -911,7 +1048,7 @@ public class Avatar2SysML { return result.toString(); } - String receiveRequest2SysML(int index, String min, String max, SignalInfo chinfo) { + String receiveRequest2SysML(int index, String min, String max, MethodInfo chinfo) { StringBuffer result = new StringBuffer(indent + "'#ReceiveRequest'(\n"); indent += indentStep; if (index != 1) @@ -972,13 +1109,13 @@ public class Avatar2SysML { return result.toString(); } - String receiveActions2SysML(SignalInfo chinfo, List<String> values) { + String receiveActions2SysML(MethodInfo chinfo, List<String> values) { if (values == null || values.size() == 0) return ""; StringBuffer result = new StringBuffer(indent + "do action {\n"); indent += indentStep; result.append(indent + "item msg : " + chinfo.getMessageType() + " = response.payload as " + chinfo.getMessageType() + ";\n" + indent + "first start;\n"); - List<String> fields = chinfo.getProfile(); + List<String> fields = null; //chinfo.getFieldName(); int length = values.size(); // must be equal to fields.size() for (int i = 0; i<length; i++) { result.append(indent + "then assign " + attributeSysMLname(values.get(i)) + " := msg." + fields.get(i) + ";\n"); diff --git a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLNames.java b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLNames.java index d8c6524aee69eb7d4b6876d0298b71c000cc1685..fdb472d5715a260512169bf8ca73caf43ddd175c 100644 --- a/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLNames.java +++ b/src/main/java/avatartranslator/tosysmlv2/Avatar2SysMLNames.java @@ -42,6 +42,7 @@ public class Avatar2SysMLNames { public final static int BFIFO = 1; public final static int NBFIFO = 2; + public static String dataTypeSysMLname(String name){ return "'@dt:" + name + "'"; } public static String blockSysMLname(String name){ return "'@blk:" + name + "'"; } public static String attributeSysMLname(String name){ return "'$" + name + "'"; } public static String methodSysMLname(String name){ return "'$" + name + "'"; }