diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java index 5e17ea1b28b5e44d52e33e3f8bf22ad6eca7f4be..df48206f65114401f3fbd341472867c79db1d8e5 100644 --- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java @@ -46,6 +46,7 @@ import java.util.function.BiConsumer; import avatartranslator.*; import avatartranslator.tosysmlv2.AvatarFromSysMLSyntax.*; import java_cup.runtime.ComplexSymbolFactory; +import myutil.TraceManager; import static java.lang.System.out; @@ -79,23 +80,32 @@ public class AvatarFromSysML { e.printStackTrace(out); return new AvatarSpecification("DummySpec", null); } + TraceManager.addDev("Parsing Model"); try { stxSpec = parser.parseModel(); } catch (java.lang.Exception e) { e.printStackTrace(out); return new AvatarSpecification("DummySpec", null); } - if (stxSpec == null) return new AvatarSpecification("DummySpec", null); + if (stxSpec == null) { + for(AvatarFromSysMLError e : parser.getErrors()) + TraceManager.addDev(e.toString()); + return new AvatarSpecification("DummySpec", null); + } errors = stxSpec.getErrors(); + TraceManager.addDev("Building Specification"); avSpec = new AvatarSpecification("FromSysMLV2_EXAMPLE_SPECIFICATION",null); transitionList.clear(); signalMap.clear(); blockMap.clear(); stateMap.clear(); + TraceManager.addDev("Building DataTypes"); buildDataTypes(); + TraceManager.addDev("Building DataTypes"); buildBlocks(); + TraceManager.addDev("Building DataTypes"); buildRelations(); for(AvatarFromSysMLError e : errors) - System.out.println(e.toString()); + TraceManager.addDev(e.toString()); /* for (AvatarBlock blk : avSpec.getListOfBlocks()) { for (AvatarStateMachineElement asme : blk.getStateMachine().getListOfElements()) { if (asme.getNexts().size() == 1 && @@ -107,7 +117,6 @@ public class AvatarFromSysML { ((AvatarTransition)asme).getDelayExtra2() + "%%%%%%%%%%%%%"); } } */ - System.out.println("$$$$$$$$$$ DONE $$$$$$$$$$$$"); return avSpec; } @@ -393,15 +402,20 @@ public class AvatarFromSysML { AvatarStateMachineElement theSourceState; size = states.length; for (int i = 0; i < size; i++) { + byte stateType = states[i].getType(); + boolean undeclaredState = false; if (! states[i].isDeclared()) { addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, "state " + theBlock.getName() + "." + states[i].getName() + " is used but not declared")); - continue; + stateType = AvatarFromSysMLSyntax.STXSTANDARDSTATE; + undeclaredState = true; } - byte stateType = states[i].getType(); if (stateType != AvatarFromSysMLSyntax.STXPRESENDSTATE && stateType != AvatarFromSysMLSyntax.STXPRERECEIVESTATE && stateType != AvatarFromSysMLSyntax.STXSTOPSTATE ) { + if (undeclaredState) { + states[i].setType(AvatarFromSysMLSyntax.STXSTANDARDSTATE); + } theSourceState = getState(states[i], theBlock); asm.addElement(theSourceState); if (stateType == AvatarFromSysMLSyntax.STXRANDOMSTATE) { @@ -424,8 +438,8 @@ public class AvatarFromSysML { } if (! transition.isDeclared()) { addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, transition.getRleft(), - "transition from state " + states[i].getName() + " in block" + theBlock.getName() + - "." + states[i].getName() + " is used but not declared" )); + "transition request in state " + states[i].getName() + " in block" + theBlock.getName() + + " has no associated declaration" )); continue; } AvatarTransition theTransition = new AvatarTransition(theBlock,"", null); @@ -870,8 +884,12 @@ public class AvatarFromSysML { for (int i = 0; i < size; i++) { StxChannel c = r.getChannel(i); c.commuteSignals(r.getBlock1().getName()); - theRelation.addSignals(getSignal(c.getSignalA()),getSignal(c.getSignalB())); - } + if (c.getSignalA() != null && c.getSignalB() != null) + theRelation.addSignals(getSignal(c.getSignalA()),getSignal(c.getSignalB())); + else + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, c.getLeft(), + "missing signal binding for channel")); + } } } } diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLError.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLError.java index 92f7a6b7edd80fdf540af9fb3e1366ec4b42efe1..2fd86942101401f55658ead45d390cdd891f6cd1 100644 --- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLError.java +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLError.java @@ -45,10 +45,10 @@ public class AvatarFromSysMLError { else res.append("BUG "); if (location != null) - res.append("(l" + location.getLine() + ",c" + location.getColumn() + ")"); + res.append("(l" + (location.getLine() + 1) + ",c" + (location.getColumn() + 1) + ")"); res.append(": " + message); if (reference != null) - res.append(" (c.f. l" + reference.getLine() + ",c" + reference.getColumn() + ")"); + res.append(" (c.f. l" + (reference.getLine() + 1) + ",c" + (reference.getColumn() + 1) + ")"); res.append("\n"); return res.toString(); } diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLLexer.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLLexer.java index 6767651e43d2d1c196bcb9c6157718999fea695e..796f4fa4a2e59dd81530590acdba86cb38663f3d 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 16/06/2024 11:17 */ +/* The following code was generated by JFlex 1.4.3 on 16/06/2024 13: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 16/06/2024 11:17 from the specification file + * on 16/06/2024 13:02 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 c173fe36d9f3f9c289275d72f51cd861e6e4edff..45c582d25deda52eb5b2523cec47ffee550b33e0 100644 --- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParser.java +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParser.java @@ -1207,6 +1207,7 @@ public class AvatarFromSysMLParser extends java_cup.runtime.lr_parser { private StringBuffer stringAcc = new StringBuffer(); private ArrayList<AvatarFromSysMLError> errors; private void addError(AvatarFromSysMLError _err) { errors.add(_err); } + public ArrayList<AvatarFromSysMLError> getErrors() { return errors; } private StxStructure theStructure; private HashMap<String,StxDataType> dataTypeMap; private StxRelation theRelation; diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java index 2122ec9016342ef3b64105a538a31d573df06545..4434c0a634b21833a1bc4f6c56f1621b4a3fcb52 100644 --- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java @@ -504,19 +504,28 @@ public class AvatarFromSysMLSyntax { } return false; } - private ArrayList<AvatarFromSysMLError> errors; + private class Complete implements BiConsumer<StxField, String> { List<AvatarFromSysMLError> errors; - public Complete(List<AvatarFromSysMLError> l){ errors = l; }; + private boolean[] inProfile; + public boolean[] getInProfile() { return inProfile; } + public Complete(List<AvatarFromSysMLError> l){ + errors = l; + inProfile = new boolean[inMessage.getSize()]; + for (int i = 0; i < inMessage.getSize(); i++) { inProfile[i] = false; } + }; public void accept(StxField o, String i) { int index = inMessage.indexOf(i); - if (errors != null && index == -1) { + if ( index == -1) { errors.add(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, o.getLeft(),"Field " + o.getName() + " of out-message is " + "associated to a field (" + i + ") in in-message that does not exist", inMessage.getLeft())); } - o.setType(inMessage.fields.get(index).getType()); - fields.set(index, o); + else { + inProfile[index] = true; + o.setType(inMessage.fields.get(index).getType()); + fields.set(index, o); + } } } public void complete(List<AvatarFromSysMLError> errors) { @@ -527,7 +536,19 @@ public class AvatarFromSysMLSyntax { return; } if (fieldMap.isEmpty()) for (StxField f: inMessage.fields) fields.add(f); - else fieldMap.forEach(new Complete(errors)); + else { + Complete cmp = new Complete(errors); + fieldMap.forEach(cmp); + boolean[] inProfile = cmp.getInProfile(); + for(int i =0; i < inProfile.length; i++) + if (! inProfile[i]) { + errors.add(new AvatarFromSysMLError(AvatarFromSysMLError.LOWWARNING, getLeft(), + "out-message has no field associated to in-message field " + inMessage.getFieldName(i) + " --> field added", + inMessage.getLeft())); + fields.set(i, new StxField(inMessage.getFieldName(i),inMessage.getFieldType(i))); + } + } + channel = inMessage.channel; if (channel == null) if (errors != null) { diff --git a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup index d015a8dd46d175547c1a50e96d0f18d81d0f1ebf..e11ccec9f9dd5b9ec87f232384e052668660c5ca 100644 --- a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup +++ b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup @@ -62,6 +62,7 @@ parser code {: private StringBuffer stringAcc = new StringBuffer(); private ArrayList<AvatarFromSysMLError> errors; private void addError(AvatarFromSysMLError _err) { errors.add(_err); } + public ArrayList<AvatarFromSysMLError> getErrors() { return errors; } private StxStructure theStructure; private HashMap<String,StxDataType> dataTypeMap; private StxRelation theRelation;