From e650abe82eef6804c8dc462d51e20066464fe01c Mon Sep 17 00:00:00 2001 From: Sophie Coudert <sophie.coudert@telecom-paris.fr> Date: Thu, 6 Jun 2024 14:49:22 +0200 Subject: [PATCH] more error detection in parsing --- .../tosysmlv2/AvatarFromSysMLLexer.java | 4 +- .../tosysmlv2/AvatarFromSysMLParser.java | 188 +++++++++++++++--- .../tosysmlv2/AvatarFromSysMLSyntax.java | 154 ++++++++++---- .../tosysmlv2/javacup/AvatarFromSysML.jcup | 174 ++++++++++++---- 4 files changed, 411 insertions(+), 109 deletions(-) diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLLexer.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLLexer.java index ba68d63da1..9e5cf4ca3d 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 30/05/2024 16:47 */ +/* The following code was generated by JFlex 1.4.3 on 06/06/2024 14:48 */ 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 30/05/2024 16:47 from the specification file + * on 06/06/2024 14:48 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 2472091f10..10f2be4f58 100644 --- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParser.java +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLParser.java @@ -1181,7 +1181,7 @@ public class AvatarFromSysMLParser extends java_cup.runtime.lr_parser { } private class Complete implements BiConsumer<String, StxOutMessage> { public Complete(){}; - public void accept(String s, StxOutMessage o) { o.complete(); } + public void accept(String s, StxOutMessage o) { o.complete(errors); } } private void updateSignal(StxTransition st) { String name = st.getSignalName(); @@ -1256,6 +1256,8 @@ public class AvatarFromSysMLParser extends java_cup.runtime.lr_parser { signalMap.put(key, theSignal); } } + + Location messageChannelParam; private HashMap<String,StxInMessage> inMessageMap; private void getInMessage(String _name) { theStructure = inMessageMap.get(_name); @@ -1625,13 +1627,22 @@ class CUP$AvatarFromSysMLParser$actions { case 25: // fieldDecl ::= ATTRIBUTE IDENT COLON typeIdent SEMICOLON { Object RESULT =null; + Location axleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location axright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object a = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); Location idxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; Location idxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; Ident id = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Ident>value(); Location tpxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; Location tpxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; String tp = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<String>value(); - theStructure.addField(id.getAvatarName(),tp); + + StxField field = new StxField(axleft, axright, id.getAvatarName(), tp); + StxField clash = theStructure.addField(field); + if (clash != null) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, axleft, "Field " + id.getAvatarName() + + " is already declared", clash.getLeft()) ); + CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("fieldDecl",12, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); } return CUP$AvatarFromSysMLParser$result; @@ -2045,6 +2056,9 @@ class CUP$AvatarFromSysMLParser$actions { addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Channel " + id.getAvatarName() + " is already declared", theChannel.getLeft()) ); } else { + if (theRelation.getAsynchronous()) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, + pxleft, "synchroneous channels require a synchroneous relation\n")); theRelation.addChannel(theChannel); theChannel.setLeft(pxleft); theChannel.setRight(sxright); @@ -2077,6 +2091,9 @@ class CUP$AvatarFromSysMLParser$actions { addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Channel " + id.getAvatarName() + " is already declared", theChannel.getLeft()) ); } else { + if (! theRelation.getAsynchronous()) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, + pxleft, "FIFO channels require an asynchroneous relation\n")); theRelation.addChannel(theChannel); theChannel.setLeft(pxleft); theChannel.setRight(sxright); @@ -2109,6 +2126,9 @@ class CUP$AvatarFromSysMLParser$actions { addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Channel " + id.getAvatarName() + " is already declared", theChannel.getLeft()) ); } else { + if (! theRelation.getAsynchronous()) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, + pxleft, "FIFO channels require an asynchroneous relation\n")); theRelation.addChannel(theChannel); theChannel.setLeft(pxleft); theChannel.setRight(sxright); @@ -2270,6 +2290,12 @@ class CUP$AvatarFromSysMLParser$actions { case 64: // inMessageDecl ::= inMessageDeclBegin inMessageDeclBODY { Object RESULT =null; + Location mxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; + Location mxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; + Object m = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Object>value(); + + if (messageChannelParam == null) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, mxleft, "In-message channel has not been set", null) ); CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("inMessageDecl",35, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); } @@ -2290,8 +2316,10 @@ class CUP$AvatarFromSysMLParser$actions { if (! theStructure.declare() ) { addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "In-message profile " + id.getAvatarName() + " is already declared", theStructure.getLeft()) ); - } else + } else { theStructure.setLeft(pxleft); + messageChannelParam = null; + } CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("inMessageDeclBegin",41, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); } @@ -2343,13 +2371,22 @@ class CUP$AvatarFromSysMLParser$actions { case 69: // messageChannel ::= PRIVATE PART CHANNEL_F COLON CHANNEL_T EQUAL IDENT SEMICOLON { Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7).<Object>value(); Location chxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; Location chxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; Ident ch = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Ident>value(); - getChannel(ch.getAvatarName()); - theChannel.setInProfile((StxInMessage)theStructure); - ((StxInMessage)theStructure).setChannel(theChannel); + if (messageChannelParam != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, + "in-message channel has already been set", messageChannelParam)); + else { + getChannel(ch.getAvatarName()); + theChannel.setInProfile((StxInMessage)theStructure); + ((StxInMessage)theStructure).setChannel(theChannel); + messageChannelParam = pxleft; + } CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("messageChannel",38, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-7), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); } @@ -2359,13 +2396,22 @@ class CUP$AvatarFromSysMLParser$actions { case 70: // messageChannel ::= PRIVATE PART CHANNEL_F EQUAL IDENT SEMICOLON { Object RESULT =null; + Location pxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xleft; + Location pxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5)).xright; + Object p = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5).<Object>value(); Location chxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xleft; Location chxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; Ident ch = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Ident>value(); - getChannel(ch.getAvatarName()); - theChannel.setInProfile((StxInMessage)theStructure); - ((StxInMessage)theStructure).setChannel(theChannel); + if (messageChannelParam != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, + "in-message channel has already been set", messageChannelParam)); + else { + getChannel(ch.getAvatarName()); + theChannel.setInProfile((StxInMessage)theStructure); + ((StxInMessage)theStructure).setChannel(theChannel); + messageChannelParam = pxleft; + } CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("messageChannel",38, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-5), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); } @@ -2483,6 +2529,9 @@ class CUP$AvatarFromSysMLParser$actions { case 78: // redefineField ::= ATTRIBUTE IDENT REDEFINES IDENT SEMICOLON { Object RESULT =null; + Location axleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xleft; + Location axright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4)).xright; + Object a = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4).<Object>value(); Location oxleft = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xleft; Location oxright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3)).xright; Ident o = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-3).<Ident>value(); @@ -2490,7 +2539,8 @@ class CUP$AvatarFromSysMLParser$actions { Location ixright = ((java_cup.runtime.ComplexSymbolFactory.ComplexSymbol)CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1)).xright; Ident i = CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-1).<Ident>value(); - theOutMessage.addFieldLink(o.getAvatarName(), i.getAvatarName()); + StxField ofield = new StxField(axleft, axright, o.getAvatarName(), ""); + theOutMessage.addFieldLink(ofield, i.getAvatarName()); CUP$AvatarFromSysMLParser$result = parser.getSymbolFactory().newSymbol("redefineField",40, CUP$AvatarFromSysMLParser$stack.elementAt(CUP$AvatarFromSysMLParser$top-4), CUP$AvatarFromSysMLParser$stack.peek(), RESULT); } @@ -2675,9 +2725,20 @@ class CUP$AvatarFromSysMLParser$actions { getAttribute(id.getAvatarName(), tp); if (! theAttribute.declare() ) { addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Attribute " + id.getAvatarName() + - " is already declared", theAttribute.getLeft()) ); + " is already declared (or there is an attribute with same name)", theAttribute.getLeft()) ); } else { - theBlock.addAttribute(theAttribute); + StxElement e = theBlock.addAttribute(theAttribute); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Attribute " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Attribute " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Attribute " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; theAttribute.setLeft(axleft); } @@ -2734,9 +2795,20 @@ class CUP$AvatarFromSysMLParser$actions { getAttribute(id.getAvatarName(), tp); if (! theAttribute.declare() ) { addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, rxleft, "Constant " + id.getAvatarName() + - " is already declared", theAttribute.getLeft()) ); + " is already declared (or there is an attribute with same name)", theAttribute.getLeft()) ); } else { - theBlock.addConstant(theAttribute); + StxElement e = theBlock.addConstant(theAttribute); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, rxleft, "Constant " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, rxleft, "Constant " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, rxleft, "Constant " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; theAttribute.setLeft(rxleft); } @@ -2806,7 +2878,18 @@ class CUP$AvatarFromSysMLParser$actions { addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Method " + id.getAvatarName() + " is already declared", theStructure.getLeft()) ); } else { - theBlock.addMethod((StxMethod)theStructure); + StxElement e = theBlock.addMethod((StxMethod)theStructure); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for timer", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; theStructure.setLeft(axleft); } @@ -2858,7 +2941,18 @@ class CUP$AvatarFromSysMLParser$actions { addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, cxleft, "Method " + id.getAvatarName() + " is already declared", theStructure.getLeft()) ); } else { - theBlock.addMethod((StxMethod)theStructure); + StxElement e = theBlock.addMethod((StxMethod)theStructure); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, cxleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for timer", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, cxleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, cxleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; theStructure.setLeft(cxleft); } @@ -2926,7 +3020,18 @@ class CUP$AvatarFromSysMLParser$actions { addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + " is already declared", theSignal.getLeft()) ); } else { - theBlock.addSignal(theSignal); + StxElement e = theBlock.addSignal(theSignal); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for timer", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else; theSignal.setLeft(pxleft); theSignal.setRight(qxright); } @@ -2954,7 +3059,18 @@ class CUP$AvatarFromSysMLParser$actions { addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + " is already declared", theSignal.getLeft()) ); } else { - theBlock.addSignal(theSignal); + StxElement e = theBlock.addSignal(theSignal); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for timer", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else; theSignal.setLeft(pxleft); theSignal.setRight(qxright); } @@ -2978,14 +3094,20 @@ class CUP$AvatarFromSysMLParser$actions { Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); StxTimer t = new StxTimer(pxleft, qxright, id.getAvatarName()); - StxElement tmp = theBlock.addTimer(t); - if (tmp != null) - if (tmp instanceof StxTimer && !tmp.declare()) + StxElement e = theBlock.addTimer(t); + if (e != null) + if (e instanceof StxTimer && !e.declare()) addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + - " is already declared", tmp.getLeft())); - else if (tmp instanceof StxAttribute) + " is already declared", e.getLeft())); + else if (e instanceof StxAttribute) addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + - " cannot be added: name already used", tmp.getLeft())); + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); else ; else t.declare(); @@ -3008,14 +3130,20 @@ class CUP$AvatarFromSysMLParser$actions { Object q = CUP$AvatarFromSysMLParser$stack.peek().<Object>value(); StxTimer t = new StxTimer(pxleft, qxright, id.getAvatarName()); - StxElement tmp = theBlock.addTimer(t); - if (tmp != null) - if (tmp instanceof StxTimer && !tmp.declare()) + StxElement e = theBlock.addTimer(t); + if (e != null) + if (e instanceof StxTimer && !e.declare()) addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + - " is already declared", tmp.getLeft())); - else if (tmp instanceof StxAttribute) + " is already declared", e.getLeft())); + else if (e instanceof StxAttribute) addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + - " cannot be added: name already used", tmp.getLeft())); + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); else ; else t.declare(); diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java index 36b6bf013a..5e7c03f264 100644 --- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java +++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java @@ -176,35 +176,52 @@ public class AvatarFromSysMLSyntax { public Location getRight() { return right; } public boolean declare() { boolean res = !declared; declared = true; return res; } } + public static class StxField extends StxElement { + private String name; + private String type; + public StxField(String _name, String _type) { + super(); + name = _name.trim(); + type = _type.trim(); + } + public StxField(Location _left, Location _right, String _name, String _type) { + super(_left, _right); + name = _name.trim(); + type = _type.trim(); + } + public String getName() { return name; } + public String getType() { return type; } + public void setType(String _type) { type = _type; } + } public static class StxStructure extends StxElement { private String name; - protected MyArray<String> fieldNames; - protected MyArray<String> fieldTypes; + protected MyArray<StxField> fields; public StxStructure(Location _left, Location _right, String _name) { super(_left, _right); name = _name; - fieldNames = new MyArray<String>(); - fieldTypes = new MyArray<String>(); + fields = new MyArray<StxField>(); } public StxStructure(String _name) { super(); name = _name; - fieldNames = new MyArray<String>(); - fieldTypes = new MyArray<String>(); - } - public boolean addField(String fieldName, String fieldType){ - boolean result = true; - for (String fld : fieldNames) result &= (! fld.equals(fieldName)); - if (result) { - fieldNames.add(fieldName); - fieldTypes.add(fieldType); + fields = new MyArray<StxField>(); + } + public StxField addField(StxField _field){ + StxField result = null; + for (StxField fld : fields) { + if (fld.getName().equals(_field.getName())) { + result = fld; + break; + } } + if (result == null) fields.add(_field); return result; } public String getName() { return name; } - public int getSize() { return fieldNames.size(); } - public String getFieldName(int i) { return fieldNames.get(i);} - public String getFieldType(int i) { return fieldTypes.get(i);} + public int getSize() { return fields.size(); } + public StxField getField(int i) { return fields.get(i);} + public String getFieldName(int i) { return fields.get(i).getName();} + public String getFieldType(int i) { return fields.get(i).getType();} } public static class StxDataType extends StxStructure { public StxDataType(Location _left, Location _right, String _name) { super(_left, _right, _name); } @@ -325,35 +342,47 @@ public class AvatarFromSysMLSyntax { public StxState[] getStates() { return states; } public void setStates(StxState[] l) { states = l; } public StxElement addAttribute(StxAttribute a){ + for (StxSignal sig : signals) if (sig.getName().equals(a.getName())) return sig; for (StxAttribute att : constants) if (att.getName().equals(a.getName())) return att; for (StxAttribute att : attributes) if (att.getName().equals(a.getName())) return att; for (StxAttribute att : timers) if (att.getName().equals(a.getName())) return att; + for (StxMethod mth : methods) if (mth.getName().equals(a.getName())) return mth; attributes.add(a); return null; } public StxElement addConstant(StxAttribute a){ + for (StxSignal sig : signals) if (sig.getName().equals(a.getName())) return sig; for (StxAttribute att : constants) if (att.getName().equals(a.getName())) return att; for (StxAttribute att : attributes) if (att.getName().equals(a.getName())) return att; for (StxAttribute att : timers) if (att.getName().equals(a.getName())) return att; + for (StxMethod mth : methods) if (mth.getName().equals(a.getName())) return mth; constants.add(a); return null; } - public boolean addMethod(StxMethod m){ - boolean result = true; - for (StxMethod mth : methods) result &= (! mth.getName().equals(m.getName())); - if (result) methods.add(m); - return result; + public StxElement addMethod(StxMethod m){ + for (StxSignal sig : signals) if (sig.getName().equals(m.getName())) return sig; + for (StxAttribute att : constants) if (att.getName().equals(m.getName())) return att; + for (StxAttribute att : attributes) if (att.getName().equals(m.getName())) return att; + for (StxAttribute att : timers) if (att.getName().equals(m.getName())) return att; + for (StxMethod mth : methods) if (mth.getName().equals(m.getName())) return mth; + methods.add(m); + return null; } - public boolean addSignal(StxSignal s){ - boolean result = true; - for (StxSignal sg : signals) result &= (! sg.getName().equals(s.getName())); - if (result) signals.add(s); - return result; + public StxElement addSignal(StxSignal s){ + for (StxSignal sig : signals) if (sig.getName().equals(s.getName())) return sig; + for (StxAttribute att : constants) if (att.getName().equals(s.getName())) return att; + for (StxAttribute att : attributes) if (att.getName().equals(s.getName())) return att; + for (StxAttribute att : timers) if (att.getName().equals(s.getName())) return att; + for (StxMethod mth : methods) if (mth.getName().equals(s.getName())) return mth; + signals.add(s); + return null; } public StxElement addTimer(StxTimer t){ + for (StxSignal sig : signals) if (sig.getName().equals(t.getName())) return sig; for (StxAttribute att : constants) if (att.getName().equals(t.getName())) return att; for (StxAttribute att : attributes) if (att.getName().equals(t.getName())) return att; for (StxAttribute att : timers) if (att.getName().equals(t.getName())) return att; + for (StxMethod mth : methods) if (mth.getName().equals(t.getName())) return mth; timers.add(t); return null; } @@ -443,42 +472,85 @@ public class AvatarFromSysMLSyntax { public StxInMessage(Location _left, Location _right) { super(_left, _right, null ); } public StxInMessage() { super(null); } public void setChannel(StxChannel c) {channel = c; } - public int indexOf(String s) { return fieldNames.indexOf(s); } + public int indexOf(String s) { + int i = 0; + for (StxField f : fields) { + if (f.getName().equals(s)) break; + i++; + } + if (i == fields.size()) return -1; + return i; + } } public static class StxOutMessage extends StxInMessage { public StxInMessage inMessage; - private HashMap<String,String> fieldMap; + private HashMap<StxField,String> fieldMap; public StxOutMessage(Location _left, Location _right, StxInMessage _inMessage) { super(_left, _right); inMessage = _inMessage; - fieldMap = new HashMap<String,String>(); + fieldMap = new HashMap<StxField,String>(); } public StxOutMessage(StxInMessage _inMessage) { super(); inMessage = _inMessage; - fieldMap = new HashMap<String,String>(); + fieldMap = new HashMap<StxField,String>(); } - public boolean addFieldLink(String fieldName, String inFieldName){ - String test = fieldMap.get(inFieldName); + public boolean addFieldLink(StxField outField, String inField){ + String test = fieldMap.get(outField); if (test == null) { - fieldMap.put(fieldName, inFieldName); + fieldMap.put(outField, inField); return true; } return false; } - private class Complete implements BiConsumer<String, String> { - public Complete(){}; - public void accept(String o, String i) { - int index = inMessage.fieldNames.indexOf(i); - fieldNames.set(index,o); - fieldTypes.set(index, inMessage.fieldTypes.get(index)); + private ArrayList<AvatarFromSysMLError> errors; + private class Complete implements BiConsumer<StxField, String> { + List<AvatarFromSysMLError> errors; + public Complete(List<AvatarFromSysMLError> l){ errors = l; }; + public void accept(StxField o, String i) { + int index = inMessage.indexOf(i); + if (errors != null && 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); } } - public void complete() { - fieldMap.forEach(new Complete()); + public void complete(List<AvatarFromSysMLError> errors) { + if (inMessage == null) + if (errors != null) { + errors.add(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, getLeft(), + "in-message associated to out-message has not been set",null)); + return; + } + if (fieldMap.isEmpty()) for (StxField f: inMessage.fields) fields.add(f); + else fieldMap.forEach(new Complete(errors)); channel = inMessage.channel; + if (channel == null) + if (errors != null) { + errors.add(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, getLeft(), + "Channel of in-message associated to out-message has not been set", + inMessage.getLeft())); + return; + } channel.setOutProfile(this); + if (channel.getSignalA() == null) + if (errors != null) { + errors.add(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, getLeft(), + "Channel of in-message associated to out-message has not associated signal", + channel.getLeft())); + return; + } channel.getSignalA().setChannel(channel); + if (channel.getSignalB() == null) + if (errors != null) { + errors.add(new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, getLeft(), + "Channel of in-message associated to out-message has only one associated signal", + channel.getLeft())); + return; + } channel.getSignalB().setChannel(channel); } } diff --git a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup index 08f6a69832..0bb7f6a348 100644 --- a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup +++ b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup @@ -39,7 +39,7 @@ parser code {: } private class Complete implements BiConsumer<String, StxOutMessage> { public Complete(){}; - public void accept(String s, StxOutMessage o) { o.complete(); } + public void accept(String s, StxOutMessage o) { o.complete(errors); } } private void updateSignal(StxTransition st) { String name = st.getSignalName(); @@ -114,6 +114,8 @@ parser code {: signalMap.put(key, theSignal); } } + + Location messageChannelParam; private HashMap<String,StxInMessage> inMessageMap; private void getInMessage(String _name) { theStructure = inMessageMap.get(_name); @@ -351,8 +353,13 @@ datatypeDeclHEADER ::= ATTRIBUTE:a DEF IDENT:id specializes AVDATATYPE_T {: :}; fieldDecls ::= fieldDecl | fieldDecl fieldDecls ; -fieldDecl ::= ATTRIBUTE IDENT:id COLON typeIdent:tp SEMICOLON {: theStructure.addField(id.getAvatarName(),tp); :} -; +fieldDecl ::= ATTRIBUTE:a IDENT:id COLON typeIdent:tp SEMICOLON {: + StxField field = new StxField(axleft, axright, id.getAvatarName(), tp); + StxField clash = theStructure.addField(field); + if (clash != null) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHWARNING, axleft, "Field " + id.getAvatarName() + + " is already declared", clash.getLeft()) ); +:}; typeIdent ::= INTEGER_T {: RESULT = "Integer"; :} | BOOLEAN_T {: RESULT = "Boolean"; :} @@ -570,15 +577,19 @@ outSignalBinding ::= // MESSAGE DECLARATION $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ messageDecl ::= inMessageDecl | outMessageDecl ; -inMessageDecl ::= inMessageDeclBegin inMessageDeclBODY -; +inMessageDecl ::= inMessageDeclBegin:m inMessageDeclBODY {: + if (messageChannelParam == null) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.HIGHERROR, mxleft, "In-message channel has not been set", null) ); +:}; inMessageDeclBegin ::= PART:p DEF IDENT:id specializes INMESSAGE_T LBRAC {: getInMessage(id.getAvatarName()); if (! theStructure.declare() ) { addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "In-message profile " + id.getAvatarName() + " is already declared", theStructure.getLeft()) ); - } else + } else { theStructure.setLeft(pxleft); + messageChannelParam = null; + } :}; inMessageDeclBODY ::= messageChannel RBRAC:b {: @@ -592,15 +603,27 @@ inMessageDeclBODY ::= :} ; messageChannel ::= - PRIVATE PART CHANNEL_F COLON CHANNEL_T EQUAL IDENT:ch SEMICOLON {: - getChannel(ch.getAvatarName()); - theChannel.setInProfile((StxInMessage)theStructure); - ((StxInMessage)theStructure).setChannel(theChannel); + PRIVATE:p PART CHANNEL_F COLON CHANNEL_T EQUAL IDENT:ch SEMICOLON {: + if (messageChannelParam != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, + "in-message channel has already been set", messageChannelParam)); + else { + getChannel(ch.getAvatarName()); + theChannel.setInProfile((StxInMessage)theStructure); + ((StxInMessage)theStructure).setChannel(theChannel); + messageChannelParam = pxleft; + } :} - | PRIVATE PART CHANNEL_F EQUAL IDENT:ch SEMICOLON {: - getChannel(ch.getAvatarName()); - theChannel.setInProfile((StxInMessage)theStructure); - ((StxInMessage)theStructure).setChannel(theChannel); + | PRIVATE:p PART CHANNEL_F EQUAL IDENT:ch SEMICOLON {: + if (messageChannelParam != null) + addError(new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, + "in-message channel has already been set", messageChannelParam)); + else { + getChannel(ch.getAvatarName()); + theChannel.setInProfile((StxInMessage)theStructure); + ((StxInMessage)theStructure).setChannel(theChannel); + messageChannelParam = pxleft; + } :} ; outMessageDecl ::= @@ -635,8 +658,9 @@ outMessageDeclBODY ::= | redefineField outMessageDeclBODY ; redefineField ::= - ATTRIBUTE IDENT:o REDEFINES IDENT:i SEMICOLON {: - theOutMessage.addFieldLink(o.getAvatarName(), i.getAvatarName()); + ATTRIBUTE:a IDENT:o REDEFINES IDENT:i SEMICOLON {: + StxField ofield = new StxField(axleft, axright, o.getAvatarName(), ""); + theOutMessage.addFieldLink(ofield, i.getAvatarName()); :}; // BLOCK DECLARATION $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ @@ -688,9 +712,20 @@ attributeDeclHEADER ::= getAttribute(id.getAvatarName(), tp); if (! theAttribute.declare() ) { addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Attribute " + id.getAvatarName() + - " is already declared", theAttribute.getLeft()) ); + " is already declared (or there is an attribute with same name)", theAttribute.getLeft()) ); } else { - theBlock.addAttribute(theAttribute); + StxElement e = theBlock.addAttribute(theAttribute); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Attribute " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Attribute " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Attribute " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; theAttribute.setLeft(axleft); } :}; @@ -710,9 +745,20 @@ constantDeclHEADER ::= getAttribute(id.getAvatarName(), tp); if (! theAttribute.declare() ) { addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, rxleft, "Constant " + id.getAvatarName() + - " is already declared", theAttribute.getLeft()) ); + " is already declared (or there is an attribute with same name)", theAttribute.getLeft()) ); } else { - theBlock.addConstant(theAttribute); + StxElement e = theBlock.addConstant(theAttribute); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, rxleft, "Constant " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, rxleft, "Constant " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, rxleft, "Constant " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; theAttribute.setLeft(rxleft); } :}; @@ -733,7 +779,18 @@ voidMethodDeclBegin ::= ACTION:a IDENT:id COLON AVVOIDMETHOD_T {: addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Method " + id.getAvatarName() + " is already declared", theStructure.getLeft()) ); } else { - theBlock.addMethod((StxMethod)theStructure); + StxElement e = theBlock.addMethod((StxMethod)theStructure); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for timer", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, axleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; theStructure.setLeft(axleft); } :}; @@ -751,7 +808,18 @@ calcMethodDeclBegin ::= CALC:c IDENT:id COLON AVCALCMETHOD_T {: addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, cxleft, "Method " + id.getAvatarName() + " is already declared", theStructure.getLeft()) ); } else { - theBlock.addMethod((StxMethod)theStructure); + StxElement e = theBlock.addMethod((StxMethod)theStructure); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, cxleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for timer", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, cxleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, cxleft, "Method " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); + else ; theStructure.setLeft(cxleft); } :}; @@ -774,7 +842,18 @@ signalDecl ::= addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + " is already declared", theSignal.getLeft()) ); } else { - theBlock.addSignal(theSignal); + StxElement e = theBlock.addSignal(theSignal); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for timer", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else; theSignal.setLeft(pxleft); theSignal.setRight(qxright); } @@ -785,7 +864,18 @@ signalDecl ::= addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + " is already declared", theSignal.getLeft()) ); } else { - theBlock.addSignal(theSignal); + StxElement e = theBlock.addSignal(theSignal); + if (e != null) + if (e instanceof StxTimer) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for timer", e.getLeft())); + else if (e instanceof StxAttribute) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Signal " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else; theSignal.setLeft(pxleft); theSignal.setRight(qxright); } @@ -796,27 +886,39 @@ signalDecl ::= timerDecl ::= PART:p IDENT:id COLON AVTIMER_T EQUAL AVTIMER_T LPAR RPAR SEMICOLON:q {: StxTimer t = new StxTimer(pxleft, qxright, id.getAvatarName()); - StxElement tmp = theBlock.addTimer(t); - if (tmp != null) - if (tmp instanceof StxTimer && !tmp.declare()) + StxElement e = theBlock.addTimer(t); + if (e != null) + if (e instanceof StxTimer && !e.declare()) addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + - " is already declared", tmp.getLeft())); - else if (tmp instanceof StxAttribute) + " is already declared", e.getLeft())); + else if (e instanceof StxAttribute) addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + - " cannot be added: name already used", tmp.getLeft())); + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); else ; else t.declare(); :} | PART:p IDENT:id COLON AVTIMER_T SEMICOLON:q {: StxTimer t = new StxTimer(pxleft, qxright, id.getAvatarName()); - StxElement tmp = theBlock.addTimer(t); - if (tmp != null) - if (tmp instanceof StxTimer && !tmp.declare()) + StxElement e = theBlock.addTimer(t); + if (e != null) + if (e instanceof StxTimer && !e.declare()) addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + - " is already declared", tmp.getLeft())); - else if (tmp instanceof StxAttribute) + " is already declared", e.getLeft())); + else if (e instanceof StxAttribute) addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + - " cannot be added: name already used", tmp.getLeft())); + " cannot be added: name already used for constant or attribute", e.getLeft())); + else if (e instanceof StxMethod) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for method", e.getLeft())); + else if (e instanceof StxSignal) + addError( new AvatarFromSysMLError(AvatarFromSysMLError.LOWERROR, pxleft, "Timer " + id.getAvatarName() + + " cannot be added: name already used for signal", e.getLeft())); else ; else t.declare(); :} -- GitLab