diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java
index a7224d22116b507c44da030291e846e2fcce258e..338e7649def65045852633bc772eb8335dd9e1c3 100644
--- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java
+++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysMLSyntax.java
@@ -2,6 +2,7 @@ package avatartranslator.tosysmlv2;
 
 import java.util.ArrayList;
 import java.util.HashMap;
+import java_cup.runtime.ComplexSymbolFactory.Location;
 
 public class AvatarFromSysMLSyntax {
     public static class MyArray<E> extends ArrayList<E> {
@@ -68,12 +69,20 @@ public class AvatarFromSysMLSyntax {
     public static final byte STXASSIGNACTION = 0;
     public static final byte STXMETHODACTION = 1;
     /** idents collected while parsing an Avatar SysML Model */
-    public static class Ident {
+    public static class Ident  extends StxElement {
         private byte type;
         private String sysMLName;
         private String avatarName;
 
         public Ident(byte _type, String _smlName) {
+            super();
+            setTypeName(_type, _smlName);
+        }
+        public Ident(Location _left, Location _right, byte _type, String _smlName) {
+            super(_left, _right);
+            setTypeName(_type, _smlName);
+        };
+        private void setTypeName(byte _type, String _smlName) {
             type = _type;
             if (type == AVATARNAME) {
                 sysMLName = _smlName;
@@ -81,22 +90,21 @@ public class AvatarFromSysMLSyntax {
             } else {
                 sysMLName = _smlName.substring(1, _smlName.length() - 2);
                 if (type == DATATYPENAME) {
-                    avatarName = _smlName.substring(5,_smlName.length() - 2);
+                    avatarName = _smlName.substring(5, _smlName.length() - 2);
                 } else if (type == ATTRIBUTENAME) {
-                    avatarName = _smlName.substring(2,_smlName.length() - 2);
+                    avatarName = _smlName.substring(2, _smlName.length() - 2);
                 } else if (type == SIGNALNAME) {
-                    avatarName = _smlName.substring(6,_smlName.length() - 2);
+                    avatarName = _smlName.substring(6, _smlName.length() - 2);
                 } else if (type == STANDARDSTATENAME) {
-                    avatarName = _smlName.substring(14,_smlName.length() - 2);
+                    avatarName = _smlName.substring(14, _smlName.length() - 2);
                 } else if (type == BLOCKNAME) {
-                    avatarName = _smlName.substring(6,_smlName.length() - 2);
+                    avatarName = _smlName.substring(6, _smlName.length() - 2);
                 } else {
                     avatarName = sysMLName;
                     if (type == QUOTEDNAME) type = AVATARNAME;
                 }
 
             }
-
         }
         public byte getType() { return type; }
         public String getSysMLName() { return sysMLName; }
@@ -129,21 +137,22 @@ public class AvatarFromSysMLSyntax {
 
 
     public abstract static class StxElement {
-        private int row;
-        private int column;
-        public StxElement(int _row, int _column){ row = _row; column = _column; }
-        public StxElement(){ row = -1; column = -1; }
-        public void setRowColumn(int _row, int _column) { row = _row; column = _column; }
-
-        public int getRow() { return row; }
-        public int getColumn() { return column; }
+        protected Location defaultLocation = new Location(-1,-1);
+        private Location left;
+        private Location right;
+        public StxElement(Location _left, Location _right){ left = _left; right = _right; }
+        public StxElement(){ left = defaultLocation; right = defaultLocation; }
+        public void setLeft(Location _left) { left = _left; }
+        public void setRight(Location _right) { right = _right; }
+        public Location  getLeft() { return left; }
+        public Location  getRight() { return right; }
     }
     public static class StxStructure extends StxElement {
         private String name;
         private ArrayList<String> fieldNames;
         private ArrayList<String> fieldTypes;
-        public StxStructure(int _row, int _column, String _name) {
-            super(_row, _column);
+        public StxStructure(Location _left, Location _right, String _name) {
+            super(_left, _right);
             name = _name;
             fieldNames = new ArrayList<String>();
             fieldTypes = new ArrayList<String>();
@@ -169,7 +178,7 @@ public class AvatarFromSysMLSyntax {
         public String getFieldType(int i) { return fieldTypes.get(i);}
     }
     public static class StxDataType extends StxStructure {
-        public StxDataType(int _row, int _column, String _name) { super(_row, _column, _name); }
+        public StxDataType(Location _left, Location _right, String _name) { super(_left, _right, _name); }
         public StxDataType(String _name) { super(_name); }
     }
     public static class StxRelation extends StxElement {
@@ -181,8 +190,8 @@ public class AvatarFromSysMLSyntax {
         boolean isprivate;
         int sizeOfFIFO;
         boolean asynchronous;
-        public StxRelation(int _row, int _column) {
-            super(_row, _column);
+        public StxRelation(Location _left, Location _right) {
+            super(_left, _right);
             channels = new ArrayList<StxChannel>();
             isprivate = false;
             lossy = false;
@@ -216,7 +225,7 @@ public class AvatarFromSysMLSyntax {
         public StxChannel getChannel(int i) { return channels.get(i); }
     }
     public static class StxMethod extends StxStructure {
-        public StxMethod(int _row, int _column, String _name) { super(_row, _column, _name); returnType = null; }
+        public StxMethod(Location _left, Location _right, String _name) { super(_left, _right, _name); returnType = null; }
         public StxMethod(String _name) { super(_name); returnType = null; }
         private String returnType;
         public String getReturnType() { return returnType; }
@@ -228,8 +237,8 @@ public class AvatarFromSysMLSyntax {
         String name;
         String type;
         String init;
-        public StxAttribute(int _row, int _column, String _name, String _type){
-            super(_row, _column);
+        public StxAttribute(Location _left, Location _right, String _name, String _type){
+            super(_left, _right);
             name = _name;
             type = _type;
             init = null;
@@ -248,8 +257,8 @@ public class AvatarFromSysMLSyntax {
 
     public static class StxTimer extends StxElement {
         String name;
-        public StxTimer(int _row, int _column, String _name){
-            super(_row, _column);
+        public StxTimer(Location _left, Location _right, String _name){
+            super(_left, _right);
             name = _name;
         }
         public StxTimer(String _name){
@@ -266,8 +275,8 @@ public class AvatarFromSysMLSyntax {
         ArrayList<StxSignal> signals;
         ArrayList<StxTimer> timers;
         HashMap<String, StxState> states;
-        public StxBlock(int _row, int _column, String _name) {
-            super(_row, _column);
+        public StxBlock(Location _left, Location _right, String _name) {
+            super(_left, _right);
             name = _name;
             father = null;
             attributes = new ArrayList<StxAttribute>();
@@ -329,8 +338,8 @@ public class AvatarFromSysMLSyntax {
         private StxSignal signalA;
         private String blockB;
         private StxSignal signalB;
-        public StxChannel(int _row, int _column){
-            super(_row, _column);
+        public StxChannel(Location _left, Location _right){
+            super(_left, _right);
             inProfile = null;
             outProfile = null;
             blockA = null;
@@ -375,8 +384,8 @@ public class AvatarFromSysMLSyntax {
     public static class StxSignal extends StxElement {
         private String name;
         private boolean input;
-        public StxSignal(int _row, int _column, String _name){
-            super(_row, _column);
+        public StxSignal(Location _left, Location _right, String _name){
+            super(_left, _right);
             name = _name;
         }
         public StxSignal(String _name){
@@ -389,7 +398,7 @@ public class AvatarFromSysMLSyntax {
     }
     public static class StxInMessage extends StxStructure {
         private StxChannel channel;
-        public StxInMessage(int _row, int _column, String _name) { super(_row, _column, _name ); }
+        public StxInMessage(Location _left, Location _right, String _name) { super(_left, _right, _name ); }
         public StxInMessage(String _name) { super(_name); }
         public void setChannel(StxChannel _c) { channel = _c; }
         public StxChannel getChannel() { return channel; }
@@ -397,8 +406,8 @@ public class AvatarFromSysMLSyntax {
     public static class StxOutMessage extends StxElement {
         private StxInMessage inMessage;
         private HashMap<String,String> fieldMap;
-        public StxOutMessage(int _row, int _column, StxInMessage _inMessage) {
-            super(_row, _column);
+        public StxOutMessage(Location _left, Location _right, StxInMessage _inMessage) {
+            super(_left, _right);
             inMessage = _inMessage;
             fieldMap = new HashMap<String,String>();
         }
@@ -418,7 +427,7 @@ public class AvatarFromSysMLSyntax {
         public StxInMessage getInMessage() { return inMessage; }
         public HashMap<String,String> getFieldMap() { return fieldMap; }
     }
-    public static class StxState {
+    public static class StxState extends StxElement {
         private byte type;
         private String name;
         private StxSignal signal;
@@ -457,7 +466,7 @@ public class AvatarFromSysMLSyntax {
             return result;
         }
     }
-    public static class StxTransition {
+    public static class StxTransition extends StxElement {
         private byte type;
         private final int index;
         private String guard;
@@ -472,7 +481,11 @@ public class AvatarFromSysMLSyntax {
         private HashMap<String,String> delayExtra;
         private StxState target;
         private ArrayList<StxAction> actions;
+        private Location rleft;
+        private Location rright;
+
         public StxTransition(int _index){
+            super();
             type = -1;
             index = _index;
             guard = null;
@@ -485,6 +498,8 @@ public class AvatarFromSysMLSyntax {
             delayExtra = null;
             target = null;
             actions = new ArrayList<StxAction>();
+            rleft = defaultLocation;
+            rright = defaultLocation;
         }
         public void setType(byte _t) { type = _t; };
         public void setGuard(String _s) { guard = _s; }
@@ -499,6 +514,8 @@ public class AvatarFromSysMLSyntax {
         public void setDelayExtra(HashMap<String,String> _m) { delayExtra = _m; }
         public void setTarget(StxState _s) { target = _s; }
         public void setActions(ArrayList<StxAction> _a) { actions = _a; }
+        public void setRleft(Location _l) { rleft = _l; }
+        public void setRright(Location _l) { rright = _l; }
         public byte getType() { return type; }
         public int getIndex() { return index; }
         public String getGuard() { return guard; }
@@ -513,16 +530,31 @@ public class AvatarFromSysMLSyntax {
         public HashMap<String,String> getDelayExtra() { return delayExtra; }
         public StxState getTarget() { return target; }
         public ArrayList<StxAction> getActions() { return actions; }
+        public Location setRleft() { return rleft; }
+        public Location setRright() { return rright; }
     }
-    public static class StxAction{
+    public static class StxAction extends StxElement {
         private byte type;
         private String value;
         private String target;
         public StxAction (String _value) {
+            super();
+            type = STXMETHODACTION;
+            value = _value;
+        }
+        public StxAction (Location _left, Location _right, String _value) {
+            super(_left, _right);
             type = STXMETHODACTION;
             value = _value;
         }
         public StxAction (String _target, String _value) {
+            super();
+            type = STXASSIGNACTION;
+            value = _value;
+            target = _target;
+        }
+         public StxAction (Location _left, Location _right, String _target, String _value) {
+            super(_left, _right);
             type = STXASSIGNACTION;
             value = _value;
             target = _target;
diff --git a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup
index ea56871b9b8ad6eaf566bc96219a4e74e4da70b5..2c098f201446fb87e33da349297c7b58a86f67f6 100644
--- a/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup
+++ b/src/main/java/avatartranslator/tosysmlv2/javacup/AvatarFromSysML.jcup
@@ -1,7 +1,6 @@
  
 package avatartranslator.tosysmlv2;
 import java_cup.runtime.*;
-import java_cup.runtime.ComplexSymbolFactory.*;
 import java.util.ArrayList;
 import java.util.HashMap;
 import avatartranslator.tosysmlv2.AvatarFromSysMLSyntax.*;
@@ -94,7 +93,6 @@ parser code {:
     private void getAttribute(String _name, String _type) {
         theAttribute = new StxAttribute(_name, _type);
     }
-    private StxMethod theMethod;
     private void getMethod(String _name) {
         theStructure = new StxMethod(_name);
     }
@@ -232,27 +230,31 @@ subsets ::= SUBSETS | REFINES;
 
 // BLOCK ALIASES
 blockAlias ::=
-    PART IDENT COLON AVBLOCK_T subsets blockChain EQUAL blockChain SEMICOLON {: :}
+    PART IDENT COLON AVBLOCK_T subsets blockChain EQUAL blockChain SEMICOLON
 ;
 blockChain::=
-      IDENT {: :}
-    | IDENT blockChain {: :}
+      IDENT
+    | IDENT POINT blockChain
 ;
 
 // DATATYPE DECLARATION $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
 datatypeDecl ::=
-      datatypeDeclHEADER LBRAC fieldDecls RBRAC
-    | datatypeDeclHEADER LBRAC  RBRAC
+      datatypeDeclHEADER LBRAC fieldDecls RBRAC:b {:
+        theStructure.setRight(bxright);
+      :}
+    | datatypeDeclHEADER LBRAC  RBRAC:b {:
+        theStructure.setRight(bxright);
+      :}
 ;
-datatypeDeclHEADER ::= ATTRIBUTE DEF IDENT:id specializes AVDATATYPE_T {:
+datatypeDeclHEADER ::= ATTRIBUTE:a DEF IDENT:id specializes AVDATATYPE_T {:
     theStructure = dataTypeMap.get(id.getAvatarName());
     if (theStructure == null) {
         theStructure = new StxDataType(id.getAvatarName());
         dataTypeMap.put(id.getAvatarName(), (StxDataType) theStructure);
     }
-    else addError("Datatype " + id.getAvatarName() + " has already been declared\n");
+    theStructure.setLeft(axleft);
 :};
-fieldDecls ::= fieldDecl {: :} | fieldDecl  fieldDecls {: :}
+fieldDecls ::= fieldDecl | fieldDecl  fieldDecls
 ;
 fieldDecl ::= ATTRIBUTE IDENT:id COLON typeIdent:tp SEMICOLON {: theStructure.addField(id.getAvatarName(),tp); :}
 ;
@@ -264,31 +266,37 @@ typeIdent ::=
 
 // RELATION DECLARATION $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
 relationDecl ::= syncRelDecl | nbfRelDecl | bfRelDecl;
-syncRelDecl ::= syncRelDeclBegin relParams RPAR SEMICOLON {: :}
-;
+syncRelDecl ::= syncRelDeclBegin relParams RPAR SEMICOLON:x {:
+    theRelation.setRight(xxright);
+:};
 syncRelDeclBegin ::=
-    PART IDENT:id COLON SYNCREL_T EQUAL SYNCREL_T LPAR {:
+    PART:p IDENT:id COLON SYNCREL_T EQUAL SYNCREL_T LPAR {:
         Location l = idxleft;
         getRelation(id.getAvatarName());
         theRelation.setAsynchronous(false);
+        theRelation.setLeft(pxleft);
         clearRelationParams();
 :};
-nbfRelDecl ::= nbfRelDeclBegin relParams RPAR SEMICOLON {: :}
-;
+nbfRelDecl ::= nbfRelDeclBegin relParams RPAR SEMICOLON:x {:
+    theRelation.setRight(xxright);
+:};
 nbfRelDeclBegin ::=
-    PART IDENT:id COLON NBFIFOREL_T EQUAL NBFIFOREL_T LPAR {:
+    PART:p IDENT:id COLON NBFIFOREL_T EQUAL NBFIFOREL_T LPAR {:
        getRelation(id.getAvatarName());
        theRelation.setAsynchronous(true);
        theRelation.setBlocking(false);
+       theRelation.setLeft(pxleft);
        clearRelationParams();
 :};
-bfRelDecl ::= bfRelDeclBegin relParams RPAR SEMICOLON {: :}
-;
+bfRelDecl ::= bfRelDeclBegin relParams RPAR SEMICOLON:x {:
+    theRelation.setRight(xxright);
+:};
 bfRelDeclBegin ::=
-    PART IDENT:id COLON BFIFOREL_T EQUAL BFIFOREL_T LPAR {:
+    PART:p IDENT:id COLON BFIFOREL_T EQUAL BFIFOREL_T LPAR {:
         getRelation(id.getAvatarName());
         theRelation.setAsynchronous(true);
         theRelation.setBlocking(true);
+        theRelation.setLeft(pxleft);
         clearRelationParams();
 :};
 
@@ -342,20 +350,26 @@ lossyParam ::= LOSSY_F EQUAL BOOL:b {:
 
 // CHANNEL DECLARATION $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
 channelDecl ::= syncChDecl | nbfChDecl |bfChDecl;
-syncChDecl ::= PART IDENT:id COLON SYNC_T EQUAL SYNC_T LPAR RELATION_F EQUAL IDENT:rl RPAR SEMICOLON {:
+syncChDecl ::= PART:p IDENT:id COLON SYNC_T EQUAL SYNC_T LPAR RELATION_F EQUAL IDENT:rl RPAR SEMICOLON:s {:
     getRelation(rl.getAvatarName());
     getChannel(id.getAvatarName());
     theRelation.addChannel(theChannel);
+    theChannel.setLeft(pxleft);
+    theChannel.setRight(sxright);
 :};
-nbfChDecl ::= PART IDENT:id COLON NBFIFO_T EQUAL NBFIFO_T LPAR RELATION_F EQUAL IDENT:rl RPAR SEMICOLON {:
+nbfChDecl ::= PART:p IDENT:id COLON NBFIFO_T EQUAL NBFIFO_T LPAR RELATION_F EQUAL IDENT:rl RPAR SEMICOLON:s {:
     getRelation(rl.getAvatarName());
     getChannel(id.getAvatarName());
     theRelation.addChannel(theChannel);
+    theChannel.setLeft(pxleft);
+    theChannel.setRight(sxright);
 :};
-bfChDecl ::= PART IDENT:id COLON BFIFO_T EQUAL BFIFO_T LPAR RELATION_F EQUAL IDENT:rl RPAR SEMICOLON {:
+bfChDecl ::= PART:p IDENT:id COLON BFIFO_T EQUAL BFIFO_T LPAR RELATION_F EQUAL IDENT:rl RPAR SEMICOLON:s {:
     getRelation(rl.getAvatarName());
     getChannel(id.getAvatarName());
     theRelation.addChannel(theChannel);
+    theChannel.setLeft(pxleft);
+    theChannel.setRight(sxright);
 :};
 
 // SIGNAL BINDING $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
@@ -370,30 +384,30 @@ inSignalBinding ::=
         theChannel.setSignal(b.getAvatarName(), theSignal);
     :}
     | BINDING COLON INSIGNALBINDING_T BIND IDENT:c EQUAL IDENT:b POINT IDENT:s SEMICOLON {:
-         getChannel(c.getAvatarName());
-         getBlock(b.getAvatarName());
-         getSignal(b.getAvatarName(),s.getAvatarName());
-         theSignal.setInput(true);
-         theBlock.addSignal(theSignal);
-         theChannel.setSignal(b.getAvatarName(), theSignal);
+        getChannel(c.getAvatarName());
+        getBlock(b.getAvatarName());
+        getSignal(b.getAvatarName(),s.getAvatarName());
+        theSignal.setInput(true);
+        theBlock.addSignal(theSignal);
+        theChannel.setSignal(b.getAvatarName(), theSignal);
    :}
 ;
 outSignalBinding ::=
       BINDING COLON OUTSIGNALBINDING_T BIND IDENT:b POINT IDENT:s EQUAL IDENT:c SEMICOLON {:
-         getChannel(c.getAvatarName());
-         getBlock(b.getAvatarName());
-         getSignal(b.getAvatarName(),s.getAvatarName());
-         theSignal.setInput(false);
-         theBlock.addSignal(theSignal);
-         theChannel.setSignal(b.getAvatarName(), theSignal);
+        getChannel(c.getAvatarName());
+        getBlock(b.getAvatarName());
+        getSignal(b.getAvatarName(),s.getAvatarName());
+        theSignal.setInput(false);
+        theBlock.addSignal(theSignal);
+        theChannel.setSignal(b.getAvatarName(), theSignal);
    :}
    | BINDING COLON OUTSIGNALBINDING_T BIND IDENT:c EQUAL IDENT:b POINT IDENT:s SEMICOLON {:
-         getChannel(c.getAvatarName());
-         getBlock(b.getAvatarName());
-         getSignal(b.getAvatarName(),s.getAvatarName());
-         theSignal.setInput(false);
-         theBlock.addSignal(theSignal);
-         theChannel.setSignal(b.getAvatarName(), theSignal);
+        getChannel(c.getAvatarName());
+        getBlock(b.getAvatarName());
+        getSignal(b.getAvatarName(),s.getAvatarName());
+        theSignal.setInput(false);
+        theBlock.addSignal(theSignal);
+        theChannel.setSignal(b.getAvatarName(), theSignal);
    :}
 ;
 
@@ -402,13 +416,20 @@ messageDecl ::= inMessageDecl | outMessageDecl
 ;
 inMessageDecl ::= inMessageDeclBegin inMessageDeclBODY
 ;
-inMessageDeclBegin ::= PART DEF IDENT:id specializes INMESSAGE_T LBRAC {:
+inMessageDeclBegin ::= PART:p DEF IDENT:id specializes INMESSAGE_T LBRAC {:
     getInMessage(id.getAvatarName());
+    theStructure.setLeft(pxleft);
 :};
 inMessageDeclBODY ::=
-      messageChannel RBRAC
-    | messageChannel fieldDecls RBRAC
-    | fieldDecls messageChannel RBRAC
+      messageChannel RBRAC:b {:
+        theStructure.setRight(bxright);
+      :}
+    | messageChannel fieldDecls RBRAC:b {:
+        theStructure.setRight(bxright);
+      :}
+    | fieldDecls messageChannel RBRAC:b {:
+        theStructure.setRight(bxright);
+      :}
 ;
 messageChannel ::=
       PRIVATE PART CHANNEL_F COLON CHANNEL_T EQUAL IDENT:ch SEMICOLON {:
@@ -421,22 +442,30 @@ messageChannel ::=
       :}
 ;
 outMessageDecl ::=
-      outMessageDeclBegin SEMICOLON
-    | outMessageDeclBegin LBRAC RBRAC
+      outMessageDeclBegin SEMICOLON:b {:
+        theOutMessage.setRight(bxright);
+      :}
+    | outMessageDeclBegin LBRAC RBRAC:b {:
+        theOutMessage.setRight(bxright);
+      :}
     | outMessageDeclBegin LBRAC outMessageDeclBODY
 ;
 outMessageDeclBegin ::=
-      PART DEF IDENT:id specializes OUTMESSAGE_T COMMA IDENT:m {:
+      PART:p DEF IDENT:id specializes OUTMESSAGE_T COMMA IDENT:m {:
         getInMessage(m.getAvatarName());
         getOutMessage(id.getAvatarName(), (StxInMessage)theStructure);
+        theOutMessage.setLeft(pxleft);
       :}
-    | PART DEF IDENT:id specializes IDENT:m COMMA OUTMESSAGE_T {:
+    | PART:p DEF IDENT:id specializes IDENT:m COMMA OUTMESSAGE_T {:
         getInMessage(m.getAvatarName());
         getOutMessage(id.getAvatarName(), (StxInMessage)theStructure);
+        theOutMessage.setLeft(pxleft);
       :}
 ;
 outMessageDeclBODY ::=
-      redefineField RBRAC
+      redefineField RBRAC:b {:
+        theOutMessage.setRight(bxright);
+      :}
     | redefineField outMessageDeclBODY
 ;
 redefineField ::=
@@ -450,14 +479,17 @@ blockDecl ::=
     | blockDeclBegin blockDeclBODY {: popBlock(); :}
 ;
 blockDeclBegin ::=
-      PART IDENT:id COLON AVBLOCK_T LBRAC {:
+      PART:p IDENT:id COLON AVBLOCK_T LBRAC {:
         StxBlock tmp = theBlock;
         pushBlock();
         getBlock(id.getAvatarName());
         theBlock.setFather(tmp);
+        theBlock.setLeft(pxleft);
 :};
 blockDeclBODY ::=
-      blockItem RBRAC
+      blockItem RBRAC:b {:
+        theBlock.setRight(bxright);
+      :}
     | blockItem blockDeclBODY
 ;
 blockItem ::=
@@ -471,43 +503,51 @@ blockItem ::=
 
 // ATTRIBUTE DECLARATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 attributeDecl ::=
-      attributeDeclHEADER SEMICOLON {: lexer.setGetStringValue(false); :}
-    | attributeDeclHEADER GETS STRINGEXPR:e SEMICOLON {:
+      attributeDeclHEADER SEMICOLON:q {:
+        lexer.setGetStringValue(false);
+        theAttribute.setRight(qxright);
+      :}
+    | attributeDeclHEADER GETS STRINGEXPR:e SEMICOLON:q {:
         lexer.setGetStringValue(false);
         theAttribute.setInit(e);
+        theAttribute.setRight(qxright);
     :}
 ;
 attributeDeclHEADER ::=
-    ATTRIBUTE IDENT:id COLON typIdent:tp {:
+    ATTRIBUTE:a IDENT:id COLON typIdent:tp {:
         getAttribute(id.getAvatarName(), (String) tp);
         theBlock.addAttribute(theAttribute);
+        theAttribute.setLeft(axleft);
         lexer.setGetStringValue(true);
-:}
-;
-typIdent ::=
-      INTEGER_T {: RESULT = "Integer"; :}
-    | BOOLEAN_T {: RESULT = "Boolean"; :}
-    | IDENT:id  {: RESULT = id.getAvatarName(); :}
-;
-
+:};
 
 // METHOD DECLARATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 methodDecl ::= voidMethodDecl | calcMethodDecl;
 voidMethodDecl ::=
-      voidMethodDeclBegin LBRAC RBRAC
-    | voidMethodDeclBegin LBRAC fieldDecls RBRAC
+      voidMethodDeclBegin LBRAC RBRAC:b {:
+        theStructure.setRight(bxright);
+      :}
+    | voidMethodDeclBegin LBRAC fieldDecls RBRAC:b {:
+        theStructure.setRight(bxright);
+      :}
 ;
-voidMethodDeclBegin ::= ACTION IDENT:id COLON AVVOIDMETHOD_T {:
+voidMethodDeclBegin ::= ACTION:a IDENT:id COLON AVVOIDMETHOD_T {:
     getMethod(id.getAvatarName());
-    theBlock.addMethod(theMethod);
+    theBlock.addMethod((StxMethod)theStructure);
+    theStructure.setLeft(axleft);
 :};
 calcMethodDecl ::=
-      calcMethodDeclBegin LBRAC RBRAC
-    | calcMethodDeclBegin LBRAC calcMethodItems RBRAC
+      calcMethodDeclBegin LBRAC RBRAC:b {:
+        theStructure.setRight(bxright);
+      :}
+    | calcMethodDeclBegin LBRAC calcMethodItems RBRAC:b {:
+        theStructure.setRight(bxright);
+      :}
 ;
-calcMethodDeclBegin ::= CALC IDENT:id COLON AVCALCMETHOD_T {:
+calcMethodDeclBegin ::= CALC:c IDENT:id COLON AVCALCMETHOD_T {:
     getMethod(id.getAvatarName());
-    theBlock.addMethod(theMethod);
+    theBlock.addMethod((StxMethod)theStructure);
+    theStructure.setLeft(cxleft);
 :};
 calcMethodItems ::=
       calcMethodItem
@@ -522,23 +562,27 @@ calcMethodItem ::=
 
 // SIGNAL DECLARATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 signalDecl ::=
-      PART IDENT:id COLON FIFO_T SEMICOLON {:
+      PART:p IDENT:id COLON FIFO_T SEMICOLON:q {:
         getSignal(theBlock.getName(),id.getAvatarName());
         theBlock.addSignal(theSignal);
+        theSignal.setLeft(pxleft);
+        theSignal.setRight(qxright);
       :}
-    | PART IDENT:id COLON CHANNEL_T SEMICOLON {:
+    | PART:p IDENT:id COLON CHANNEL_T SEMICOLON:q {:
         getSignal(theBlock.getName(),id.getAvatarName());
         theBlock.addSignal(theSignal);
+        theSignal.setLeft(pxleft);
+        theSignal.setRight(qxright);
       :}
 ;
 
 // TIMER DECLARATION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 timerDecl ::=
-      PART IDENT:id COLON AVTIMER_T EQUAL AVTIMER_T LPAR RPAR SEMICOLON {:
-        theBlock.addTimer(new StxTimer(id.getAvatarName()));
+      PART:p IDENT:id COLON AVTIMER_T EQUAL AVTIMER_T LPAR RPAR SEMICOLON:q {:
+        theBlock.addTimer(new StxTimer(pxleft, qxright, id.getAvatarName()));
       :}
-    | PART IDENT:id COLON AVTIMER_T SEMICOLON {:
-        theBlock.addTimer(new StxTimer(id.getAvatarName()));
+    | PART:p IDENT:id COLON AVTIMER_T SEMICOLON:q {:
+        theBlock.addTimer(new StxTimer(pxleft, qxright, id.getAvatarName()));
       :}
 ;
 
@@ -573,118 +617,192 @@ state ::= standardState | stopState | startState | sendState | receiveState
     | setTimerState | resetTimerState | expireTimerState
 ;
 startState ::=
-     startStateBegin SEMICOLON
-   | startStateBegin EQUAL AVSTARTSTATE_T LPAR RPAR SEMICOLON
-   | startStateBegin EQUAL AVSTARTSTATE_T LPAR requestParam RPAR SEMICOLON
+     startStateBegin SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
+   | startStateBegin EQUAL AVSTARTSTATE_T LPAR RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
+   | startStateBegin EQUAL AVSTARTSTATE_T LPAR requestParam RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
 ;
-startStateBegin ::= ENTRY ACTION IDENT:id COLON AVSTARTSTATE_T {:
+startStateBegin ::= ENTRY:z ACTION IDENT:id COLON AVSTARTSTATE_T {:
     getState(id.getAvatarName());
     theState.setType(AvatarFromSysMLSyntax.STXSTARTSTATE);
+    theState.setLeft(zxright);
     requestIndex = 1;
 :};
 standardState ::=
-      standardStateBegin SEMICOLON
-    | standardStateBegin EQUAL AVSTANDARDSTATE_T LPAR RPAR SEMICOLON
-    | standardStateBegin EQUAL AVSTANDARDSTATE_T LPAR poolParam RPAR SEMICOLON
+      standardStateBegin SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
+    | standardStateBegin EQUAL AVSTANDARDSTATE_T LPAR RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
+    | standardStateBegin EQUAL AVSTANDARDSTATE_T LPAR poolParam RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
 ;
-standardStateBegin ::= STATE IDENT:id COLON AVSTANDARDSTATE_T {:
+standardStateBegin ::= STATE:z IDENT:id COLON AVSTANDARDSTATE_T {:
     getState(id.getAvatarName());
     theState.setType(AvatarFromSysMLSyntax.STXSTANDARDSTATE);
     theState.setName(id.getAvatarName());
+    theState.setLeft(zxright);
     requestIndex = 1;
 :};
 stopState ::=
-      stopStateBegin SEMICOLON
-    | stopStateBegin EQUAL AVSTOPSTATE_T LPAR RPAR SEMICOLON
+      stopStateBegin SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
+    | stopStateBegin EQUAL AVSTOPSTATE_T LPAR RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
 ;
-stopStateBegin ::= STATE IDENT:id COLON AVSTOPSTATE_T {:
+stopStateBegin ::= EXIT:z ACTION IDENT:id COLON AVSTOPSTATE_T {:
     getState(id.getAvatarName());
     theState.setType(AvatarFromSysMLSyntax.STXSTOPSTATE);
+    theState.setLeft(zxright);
 :};
 sendState ::=
-      sendStateBegin SEMICOLON
-    | sendStateBegin EQUAL AVSENDSTATE_T LPAR RPAR SEMICOLON
-    | sendStateBegin EQUAL AVSENDSTATE_T LPAR requestParam RPAR SEMICOLON
+      sendStateBegin SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
+    | sendStateBegin EQUAL AVSENDSTATE_T LPAR RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
+    | sendStateBegin EQUAL AVSENDSTATE_T LPAR requestParam RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
 ;
-sendStateBegin ::= STATE IDENT:id COLON AVSENDSTATE_T {:
+sendStateBegin ::= STATE:z IDENT:id COLON AVSENDSTATE_T {:
     getState(id.getAvatarName());
     theState.setType(AvatarFromSysMLSyntax.STXSENDSTATE);
+    theState.setLeft(zxright);
     requestIndex = 1;
 :};
 receiveState ::=
-      receiveStateBegin SEMICOLON
-    | receiveStateBegin EQUAL AVRECEIVESTATE_T LPAR RPAR SEMICOLON
-    | receiveStateBegin EQUAL AVRECEIVESTATE_T LPAR requestParam RPAR SEMICOLON
+      receiveStateBegin SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
+    | receiveStateBegin EQUAL AVRECEIVESTATE_T LPAR RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
+    | receiveStateBegin EQUAL AVRECEIVESTATE_T LPAR requestParam RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
 ;
-receiveStateBegin ::= STATE IDENT:id COLON AVRECEIVESTATE_T {:
+receiveStateBegin ::= STATE:z IDENT:id COLON AVRECEIVESTATE_T {:
     getState(id.getAvatarName());
     theState.setType(AvatarFromSysMLSyntax.STXRECEIVESTATE);
+    theState.setLeft(zxright);
     requestIndex = 1;
 :};
 randomState ::=
-      randomStateBegin EQUAL AVRANDOMSTATE_T LPAR randomAction requestParam RPAR SEMICOLON
-    | randomStateBegin EQUAL AVRANDOMSTATE_T LPAR requestParam randomAction RPAR SEMICOLON
-    | randomStateBegin EQUAL AVRANDOMSTATE_T LPAR randomAction RPAR SEMICOLON
+      randomStateBegin EQUAL AVRANDOMSTATE_T LPAR randomAction requestParam RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
+    | randomStateBegin EQUAL AVRANDOMSTATE_T LPAR requestParam randomAction RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
+    | randomStateBegin EQUAL AVRANDOMSTATE_T LPAR randomAction RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
 ;
-randomStateBegin ::= STATE IDENT:id COLON AVRANDOMSTATE_T {:
+randomStateBegin ::= STATE:z IDENT:id COLON AVRANDOMSTATE_T {:
     getState(id.getAvatarName());
     theState.setType(AvatarFromSysMLSyntax.STXRANDOMSTATE);
+    theState.setLeft(zxright);
     requestIndex = 1;
 :};
 countState ::=
-      countStateBegin EQUAL AVCOUNTSTATE_T LPAR countAction RPAR SEMICOLON
-    | countStateBegin EQUAL AVCOUNTSTATE_T LPAR requestParam countAction RPAR SEMICOLON
-    | countStateBegin EQUAL AVCOUNTSTATE_T LPAR countAction requestParam RPAR SEMICOLON
+      countStateBegin EQUAL AVCOUNTSTATE_T LPAR countAction RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
+    | countStateBegin EQUAL AVCOUNTSTATE_T LPAR requestParam countAction RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
+    | countStateBegin EQUAL AVCOUNTSTATE_T LPAR countAction requestParam RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
 ;
-countStateBegin ::= STATE IDENT:id COLON AVCOUNTSTATE_T {:
+countStateBegin ::= STATE:z IDENT:id COLON AVCOUNTSTATE_T {:
     getState(id.getAvatarName());
     theState.setType(AvatarFromSysMLSyntax.STXCOUNTSTATE);
+    theState.setLeft(zxright);
     requestIndex = 1;
 :};
 presendState ::=
-      presendStateBegin EQUAL AVPRESENDSTATE_T LPAR requestParam RPAR SEMICOLON
+      presendStateBegin EQUAL AVPRESENDSTATE_T LPAR requestParam RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
 ;
-presendStateBegin ::= STATE IDENT:id COLON AVPRESENDSTATE_T {:
+presendStateBegin ::= STATE:z IDENT:id COLON AVPRESENDSTATE_T {:
     getState(id.getAvatarName());
     theState.setType(AvatarFromSysMLSyntax.STXPRESENDSTATE);
+    theState.setLeft(zxright);
     requestIndex = 1;
 :};
 prereceiveState ::=
-      prereceiveStateBegin EQUAL AVPRERECEIVESTATE_T LPAR requestParam RPAR SEMICOLON
+      prereceiveStateBegin EQUAL AVPRERECEIVESTATE_T LPAR requestParam RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
 ;
-prereceiveStateBegin ::= STATE IDENT:id COLON AVPRERECEIVESTATE_T {:
+prereceiveStateBegin ::= STATE:z IDENT:id COLON AVPRERECEIVESTATE_T {:
     getState(id.getAvatarName());
     theState.setType(AvatarFromSysMLSyntax.STXPRERECEIVESTATE);
+    theState.setLeft(zxright);
     requestIndex = 1;
 :};
 setTimerState ::=
-      setTimerStateBegin EQUAL AVSETTIMERSTATE_T LPAR requestParam RPAR SEMICOLON
-    | setTimerStateBegin EQUAL AVSETTIMERSTATE_T LPAR RPAR SEMICOLON
-    | setTimerStateBegin SEMICOLON
+      setTimerStateBegin EQUAL AVSETTIMERSTATE_T LPAR requestParam RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
+    | setTimerStateBegin EQUAL AVSETTIMERSTATE_T LPAR RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
+    | setTimerStateBegin SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
 ;
-setTimerStateBegin ::= STATE IDENT:id COLON AVSETTIMERSTATE_T {:
+setTimerStateBegin ::= STATE:z IDENT:id COLON AVSETTIMERSTATE_T {:
     getState(id.getAvatarName());
     theState.setType(AvatarFromSysMLSyntax.STXSETTIMERSTATE);
+    theState.setLeft(zxright);
     requestIndex = 1;
 :};
 resetTimerState ::=
-      resetTimerStateBegin EQUAL AVRESETTIMERSTATE_T LPAR requestParam RPAR SEMICOLON
-    | resetTimerStateBegin EQUAL AVRESETTIMERSTATE_T LPAR RPAR SEMICOLON
-    | resetTimerStateBegin SEMICOLON
+      resetTimerStateBegin EQUAL AVRESETTIMERSTATE_T LPAR requestParam RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
+    | resetTimerStateBegin EQUAL AVRESETTIMERSTATE_T LPAR RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
+    | resetTimerStateBegin SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
 ;
-resetTimerStateBegin ::= STATE IDENT:id COLON AVRESETTIMERSTATE_T {:
+resetTimerStateBegin ::= STATE:z IDENT:id COLON AVRESETTIMERSTATE_T {:
     getState(id.getAvatarName());
     theState.setType(AvatarFromSysMLSyntax.STXRESETTIMERSTATE);
+    theState.setLeft(zxright);
     requestIndex = 1;
 :};
 expireTimerState ::=
-      expireTimerStateBegin EQUAL AVEXPIRETIMERSTATE_T LPAR requestParam RPAR SEMICOLON
-    | expireTimerStateBegin EQUAL AVEXPIRETIMERSTATE_T LPAR RPAR SEMICOLON
-    | expireTimerStateBegin SEMICOLON
+      expireTimerStateBegin EQUAL AVEXPIRETIMERSTATE_T LPAR requestParam RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
+    | expireTimerStateBegin EQUAL AVEXPIRETIMERSTATE_T LPAR RPAR SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
+    | expireTimerStateBegin SEMICOLON:q {:
+        theState.setRight(qxright);
+     :}
 ;
-expireTimerStateBegin ::= STATE IDENT:id COLON AVEXPIRETIMERSTATE_T {:
+expireTimerStateBegin ::= STATE:z IDENT:id COLON AVEXPIRETIMERSTATE_T {:
     getState(id.getAvatarName());
     theState.setType(AvatarFromSysMLSyntax.STXEXPIRETIMERSTATE);
+    theState.setLeft(zxright);
     requestIndex = 1;
 :};
 
@@ -694,11 +812,17 @@ poolParam ::= POOL_F EQUAL requestList;
 requestParam ::= REQUEST_F EQUAL request;
 requestList ::= request | request COMMA requestList;
 request ::=
-      IF STRINGEXPR:e simpleRequest ELSE NOKREQUEST_U LPAR INT RPAR {:
+      IF:i STRINGEXPR:e simpleRequest:q ELSE NOKREQUEST_U LPAR INT RPAR {:
         theTransition.setGuard(e);
+        theTransition.setRleft(ixleft);
+        theTransition.setRright(qxright);
+        requestIndex++;
+      :}
+    | simpleRequest:i {:
         requestIndex++;
+        theTransition.setRleft(ixleft);
+        theTransition.setRright(ixright);
       :}
-    | simpleRequest {: requestIndex++; :}
 ;
 simpleRequest ::= trivialRequest | sendRequest | receiveRequest
     | setTimerRequest | resetTimerRequest | expireTimerRequest;
@@ -824,25 +948,33 @@ countParam ::= VALUE_F EQUAL IDENT:id POINT AMOUNT_U LPAR RPAR {:
 // TRANSITIONS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 
 transition ::=
-      transitionBegin THEN IDENT:id SEMICOLON {:
+      transitionBegin:t THEN IDENT:id SEMICOLON:q {:
         getState(id.getAvatarName());
         theTransition.setTarget(theState);
+        theTransition.setLeft(txleft);
+        theTransition.setRight(qxright);
       :}
-    | transitionBegin doActions THEN IDENT:id SEMICOLON {:
+    | transitionBegin:t doActions THEN IDENT:id SEMICOLON:q {:
         getState(id.getAvatarName());
         theTransition.setTarget(theState);
+        theTransition.setLeft(txleft);
+        theTransition.setRight(qxright);
       :}
-    | transitionBegin THEN IDENT:id transitionLabels RBRAC {:
+    | transitionBegin:t THEN IDENT:id transitionLabels RBRAC:q {:
         getState(id.getAvatarName());
         theTransition.setTarget(theState);
         theTransition.setDelayExtra(delayExtraMap);
         delayExtraMap = null;
+        theTransition.setLeft(txleft);
+        theTransition.setRight(qxright);
       :}
-    | transitionBegin doActions THEN IDENT:id transitionLabels RBRAC {:
+    | transitionBegin:t doActions THEN IDENT:id transitionLabels RBRAC:q {:
         getState(id.getAvatarName());
         theTransition.setTarget(theState);
         theTransition.setDelayExtra(delayExtraMap);
         delayExtraMap = null;
+        theTransition.setLeft(txleft);
+        theTransition.setRight(qxright);
       :}
 ;
 transitionBegin ::=
@@ -883,11 +1015,11 @@ actionSeq ::=
     | THEN act SEMICOLON actionSeq
 ;
 act ::=
-      assign fullIdent GETS STRINGEXPR:e SEMICOLON {:
-        actionList.add(new StxAction(stringAcc.toString(),e));
+      assign:a fullIdent GETS STRINGEXPR:e SEMICOLON:q {:
+        actionList.add(new StxAction(axleft, qxright, stringAcc.toString(),e));
       :}
-    | ACTION STRINGEXPR:e SEMICOLON {:
-        actionList.add(new StxAction(e));
+    | ACTION:a STRINGEXPR:e SEMICOLON:q {:
+        actionList.add(new StxAction(axleft, qxright, e));
       :}
 ;
 assign ::= ASSIGN {: