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