diff --git a/org.eclipse.osbp.xtext.perspective.ide/src-gen/org/eclipse/osbp/xtext/perspective/ide/contentassist/antlr/internal/InternalPerspectiveDsl.g b/org.eclipse.osbp.xtext.perspective.ide/src-gen/org/eclipse/osbp/xtext/perspective/ide/contentassist/antlr/internal/InternalPerspectiveDsl.g
index e1c7345..2acdf1f 100644
--- a/org.eclipse.osbp.xtext.perspective.ide/src-gen/org/eclipse/osbp/xtext/perspective/ide/contentassist/antlr/internal/InternalPerspectiveDsl.g
+++ b/org.eclipse.osbp.xtext.perspective.ide/src-gen/org/eclipse/osbp/xtext/perspective/ide/contentassist/antlr/internal/InternalPerspectiveDsl.g
@@ -3,9 +3,11 @@
  *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
  *                                                                            
  *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
+ *  are made available under the terms of the Eclipse Public License 2.0        
  *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *  https://www.eclipse.org/legal/epl-2.0/                                 
+ *                                 
+ *  SPDX-License-Identifier: EPL-2.0                                 
  *                                                                            
  *  Contributors:                                                      
  * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
@@ -21679,13 +21681,13 @@
 	}
 :
 	(
-		{ before(grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangePackageCrossReference_2_0()); }
+		{ before(grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangeGroupCrossReference_2_0()); }
 		(
-			{ before(grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangePackageIDTerminalRuleCall_2_0_1()); }
+			{ before(grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangeGroupIDTerminalRuleCall_2_0_1()); }
 			RULE_ID
-			{ after(grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangePackageIDTerminalRuleCall_2_0_1()); }
+			{ after(grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangeGroupIDTerminalRuleCall_2_0_1()); }
 		)
-		{ after(grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangePackageCrossReference_2_0()); }
+		{ after(grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangeGroupCrossReference_2_0()); }
 	)
 ;
 finally {
diff --git a/org.eclipse.osbp.xtext.perspective.ide/src-gen/org/eclipse/osbp/xtext/perspective/ide/contentassist/antlr/internal/InternalPerspectiveDslLexer.java b/org.eclipse.osbp.xtext.perspective.ide/src-gen/org/eclipse/osbp/xtext/perspective/ide/contentassist/antlr/internal/InternalPerspectiveDslLexer.java
index 260543f..6723ba0 100644
--- a/org.eclipse.osbp.xtext.perspective.ide/src-gen/org/eclipse/osbp/xtext/perspective/ide/contentassist/antlr/internal/InternalPerspectiveDslLexer.java
+++ b/org.eclipse.osbp.xtext.perspective.ide/src-gen/org/eclipse/osbp/xtext/perspective/ide/contentassist/antlr/internal/InternalPerspectiveDslLexer.java
@@ -2525,10 +2525,10 @@
         try {
             int _type = RULE_HEX;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalPerspectiveDsl.g:24183:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
-            // InternalPerspectiveDsl.g:24183:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            // InternalPerspectiveDsl.g:24185:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
+            // InternalPerspectiveDsl.g:24185:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
             {
-            // InternalPerspectiveDsl.g:24183:12: ( '0x' | '0X' )
+            // InternalPerspectiveDsl.g:24185:12: ( '0x' | '0X' )
             int alt1=2;
             int LA1_0 = input.LA(1);
 
@@ -2556,7 +2556,7 @@
             }
             switch (alt1) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:24183:13: '0x'
+                    // InternalPerspectiveDsl.g:24185:13: '0x'
                     {
                     match("0x"); 
 
@@ -2564,7 +2564,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:24183:18: '0X'
+                    // InternalPerspectiveDsl.g:24185:18: '0X'
                     {
                     match("0X"); 
 
@@ -2574,7 +2574,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:24183:24: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+
+            // InternalPerspectiveDsl.g:24185:24: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+
             int cnt2=0;
             loop2:
             do {
@@ -2612,7 +2612,7 @@
                 cnt2++;
             } while (true);
 
-            // InternalPerspectiveDsl.g:24183:58: ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            // InternalPerspectiveDsl.g:24185:58: ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
             int alt4=2;
             int LA4_0 = input.LA(1);
 
@@ -2621,10 +2621,10 @@
             }
             switch (alt4) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:24183:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    // InternalPerspectiveDsl.g:24185:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
                     {
                     match('#'); 
-                    // InternalPerspectiveDsl.g:24183:63: ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    // InternalPerspectiveDsl.g:24185:63: ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
                     int alt3=2;
                     int LA3_0 = input.LA(1);
 
@@ -2642,7 +2642,7 @@
                     }
                     switch (alt3) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:24183:64: ( 'b' | 'B' ) ( 'i' | 'I' )
+                            // InternalPerspectiveDsl.g:24185:64: ( 'b' | 'B' ) ( 'i' | 'I' )
                             {
                             if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
                                 input.consume();
@@ -2666,7 +2666,7 @@
                             }
                             break;
                         case 2 :
-                            // InternalPerspectiveDsl.g:24183:84: ( 'l' | 'L' )
+                            // InternalPerspectiveDsl.g:24185:84: ( 'l' | 'L' )
                             {
                             if ( input.LA(1)=='L'||input.LA(1)=='l' ) {
                                 input.consume();
@@ -2705,11 +2705,11 @@
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalPerspectiveDsl.g:24185:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
-            // InternalPerspectiveDsl.g:24185:12: '0' .. '9' ( '0' .. '9' | '_' )*
+            // InternalPerspectiveDsl.g:24187:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
+            // InternalPerspectiveDsl.g:24187:12: '0' .. '9' ( '0' .. '9' | '_' )*
             {
             matchRange('0','9'); 
-            // InternalPerspectiveDsl.g:24185:21: ( '0' .. '9' | '_' )*
+            // InternalPerspectiveDsl.g:24187:21: ( '0' .. '9' | '_' )*
             loop5:
             do {
                 int alt5=2;
@@ -2758,11 +2758,11 @@
         try {
             int _type = RULE_DECIMAL;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalPerspectiveDsl.g:24187:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
-            // InternalPerspectiveDsl.g:24187:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            // InternalPerspectiveDsl.g:24189:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
+            // InternalPerspectiveDsl.g:24189:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
             {
             mRULE_INT(); 
-            // InternalPerspectiveDsl.g:24187:25: ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )?
+            // InternalPerspectiveDsl.g:24189:25: ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )?
             int alt7=2;
             int LA7_0 = input.LA(1);
 
@@ -2771,7 +2771,7 @@
             }
             switch (alt7) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:24187:26: ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT
+                    // InternalPerspectiveDsl.g:24189:26: ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT
                     {
                     if ( input.LA(1)=='E'||input.LA(1)=='e' ) {
                         input.consume();
@@ -2782,7 +2782,7 @@
                         recover(mse);
                         throw mse;}
 
-                    // InternalPerspectiveDsl.g:24187:36: ( '+' | '-' )?
+                    // InternalPerspectiveDsl.g:24189:36: ( '+' | '-' )?
                     int alt6=2;
                     int LA6_0 = input.LA(1);
 
@@ -2815,7 +2815,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:24187:58: ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            // InternalPerspectiveDsl.g:24189:58: ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
             int alt8=3;
             int LA8_0 = input.LA(1);
 
@@ -2827,7 +2827,7 @@
             }
             switch (alt8) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:24187:59: ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' )
+                    // InternalPerspectiveDsl.g:24189:59: ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' )
                     {
                     if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
                         input.consume();
@@ -2851,7 +2851,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:24187:87: ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' )
+                    // InternalPerspectiveDsl.g:24189:87: ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' )
                     {
                     if ( input.LA(1)=='D'||input.LA(1)=='F'||input.LA(1)=='L'||input.LA(1)=='d'||input.LA(1)=='f'||input.LA(1)=='l' ) {
                         input.consume();
@@ -2884,10 +2884,10 @@
         try {
             int _type = RULE_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalPerspectiveDsl.g:24189:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
-            // InternalPerspectiveDsl.g:24189:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            // InternalPerspectiveDsl.g:24191:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
+            // InternalPerspectiveDsl.g:24191:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
             {
-            // InternalPerspectiveDsl.g:24189:11: ( '^' )?
+            // InternalPerspectiveDsl.g:24191:11: ( '^' )?
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -2896,7 +2896,7 @@
             }
             switch (alt9) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:24189:11: '^'
+                    // InternalPerspectiveDsl.g:24191:11: '^'
                     {
                     match('^'); 
 
@@ -2914,7 +2914,7 @@
                 recover(mse);
                 throw mse;}
 
-            // InternalPerspectiveDsl.g:24189:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            // InternalPerspectiveDsl.g:24191:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
             loop10:
             do {
                 int alt10=2;
@@ -2963,10 +2963,10 @@
         try {
             int _type = RULE_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalPerspectiveDsl.g:24191:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
-            // InternalPerspectiveDsl.g:24191:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            // InternalPerspectiveDsl.g:24193:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
+            // InternalPerspectiveDsl.g:24193:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
             {
-            // InternalPerspectiveDsl.g:24191:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            // InternalPerspectiveDsl.g:24193:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
             int alt15=2;
             int LA15_0 = input.LA(1);
 
@@ -2984,10 +2984,10 @@
             }
             switch (alt15) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:24191:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
+                    // InternalPerspectiveDsl.g:24193:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
                     {
                     match('\"'); 
-                    // InternalPerspectiveDsl.g:24191:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+                    // InternalPerspectiveDsl.g:24193:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
                     loop11:
                     do {
                         int alt11=3;
@@ -3003,7 +3003,7 @@
 
                         switch (alt11) {
                     	case 1 :
-                    	    // InternalPerspectiveDsl.g:24191:21: '\\\\' .
+                    	    // InternalPerspectiveDsl.g:24193:21: '\\\\' .
                     	    {
                     	    match('\\'); 
                     	    matchAny(); 
@@ -3011,7 +3011,7 @@
                     	    }
                     	    break;
                     	case 2 :
-                    	    // InternalPerspectiveDsl.g:24191:28: ~ ( ( '\\\\' | '\"' ) )
+                    	    // InternalPerspectiveDsl.g:24193:28: ~ ( ( '\\\\' | '\"' ) )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                     	        input.consume();
@@ -3031,7 +3031,7 @@
                         }
                     } while (true);
 
-                    // InternalPerspectiveDsl.g:24191:44: ( '\"' )?
+                    // InternalPerspectiveDsl.g:24193:44: ( '\"' )?
                     int alt12=2;
                     int LA12_0 = input.LA(1);
 
@@ -3040,7 +3040,7 @@
                     }
                     switch (alt12) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:24191:44: '\"'
+                            // InternalPerspectiveDsl.g:24193:44: '\"'
                             {
                             match('\"'); 
 
@@ -3053,10 +3053,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:24191:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
+                    // InternalPerspectiveDsl.g:24193:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
                     {
                     match('\''); 
-                    // InternalPerspectiveDsl.g:24191:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+                    // InternalPerspectiveDsl.g:24193:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
                     loop13:
                     do {
                         int alt13=3;
@@ -3072,7 +3072,7 @@
 
                         switch (alt13) {
                     	case 1 :
-                    	    // InternalPerspectiveDsl.g:24191:55: '\\\\' .
+                    	    // InternalPerspectiveDsl.g:24193:55: '\\\\' .
                     	    {
                     	    match('\\'); 
                     	    matchAny(); 
@@ -3080,7 +3080,7 @@
                     	    }
                     	    break;
                     	case 2 :
-                    	    // InternalPerspectiveDsl.g:24191:62: ~ ( ( '\\\\' | '\\'' ) )
+                    	    // InternalPerspectiveDsl.g:24193:62: ~ ( ( '\\\\' | '\\'' ) )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                     	        input.consume();
@@ -3100,7 +3100,7 @@
                         }
                     } while (true);
 
-                    // InternalPerspectiveDsl.g:24191:79: ( '\\'' )?
+                    // InternalPerspectiveDsl.g:24193:79: ( '\\'' )?
                     int alt14=2;
                     int LA14_0 = input.LA(1);
 
@@ -3109,7 +3109,7 @@
                     }
                     switch (alt14) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:24191:79: '\\''
+                            // InternalPerspectiveDsl.g:24193:79: '\\''
                             {
                             match('\''); 
 
@@ -3140,12 +3140,12 @@
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalPerspectiveDsl.g:24193:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // InternalPerspectiveDsl.g:24193:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // InternalPerspectiveDsl.g:24195:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalPerspectiveDsl.g:24195:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*"); 
 
-            // InternalPerspectiveDsl.g:24193:24: ( options {greedy=false; } : . )*
+            // InternalPerspectiveDsl.g:24195:24: ( options {greedy=false; } : . )*
             loop16:
             do {
                 int alt16=2;
@@ -3170,7 +3170,7 @@
 
                 switch (alt16) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:24193:52: .
+            	    // InternalPerspectiveDsl.g:24195:52: .
             	    {
             	    matchAny(); 
 
@@ -3200,12 +3200,12 @@
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalPerspectiveDsl.g:24195:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // InternalPerspectiveDsl.g:24195:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // InternalPerspectiveDsl.g:24197:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalPerspectiveDsl.g:24197:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("//"); 
 
-            // InternalPerspectiveDsl.g:24195:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // InternalPerspectiveDsl.g:24197:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop17:
             do {
                 int alt17=2;
@@ -3218,7 +3218,7 @@
 
                 switch (alt17) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:24195:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // InternalPerspectiveDsl.g:24197:24: ~ ( ( '\\n' | '\\r' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -3238,7 +3238,7 @@
                 }
             } while (true);
 
-            // InternalPerspectiveDsl.g:24195:40: ( ( '\\r' )? '\\n' )?
+            // InternalPerspectiveDsl.g:24197:40: ( ( '\\r' )? '\\n' )?
             int alt19=2;
             int LA19_0 = input.LA(1);
 
@@ -3247,9 +3247,9 @@
             }
             switch (alt19) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:24195:41: ( '\\r' )? '\\n'
+                    // InternalPerspectiveDsl.g:24197:41: ( '\\r' )? '\\n'
                     {
-                    // InternalPerspectiveDsl.g:24195:41: ( '\\r' )?
+                    // InternalPerspectiveDsl.g:24197:41: ( '\\r' )?
                     int alt18=2;
                     int LA18_0 = input.LA(1);
 
@@ -3258,7 +3258,7 @@
                     }
                     switch (alt18) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:24195:41: '\\r'
+                            // InternalPerspectiveDsl.g:24197:41: '\\r'
                             {
                             match('\r'); 
 
@@ -3290,10 +3290,10 @@
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalPerspectiveDsl.g:24197:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // InternalPerspectiveDsl.g:24197:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalPerspectiveDsl.g:24199:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalPerspectiveDsl.g:24199:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // InternalPerspectiveDsl.g:24197:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalPerspectiveDsl.g:24199:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt20=0;
             loop20:
             do {
@@ -3347,8 +3347,8 @@
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalPerspectiveDsl.g:24199:16: ( . )
-            // InternalPerspectiveDsl.g:24199:18: .
+            // InternalPerspectiveDsl.g:24201:16: ( . )
+            // InternalPerspectiveDsl.g:24201:18: .
             {
             matchAny(); 
 
diff --git a/org.eclipse.osbp.xtext.perspective.ide/src-gen/org/eclipse/osbp/xtext/perspective/ide/contentassist/antlr/internal/InternalPerspectiveDslParser.java b/org.eclipse.osbp.xtext.perspective.ide/src-gen/org/eclipse/osbp/xtext/perspective/ide/contentassist/antlr/internal/InternalPerspectiveDslParser.java
index fe88b45..23eb52a 100644
--- a/org.eclipse.osbp.xtext.perspective.ide/src-gen/org/eclipse/osbp/xtext/perspective/ide/contentassist/antlr/internal/InternalPerspectiveDslParser.java
+++ b/org.eclipse.osbp.xtext.perspective.ide/src-gen/org/eclipse/osbp/xtext/perspective/ide/contentassist/antlr/internal/InternalPerspectiveDslParser.java
@@ -203,11 +203,11 @@
 
 
     // $ANTLR start "entryRulePerspectiveModel"
-    // InternalPerspectiveDsl.g:67:1: entryRulePerspectiveModel : rulePerspectiveModel EOF ;
+    // InternalPerspectiveDsl.g:69:1: entryRulePerspectiveModel : rulePerspectiveModel EOF ;
     public final void entryRulePerspectiveModel() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:68:1: ( rulePerspectiveModel EOF )
-            // InternalPerspectiveDsl.g:69:1: rulePerspectiveModel EOF
+            // InternalPerspectiveDsl.g:70:1: ( rulePerspectiveModel EOF )
+            // InternalPerspectiveDsl.g:71:1: rulePerspectiveModel EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveModelRule()); 
@@ -237,23 +237,23 @@
 
 
     // $ANTLR start "rulePerspectiveModel"
-    // InternalPerspectiveDsl.g:76:1: rulePerspectiveModel : ( ( rule__PerspectiveModel__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:78:1: rulePerspectiveModel : ( ( rule__PerspectiveModel__Group__0 ) ) ;
     public final void rulePerspectiveModel() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:80:2: ( ( ( rule__PerspectiveModel__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:81:2: ( ( rule__PerspectiveModel__Group__0 ) )
+            // InternalPerspectiveDsl.g:82:2: ( ( ( rule__PerspectiveModel__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:83:2: ( ( rule__PerspectiveModel__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:81:2: ( ( rule__PerspectiveModel__Group__0 ) )
-            // InternalPerspectiveDsl.g:82:3: ( rule__PerspectiveModel__Group__0 )
+            // InternalPerspectiveDsl.g:83:2: ( ( rule__PerspectiveModel__Group__0 ) )
+            // InternalPerspectiveDsl.g:84:3: ( rule__PerspectiveModel__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveModelAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:83:3: ( rule__PerspectiveModel__Group__0 )
-            // InternalPerspectiveDsl.g:83:4: rule__PerspectiveModel__Group__0
+            // InternalPerspectiveDsl.g:85:3: ( rule__PerspectiveModel__Group__0 )
+            // InternalPerspectiveDsl.g:85:4: rule__PerspectiveModel__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveModel__Group__0();
@@ -288,11 +288,11 @@
 
 
     // $ANTLR start "entryRulePerspectivePackage"
-    // InternalPerspectiveDsl.g:92:1: entryRulePerspectivePackage : rulePerspectivePackage EOF ;
+    // InternalPerspectiveDsl.g:94:1: entryRulePerspectivePackage : rulePerspectivePackage EOF ;
     public final void entryRulePerspectivePackage() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:93:1: ( rulePerspectivePackage EOF )
-            // InternalPerspectiveDsl.g:94:1: rulePerspectivePackage EOF
+            // InternalPerspectiveDsl.g:95:1: ( rulePerspectivePackage EOF )
+            // InternalPerspectiveDsl.g:96:1: rulePerspectivePackage EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePackageRule()); 
@@ -322,23 +322,23 @@
 
 
     // $ANTLR start "rulePerspectivePackage"
-    // InternalPerspectiveDsl.g:101:1: rulePerspectivePackage : ( ( rule__PerspectivePackage__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:103:1: rulePerspectivePackage : ( ( rule__PerspectivePackage__Group__0 ) ) ;
     public final void rulePerspectivePackage() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:105:2: ( ( ( rule__PerspectivePackage__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:106:2: ( ( rule__PerspectivePackage__Group__0 ) )
+            // InternalPerspectiveDsl.g:107:2: ( ( ( rule__PerspectivePackage__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:108:2: ( ( rule__PerspectivePackage__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:106:2: ( ( rule__PerspectivePackage__Group__0 ) )
-            // InternalPerspectiveDsl.g:107:3: ( rule__PerspectivePackage__Group__0 )
+            // InternalPerspectiveDsl.g:108:2: ( ( rule__PerspectivePackage__Group__0 ) )
+            // InternalPerspectiveDsl.g:109:3: ( rule__PerspectivePackage__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePackageAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:108:3: ( rule__PerspectivePackage__Group__0 )
-            // InternalPerspectiveDsl.g:108:4: rule__PerspectivePackage__Group__0
+            // InternalPerspectiveDsl.g:110:3: ( rule__PerspectivePackage__Group__0 )
+            // InternalPerspectiveDsl.g:110:4: rule__PerspectivePackage__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePackage__Group__0();
@@ -373,11 +373,11 @@
 
 
     // $ANTLR start "entryRulePerspective"
-    // InternalPerspectiveDsl.g:117:1: entryRulePerspective : rulePerspective EOF ;
+    // InternalPerspectiveDsl.g:119:1: entryRulePerspective : rulePerspective EOF ;
     public final void entryRulePerspective() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:118:1: ( rulePerspective EOF )
-            // InternalPerspectiveDsl.g:119:1: rulePerspective EOF
+            // InternalPerspectiveDsl.g:120:1: ( rulePerspective EOF )
+            // InternalPerspectiveDsl.g:121:1: rulePerspective EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveRule()); 
@@ -407,23 +407,23 @@
 
 
     // $ANTLR start "rulePerspective"
-    // InternalPerspectiveDsl.g:126:1: rulePerspective : ( ( rule__Perspective__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:128:1: rulePerspective : ( ( rule__Perspective__Group__0 ) ) ;
     public final void rulePerspective() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:130:2: ( ( ( rule__Perspective__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:131:2: ( ( rule__Perspective__Group__0 ) )
+            // InternalPerspectiveDsl.g:132:2: ( ( ( rule__Perspective__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:133:2: ( ( rule__Perspective__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:131:2: ( ( rule__Perspective__Group__0 ) )
-            // InternalPerspectiveDsl.g:132:3: ( rule__Perspective__Group__0 )
+            // InternalPerspectiveDsl.g:133:2: ( ( rule__Perspective__Group__0 ) )
+            // InternalPerspectiveDsl.g:134:3: ( rule__Perspective__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:133:3: ( rule__Perspective__Group__0 )
-            // InternalPerspectiveDsl.g:133:4: rule__Perspective__Group__0
+            // InternalPerspectiveDsl.g:135:3: ( rule__Perspective__Group__0 )
+            // InternalPerspectiveDsl.g:135:4: rule__Perspective__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__Perspective__Group__0();
@@ -458,11 +458,11 @@
 
 
     // $ANTLR start "entryRulePerspectiveElement"
-    // InternalPerspectiveDsl.g:142:1: entryRulePerspectiveElement : rulePerspectiveElement EOF ;
+    // InternalPerspectiveDsl.g:144:1: entryRulePerspectiveElement : rulePerspectiveElement EOF ;
     public final void entryRulePerspectiveElement() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:143:1: ( rulePerspectiveElement EOF )
-            // InternalPerspectiveDsl.g:144:1: rulePerspectiveElement EOF
+            // InternalPerspectiveDsl.g:145:1: ( rulePerspectiveElement EOF )
+            // InternalPerspectiveDsl.g:146:1: rulePerspectiveElement EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveElementRule()); 
@@ -492,23 +492,23 @@
 
 
     // $ANTLR start "rulePerspectiveElement"
-    // InternalPerspectiveDsl.g:151:1: rulePerspectiveElement : ( ( rule__PerspectiveElement__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:153:1: rulePerspectiveElement : ( ( rule__PerspectiveElement__Alternatives ) ) ;
     public final void rulePerspectiveElement() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:155:2: ( ( ( rule__PerspectiveElement__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:156:2: ( ( rule__PerspectiveElement__Alternatives ) )
+            // InternalPerspectiveDsl.g:157:2: ( ( ( rule__PerspectiveElement__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:158:2: ( ( rule__PerspectiveElement__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:156:2: ( ( rule__PerspectiveElement__Alternatives ) )
-            // InternalPerspectiveDsl.g:157:3: ( rule__PerspectiveElement__Alternatives )
+            // InternalPerspectiveDsl.g:158:2: ( ( rule__PerspectiveElement__Alternatives ) )
+            // InternalPerspectiveDsl.g:159:3: ( rule__PerspectiveElement__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveElementAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:158:3: ( rule__PerspectiveElement__Alternatives )
-            // InternalPerspectiveDsl.g:158:4: rule__PerspectiveElement__Alternatives
+            // InternalPerspectiveDsl.g:160:3: ( rule__PerspectiveElement__Alternatives )
+            // InternalPerspectiveDsl.g:160:4: rule__PerspectiveElement__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveElement__Alternatives();
@@ -543,11 +543,11 @@
 
 
     // $ANTLR start "entryRulePerspectiveSashContainer"
-    // InternalPerspectiveDsl.g:167:1: entryRulePerspectiveSashContainer : rulePerspectiveSashContainer EOF ;
+    // InternalPerspectiveDsl.g:169:1: entryRulePerspectiveSashContainer : rulePerspectiveSashContainer EOF ;
     public final void entryRulePerspectiveSashContainer() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:168:1: ( rulePerspectiveSashContainer EOF )
-            // InternalPerspectiveDsl.g:169:1: rulePerspectiveSashContainer EOF
+            // InternalPerspectiveDsl.g:170:1: ( rulePerspectiveSashContainer EOF )
+            // InternalPerspectiveDsl.g:171:1: rulePerspectiveSashContainer EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerRule()); 
@@ -577,23 +577,23 @@
 
 
     // $ANTLR start "rulePerspectiveSashContainer"
-    // InternalPerspectiveDsl.g:176:1: rulePerspectiveSashContainer : ( ( rule__PerspectiveSashContainer__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:178:1: rulePerspectiveSashContainer : ( ( rule__PerspectiveSashContainer__Group__0 ) ) ;
     public final void rulePerspectiveSashContainer() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:180:2: ( ( ( rule__PerspectiveSashContainer__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:181:2: ( ( rule__PerspectiveSashContainer__Group__0 ) )
+            // InternalPerspectiveDsl.g:182:2: ( ( ( rule__PerspectiveSashContainer__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:183:2: ( ( rule__PerspectiveSashContainer__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:181:2: ( ( rule__PerspectiveSashContainer__Group__0 ) )
-            // InternalPerspectiveDsl.g:182:3: ( rule__PerspectiveSashContainer__Group__0 )
+            // InternalPerspectiveDsl.g:183:2: ( ( rule__PerspectiveSashContainer__Group__0 ) )
+            // InternalPerspectiveDsl.g:184:3: ( rule__PerspectiveSashContainer__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:183:3: ( rule__PerspectiveSashContainer__Group__0 )
-            // InternalPerspectiveDsl.g:183:4: rule__PerspectiveSashContainer__Group__0
+            // InternalPerspectiveDsl.g:185:3: ( rule__PerspectiveSashContainer__Group__0 )
+            // InternalPerspectiveDsl.g:185:4: rule__PerspectiveSashContainer__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSashContainer__Group__0();
@@ -628,11 +628,11 @@
 
 
     // $ANTLR start "entryRulePerspectivePartStack"
-    // InternalPerspectiveDsl.g:192:1: entryRulePerspectivePartStack : rulePerspectivePartStack EOF ;
+    // InternalPerspectiveDsl.g:194:1: entryRulePerspectivePartStack : rulePerspectivePartStack EOF ;
     public final void entryRulePerspectivePartStack() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:193:1: ( rulePerspectivePartStack EOF )
-            // InternalPerspectiveDsl.g:194:1: rulePerspectivePartStack EOF
+            // InternalPerspectiveDsl.g:195:1: ( rulePerspectivePartStack EOF )
+            // InternalPerspectiveDsl.g:196:1: rulePerspectivePartStack EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackRule()); 
@@ -662,23 +662,23 @@
 
 
     // $ANTLR start "rulePerspectivePartStack"
-    // InternalPerspectiveDsl.g:201:1: rulePerspectivePartStack : ( ( rule__PerspectivePartStack__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:203:1: rulePerspectivePartStack : ( ( rule__PerspectivePartStack__Group__0 ) ) ;
     public final void rulePerspectivePartStack() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:205:2: ( ( ( rule__PerspectivePartStack__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:206:2: ( ( rule__PerspectivePartStack__Group__0 ) )
+            // InternalPerspectiveDsl.g:207:2: ( ( ( rule__PerspectivePartStack__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:208:2: ( ( rule__PerspectivePartStack__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:206:2: ( ( rule__PerspectivePartStack__Group__0 ) )
-            // InternalPerspectiveDsl.g:207:3: ( rule__PerspectivePartStack__Group__0 )
+            // InternalPerspectiveDsl.g:208:2: ( ( rule__PerspectivePartStack__Group__0 ) )
+            // InternalPerspectiveDsl.g:209:3: ( rule__PerspectivePartStack__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:208:3: ( rule__PerspectivePartStack__Group__0 )
-            // InternalPerspectiveDsl.g:208:4: rule__PerspectivePartStack__Group__0
+            // InternalPerspectiveDsl.g:210:3: ( rule__PerspectivePartStack__Group__0 )
+            // InternalPerspectiveDsl.g:210:4: rule__PerspectivePartStack__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePartStack__Group__0();
@@ -713,11 +713,11 @@
 
 
     // $ANTLR start "entryRulePerspectivePart"
-    // InternalPerspectiveDsl.g:217:1: entryRulePerspectivePart : rulePerspectivePart EOF ;
+    // InternalPerspectiveDsl.g:219:1: entryRulePerspectivePart : rulePerspectivePart EOF ;
     public final void entryRulePerspectivePart() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:218:1: ( rulePerspectivePart EOF )
-            // InternalPerspectiveDsl.g:219:1: rulePerspectivePart EOF
+            // InternalPerspectiveDsl.g:220:1: ( rulePerspectivePart EOF )
+            // InternalPerspectiveDsl.g:221:1: rulePerspectivePart EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartRule()); 
@@ -747,23 +747,23 @@
 
 
     // $ANTLR start "rulePerspectivePart"
-    // InternalPerspectiveDsl.g:226:1: rulePerspectivePart : ( ( rule__PerspectivePart__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:228:1: rulePerspectivePart : ( ( rule__PerspectivePart__Group__0 ) ) ;
     public final void rulePerspectivePart() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:230:2: ( ( ( rule__PerspectivePart__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:231:2: ( ( rule__PerspectivePart__Group__0 ) )
+            // InternalPerspectiveDsl.g:232:2: ( ( ( rule__PerspectivePart__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:233:2: ( ( rule__PerspectivePart__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:231:2: ( ( rule__PerspectivePart__Group__0 ) )
-            // InternalPerspectiveDsl.g:232:3: ( rule__PerspectivePart__Group__0 )
+            // InternalPerspectiveDsl.g:233:2: ( ( rule__PerspectivePart__Group__0 ) )
+            // InternalPerspectiveDsl.g:234:3: ( rule__PerspectivePart__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:233:3: ( rule__PerspectivePart__Group__0 )
-            // InternalPerspectiveDsl.g:233:4: rule__PerspectivePart__Group__0
+            // InternalPerspectiveDsl.g:235:3: ( rule__PerspectivePart__Group__0 )
+            // InternalPerspectiveDsl.g:235:4: rule__PerspectivePart__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePart__Group__0();
@@ -798,11 +798,11 @@
 
 
     // $ANTLR start "entryRulePerspectiveView"
-    // InternalPerspectiveDsl.g:242:1: entryRulePerspectiveView : rulePerspectiveView EOF ;
+    // InternalPerspectiveDsl.g:244:1: entryRulePerspectiveView : rulePerspectiveView EOF ;
     public final void entryRulePerspectiveView() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:243:1: ( rulePerspectiveView EOF )
-            // InternalPerspectiveDsl.g:244:1: rulePerspectiveView EOF
+            // InternalPerspectiveDsl.g:245:1: ( rulePerspectiveView EOF )
+            // InternalPerspectiveDsl.g:246:1: rulePerspectiveView EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveViewRule()); 
@@ -832,23 +832,23 @@
 
 
     // $ANTLR start "rulePerspectiveView"
-    // InternalPerspectiveDsl.g:251:1: rulePerspectiveView : ( ( rule__PerspectiveView__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:253:1: rulePerspectiveView : ( ( rule__PerspectiveView__Alternatives ) ) ;
     public final void rulePerspectiveView() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:255:2: ( ( ( rule__PerspectiveView__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:256:2: ( ( rule__PerspectiveView__Alternatives ) )
+            // InternalPerspectiveDsl.g:257:2: ( ( ( rule__PerspectiveView__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:258:2: ( ( rule__PerspectiveView__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:256:2: ( ( rule__PerspectiveView__Alternatives ) )
-            // InternalPerspectiveDsl.g:257:3: ( rule__PerspectiveView__Alternatives )
+            // InternalPerspectiveDsl.g:258:2: ( ( rule__PerspectiveView__Alternatives ) )
+            // InternalPerspectiveDsl.g:259:3: ( rule__PerspectiveView__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveViewAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:258:3: ( rule__PerspectiveView__Alternatives )
-            // InternalPerspectiveDsl.g:258:4: rule__PerspectiveView__Alternatives
+            // InternalPerspectiveDsl.g:260:3: ( rule__PerspectiveView__Alternatives )
+            // InternalPerspectiveDsl.g:260:4: rule__PerspectiveView__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveView__Alternatives();
@@ -883,11 +883,11 @@
 
 
     // $ANTLR start "entryRulePerspectiveSelection"
-    // InternalPerspectiveDsl.g:267:1: entryRulePerspectiveSelection : rulePerspectiveSelection EOF ;
+    // InternalPerspectiveDsl.g:269:1: entryRulePerspectiveSelection : rulePerspectiveSelection EOF ;
     public final void entryRulePerspectiveSelection() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:268:1: ( rulePerspectiveSelection EOF )
-            // InternalPerspectiveDsl.g:269:1: rulePerspectiveSelection EOF
+            // InternalPerspectiveDsl.g:270:1: ( rulePerspectiveSelection EOF )
+            // InternalPerspectiveDsl.g:271:1: rulePerspectiveSelection EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSelectionRule()); 
@@ -917,23 +917,23 @@
 
 
     // $ANTLR start "rulePerspectiveSelection"
-    // InternalPerspectiveDsl.g:276:1: rulePerspectiveSelection : ( ( rule__PerspectiveSelection__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:278:1: rulePerspectiveSelection : ( ( rule__PerspectiveSelection__Group__0 ) ) ;
     public final void rulePerspectiveSelection() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:280:2: ( ( ( rule__PerspectiveSelection__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:281:2: ( ( rule__PerspectiveSelection__Group__0 ) )
+            // InternalPerspectiveDsl.g:282:2: ( ( ( rule__PerspectiveSelection__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:283:2: ( ( rule__PerspectiveSelection__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:281:2: ( ( rule__PerspectiveSelection__Group__0 ) )
-            // InternalPerspectiveDsl.g:282:3: ( rule__PerspectiveSelection__Group__0 )
+            // InternalPerspectiveDsl.g:283:2: ( ( rule__PerspectiveSelection__Group__0 ) )
+            // InternalPerspectiveDsl.g:284:3: ( rule__PerspectiveSelection__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSelectionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:283:3: ( rule__PerspectiveSelection__Group__0 )
-            // InternalPerspectiveDsl.g:283:4: rule__PerspectiveSelection__Group__0
+            // InternalPerspectiveDsl.g:285:3: ( rule__PerspectiveSelection__Group__0 )
+            // InternalPerspectiveDsl.g:285:4: rule__PerspectiveSelection__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSelection__Group__0();
@@ -968,11 +968,11 @@
 
 
     // $ANTLR start "entryRulePerspectiveTable"
-    // InternalPerspectiveDsl.g:292:1: entryRulePerspectiveTable : rulePerspectiveTable EOF ;
+    // InternalPerspectiveDsl.g:294:1: entryRulePerspectiveTable : rulePerspectiveTable EOF ;
     public final void entryRulePerspectiveTable() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:293:1: ( rulePerspectiveTable EOF )
-            // InternalPerspectiveDsl.g:294:1: rulePerspectiveTable EOF
+            // InternalPerspectiveDsl.g:295:1: ( rulePerspectiveTable EOF )
+            // InternalPerspectiveDsl.g:296:1: rulePerspectiveTable EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTableRule()); 
@@ -1002,23 +1002,23 @@
 
 
     // $ANTLR start "rulePerspectiveTable"
-    // InternalPerspectiveDsl.g:301:1: rulePerspectiveTable : ( ( rule__PerspectiveTable__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:303:1: rulePerspectiveTable : ( ( rule__PerspectiveTable__Group__0 ) ) ;
     public final void rulePerspectiveTable() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:305:2: ( ( ( rule__PerspectiveTable__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:306:2: ( ( rule__PerspectiveTable__Group__0 ) )
+            // InternalPerspectiveDsl.g:307:2: ( ( ( rule__PerspectiveTable__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:308:2: ( ( rule__PerspectiveTable__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:306:2: ( ( rule__PerspectiveTable__Group__0 ) )
-            // InternalPerspectiveDsl.g:307:3: ( rule__PerspectiveTable__Group__0 )
+            // InternalPerspectiveDsl.g:308:2: ( ( rule__PerspectiveTable__Group__0 ) )
+            // InternalPerspectiveDsl.g:309:3: ( rule__PerspectiveTable__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTableAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:308:3: ( rule__PerspectiveTable__Group__0 )
-            // InternalPerspectiveDsl.g:308:4: rule__PerspectiveTable__Group__0
+            // InternalPerspectiveDsl.g:310:3: ( rule__PerspectiveTable__Group__0 )
+            // InternalPerspectiveDsl.g:310:4: rule__PerspectiveTable__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveTable__Group__0();
@@ -1053,11 +1053,11 @@
 
 
     // $ANTLR start "entryRulePerspectiveGrid"
-    // InternalPerspectiveDsl.g:317:1: entryRulePerspectiveGrid : rulePerspectiveGrid EOF ;
+    // InternalPerspectiveDsl.g:319:1: entryRulePerspectiveGrid : rulePerspectiveGrid EOF ;
     public final void entryRulePerspectiveGrid() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:318:1: ( rulePerspectiveGrid EOF )
-            // InternalPerspectiveDsl.g:319:1: rulePerspectiveGrid EOF
+            // InternalPerspectiveDsl.g:320:1: ( rulePerspectiveGrid EOF )
+            // InternalPerspectiveDsl.g:321:1: rulePerspectiveGrid EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveGridRule()); 
@@ -1087,23 +1087,23 @@
 
 
     // $ANTLR start "rulePerspectiveGrid"
-    // InternalPerspectiveDsl.g:326:1: rulePerspectiveGrid : ( ( rule__PerspectiveGrid__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:328:1: rulePerspectiveGrid : ( ( rule__PerspectiveGrid__Group__0 ) ) ;
     public final void rulePerspectiveGrid() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:330:2: ( ( ( rule__PerspectiveGrid__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:331:2: ( ( rule__PerspectiveGrid__Group__0 ) )
+            // InternalPerspectiveDsl.g:332:2: ( ( ( rule__PerspectiveGrid__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:333:2: ( ( rule__PerspectiveGrid__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:331:2: ( ( rule__PerspectiveGrid__Group__0 ) )
-            // InternalPerspectiveDsl.g:332:3: ( rule__PerspectiveGrid__Group__0 )
+            // InternalPerspectiveDsl.g:333:2: ( ( rule__PerspectiveGrid__Group__0 ) )
+            // InternalPerspectiveDsl.g:334:3: ( rule__PerspectiveGrid__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveGridAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:333:3: ( rule__PerspectiveGrid__Group__0 )
-            // InternalPerspectiveDsl.g:333:4: rule__PerspectiveGrid__Group__0
+            // InternalPerspectiveDsl.g:335:3: ( rule__PerspectiveGrid__Group__0 )
+            // InternalPerspectiveDsl.g:335:4: rule__PerspectiveGrid__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveGrid__Group__0();
@@ -1138,11 +1138,11 @@
 
 
     // $ANTLR start "entryRulePerspectiveChart"
-    // InternalPerspectiveDsl.g:342:1: entryRulePerspectiveChart : rulePerspectiveChart EOF ;
+    // InternalPerspectiveDsl.g:344:1: entryRulePerspectiveChart : rulePerspectiveChart EOF ;
     public final void entryRulePerspectiveChart() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:343:1: ( rulePerspectiveChart EOF )
-            // InternalPerspectiveDsl.g:344:1: rulePerspectiveChart EOF
+            // InternalPerspectiveDsl.g:345:1: ( rulePerspectiveChart EOF )
+            // InternalPerspectiveDsl.g:346:1: rulePerspectiveChart EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveChartRule()); 
@@ -1172,23 +1172,23 @@
 
 
     // $ANTLR start "rulePerspectiveChart"
-    // InternalPerspectiveDsl.g:351:1: rulePerspectiveChart : ( ( rule__PerspectiveChart__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:353:1: rulePerspectiveChart : ( ( rule__PerspectiveChart__Group__0 ) ) ;
     public final void rulePerspectiveChart() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:355:2: ( ( ( rule__PerspectiveChart__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:356:2: ( ( rule__PerspectiveChart__Group__0 ) )
+            // InternalPerspectiveDsl.g:357:2: ( ( ( rule__PerspectiveChart__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:358:2: ( ( rule__PerspectiveChart__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:356:2: ( ( rule__PerspectiveChart__Group__0 ) )
-            // InternalPerspectiveDsl.g:357:3: ( rule__PerspectiveChart__Group__0 )
+            // InternalPerspectiveDsl.g:358:2: ( ( rule__PerspectiveChart__Group__0 ) )
+            // InternalPerspectiveDsl.g:359:3: ( rule__PerspectiveChart__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveChartAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:358:3: ( rule__PerspectiveChart__Group__0 )
-            // InternalPerspectiveDsl.g:358:4: rule__PerspectiveChart__Group__0
+            // InternalPerspectiveDsl.g:360:3: ( rule__PerspectiveChart__Group__0 )
+            // InternalPerspectiveDsl.g:360:4: rule__PerspectiveChart__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveChart__Group__0();
@@ -1223,11 +1223,11 @@
 
 
     // $ANTLR start "entryRulePerspectiveReport"
-    // InternalPerspectiveDsl.g:367:1: entryRulePerspectiveReport : rulePerspectiveReport EOF ;
+    // InternalPerspectiveDsl.g:369:1: entryRulePerspectiveReport : rulePerspectiveReport EOF ;
     public final void entryRulePerspectiveReport() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:368:1: ( rulePerspectiveReport EOF )
-            // InternalPerspectiveDsl.g:369:1: rulePerspectiveReport EOF
+            // InternalPerspectiveDsl.g:370:1: ( rulePerspectiveReport EOF )
+            // InternalPerspectiveDsl.g:371:1: rulePerspectiveReport EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveReportRule()); 
@@ -1257,23 +1257,23 @@
 
 
     // $ANTLR start "rulePerspectiveReport"
-    // InternalPerspectiveDsl.g:376:1: rulePerspectiveReport : ( ( rule__PerspectiveReport__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:378:1: rulePerspectiveReport : ( ( rule__PerspectiveReport__Group__0 ) ) ;
     public final void rulePerspectiveReport() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:380:2: ( ( ( rule__PerspectiveReport__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:381:2: ( ( rule__PerspectiveReport__Group__0 ) )
+            // InternalPerspectiveDsl.g:382:2: ( ( ( rule__PerspectiveReport__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:383:2: ( ( rule__PerspectiveReport__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:381:2: ( ( rule__PerspectiveReport__Group__0 ) )
-            // InternalPerspectiveDsl.g:382:3: ( rule__PerspectiveReport__Group__0 )
+            // InternalPerspectiveDsl.g:383:2: ( ( rule__PerspectiveReport__Group__0 ) )
+            // InternalPerspectiveDsl.g:384:3: ( rule__PerspectiveReport__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveReportAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:383:3: ( rule__PerspectiveReport__Group__0 )
-            // InternalPerspectiveDsl.g:383:4: rule__PerspectiveReport__Group__0
+            // InternalPerspectiveDsl.g:385:3: ( rule__PerspectiveReport__Group__0 )
+            // InternalPerspectiveDsl.g:385:4: rule__PerspectiveReport__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveReport__Group__0();
@@ -1308,11 +1308,11 @@
 
 
     // $ANTLR start "entryRulePerspectiveOrganization"
-    // InternalPerspectiveDsl.g:392:1: entryRulePerspectiveOrganization : rulePerspectiveOrganization EOF ;
+    // InternalPerspectiveDsl.g:394:1: entryRulePerspectiveOrganization : rulePerspectiveOrganization EOF ;
     public final void entryRulePerspectiveOrganization() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:393:1: ( rulePerspectiveOrganization EOF )
-            // InternalPerspectiveDsl.g:394:1: rulePerspectiveOrganization EOF
+            // InternalPerspectiveDsl.g:395:1: ( rulePerspectiveOrganization EOF )
+            // InternalPerspectiveDsl.g:396:1: rulePerspectiveOrganization EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveOrganizationRule()); 
@@ -1342,23 +1342,23 @@
 
 
     // $ANTLR start "rulePerspectiveOrganization"
-    // InternalPerspectiveDsl.g:401:1: rulePerspectiveOrganization : ( ( rule__PerspectiveOrganization__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:403:1: rulePerspectiveOrganization : ( ( rule__PerspectiveOrganization__Group__0 ) ) ;
     public final void rulePerspectiveOrganization() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:405:2: ( ( ( rule__PerspectiveOrganization__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:406:2: ( ( rule__PerspectiveOrganization__Group__0 ) )
+            // InternalPerspectiveDsl.g:407:2: ( ( ( rule__PerspectiveOrganization__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:408:2: ( ( rule__PerspectiveOrganization__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:406:2: ( ( rule__PerspectiveOrganization__Group__0 ) )
-            // InternalPerspectiveDsl.g:407:3: ( rule__PerspectiveOrganization__Group__0 )
+            // InternalPerspectiveDsl.g:408:2: ( ( rule__PerspectiveOrganization__Group__0 ) )
+            // InternalPerspectiveDsl.g:409:3: ( rule__PerspectiveOrganization__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveOrganizationAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:408:3: ( rule__PerspectiveOrganization__Group__0 )
-            // InternalPerspectiveDsl.g:408:4: rule__PerspectiveOrganization__Group__0
+            // InternalPerspectiveDsl.g:410:3: ( rule__PerspectiveOrganization__Group__0 )
+            // InternalPerspectiveDsl.g:410:4: rule__PerspectiveOrganization__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveOrganization__Group__0();
@@ -1393,11 +1393,11 @@
 
 
     // $ANTLR start "entryRulePerspectiveTopology"
-    // InternalPerspectiveDsl.g:417:1: entryRulePerspectiveTopology : rulePerspectiveTopology EOF ;
+    // InternalPerspectiveDsl.g:419:1: entryRulePerspectiveTopology : rulePerspectiveTopology EOF ;
     public final void entryRulePerspectiveTopology() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:418:1: ( rulePerspectiveTopology EOF )
-            // InternalPerspectiveDsl.g:419:1: rulePerspectiveTopology EOF
+            // InternalPerspectiveDsl.g:420:1: ( rulePerspectiveTopology EOF )
+            // InternalPerspectiveDsl.g:421:1: rulePerspectiveTopology EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTopologyRule()); 
@@ -1427,23 +1427,23 @@
 
 
     // $ANTLR start "rulePerspectiveTopology"
-    // InternalPerspectiveDsl.g:426:1: rulePerspectiveTopology : ( ( rule__PerspectiveTopology__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:428:1: rulePerspectiveTopology : ( ( rule__PerspectiveTopology__Group__0 ) ) ;
     public final void rulePerspectiveTopology() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:430:2: ( ( ( rule__PerspectiveTopology__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:431:2: ( ( rule__PerspectiveTopology__Group__0 ) )
+            // InternalPerspectiveDsl.g:432:2: ( ( ( rule__PerspectiveTopology__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:433:2: ( ( rule__PerspectiveTopology__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:431:2: ( ( rule__PerspectiveTopology__Group__0 ) )
-            // InternalPerspectiveDsl.g:432:3: ( rule__PerspectiveTopology__Group__0 )
+            // InternalPerspectiveDsl.g:433:2: ( ( rule__PerspectiveTopology__Group__0 ) )
+            // InternalPerspectiveDsl.g:434:3: ( rule__PerspectiveTopology__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTopologyAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:433:3: ( rule__PerspectiveTopology__Group__0 )
-            // InternalPerspectiveDsl.g:433:4: rule__PerspectiveTopology__Group__0
+            // InternalPerspectiveDsl.g:435:3: ( rule__PerspectiveTopology__Group__0 )
+            // InternalPerspectiveDsl.g:435:4: rule__PerspectiveTopology__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveTopology__Group__0();
@@ -1478,11 +1478,11 @@
 
 
     // $ANTLR start "entryRulePerspectiveDialog"
-    // InternalPerspectiveDsl.g:442:1: entryRulePerspectiveDialog : rulePerspectiveDialog EOF ;
+    // InternalPerspectiveDsl.g:444:1: entryRulePerspectiveDialog : rulePerspectiveDialog EOF ;
     public final void entryRulePerspectiveDialog() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:443:1: ( rulePerspectiveDialog EOF )
-            // InternalPerspectiveDsl.g:444:1: rulePerspectiveDialog EOF
+            // InternalPerspectiveDsl.g:445:1: ( rulePerspectiveDialog EOF )
+            // InternalPerspectiveDsl.g:446:1: rulePerspectiveDialog EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveDialogRule()); 
@@ -1512,23 +1512,23 @@
 
 
     // $ANTLR start "rulePerspectiveDialog"
-    // InternalPerspectiveDsl.g:451:1: rulePerspectiveDialog : ( ( rule__PerspectiveDialog__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:453:1: rulePerspectiveDialog : ( ( rule__PerspectiveDialog__Group__0 ) ) ;
     public final void rulePerspectiveDialog() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:455:2: ( ( ( rule__PerspectiveDialog__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:456:2: ( ( rule__PerspectiveDialog__Group__0 ) )
+            // InternalPerspectiveDsl.g:457:2: ( ( ( rule__PerspectiveDialog__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:458:2: ( ( rule__PerspectiveDialog__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:456:2: ( ( rule__PerspectiveDialog__Group__0 ) )
-            // InternalPerspectiveDsl.g:457:3: ( rule__PerspectiveDialog__Group__0 )
+            // InternalPerspectiveDsl.g:458:2: ( ( rule__PerspectiveDialog__Group__0 ) )
+            // InternalPerspectiveDsl.g:459:3: ( rule__PerspectiveDialog__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveDialogAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:458:3: ( rule__PerspectiveDialog__Group__0 )
-            // InternalPerspectiveDsl.g:458:4: rule__PerspectiveDialog__Group__0
+            // InternalPerspectiveDsl.g:460:3: ( rule__PerspectiveDialog__Group__0 )
+            // InternalPerspectiveDsl.g:460:4: rule__PerspectiveDialog__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveDialog__Group__0();
@@ -1563,11 +1563,11 @@
 
 
     // $ANTLR start "entryRulePerspectiveBPMN"
-    // InternalPerspectiveDsl.g:467:1: entryRulePerspectiveBPMN : rulePerspectiveBPMN EOF ;
+    // InternalPerspectiveDsl.g:469:1: entryRulePerspectiveBPMN : rulePerspectiveBPMN EOF ;
     public final void entryRulePerspectiveBPMN() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:468:1: ( rulePerspectiveBPMN EOF )
-            // InternalPerspectiveDsl.g:469:1: rulePerspectiveBPMN EOF
+            // InternalPerspectiveDsl.g:470:1: ( rulePerspectiveBPMN EOF )
+            // InternalPerspectiveDsl.g:471:1: rulePerspectiveBPMN EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveBPMNRule()); 
@@ -1597,23 +1597,23 @@
 
 
     // $ANTLR start "rulePerspectiveBPMN"
-    // InternalPerspectiveDsl.g:476:1: rulePerspectiveBPMN : ( ( rule__PerspectiveBPMN__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:478:1: rulePerspectiveBPMN : ( ( rule__PerspectiveBPMN__Group__0 ) ) ;
     public final void rulePerspectiveBPMN() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:480:2: ( ( ( rule__PerspectiveBPMN__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:481:2: ( ( rule__PerspectiveBPMN__Group__0 ) )
+            // InternalPerspectiveDsl.g:482:2: ( ( ( rule__PerspectiveBPMN__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:483:2: ( ( rule__PerspectiveBPMN__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:481:2: ( ( rule__PerspectiveBPMN__Group__0 ) )
-            // InternalPerspectiveDsl.g:482:3: ( rule__PerspectiveBPMN__Group__0 )
+            // InternalPerspectiveDsl.g:483:2: ( ( rule__PerspectiveBPMN__Group__0 ) )
+            // InternalPerspectiveDsl.g:484:3: ( rule__PerspectiveBPMN__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveBPMNAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:483:3: ( rule__PerspectiveBPMN__Group__0 )
-            // InternalPerspectiveDsl.g:483:4: rule__PerspectiveBPMN__Group__0
+            // InternalPerspectiveDsl.g:485:3: ( rule__PerspectiveBPMN__Group__0 )
+            // InternalPerspectiveDsl.g:485:4: rule__PerspectiveBPMN__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveBPMN__Group__0();
@@ -1648,11 +1648,11 @@
 
 
     // $ANTLR start "entryRulePerspectiveKanban"
-    // InternalPerspectiveDsl.g:492:1: entryRulePerspectiveKanban : rulePerspectiveKanban EOF ;
+    // InternalPerspectiveDsl.g:494:1: entryRulePerspectiveKanban : rulePerspectiveKanban EOF ;
     public final void entryRulePerspectiveKanban() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:493:1: ( rulePerspectiveKanban EOF )
-            // InternalPerspectiveDsl.g:494:1: rulePerspectiveKanban EOF
+            // InternalPerspectiveDsl.g:495:1: ( rulePerspectiveKanban EOF )
+            // InternalPerspectiveDsl.g:496:1: rulePerspectiveKanban EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveKanbanRule()); 
@@ -1682,23 +1682,23 @@
 
 
     // $ANTLR start "rulePerspectiveKanban"
-    // InternalPerspectiveDsl.g:501:1: rulePerspectiveKanban : ( ( rule__PerspectiveKanban__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:503:1: rulePerspectiveKanban : ( ( rule__PerspectiveKanban__Group__0 ) ) ;
     public final void rulePerspectiveKanban() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:505:2: ( ( ( rule__PerspectiveKanban__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:506:2: ( ( rule__PerspectiveKanban__Group__0 ) )
+            // InternalPerspectiveDsl.g:507:2: ( ( ( rule__PerspectiveKanban__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:508:2: ( ( rule__PerspectiveKanban__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:506:2: ( ( rule__PerspectiveKanban__Group__0 ) )
-            // InternalPerspectiveDsl.g:507:3: ( rule__PerspectiveKanban__Group__0 )
+            // InternalPerspectiveDsl.g:508:2: ( ( rule__PerspectiveKanban__Group__0 ) )
+            // InternalPerspectiveDsl.g:509:3: ( rule__PerspectiveKanban__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveKanbanAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:508:3: ( rule__PerspectiveKanban__Group__0 )
-            // InternalPerspectiveDsl.g:508:4: rule__PerspectiveKanban__Group__0
+            // InternalPerspectiveDsl.g:510:3: ( rule__PerspectiveKanban__Group__0 )
+            // InternalPerspectiveDsl.g:510:4: rule__PerspectiveKanban__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveKanban__Group__0();
@@ -1733,11 +1733,11 @@
 
 
     // $ANTLR start "entryRulePerspectiveWelcome"
-    // InternalPerspectiveDsl.g:517:1: entryRulePerspectiveWelcome : rulePerspectiveWelcome EOF ;
+    // InternalPerspectiveDsl.g:519:1: entryRulePerspectiveWelcome : rulePerspectiveWelcome EOF ;
     public final void entryRulePerspectiveWelcome() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:518:1: ( rulePerspectiveWelcome EOF )
-            // InternalPerspectiveDsl.g:519:1: rulePerspectiveWelcome EOF
+            // InternalPerspectiveDsl.g:520:1: ( rulePerspectiveWelcome EOF )
+            // InternalPerspectiveDsl.g:521:1: rulePerspectiveWelcome EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveWelcomeRule()); 
@@ -1767,23 +1767,23 @@
 
 
     // $ANTLR start "rulePerspectiveWelcome"
-    // InternalPerspectiveDsl.g:526:1: rulePerspectiveWelcome : ( ( rule__PerspectiveWelcome__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:528:1: rulePerspectiveWelcome : ( ( rule__PerspectiveWelcome__Group__0 ) ) ;
     public final void rulePerspectiveWelcome() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:530:2: ( ( ( rule__PerspectiveWelcome__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:531:2: ( ( rule__PerspectiveWelcome__Group__0 ) )
+            // InternalPerspectiveDsl.g:532:2: ( ( ( rule__PerspectiveWelcome__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:533:2: ( ( rule__PerspectiveWelcome__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:531:2: ( ( rule__PerspectiveWelcome__Group__0 ) )
-            // InternalPerspectiveDsl.g:532:3: ( rule__PerspectiveWelcome__Group__0 )
+            // InternalPerspectiveDsl.g:533:2: ( ( rule__PerspectiveWelcome__Group__0 ) )
+            // InternalPerspectiveDsl.g:534:3: ( rule__PerspectiveWelcome__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveWelcomeAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:533:3: ( rule__PerspectiveWelcome__Group__0 )
-            // InternalPerspectiveDsl.g:533:4: rule__PerspectiveWelcome__Group__0
+            // InternalPerspectiveDsl.g:535:3: ( rule__PerspectiveWelcome__Group__0 )
+            // InternalPerspectiveDsl.g:535:4: rule__PerspectiveWelcome__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveWelcome__Group__0();
@@ -1818,11 +1818,11 @@
 
 
     // $ANTLR start "entryRulePerspectiveSearch"
-    // InternalPerspectiveDsl.g:542:1: entryRulePerspectiveSearch : rulePerspectiveSearch EOF ;
+    // InternalPerspectiveDsl.g:544:1: entryRulePerspectiveSearch : rulePerspectiveSearch EOF ;
     public final void entryRulePerspectiveSearch() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:543:1: ( rulePerspectiveSearch EOF )
-            // InternalPerspectiveDsl.g:544:1: rulePerspectiveSearch EOF
+            // InternalPerspectiveDsl.g:545:1: ( rulePerspectiveSearch EOF )
+            // InternalPerspectiveDsl.g:546:1: rulePerspectiveSearch EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSearchRule()); 
@@ -1852,23 +1852,23 @@
 
 
     // $ANTLR start "rulePerspectiveSearch"
-    // InternalPerspectiveDsl.g:551:1: rulePerspectiveSearch : ( ( rule__PerspectiveSearch__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:553:1: rulePerspectiveSearch : ( ( rule__PerspectiveSearch__Group__0 ) ) ;
     public final void rulePerspectiveSearch() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:555:2: ( ( ( rule__PerspectiveSearch__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:556:2: ( ( rule__PerspectiveSearch__Group__0 ) )
+            // InternalPerspectiveDsl.g:557:2: ( ( ( rule__PerspectiveSearch__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:558:2: ( ( rule__PerspectiveSearch__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:556:2: ( ( rule__PerspectiveSearch__Group__0 ) )
-            // InternalPerspectiveDsl.g:557:3: ( rule__PerspectiveSearch__Group__0 )
+            // InternalPerspectiveDsl.g:558:2: ( ( rule__PerspectiveSearch__Group__0 ) )
+            // InternalPerspectiveDsl.g:559:3: ( rule__PerspectiveSearch__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSearchAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:558:3: ( rule__PerspectiveSearch__Group__0 )
-            // InternalPerspectiveDsl.g:558:4: rule__PerspectiveSearch__Group__0
+            // InternalPerspectiveDsl.g:560:3: ( rule__PerspectiveSearch__Group__0 )
+            // InternalPerspectiveDsl.g:560:4: rule__PerspectiveSearch__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSearch__Group__0();
@@ -1903,11 +1903,11 @@
 
 
     // $ANTLR start "entryRulePerspectiveDataInterchange"
-    // InternalPerspectiveDsl.g:567:1: entryRulePerspectiveDataInterchange : rulePerspectiveDataInterchange EOF ;
+    // InternalPerspectiveDsl.g:569:1: entryRulePerspectiveDataInterchange : rulePerspectiveDataInterchange EOF ;
     public final void entryRulePerspectiveDataInterchange() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:568:1: ( rulePerspectiveDataInterchange EOF )
-            // InternalPerspectiveDsl.g:569:1: rulePerspectiveDataInterchange EOF
+            // InternalPerspectiveDsl.g:570:1: ( rulePerspectiveDataInterchange EOF )
+            // InternalPerspectiveDsl.g:571:1: rulePerspectiveDataInterchange EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveDataInterchangeRule()); 
@@ -1937,23 +1937,23 @@
 
 
     // $ANTLR start "rulePerspectiveDataInterchange"
-    // InternalPerspectiveDsl.g:576:1: rulePerspectiveDataInterchange : ( ( rule__PerspectiveDataInterchange__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:578:1: rulePerspectiveDataInterchange : ( ( rule__PerspectiveDataInterchange__Group__0 ) ) ;
     public final void rulePerspectiveDataInterchange() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:580:2: ( ( ( rule__PerspectiveDataInterchange__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:581:2: ( ( rule__PerspectiveDataInterchange__Group__0 ) )
+            // InternalPerspectiveDsl.g:582:2: ( ( ( rule__PerspectiveDataInterchange__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:583:2: ( ( rule__PerspectiveDataInterchange__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:581:2: ( ( rule__PerspectiveDataInterchange__Group__0 ) )
-            // InternalPerspectiveDsl.g:582:3: ( rule__PerspectiveDataInterchange__Group__0 )
+            // InternalPerspectiveDsl.g:583:2: ( ( rule__PerspectiveDataInterchange__Group__0 ) )
+            // InternalPerspectiveDsl.g:584:3: ( rule__PerspectiveDataInterchange__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveDataInterchangeAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:583:3: ( rule__PerspectiveDataInterchange__Group__0 )
-            // InternalPerspectiveDsl.g:583:4: rule__PerspectiveDataInterchange__Group__0
+            // InternalPerspectiveDsl.g:585:3: ( rule__PerspectiveDataInterchange__Group__0 )
+            // InternalPerspectiveDsl.g:585:4: rule__PerspectiveDataInterchange__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveDataInterchange__Group__0();
@@ -1988,11 +1988,11 @@
 
 
     // $ANTLR start "entryRulePerspectiveTitle"
-    // InternalPerspectiveDsl.g:592:1: entryRulePerspectiveTitle : rulePerspectiveTitle EOF ;
+    // InternalPerspectiveDsl.g:594:1: entryRulePerspectiveTitle : rulePerspectiveTitle EOF ;
     public final void entryRulePerspectiveTitle() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:593:1: ( rulePerspectiveTitle EOF )
-            // InternalPerspectiveDsl.g:594:1: rulePerspectiveTitle EOF
+            // InternalPerspectiveDsl.g:595:1: ( rulePerspectiveTitle EOF )
+            // InternalPerspectiveDsl.g:596:1: rulePerspectiveTitle EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTitleRule()); 
@@ -2022,23 +2022,23 @@
 
 
     // $ANTLR start "rulePerspectiveTitle"
-    // InternalPerspectiveDsl.g:601:1: rulePerspectiveTitle : ( ( rule__PerspectiveTitle__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:603:1: rulePerspectiveTitle : ( ( rule__PerspectiveTitle__Group__0 ) ) ;
     public final void rulePerspectiveTitle() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:605:2: ( ( ( rule__PerspectiveTitle__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:606:2: ( ( rule__PerspectiveTitle__Group__0 ) )
+            // InternalPerspectiveDsl.g:607:2: ( ( ( rule__PerspectiveTitle__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:608:2: ( ( rule__PerspectiveTitle__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:606:2: ( ( rule__PerspectiveTitle__Group__0 ) )
-            // InternalPerspectiveDsl.g:607:3: ( rule__PerspectiveTitle__Group__0 )
+            // InternalPerspectiveDsl.g:608:2: ( ( rule__PerspectiveTitle__Group__0 ) )
+            // InternalPerspectiveDsl.g:609:3: ( rule__PerspectiveTitle__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTitleAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:608:3: ( rule__PerspectiveTitle__Group__0 )
-            // InternalPerspectiveDsl.g:608:4: rule__PerspectiveTitle__Group__0
+            // InternalPerspectiveDsl.g:610:3: ( rule__PerspectiveTitle__Group__0 )
+            // InternalPerspectiveDsl.g:610:4: rule__PerspectiveTitle__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveTitle__Group__0();
@@ -2073,11 +2073,11 @@
 
 
     // $ANTLR start "entryRulePerspectiveDashboard"
-    // InternalPerspectiveDsl.g:617:1: entryRulePerspectiveDashboard : rulePerspectiveDashboard EOF ;
+    // InternalPerspectiveDsl.g:619:1: entryRulePerspectiveDashboard : rulePerspectiveDashboard EOF ;
     public final void entryRulePerspectiveDashboard() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:618:1: ( rulePerspectiveDashboard EOF )
-            // InternalPerspectiveDsl.g:619:1: rulePerspectiveDashboard EOF
+            // InternalPerspectiveDsl.g:620:1: ( rulePerspectiveDashboard EOF )
+            // InternalPerspectiveDsl.g:621:1: rulePerspectiveDashboard EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveDashboardRule()); 
@@ -2107,23 +2107,23 @@
 
 
     // $ANTLR start "rulePerspectiveDashboard"
-    // InternalPerspectiveDsl.g:626:1: rulePerspectiveDashboard : ( ( rule__PerspectiveDashboard__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:628:1: rulePerspectiveDashboard : ( ( rule__PerspectiveDashboard__Group__0 ) ) ;
     public final void rulePerspectiveDashboard() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:630:2: ( ( ( rule__PerspectiveDashboard__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:631:2: ( ( rule__PerspectiveDashboard__Group__0 ) )
+            // InternalPerspectiveDsl.g:632:2: ( ( ( rule__PerspectiveDashboard__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:633:2: ( ( rule__PerspectiveDashboard__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:631:2: ( ( rule__PerspectiveDashboard__Group__0 ) )
-            // InternalPerspectiveDsl.g:632:3: ( rule__PerspectiveDashboard__Group__0 )
+            // InternalPerspectiveDsl.g:633:2: ( ( rule__PerspectiveDashboard__Group__0 ) )
+            // InternalPerspectiveDsl.g:634:3: ( rule__PerspectiveDashboard__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveDashboardAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:633:3: ( rule__PerspectiveDashboard__Group__0 )
-            // InternalPerspectiveDsl.g:633:4: rule__PerspectiveDashboard__Group__0
+            // InternalPerspectiveDsl.g:635:3: ( rule__PerspectiveDashboard__Group__0 )
+            // InternalPerspectiveDsl.g:635:4: rule__PerspectiveDashboard__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveDashboard__Group__0();
@@ -2158,11 +2158,11 @@
 
 
     // $ANTLR start "entryRuleTRANSLATABLEID"
-    // InternalPerspectiveDsl.g:642:1: entryRuleTRANSLATABLEID : ruleTRANSLATABLEID EOF ;
+    // InternalPerspectiveDsl.g:644:1: entryRuleTRANSLATABLEID : ruleTRANSLATABLEID EOF ;
     public final void entryRuleTRANSLATABLEID() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:643:1: ( ruleTRANSLATABLEID EOF )
-            // InternalPerspectiveDsl.g:644:1: ruleTRANSLATABLEID EOF
+            // InternalPerspectiveDsl.g:645:1: ( ruleTRANSLATABLEID EOF )
+            // InternalPerspectiveDsl.g:646:1: ruleTRANSLATABLEID EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTRANSLATABLEIDRule()); 
@@ -2192,17 +2192,17 @@
 
 
     // $ANTLR start "ruleTRANSLATABLEID"
-    // InternalPerspectiveDsl.g:651:1: ruleTRANSLATABLEID : ( RULE_ID ) ;
+    // InternalPerspectiveDsl.g:653:1: ruleTRANSLATABLEID : ( RULE_ID ) ;
     public final void ruleTRANSLATABLEID() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:655:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:656:2: ( RULE_ID )
+            // InternalPerspectiveDsl.g:657:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:658:2: ( RULE_ID )
             {
-            // InternalPerspectiveDsl.g:656:2: ( RULE_ID )
-            // InternalPerspectiveDsl.g:657:3: RULE_ID
+            // InternalPerspectiveDsl.g:658:2: ( RULE_ID )
+            // InternalPerspectiveDsl.g:659:3: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTRANSLATABLEIDAccess().getIDTerminalRuleCall()); 
@@ -2233,11 +2233,11 @@
 
 
     // $ANTLR start "entryRuleTRANSLATABLESTRING"
-    // InternalPerspectiveDsl.g:667:1: entryRuleTRANSLATABLESTRING : ruleTRANSLATABLESTRING EOF ;
+    // InternalPerspectiveDsl.g:669:1: entryRuleTRANSLATABLESTRING : ruleTRANSLATABLESTRING EOF ;
     public final void entryRuleTRANSLATABLESTRING() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:668:1: ( ruleTRANSLATABLESTRING EOF )
-            // InternalPerspectiveDsl.g:669:1: ruleTRANSLATABLESTRING EOF
+            // InternalPerspectiveDsl.g:670:1: ( ruleTRANSLATABLESTRING EOF )
+            // InternalPerspectiveDsl.g:671:1: ruleTRANSLATABLESTRING EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTRANSLATABLESTRINGRule()); 
@@ -2267,17 +2267,17 @@
 
 
     // $ANTLR start "ruleTRANSLATABLESTRING"
-    // InternalPerspectiveDsl.g:676:1: ruleTRANSLATABLESTRING : ( RULE_STRING ) ;
+    // InternalPerspectiveDsl.g:678:1: ruleTRANSLATABLESTRING : ( RULE_STRING ) ;
     public final void ruleTRANSLATABLESTRING() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:680:2: ( ( RULE_STRING ) )
-            // InternalPerspectiveDsl.g:681:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:682:2: ( ( RULE_STRING ) )
+            // InternalPerspectiveDsl.g:683:2: ( RULE_STRING )
             {
-            // InternalPerspectiveDsl.g:681:2: ( RULE_STRING )
-            // InternalPerspectiveDsl.g:682:3: RULE_STRING
+            // InternalPerspectiveDsl.g:683:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:684:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTRANSLATABLESTRINGAccess().getSTRINGTerminalRuleCall()); 
@@ -2308,11 +2308,11 @@
 
 
     // $ANTLR start "entryRuleXImportDeclaration"
-    // InternalPerspectiveDsl.g:692:1: entryRuleXImportDeclaration : ruleXImportDeclaration EOF ;
+    // InternalPerspectiveDsl.g:694:1: entryRuleXImportDeclaration : ruleXImportDeclaration EOF ;
     public final void entryRuleXImportDeclaration() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:693:1: ( ruleXImportDeclaration EOF )
-            // InternalPerspectiveDsl.g:694:1: ruleXImportDeclaration EOF
+            // InternalPerspectiveDsl.g:695:1: ( ruleXImportDeclaration EOF )
+            // InternalPerspectiveDsl.g:696:1: ruleXImportDeclaration EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationRule()); 
@@ -2342,23 +2342,23 @@
 
 
     // $ANTLR start "ruleXImportDeclaration"
-    // InternalPerspectiveDsl.g:701:1: ruleXImportDeclaration : ( ( rule__XImportDeclaration__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:703:1: ruleXImportDeclaration : ( ( rule__XImportDeclaration__Group__0 ) ) ;
     public final void ruleXImportDeclaration() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:705:2: ( ( ( rule__XImportDeclaration__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:706:2: ( ( rule__XImportDeclaration__Group__0 ) )
+            // InternalPerspectiveDsl.g:707:2: ( ( ( rule__XImportDeclaration__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:708:2: ( ( rule__XImportDeclaration__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:706:2: ( ( rule__XImportDeclaration__Group__0 ) )
-            // InternalPerspectiveDsl.g:707:3: ( rule__XImportDeclaration__Group__0 )
+            // InternalPerspectiveDsl.g:708:2: ( ( rule__XImportDeclaration__Group__0 ) )
+            // InternalPerspectiveDsl.g:709:3: ( rule__XImportDeclaration__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:708:3: ( rule__XImportDeclaration__Group__0 )
-            // InternalPerspectiveDsl.g:708:4: rule__XImportDeclaration__Group__0
+            // InternalPerspectiveDsl.g:710:3: ( rule__XImportDeclaration__Group__0 )
+            // InternalPerspectiveDsl.g:710:4: rule__XImportDeclaration__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__Group__0();
@@ -2393,11 +2393,11 @@
 
 
     // $ANTLR start "entryRuleXAnnotation"
-    // InternalPerspectiveDsl.g:717:1: entryRuleXAnnotation : ruleXAnnotation EOF ;
+    // InternalPerspectiveDsl.g:719:1: entryRuleXAnnotation : ruleXAnnotation EOF ;
     public final void entryRuleXAnnotation() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:718:1: ( ruleXAnnotation EOF )
-            // InternalPerspectiveDsl.g:719:1: ruleXAnnotation EOF
+            // InternalPerspectiveDsl.g:720:1: ( ruleXAnnotation EOF )
+            // InternalPerspectiveDsl.g:721:1: ruleXAnnotation EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationRule()); 
@@ -2427,23 +2427,23 @@
 
 
     // $ANTLR start "ruleXAnnotation"
-    // InternalPerspectiveDsl.g:726:1: ruleXAnnotation : ( ( rule__XAnnotation__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:728:1: ruleXAnnotation : ( ( rule__XAnnotation__Group__0 ) ) ;
     public final void ruleXAnnotation() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:730:2: ( ( ( rule__XAnnotation__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:731:2: ( ( rule__XAnnotation__Group__0 ) )
+            // InternalPerspectiveDsl.g:732:2: ( ( ( rule__XAnnotation__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:733:2: ( ( rule__XAnnotation__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:731:2: ( ( rule__XAnnotation__Group__0 ) )
-            // InternalPerspectiveDsl.g:732:3: ( rule__XAnnotation__Group__0 )
+            // InternalPerspectiveDsl.g:733:2: ( ( rule__XAnnotation__Group__0 ) )
+            // InternalPerspectiveDsl.g:734:3: ( rule__XAnnotation__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:733:3: ( rule__XAnnotation__Group__0 )
-            // InternalPerspectiveDsl.g:733:4: rule__XAnnotation__Group__0
+            // InternalPerspectiveDsl.g:735:3: ( rule__XAnnotation__Group__0 )
+            // InternalPerspectiveDsl.g:735:4: rule__XAnnotation__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotation__Group__0();
@@ -2478,11 +2478,11 @@
 
 
     // $ANTLR start "entryRuleXAnnotationElementValuePair"
-    // InternalPerspectiveDsl.g:742:1: entryRuleXAnnotationElementValuePair : ruleXAnnotationElementValuePair EOF ;
+    // InternalPerspectiveDsl.g:744:1: entryRuleXAnnotationElementValuePair : ruleXAnnotationElementValuePair EOF ;
     public final void entryRuleXAnnotationElementValuePair() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:743:1: ( ruleXAnnotationElementValuePair EOF )
-            // InternalPerspectiveDsl.g:744:1: ruleXAnnotationElementValuePair EOF
+            // InternalPerspectiveDsl.g:745:1: ( ruleXAnnotationElementValuePair EOF )
+            // InternalPerspectiveDsl.g:746:1: ruleXAnnotationElementValuePair EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairRule()); 
@@ -2512,23 +2512,23 @@
 
 
     // $ANTLR start "ruleXAnnotationElementValuePair"
-    // InternalPerspectiveDsl.g:751:1: ruleXAnnotationElementValuePair : ( ( rule__XAnnotationElementValuePair__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:753:1: ruleXAnnotationElementValuePair : ( ( rule__XAnnotationElementValuePair__Group__0 ) ) ;
     public final void ruleXAnnotationElementValuePair() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:755:2: ( ( ( rule__XAnnotationElementValuePair__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:756:2: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
+            // InternalPerspectiveDsl.g:757:2: ( ( ( rule__XAnnotationElementValuePair__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:758:2: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:756:2: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
-            // InternalPerspectiveDsl.g:757:3: ( rule__XAnnotationElementValuePair__Group__0 )
+            // InternalPerspectiveDsl.g:758:2: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
+            // InternalPerspectiveDsl.g:759:3: ( rule__XAnnotationElementValuePair__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:758:3: ( rule__XAnnotationElementValuePair__Group__0 )
-            // InternalPerspectiveDsl.g:758:4: rule__XAnnotationElementValuePair__Group__0
+            // InternalPerspectiveDsl.g:760:3: ( rule__XAnnotationElementValuePair__Group__0 )
+            // InternalPerspectiveDsl.g:760:4: rule__XAnnotationElementValuePair__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValuePair__Group__0();
@@ -2563,11 +2563,11 @@
 
 
     // $ANTLR start "entryRuleXAnnotationElementValueOrCommaList"
-    // InternalPerspectiveDsl.g:767:1: entryRuleXAnnotationElementValueOrCommaList : ruleXAnnotationElementValueOrCommaList EOF ;
+    // InternalPerspectiveDsl.g:769:1: entryRuleXAnnotationElementValueOrCommaList : ruleXAnnotationElementValueOrCommaList EOF ;
     public final void entryRuleXAnnotationElementValueOrCommaList() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:768:1: ( ruleXAnnotationElementValueOrCommaList EOF )
-            // InternalPerspectiveDsl.g:769:1: ruleXAnnotationElementValueOrCommaList EOF
+            // InternalPerspectiveDsl.g:770:1: ( ruleXAnnotationElementValueOrCommaList EOF )
+            // InternalPerspectiveDsl.g:771:1: ruleXAnnotationElementValueOrCommaList EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListRule()); 
@@ -2597,23 +2597,23 @@
 
 
     // $ANTLR start "ruleXAnnotationElementValueOrCommaList"
-    // InternalPerspectiveDsl.g:776:1: ruleXAnnotationElementValueOrCommaList : ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:778:1: ruleXAnnotationElementValueOrCommaList : ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) ) ;
     public final void ruleXAnnotationElementValueOrCommaList() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:780:2: ( ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:781:2: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
+            // InternalPerspectiveDsl.g:782:2: ( ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:783:2: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:781:2: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
-            // InternalPerspectiveDsl.g:782:3: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
+            // InternalPerspectiveDsl.g:783:2: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
+            // InternalPerspectiveDsl.g:784:3: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:783:3: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
-            // InternalPerspectiveDsl.g:783:4: rule__XAnnotationElementValueOrCommaList__Alternatives
+            // InternalPerspectiveDsl.g:785:3: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
+            // InternalPerspectiveDsl.g:785:4: rule__XAnnotationElementValueOrCommaList__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Alternatives();
@@ -2648,11 +2648,11 @@
 
 
     // $ANTLR start "entryRuleXAnnotationElementValue"
-    // InternalPerspectiveDsl.g:792:1: entryRuleXAnnotationElementValue : ruleXAnnotationElementValue EOF ;
+    // InternalPerspectiveDsl.g:794:1: entryRuleXAnnotationElementValue : ruleXAnnotationElementValue EOF ;
     public final void entryRuleXAnnotationElementValue() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:793:1: ( ruleXAnnotationElementValue EOF )
-            // InternalPerspectiveDsl.g:794:1: ruleXAnnotationElementValue EOF
+            // InternalPerspectiveDsl.g:795:1: ( ruleXAnnotationElementValue EOF )
+            // InternalPerspectiveDsl.g:796:1: ruleXAnnotationElementValue EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueRule()); 
@@ -2682,23 +2682,23 @@
 
 
     // $ANTLR start "ruleXAnnotationElementValue"
-    // InternalPerspectiveDsl.g:801:1: ruleXAnnotationElementValue : ( ( rule__XAnnotationElementValue__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:803:1: ruleXAnnotationElementValue : ( ( rule__XAnnotationElementValue__Alternatives ) ) ;
     public final void ruleXAnnotationElementValue() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:805:2: ( ( ( rule__XAnnotationElementValue__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:806:2: ( ( rule__XAnnotationElementValue__Alternatives ) )
+            // InternalPerspectiveDsl.g:807:2: ( ( ( rule__XAnnotationElementValue__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:808:2: ( ( rule__XAnnotationElementValue__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:806:2: ( ( rule__XAnnotationElementValue__Alternatives ) )
-            // InternalPerspectiveDsl.g:807:3: ( rule__XAnnotationElementValue__Alternatives )
+            // InternalPerspectiveDsl.g:808:2: ( ( rule__XAnnotationElementValue__Alternatives ) )
+            // InternalPerspectiveDsl.g:809:3: ( rule__XAnnotationElementValue__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:808:3: ( rule__XAnnotationElementValue__Alternatives )
-            // InternalPerspectiveDsl.g:808:4: rule__XAnnotationElementValue__Alternatives
+            // InternalPerspectiveDsl.g:810:3: ( rule__XAnnotationElementValue__Alternatives )
+            // InternalPerspectiveDsl.g:810:4: rule__XAnnotationElementValue__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__Alternatives();
@@ -2733,11 +2733,11 @@
 
 
     // $ANTLR start "entryRuleXAnnotationOrExpression"
-    // InternalPerspectiveDsl.g:817:1: entryRuleXAnnotationOrExpression : ruleXAnnotationOrExpression EOF ;
+    // InternalPerspectiveDsl.g:819:1: entryRuleXAnnotationOrExpression : ruleXAnnotationOrExpression EOF ;
     public final void entryRuleXAnnotationOrExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:818:1: ( ruleXAnnotationOrExpression EOF )
-            // InternalPerspectiveDsl.g:819:1: ruleXAnnotationOrExpression EOF
+            // InternalPerspectiveDsl.g:820:1: ( ruleXAnnotationOrExpression EOF )
+            // InternalPerspectiveDsl.g:821:1: ruleXAnnotationOrExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationOrExpressionRule()); 
@@ -2767,23 +2767,23 @@
 
 
     // $ANTLR start "ruleXAnnotationOrExpression"
-    // InternalPerspectiveDsl.g:826:1: ruleXAnnotationOrExpression : ( ( rule__XAnnotationOrExpression__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:828:1: ruleXAnnotationOrExpression : ( ( rule__XAnnotationOrExpression__Alternatives ) ) ;
     public final void ruleXAnnotationOrExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:830:2: ( ( ( rule__XAnnotationOrExpression__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:831:2: ( ( rule__XAnnotationOrExpression__Alternatives ) )
+            // InternalPerspectiveDsl.g:832:2: ( ( ( rule__XAnnotationOrExpression__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:833:2: ( ( rule__XAnnotationOrExpression__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:831:2: ( ( rule__XAnnotationOrExpression__Alternatives ) )
-            // InternalPerspectiveDsl.g:832:3: ( rule__XAnnotationOrExpression__Alternatives )
+            // InternalPerspectiveDsl.g:833:2: ( ( rule__XAnnotationOrExpression__Alternatives ) )
+            // InternalPerspectiveDsl.g:834:3: ( rule__XAnnotationOrExpression__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:833:3: ( rule__XAnnotationOrExpression__Alternatives )
-            // InternalPerspectiveDsl.g:833:4: rule__XAnnotationOrExpression__Alternatives
+            // InternalPerspectiveDsl.g:835:3: ( rule__XAnnotationOrExpression__Alternatives )
+            // InternalPerspectiveDsl.g:835:4: rule__XAnnotationOrExpression__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationOrExpression__Alternatives();
@@ -2818,11 +2818,11 @@
 
 
     // $ANTLR start "entryRuleXExpression"
-    // InternalPerspectiveDsl.g:842:1: entryRuleXExpression : ruleXExpression EOF ;
+    // InternalPerspectiveDsl.g:844:1: entryRuleXExpression : ruleXExpression EOF ;
     public final void entryRuleXExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:843:1: ( ruleXExpression EOF )
-            // InternalPerspectiveDsl.g:844:1: ruleXExpression EOF
+            // InternalPerspectiveDsl.g:845:1: ( ruleXExpression EOF )
+            // InternalPerspectiveDsl.g:846:1: ruleXExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionRule()); 
@@ -2852,17 +2852,17 @@
 
 
     // $ANTLR start "ruleXExpression"
-    // InternalPerspectiveDsl.g:851:1: ruleXExpression : ( ruleXAssignment ) ;
+    // InternalPerspectiveDsl.g:853:1: ruleXExpression : ( ruleXAssignment ) ;
     public final void ruleXExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:855:2: ( ( ruleXAssignment ) )
-            // InternalPerspectiveDsl.g:856:2: ( ruleXAssignment )
+            // InternalPerspectiveDsl.g:857:2: ( ( ruleXAssignment ) )
+            // InternalPerspectiveDsl.g:858:2: ( ruleXAssignment )
             {
-            // InternalPerspectiveDsl.g:856:2: ( ruleXAssignment )
-            // InternalPerspectiveDsl.g:857:3: ruleXAssignment
+            // InternalPerspectiveDsl.g:858:2: ( ruleXAssignment )
+            // InternalPerspectiveDsl.g:859:3: ruleXAssignment
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); 
@@ -2897,11 +2897,11 @@
 
 
     // $ANTLR start "entryRuleXAssignment"
-    // InternalPerspectiveDsl.g:867:1: entryRuleXAssignment : ruleXAssignment EOF ;
+    // InternalPerspectiveDsl.g:869:1: entryRuleXAssignment : ruleXAssignment EOF ;
     public final void entryRuleXAssignment() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:868:1: ( ruleXAssignment EOF )
-            // InternalPerspectiveDsl.g:869:1: ruleXAssignment EOF
+            // InternalPerspectiveDsl.g:870:1: ( ruleXAssignment EOF )
+            // InternalPerspectiveDsl.g:871:1: ruleXAssignment EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentRule()); 
@@ -2931,23 +2931,23 @@
 
 
     // $ANTLR start "ruleXAssignment"
-    // InternalPerspectiveDsl.g:876:1: ruleXAssignment : ( ( rule__XAssignment__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:878:1: ruleXAssignment : ( ( rule__XAssignment__Alternatives ) ) ;
     public final void ruleXAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:880:2: ( ( ( rule__XAssignment__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:881:2: ( ( rule__XAssignment__Alternatives ) )
+            // InternalPerspectiveDsl.g:882:2: ( ( ( rule__XAssignment__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:883:2: ( ( rule__XAssignment__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:881:2: ( ( rule__XAssignment__Alternatives ) )
-            // InternalPerspectiveDsl.g:882:3: ( rule__XAssignment__Alternatives )
+            // InternalPerspectiveDsl.g:883:2: ( ( rule__XAssignment__Alternatives ) )
+            // InternalPerspectiveDsl.g:884:3: ( rule__XAssignment__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:883:3: ( rule__XAssignment__Alternatives )
-            // InternalPerspectiveDsl.g:883:4: rule__XAssignment__Alternatives
+            // InternalPerspectiveDsl.g:885:3: ( rule__XAssignment__Alternatives )
+            // InternalPerspectiveDsl.g:885:4: rule__XAssignment__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__Alternatives();
@@ -2982,11 +2982,11 @@
 
 
     // $ANTLR start "entryRuleOpSingleAssign"
-    // InternalPerspectiveDsl.g:892:1: entryRuleOpSingleAssign : ruleOpSingleAssign EOF ;
+    // InternalPerspectiveDsl.g:894:1: entryRuleOpSingleAssign : ruleOpSingleAssign EOF ;
     public final void entryRuleOpSingleAssign() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:893:1: ( ruleOpSingleAssign EOF )
-            // InternalPerspectiveDsl.g:894:1: ruleOpSingleAssign EOF
+            // InternalPerspectiveDsl.g:895:1: ( ruleOpSingleAssign EOF )
+            // InternalPerspectiveDsl.g:896:1: ruleOpSingleAssign EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpSingleAssignRule()); 
@@ -3016,17 +3016,17 @@
 
 
     // $ANTLR start "ruleOpSingleAssign"
-    // InternalPerspectiveDsl.g:901:1: ruleOpSingleAssign : ( '=' ) ;
+    // InternalPerspectiveDsl.g:903:1: ruleOpSingleAssign : ( '=' ) ;
     public final void ruleOpSingleAssign() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:905:2: ( ( '=' ) )
-            // InternalPerspectiveDsl.g:906:2: ( '=' )
+            // InternalPerspectiveDsl.g:907:2: ( ( '=' ) )
+            // InternalPerspectiveDsl.g:908:2: ( '=' )
             {
-            // InternalPerspectiveDsl.g:906:2: ( '=' )
-            // InternalPerspectiveDsl.g:907:3: '='
+            // InternalPerspectiveDsl.g:908:2: ( '=' )
+            // InternalPerspectiveDsl.g:909:3: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); 
@@ -3057,11 +3057,11 @@
 
 
     // $ANTLR start "entryRuleOpMultiAssign"
-    // InternalPerspectiveDsl.g:917:1: entryRuleOpMultiAssign : ruleOpMultiAssign EOF ;
+    // InternalPerspectiveDsl.g:919:1: entryRuleOpMultiAssign : ruleOpMultiAssign EOF ;
     public final void entryRuleOpMultiAssign() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:918:1: ( ruleOpMultiAssign EOF )
-            // InternalPerspectiveDsl.g:919:1: ruleOpMultiAssign EOF
+            // InternalPerspectiveDsl.g:920:1: ( ruleOpMultiAssign EOF )
+            // InternalPerspectiveDsl.g:921:1: ruleOpMultiAssign EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiAssignRule()); 
@@ -3091,23 +3091,23 @@
 
 
     // $ANTLR start "ruleOpMultiAssign"
-    // InternalPerspectiveDsl.g:926:1: ruleOpMultiAssign : ( ( rule__OpMultiAssign__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:928:1: ruleOpMultiAssign : ( ( rule__OpMultiAssign__Alternatives ) ) ;
     public final void ruleOpMultiAssign() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:930:2: ( ( ( rule__OpMultiAssign__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:931:2: ( ( rule__OpMultiAssign__Alternatives ) )
+            // InternalPerspectiveDsl.g:932:2: ( ( ( rule__OpMultiAssign__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:933:2: ( ( rule__OpMultiAssign__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:931:2: ( ( rule__OpMultiAssign__Alternatives ) )
-            // InternalPerspectiveDsl.g:932:3: ( rule__OpMultiAssign__Alternatives )
+            // InternalPerspectiveDsl.g:933:2: ( ( rule__OpMultiAssign__Alternatives ) )
+            // InternalPerspectiveDsl.g:934:3: ( rule__OpMultiAssign__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiAssignAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:933:3: ( rule__OpMultiAssign__Alternatives )
-            // InternalPerspectiveDsl.g:933:4: rule__OpMultiAssign__Alternatives
+            // InternalPerspectiveDsl.g:935:3: ( rule__OpMultiAssign__Alternatives )
+            // InternalPerspectiveDsl.g:935:4: rule__OpMultiAssign__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__OpMultiAssign__Alternatives();
@@ -3142,11 +3142,11 @@
 
 
     // $ANTLR start "entryRuleXOrExpression"
-    // InternalPerspectiveDsl.g:942:1: entryRuleXOrExpression : ruleXOrExpression EOF ;
+    // InternalPerspectiveDsl.g:944:1: entryRuleXOrExpression : ruleXOrExpression EOF ;
     public final void entryRuleXOrExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:943:1: ( ruleXOrExpression EOF )
-            // InternalPerspectiveDsl.g:944:1: ruleXOrExpression EOF
+            // InternalPerspectiveDsl.g:945:1: ( ruleXOrExpression EOF )
+            // InternalPerspectiveDsl.g:946:1: ruleXOrExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionRule()); 
@@ -3176,23 +3176,23 @@
 
 
     // $ANTLR start "ruleXOrExpression"
-    // InternalPerspectiveDsl.g:951:1: ruleXOrExpression : ( ( rule__XOrExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:953:1: ruleXOrExpression : ( ( rule__XOrExpression__Group__0 ) ) ;
     public final void ruleXOrExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:955:2: ( ( ( rule__XOrExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:956:2: ( ( rule__XOrExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:957:2: ( ( ( rule__XOrExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:958:2: ( ( rule__XOrExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:956:2: ( ( rule__XOrExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:957:3: ( rule__XOrExpression__Group__0 )
+            // InternalPerspectiveDsl.g:958:2: ( ( rule__XOrExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:959:3: ( rule__XOrExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:958:3: ( rule__XOrExpression__Group__0 )
-            // InternalPerspectiveDsl.g:958:4: rule__XOrExpression__Group__0
+            // InternalPerspectiveDsl.g:960:3: ( rule__XOrExpression__Group__0 )
+            // InternalPerspectiveDsl.g:960:4: rule__XOrExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XOrExpression__Group__0();
@@ -3227,11 +3227,11 @@
 
 
     // $ANTLR start "entryRuleOpOr"
-    // InternalPerspectiveDsl.g:967:1: entryRuleOpOr : ruleOpOr EOF ;
+    // InternalPerspectiveDsl.g:969:1: entryRuleOpOr : ruleOpOr EOF ;
     public final void entryRuleOpOr() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:968:1: ( ruleOpOr EOF )
-            // InternalPerspectiveDsl.g:969:1: ruleOpOr EOF
+            // InternalPerspectiveDsl.g:970:1: ( ruleOpOr EOF )
+            // InternalPerspectiveDsl.g:971:1: ruleOpOr EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOrRule()); 
@@ -3261,17 +3261,17 @@
 
 
     // $ANTLR start "ruleOpOr"
-    // InternalPerspectiveDsl.g:976:1: ruleOpOr : ( '||' ) ;
+    // InternalPerspectiveDsl.g:978:1: ruleOpOr : ( '||' ) ;
     public final void ruleOpOr() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:980:2: ( ( '||' ) )
-            // InternalPerspectiveDsl.g:981:2: ( '||' )
+            // InternalPerspectiveDsl.g:982:2: ( ( '||' ) )
+            // InternalPerspectiveDsl.g:983:2: ( '||' )
             {
-            // InternalPerspectiveDsl.g:981:2: ( '||' )
-            // InternalPerspectiveDsl.g:982:3: '||'
+            // InternalPerspectiveDsl.g:983:2: ( '||' )
+            // InternalPerspectiveDsl.g:984:3: '||'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); 
@@ -3302,11 +3302,11 @@
 
 
     // $ANTLR start "entryRuleXAndExpression"
-    // InternalPerspectiveDsl.g:992:1: entryRuleXAndExpression : ruleXAndExpression EOF ;
+    // InternalPerspectiveDsl.g:994:1: entryRuleXAndExpression : ruleXAndExpression EOF ;
     public final void entryRuleXAndExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:993:1: ( ruleXAndExpression EOF )
-            // InternalPerspectiveDsl.g:994:1: ruleXAndExpression EOF
+            // InternalPerspectiveDsl.g:995:1: ( ruleXAndExpression EOF )
+            // InternalPerspectiveDsl.g:996:1: ruleXAndExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionRule()); 
@@ -3336,23 +3336,23 @@
 
 
     // $ANTLR start "ruleXAndExpression"
-    // InternalPerspectiveDsl.g:1001:1: ruleXAndExpression : ( ( rule__XAndExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1003:1: ruleXAndExpression : ( ( rule__XAndExpression__Group__0 ) ) ;
     public final void ruleXAndExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1005:2: ( ( ( rule__XAndExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1006:2: ( ( rule__XAndExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1007:2: ( ( ( rule__XAndExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1008:2: ( ( rule__XAndExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1006:2: ( ( rule__XAndExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:1007:3: ( rule__XAndExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1008:2: ( ( rule__XAndExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1009:3: ( rule__XAndExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1008:3: ( rule__XAndExpression__Group__0 )
-            // InternalPerspectiveDsl.g:1008:4: rule__XAndExpression__Group__0
+            // InternalPerspectiveDsl.g:1010:3: ( rule__XAndExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1010:4: rule__XAndExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XAndExpression__Group__0();
@@ -3387,11 +3387,11 @@
 
 
     // $ANTLR start "entryRuleOpAnd"
-    // InternalPerspectiveDsl.g:1017:1: entryRuleOpAnd : ruleOpAnd EOF ;
+    // InternalPerspectiveDsl.g:1019:1: entryRuleOpAnd : ruleOpAnd EOF ;
     public final void entryRuleOpAnd() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1018:1: ( ruleOpAnd EOF )
-            // InternalPerspectiveDsl.g:1019:1: ruleOpAnd EOF
+            // InternalPerspectiveDsl.g:1020:1: ( ruleOpAnd EOF )
+            // InternalPerspectiveDsl.g:1021:1: ruleOpAnd EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpAndRule()); 
@@ -3421,17 +3421,17 @@
 
 
     // $ANTLR start "ruleOpAnd"
-    // InternalPerspectiveDsl.g:1026:1: ruleOpAnd : ( '&&' ) ;
+    // InternalPerspectiveDsl.g:1028:1: ruleOpAnd : ( '&&' ) ;
     public final void ruleOpAnd() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1030:2: ( ( '&&' ) )
-            // InternalPerspectiveDsl.g:1031:2: ( '&&' )
+            // InternalPerspectiveDsl.g:1032:2: ( ( '&&' ) )
+            // InternalPerspectiveDsl.g:1033:2: ( '&&' )
             {
-            // InternalPerspectiveDsl.g:1031:2: ( '&&' )
-            // InternalPerspectiveDsl.g:1032:3: '&&'
+            // InternalPerspectiveDsl.g:1033:2: ( '&&' )
+            // InternalPerspectiveDsl.g:1034:3: '&&'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); 
@@ -3462,11 +3462,11 @@
 
 
     // $ANTLR start "entryRuleXEqualityExpression"
-    // InternalPerspectiveDsl.g:1042:1: entryRuleXEqualityExpression : ruleXEqualityExpression EOF ;
+    // InternalPerspectiveDsl.g:1044:1: entryRuleXEqualityExpression : ruleXEqualityExpression EOF ;
     public final void entryRuleXEqualityExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1043:1: ( ruleXEqualityExpression EOF )
-            // InternalPerspectiveDsl.g:1044:1: ruleXEqualityExpression EOF
+            // InternalPerspectiveDsl.g:1045:1: ( ruleXEqualityExpression EOF )
+            // InternalPerspectiveDsl.g:1046:1: ruleXEqualityExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionRule()); 
@@ -3496,23 +3496,23 @@
 
 
     // $ANTLR start "ruleXEqualityExpression"
-    // InternalPerspectiveDsl.g:1051:1: ruleXEqualityExpression : ( ( rule__XEqualityExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1053:1: ruleXEqualityExpression : ( ( rule__XEqualityExpression__Group__0 ) ) ;
     public final void ruleXEqualityExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1055:2: ( ( ( rule__XEqualityExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1056:2: ( ( rule__XEqualityExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1057:2: ( ( ( rule__XEqualityExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1058:2: ( ( rule__XEqualityExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1056:2: ( ( rule__XEqualityExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:1057:3: ( rule__XEqualityExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1058:2: ( ( rule__XEqualityExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1059:3: ( rule__XEqualityExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1058:3: ( rule__XEqualityExpression__Group__0 )
-            // InternalPerspectiveDsl.g:1058:4: rule__XEqualityExpression__Group__0
+            // InternalPerspectiveDsl.g:1060:3: ( rule__XEqualityExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1060:4: rule__XEqualityExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XEqualityExpression__Group__0();
@@ -3547,11 +3547,11 @@
 
 
     // $ANTLR start "entryRuleOpEquality"
-    // InternalPerspectiveDsl.g:1067:1: entryRuleOpEquality : ruleOpEquality EOF ;
+    // InternalPerspectiveDsl.g:1069:1: entryRuleOpEquality : ruleOpEquality EOF ;
     public final void entryRuleOpEquality() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1068:1: ( ruleOpEquality EOF )
-            // InternalPerspectiveDsl.g:1069:1: ruleOpEquality EOF
+            // InternalPerspectiveDsl.g:1070:1: ( ruleOpEquality EOF )
+            // InternalPerspectiveDsl.g:1071:1: ruleOpEquality EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpEqualityRule()); 
@@ -3581,23 +3581,23 @@
 
 
     // $ANTLR start "ruleOpEquality"
-    // InternalPerspectiveDsl.g:1076:1: ruleOpEquality : ( ( rule__OpEquality__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:1078:1: ruleOpEquality : ( ( rule__OpEquality__Alternatives ) ) ;
     public final void ruleOpEquality() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1080:2: ( ( ( rule__OpEquality__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:1081:2: ( ( rule__OpEquality__Alternatives ) )
+            // InternalPerspectiveDsl.g:1082:2: ( ( ( rule__OpEquality__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:1083:2: ( ( rule__OpEquality__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:1081:2: ( ( rule__OpEquality__Alternatives ) )
-            // InternalPerspectiveDsl.g:1082:3: ( rule__OpEquality__Alternatives )
+            // InternalPerspectiveDsl.g:1083:2: ( ( rule__OpEquality__Alternatives ) )
+            // InternalPerspectiveDsl.g:1084:3: ( rule__OpEquality__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpEqualityAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:1083:3: ( rule__OpEquality__Alternatives )
-            // InternalPerspectiveDsl.g:1083:4: rule__OpEquality__Alternatives
+            // InternalPerspectiveDsl.g:1085:3: ( rule__OpEquality__Alternatives )
+            // InternalPerspectiveDsl.g:1085:4: rule__OpEquality__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__OpEquality__Alternatives();
@@ -3632,11 +3632,11 @@
 
 
     // $ANTLR start "entryRuleXRelationalExpression"
-    // InternalPerspectiveDsl.g:1092:1: entryRuleXRelationalExpression : ruleXRelationalExpression EOF ;
+    // InternalPerspectiveDsl.g:1094:1: entryRuleXRelationalExpression : ruleXRelationalExpression EOF ;
     public final void entryRuleXRelationalExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1093:1: ( ruleXRelationalExpression EOF )
-            // InternalPerspectiveDsl.g:1094:1: ruleXRelationalExpression EOF
+            // InternalPerspectiveDsl.g:1095:1: ( ruleXRelationalExpression EOF )
+            // InternalPerspectiveDsl.g:1096:1: ruleXRelationalExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionRule()); 
@@ -3666,23 +3666,23 @@
 
 
     // $ANTLR start "ruleXRelationalExpression"
-    // InternalPerspectiveDsl.g:1101:1: ruleXRelationalExpression : ( ( rule__XRelationalExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1103:1: ruleXRelationalExpression : ( ( rule__XRelationalExpression__Group__0 ) ) ;
     public final void ruleXRelationalExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1105:2: ( ( ( rule__XRelationalExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1106:2: ( ( rule__XRelationalExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1107:2: ( ( ( rule__XRelationalExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1108:2: ( ( rule__XRelationalExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1106:2: ( ( rule__XRelationalExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:1107:3: ( rule__XRelationalExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1108:2: ( ( rule__XRelationalExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1109:3: ( rule__XRelationalExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1108:3: ( rule__XRelationalExpression__Group__0 )
-            // InternalPerspectiveDsl.g:1108:4: rule__XRelationalExpression__Group__0
+            // InternalPerspectiveDsl.g:1110:3: ( rule__XRelationalExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1110:4: rule__XRelationalExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group__0();
@@ -3717,11 +3717,11 @@
 
 
     // $ANTLR start "entryRuleOpCompare"
-    // InternalPerspectiveDsl.g:1117:1: entryRuleOpCompare : ruleOpCompare EOF ;
+    // InternalPerspectiveDsl.g:1119:1: entryRuleOpCompare : ruleOpCompare EOF ;
     public final void entryRuleOpCompare() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1118:1: ( ruleOpCompare EOF )
-            // InternalPerspectiveDsl.g:1119:1: ruleOpCompare EOF
+            // InternalPerspectiveDsl.g:1120:1: ( ruleOpCompare EOF )
+            // InternalPerspectiveDsl.g:1121:1: ruleOpCompare EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpCompareRule()); 
@@ -3751,23 +3751,23 @@
 
 
     // $ANTLR start "ruleOpCompare"
-    // InternalPerspectiveDsl.g:1126:1: ruleOpCompare : ( ( rule__OpCompare__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:1128:1: ruleOpCompare : ( ( rule__OpCompare__Alternatives ) ) ;
     public final void ruleOpCompare() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1130:2: ( ( ( rule__OpCompare__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:1131:2: ( ( rule__OpCompare__Alternatives ) )
+            // InternalPerspectiveDsl.g:1132:2: ( ( ( rule__OpCompare__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:1133:2: ( ( rule__OpCompare__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:1131:2: ( ( rule__OpCompare__Alternatives ) )
-            // InternalPerspectiveDsl.g:1132:3: ( rule__OpCompare__Alternatives )
+            // InternalPerspectiveDsl.g:1133:2: ( ( rule__OpCompare__Alternatives ) )
+            // InternalPerspectiveDsl.g:1134:3: ( rule__OpCompare__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpCompareAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:1133:3: ( rule__OpCompare__Alternatives )
-            // InternalPerspectiveDsl.g:1133:4: rule__OpCompare__Alternatives
+            // InternalPerspectiveDsl.g:1135:3: ( rule__OpCompare__Alternatives )
+            // InternalPerspectiveDsl.g:1135:4: rule__OpCompare__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__OpCompare__Alternatives();
@@ -3802,11 +3802,11 @@
 
 
     // $ANTLR start "entryRuleXOtherOperatorExpression"
-    // InternalPerspectiveDsl.g:1142:1: entryRuleXOtherOperatorExpression : ruleXOtherOperatorExpression EOF ;
+    // InternalPerspectiveDsl.g:1144:1: entryRuleXOtherOperatorExpression : ruleXOtherOperatorExpression EOF ;
     public final void entryRuleXOtherOperatorExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1143:1: ( ruleXOtherOperatorExpression EOF )
-            // InternalPerspectiveDsl.g:1144:1: ruleXOtherOperatorExpression EOF
+            // InternalPerspectiveDsl.g:1145:1: ( ruleXOtherOperatorExpression EOF )
+            // InternalPerspectiveDsl.g:1146:1: ruleXOtherOperatorExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionRule()); 
@@ -3836,23 +3836,23 @@
 
 
     // $ANTLR start "ruleXOtherOperatorExpression"
-    // InternalPerspectiveDsl.g:1151:1: ruleXOtherOperatorExpression : ( ( rule__XOtherOperatorExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1153:1: ruleXOtherOperatorExpression : ( ( rule__XOtherOperatorExpression__Group__0 ) ) ;
     public final void ruleXOtherOperatorExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1155:2: ( ( ( rule__XOtherOperatorExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1156:2: ( ( rule__XOtherOperatorExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1157:2: ( ( ( rule__XOtherOperatorExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1158:2: ( ( rule__XOtherOperatorExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1156:2: ( ( rule__XOtherOperatorExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:1157:3: ( rule__XOtherOperatorExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1158:2: ( ( rule__XOtherOperatorExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1159:3: ( rule__XOtherOperatorExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1158:3: ( rule__XOtherOperatorExpression__Group__0 )
-            // InternalPerspectiveDsl.g:1158:4: rule__XOtherOperatorExpression__Group__0
+            // InternalPerspectiveDsl.g:1160:3: ( rule__XOtherOperatorExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1160:4: rule__XOtherOperatorExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XOtherOperatorExpression__Group__0();
@@ -3887,11 +3887,11 @@
 
 
     // $ANTLR start "entryRuleOpOther"
-    // InternalPerspectiveDsl.g:1167:1: entryRuleOpOther : ruleOpOther EOF ;
+    // InternalPerspectiveDsl.g:1169:1: entryRuleOpOther : ruleOpOther EOF ;
     public final void entryRuleOpOther() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1168:1: ( ruleOpOther EOF )
-            // InternalPerspectiveDsl.g:1169:1: ruleOpOther EOF
+            // InternalPerspectiveDsl.g:1170:1: ( ruleOpOther EOF )
+            // InternalPerspectiveDsl.g:1171:1: ruleOpOther EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherRule()); 
@@ -3921,23 +3921,23 @@
 
 
     // $ANTLR start "ruleOpOther"
-    // InternalPerspectiveDsl.g:1176:1: ruleOpOther : ( ( rule__OpOther__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:1178:1: ruleOpOther : ( ( rule__OpOther__Alternatives ) ) ;
     public final void ruleOpOther() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1180:2: ( ( ( rule__OpOther__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:1181:2: ( ( rule__OpOther__Alternatives ) )
+            // InternalPerspectiveDsl.g:1182:2: ( ( ( rule__OpOther__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:1183:2: ( ( rule__OpOther__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:1181:2: ( ( rule__OpOther__Alternatives ) )
-            // InternalPerspectiveDsl.g:1182:3: ( rule__OpOther__Alternatives )
+            // InternalPerspectiveDsl.g:1183:2: ( ( rule__OpOther__Alternatives ) )
+            // InternalPerspectiveDsl.g:1184:3: ( rule__OpOther__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:1183:3: ( rule__OpOther__Alternatives )
-            // InternalPerspectiveDsl.g:1183:4: rule__OpOther__Alternatives
+            // InternalPerspectiveDsl.g:1185:3: ( rule__OpOther__Alternatives )
+            // InternalPerspectiveDsl.g:1185:4: rule__OpOther__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Alternatives();
@@ -3972,11 +3972,11 @@
 
 
     // $ANTLR start "entryRuleXAdditiveExpression"
-    // InternalPerspectiveDsl.g:1192:1: entryRuleXAdditiveExpression : ruleXAdditiveExpression EOF ;
+    // InternalPerspectiveDsl.g:1194:1: entryRuleXAdditiveExpression : ruleXAdditiveExpression EOF ;
     public final void entryRuleXAdditiveExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1193:1: ( ruleXAdditiveExpression EOF )
-            // InternalPerspectiveDsl.g:1194:1: ruleXAdditiveExpression EOF
+            // InternalPerspectiveDsl.g:1195:1: ( ruleXAdditiveExpression EOF )
+            // InternalPerspectiveDsl.g:1196:1: ruleXAdditiveExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionRule()); 
@@ -4006,23 +4006,23 @@
 
 
     // $ANTLR start "ruleXAdditiveExpression"
-    // InternalPerspectiveDsl.g:1201:1: ruleXAdditiveExpression : ( ( rule__XAdditiveExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1203:1: ruleXAdditiveExpression : ( ( rule__XAdditiveExpression__Group__0 ) ) ;
     public final void ruleXAdditiveExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1205:2: ( ( ( rule__XAdditiveExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1206:2: ( ( rule__XAdditiveExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1207:2: ( ( ( rule__XAdditiveExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1208:2: ( ( rule__XAdditiveExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1206:2: ( ( rule__XAdditiveExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:1207:3: ( rule__XAdditiveExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1208:2: ( ( rule__XAdditiveExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1209:3: ( rule__XAdditiveExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1208:3: ( rule__XAdditiveExpression__Group__0 )
-            // InternalPerspectiveDsl.g:1208:4: rule__XAdditiveExpression__Group__0
+            // InternalPerspectiveDsl.g:1210:3: ( rule__XAdditiveExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1210:4: rule__XAdditiveExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XAdditiveExpression__Group__0();
@@ -4057,11 +4057,11 @@
 
 
     // $ANTLR start "entryRuleOpAdd"
-    // InternalPerspectiveDsl.g:1217:1: entryRuleOpAdd : ruleOpAdd EOF ;
+    // InternalPerspectiveDsl.g:1219:1: entryRuleOpAdd : ruleOpAdd EOF ;
     public final void entryRuleOpAdd() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1218:1: ( ruleOpAdd EOF )
-            // InternalPerspectiveDsl.g:1219:1: ruleOpAdd EOF
+            // InternalPerspectiveDsl.g:1220:1: ( ruleOpAdd EOF )
+            // InternalPerspectiveDsl.g:1221:1: ruleOpAdd EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpAddRule()); 
@@ -4091,23 +4091,23 @@
 
 
     // $ANTLR start "ruleOpAdd"
-    // InternalPerspectiveDsl.g:1226:1: ruleOpAdd : ( ( rule__OpAdd__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:1228:1: ruleOpAdd : ( ( rule__OpAdd__Alternatives ) ) ;
     public final void ruleOpAdd() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1230:2: ( ( ( rule__OpAdd__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:1231:2: ( ( rule__OpAdd__Alternatives ) )
+            // InternalPerspectiveDsl.g:1232:2: ( ( ( rule__OpAdd__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:1233:2: ( ( rule__OpAdd__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:1231:2: ( ( rule__OpAdd__Alternatives ) )
-            // InternalPerspectiveDsl.g:1232:3: ( rule__OpAdd__Alternatives )
+            // InternalPerspectiveDsl.g:1233:2: ( ( rule__OpAdd__Alternatives ) )
+            // InternalPerspectiveDsl.g:1234:3: ( rule__OpAdd__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpAddAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:1233:3: ( rule__OpAdd__Alternatives )
-            // InternalPerspectiveDsl.g:1233:4: rule__OpAdd__Alternatives
+            // InternalPerspectiveDsl.g:1235:3: ( rule__OpAdd__Alternatives )
+            // InternalPerspectiveDsl.g:1235:4: rule__OpAdd__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__OpAdd__Alternatives();
@@ -4142,11 +4142,11 @@
 
 
     // $ANTLR start "entryRuleXMultiplicativeExpression"
-    // InternalPerspectiveDsl.g:1242:1: entryRuleXMultiplicativeExpression : ruleXMultiplicativeExpression EOF ;
+    // InternalPerspectiveDsl.g:1244:1: entryRuleXMultiplicativeExpression : ruleXMultiplicativeExpression EOF ;
     public final void entryRuleXMultiplicativeExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1243:1: ( ruleXMultiplicativeExpression EOF )
-            // InternalPerspectiveDsl.g:1244:1: ruleXMultiplicativeExpression EOF
+            // InternalPerspectiveDsl.g:1245:1: ( ruleXMultiplicativeExpression EOF )
+            // InternalPerspectiveDsl.g:1246:1: ruleXMultiplicativeExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionRule()); 
@@ -4176,23 +4176,23 @@
 
 
     // $ANTLR start "ruleXMultiplicativeExpression"
-    // InternalPerspectiveDsl.g:1251:1: ruleXMultiplicativeExpression : ( ( rule__XMultiplicativeExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1253:1: ruleXMultiplicativeExpression : ( ( rule__XMultiplicativeExpression__Group__0 ) ) ;
     public final void ruleXMultiplicativeExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1255:2: ( ( ( rule__XMultiplicativeExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1256:2: ( ( rule__XMultiplicativeExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1257:2: ( ( ( rule__XMultiplicativeExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1258:2: ( ( rule__XMultiplicativeExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1256:2: ( ( rule__XMultiplicativeExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:1257:3: ( rule__XMultiplicativeExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1258:2: ( ( rule__XMultiplicativeExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1259:3: ( rule__XMultiplicativeExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1258:3: ( rule__XMultiplicativeExpression__Group__0 )
-            // InternalPerspectiveDsl.g:1258:4: rule__XMultiplicativeExpression__Group__0
+            // InternalPerspectiveDsl.g:1260:3: ( rule__XMultiplicativeExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1260:4: rule__XMultiplicativeExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XMultiplicativeExpression__Group__0();
@@ -4227,11 +4227,11 @@
 
 
     // $ANTLR start "entryRuleOpMulti"
-    // InternalPerspectiveDsl.g:1267:1: entryRuleOpMulti : ruleOpMulti EOF ;
+    // InternalPerspectiveDsl.g:1269:1: entryRuleOpMulti : ruleOpMulti EOF ;
     public final void entryRuleOpMulti() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1268:1: ( ruleOpMulti EOF )
-            // InternalPerspectiveDsl.g:1269:1: ruleOpMulti EOF
+            // InternalPerspectiveDsl.g:1270:1: ( ruleOpMulti EOF )
+            // InternalPerspectiveDsl.g:1271:1: ruleOpMulti EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiRule()); 
@@ -4261,23 +4261,23 @@
 
 
     // $ANTLR start "ruleOpMulti"
-    // InternalPerspectiveDsl.g:1276:1: ruleOpMulti : ( ( rule__OpMulti__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:1278:1: ruleOpMulti : ( ( rule__OpMulti__Alternatives ) ) ;
     public final void ruleOpMulti() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1280:2: ( ( ( rule__OpMulti__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:1281:2: ( ( rule__OpMulti__Alternatives ) )
+            // InternalPerspectiveDsl.g:1282:2: ( ( ( rule__OpMulti__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:1283:2: ( ( rule__OpMulti__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:1281:2: ( ( rule__OpMulti__Alternatives ) )
-            // InternalPerspectiveDsl.g:1282:3: ( rule__OpMulti__Alternatives )
+            // InternalPerspectiveDsl.g:1283:2: ( ( rule__OpMulti__Alternatives ) )
+            // InternalPerspectiveDsl.g:1284:3: ( rule__OpMulti__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:1283:3: ( rule__OpMulti__Alternatives )
-            // InternalPerspectiveDsl.g:1283:4: rule__OpMulti__Alternatives
+            // InternalPerspectiveDsl.g:1285:3: ( rule__OpMulti__Alternatives )
+            // InternalPerspectiveDsl.g:1285:4: rule__OpMulti__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__OpMulti__Alternatives();
@@ -4312,11 +4312,11 @@
 
 
     // $ANTLR start "entryRuleXUnaryOperation"
-    // InternalPerspectiveDsl.g:1292:1: entryRuleXUnaryOperation : ruleXUnaryOperation EOF ;
+    // InternalPerspectiveDsl.g:1294:1: entryRuleXUnaryOperation : ruleXUnaryOperation EOF ;
     public final void entryRuleXUnaryOperation() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1293:1: ( ruleXUnaryOperation EOF )
-            // InternalPerspectiveDsl.g:1294:1: ruleXUnaryOperation EOF
+            // InternalPerspectiveDsl.g:1295:1: ( ruleXUnaryOperation EOF )
+            // InternalPerspectiveDsl.g:1296:1: ruleXUnaryOperation EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXUnaryOperationRule()); 
@@ -4346,23 +4346,23 @@
 
 
     // $ANTLR start "ruleXUnaryOperation"
-    // InternalPerspectiveDsl.g:1301:1: ruleXUnaryOperation : ( ( rule__XUnaryOperation__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:1303:1: ruleXUnaryOperation : ( ( rule__XUnaryOperation__Alternatives ) ) ;
     public final void ruleXUnaryOperation() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1305:2: ( ( ( rule__XUnaryOperation__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:1306:2: ( ( rule__XUnaryOperation__Alternatives ) )
+            // InternalPerspectiveDsl.g:1307:2: ( ( ( rule__XUnaryOperation__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:1308:2: ( ( rule__XUnaryOperation__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:1306:2: ( ( rule__XUnaryOperation__Alternatives ) )
-            // InternalPerspectiveDsl.g:1307:3: ( rule__XUnaryOperation__Alternatives )
+            // InternalPerspectiveDsl.g:1308:2: ( ( rule__XUnaryOperation__Alternatives ) )
+            // InternalPerspectiveDsl.g:1309:3: ( rule__XUnaryOperation__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXUnaryOperationAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:1308:3: ( rule__XUnaryOperation__Alternatives )
-            // InternalPerspectiveDsl.g:1308:4: rule__XUnaryOperation__Alternatives
+            // InternalPerspectiveDsl.g:1310:3: ( rule__XUnaryOperation__Alternatives )
+            // InternalPerspectiveDsl.g:1310:4: rule__XUnaryOperation__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__XUnaryOperation__Alternatives();
@@ -4397,11 +4397,11 @@
 
 
     // $ANTLR start "entryRuleOpUnary"
-    // InternalPerspectiveDsl.g:1317:1: entryRuleOpUnary : ruleOpUnary EOF ;
+    // InternalPerspectiveDsl.g:1319:1: entryRuleOpUnary : ruleOpUnary EOF ;
     public final void entryRuleOpUnary() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1318:1: ( ruleOpUnary EOF )
-            // InternalPerspectiveDsl.g:1319:1: ruleOpUnary EOF
+            // InternalPerspectiveDsl.g:1320:1: ( ruleOpUnary EOF )
+            // InternalPerspectiveDsl.g:1321:1: ruleOpUnary EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpUnaryRule()); 
@@ -4431,23 +4431,23 @@
 
 
     // $ANTLR start "ruleOpUnary"
-    // InternalPerspectiveDsl.g:1326:1: ruleOpUnary : ( ( rule__OpUnary__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:1328:1: ruleOpUnary : ( ( rule__OpUnary__Alternatives ) ) ;
     public final void ruleOpUnary() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1330:2: ( ( ( rule__OpUnary__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:1331:2: ( ( rule__OpUnary__Alternatives ) )
+            // InternalPerspectiveDsl.g:1332:2: ( ( ( rule__OpUnary__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:1333:2: ( ( rule__OpUnary__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:1331:2: ( ( rule__OpUnary__Alternatives ) )
-            // InternalPerspectiveDsl.g:1332:3: ( rule__OpUnary__Alternatives )
+            // InternalPerspectiveDsl.g:1333:2: ( ( rule__OpUnary__Alternatives ) )
+            // InternalPerspectiveDsl.g:1334:3: ( rule__OpUnary__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpUnaryAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:1333:3: ( rule__OpUnary__Alternatives )
-            // InternalPerspectiveDsl.g:1333:4: rule__OpUnary__Alternatives
+            // InternalPerspectiveDsl.g:1335:3: ( rule__OpUnary__Alternatives )
+            // InternalPerspectiveDsl.g:1335:4: rule__OpUnary__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__OpUnary__Alternatives();
@@ -4482,11 +4482,11 @@
 
 
     // $ANTLR start "entryRuleXCastedExpression"
-    // InternalPerspectiveDsl.g:1342:1: entryRuleXCastedExpression : ruleXCastedExpression EOF ;
+    // InternalPerspectiveDsl.g:1344:1: entryRuleXCastedExpression : ruleXCastedExpression EOF ;
     public final void entryRuleXCastedExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1343:1: ( ruleXCastedExpression EOF )
-            // InternalPerspectiveDsl.g:1344:1: ruleXCastedExpression EOF
+            // InternalPerspectiveDsl.g:1345:1: ( ruleXCastedExpression EOF )
+            // InternalPerspectiveDsl.g:1346:1: ruleXCastedExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionRule()); 
@@ -4516,23 +4516,23 @@
 
 
     // $ANTLR start "ruleXCastedExpression"
-    // InternalPerspectiveDsl.g:1351:1: ruleXCastedExpression : ( ( rule__XCastedExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1353:1: ruleXCastedExpression : ( ( rule__XCastedExpression__Group__0 ) ) ;
     public final void ruleXCastedExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1355:2: ( ( ( rule__XCastedExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1356:2: ( ( rule__XCastedExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1357:2: ( ( ( rule__XCastedExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1358:2: ( ( rule__XCastedExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1356:2: ( ( rule__XCastedExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:1357:3: ( rule__XCastedExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1358:2: ( ( rule__XCastedExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1359:3: ( rule__XCastedExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1358:3: ( rule__XCastedExpression__Group__0 )
-            // InternalPerspectiveDsl.g:1358:4: rule__XCastedExpression__Group__0
+            // InternalPerspectiveDsl.g:1360:3: ( rule__XCastedExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1360:4: rule__XCastedExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XCastedExpression__Group__0();
@@ -4567,11 +4567,11 @@
 
 
     // $ANTLR start "entryRuleXPostfixOperation"
-    // InternalPerspectiveDsl.g:1367:1: entryRuleXPostfixOperation : ruleXPostfixOperation EOF ;
+    // InternalPerspectiveDsl.g:1369:1: entryRuleXPostfixOperation : ruleXPostfixOperation EOF ;
     public final void entryRuleXPostfixOperation() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1368:1: ( ruleXPostfixOperation EOF )
-            // InternalPerspectiveDsl.g:1369:1: ruleXPostfixOperation EOF
+            // InternalPerspectiveDsl.g:1370:1: ( ruleXPostfixOperation EOF )
+            // InternalPerspectiveDsl.g:1371:1: ruleXPostfixOperation EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPostfixOperationRule()); 
@@ -4601,23 +4601,23 @@
 
 
     // $ANTLR start "ruleXPostfixOperation"
-    // InternalPerspectiveDsl.g:1376:1: ruleXPostfixOperation : ( ( rule__XPostfixOperation__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1378:1: ruleXPostfixOperation : ( ( rule__XPostfixOperation__Group__0 ) ) ;
     public final void ruleXPostfixOperation() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1380:2: ( ( ( rule__XPostfixOperation__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1381:2: ( ( rule__XPostfixOperation__Group__0 ) )
+            // InternalPerspectiveDsl.g:1382:2: ( ( ( rule__XPostfixOperation__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1383:2: ( ( rule__XPostfixOperation__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1381:2: ( ( rule__XPostfixOperation__Group__0 ) )
-            // InternalPerspectiveDsl.g:1382:3: ( rule__XPostfixOperation__Group__0 )
+            // InternalPerspectiveDsl.g:1383:2: ( ( rule__XPostfixOperation__Group__0 ) )
+            // InternalPerspectiveDsl.g:1384:3: ( rule__XPostfixOperation__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPostfixOperationAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1383:3: ( rule__XPostfixOperation__Group__0 )
-            // InternalPerspectiveDsl.g:1383:4: rule__XPostfixOperation__Group__0
+            // InternalPerspectiveDsl.g:1385:3: ( rule__XPostfixOperation__Group__0 )
+            // InternalPerspectiveDsl.g:1385:4: rule__XPostfixOperation__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XPostfixOperation__Group__0();
@@ -4652,11 +4652,11 @@
 
 
     // $ANTLR start "entryRuleOpPostfix"
-    // InternalPerspectiveDsl.g:1392:1: entryRuleOpPostfix : ruleOpPostfix EOF ;
+    // InternalPerspectiveDsl.g:1394:1: entryRuleOpPostfix : ruleOpPostfix EOF ;
     public final void entryRuleOpPostfix() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1393:1: ( ruleOpPostfix EOF )
-            // InternalPerspectiveDsl.g:1394:1: ruleOpPostfix EOF
+            // InternalPerspectiveDsl.g:1395:1: ( ruleOpPostfix EOF )
+            // InternalPerspectiveDsl.g:1396:1: ruleOpPostfix EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpPostfixRule()); 
@@ -4686,23 +4686,23 @@
 
 
     // $ANTLR start "ruleOpPostfix"
-    // InternalPerspectiveDsl.g:1401:1: ruleOpPostfix : ( ( rule__OpPostfix__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:1403:1: ruleOpPostfix : ( ( rule__OpPostfix__Alternatives ) ) ;
     public final void ruleOpPostfix() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1405:2: ( ( ( rule__OpPostfix__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:1406:2: ( ( rule__OpPostfix__Alternatives ) )
+            // InternalPerspectiveDsl.g:1407:2: ( ( ( rule__OpPostfix__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:1408:2: ( ( rule__OpPostfix__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:1406:2: ( ( rule__OpPostfix__Alternatives ) )
-            // InternalPerspectiveDsl.g:1407:3: ( rule__OpPostfix__Alternatives )
+            // InternalPerspectiveDsl.g:1408:2: ( ( rule__OpPostfix__Alternatives ) )
+            // InternalPerspectiveDsl.g:1409:3: ( rule__OpPostfix__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpPostfixAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:1408:3: ( rule__OpPostfix__Alternatives )
-            // InternalPerspectiveDsl.g:1408:4: rule__OpPostfix__Alternatives
+            // InternalPerspectiveDsl.g:1410:3: ( rule__OpPostfix__Alternatives )
+            // InternalPerspectiveDsl.g:1410:4: rule__OpPostfix__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__OpPostfix__Alternatives();
@@ -4737,11 +4737,11 @@
 
 
     // $ANTLR start "entryRuleXMemberFeatureCall"
-    // InternalPerspectiveDsl.g:1417:1: entryRuleXMemberFeatureCall : ruleXMemberFeatureCall EOF ;
+    // InternalPerspectiveDsl.g:1419:1: entryRuleXMemberFeatureCall : ruleXMemberFeatureCall EOF ;
     public final void entryRuleXMemberFeatureCall() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1418:1: ( ruleXMemberFeatureCall EOF )
-            // InternalPerspectiveDsl.g:1419:1: ruleXMemberFeatureCall EOF
+            // InternalPerspectiveDsl.g:1420:1: ( ruleXMemberFeatureCall EOF )
+            // InternalPerspectiveDsl.g:1421:1: ruleXMemberFeatureCall EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallRule()); 
@@ -4771,23 +4771,23 @@
 
 
     // $ANTLR start "ruleXMemberFeatureCall"
-    // InternalPerspectiveDsl.g:1426:1: ruleXMemberFeatureCall : ( ( rule__XMemberFeatureCall__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1428:1: ruleXMemberFeatureCall : ( ( rule__XMemberFeatureCall__Group__0 ) ) ;
     public final void ruleXMemberFeatureCall() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1430:2: ( ( ( rule__XMemberFeatureCall__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1431:2: ( ( rule__XMemberFeatureCall__Group__0 ) )
+            // InternalPerspectiveDsl.g:1432:2: ( ( ( rule__XMemberFeatureCall__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1433:2: ( ( rule__XMemberFeatureCall__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1431:2: ( ( rule__XMemberFeatureCall__Group__0 ) )
-            // InternalPerspectiveDsl.g:1432:3: ( rule__XMemberFeatureCall__Group__0 )
+            // InternalPerspectiveDsl.g:1433:2: ( ( rule__XMemberFeatureCall__Group__0 ) )
+            // InternalPerspectiveDsl.g:1434:3: ( rule__XMemberFeatureCall__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1433:3: ( rule__XMemberFeatureCall__Group__0 )
-            // InternalPerspectiveDsl.g:1433:4: rule__XMemberFeatureCall__Group__0
+            // InternalPerspectiveDsl.g:1435:3: ( rule__XMemberFeatureCall__Group__0 )
+            // InternalPerspectiveDsl.g:1435:4: rule__XMemberFeatureCall__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group__0();
@@ -4822,11 +4822,11 @@
 
 
     // $ANTLR start "entryRuleXPrimaryExpression"
-    // InternalPerspectiveDsl.g:1442:1: entryRuleXPrimaryExpression : ruleXPrimaryExpression EOF ;
+    // InternalPerspectiveDsl.g:1444:1: entryRuleXPrimaryExpression : ruleXPrimaryExpression EOF ;
     public final void entryRuleXPrimaryExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1443:1: ( ruleXPrimaryExpression EOF )
-            // InternalPerspectiveDsl.g:1444:1: ruleXPrimaryExpression EOF
+            // InternalPerspectiveDsl.g:1445:1: ( ruleXPrimaryExpression EOF )
+            // InternalPerspectiveDsl.g:1446:1: ruleXPrimaryExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPrimaryExpressionRule()); 
@@ -4856,23 +4856,23 @@
 
 
     // $ANTLR start "ruleXPrimaryExpression"
-    // InternalPerspectiveDsl.g:1451:1: ruleXPrimaryExpression : ( ( rule__XPrimaryExpression__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:1453:1: ruleXPrimaryExpression : ( ( rule__XPrimaryExpression__Alternatives ) ) ;
     public final void ruleXPrimaryExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1455:2: ( ( ( rule__XPrimaryExpression__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:1456:2: ( ( rule__XPrimaryExpression__Alternatives ) )
+            // InternalPerspectiveDsl.g:1457:2: ( ( ( rule__XPrimaryExpression__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:1458:2: ( ( rule__XPrimaryExpression__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:1456:2: ( ( rule__XPrimaryExpression__Alternatives ) )
-            // InternalPerspectiveDsl.g:1457:3: ( rule__XPrimaryExpression__Alternatives )
+            // InternalPerspectiveDsl.g:1458:2: ( ( rule__XPrimaryExpression__Alternatives ) )
+            // InternalPerspectiveDsl.g:1459:3: ( rule__XPrimaryExpression__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:1458:3: ( rule__XPrimaryExpression__Alternatives )
-            // InternalPerspectiveDsl.g:1458:4: rule__XPrimaryExpression__Alternatives
+            // InternalPerspectiveDsl.g:1460:3: ( rule__XPrimaryExpression__Alternatives )
+            // InternalPerspectiveDsl.g:1460:4: rule__XPrimaryExpression__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__XPrimaryExpression__Alternatives();
@@ -4907,11 +4907,11 @@
 
 
     // $ANTLR start "entryRuleXLiteral"
-    // InternalPerspectiveDsl.g:1467:1: entryRuleXLiteral : ruleXLiteral EOF ;
+    // InternalPerspectiveDsl.g:1469:1: entryRuleXLiteral : ruleXLiteral EOF ;
     public final void entryRuleXLiteral() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1468:1: ( ruleXLiteral EOF )
-            // InternalPerspectiveDsl.g:1469:1: ruleXLiteral EOF
+            // InternalPerspectiveDsl.g:1470:1: ( ruleXLiteral EOF )
+            // InternalPerspectiveDsl.g:1471:1: ruleXLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXLiteralRule()); 
@@ -4941,23 +4941,23 @@
 
 
     // $ANTLR start "ruleXLiteral"
-    // InternalPerspectiveDsl.g:1476:1: ruleXLiteral : ( ( rule__XLiteral__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:1478:1: ruleXLiteral : ( ( rule__XLiteral__Alternatives ) ) ;
     public final void ruleXLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1480:2: ( ( ( rule__XLiteral__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:1481:2: ( ( rule__XLiteral__Alternatives ) )
+            // InternalPerspectiveDsl.g:1482:2: ( ( ( rule__XLiteral__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:1483:2: ( ( rule__XLiteral__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:1481:2: ( ( rule__XLiteral__Alternatives ) )
-            // InternalPerspectiveDsl.g:1482:3: ( rule__XLiteral__Alternatives )
+            // InternalPerspectiveDsl.g:1483:2: ( ( rule__XLiteral__Alternatives ) )
+            // InternalPerspectiveDsl.g:1484:3: ( rule__XLiteral__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXLiteralAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:1483:3: ( rule__XLiteral__Alternatives )
-            // InternalPerspectiveDsl.g:1483:4: rule__XLiteral__Alternatives
+            // InternalPerspectiveDsl.g:1485:3: ( rule__XLiteral__Alternatives )
+            // InternalPerspectiveDsl.g:1485:4: rule__XLiteral__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__XLiteral__Alternatives();
@@ -4992,11 +4992,11 @@
 
 
     // $ANTLR start "entryRuleXCollectionLiteral"
-    // InternalPerspectiveDsl.g:1492:1: entryRuleXCollectionLiteral : ruleXCollectionLiteral EOF ;
+    // InternalPerspectiveDsl.g:1494:1: entryRuleXCollectionLiteral : ruleXCollectionLiteral EOF ;
     public final void entryRuleXCollectionLiteral() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1493:1: ( ruleXCollectionLiteral EOF )
-            // InternalPerspectiveDsl.g:1494:1: ruleXCollectionLiteral EOF
+            // InternalPerspectiveDsl.g:1495:1: ( ruleXCollectionLiteral EOF )
+            // InternalPerspectiveDsl.g:1496:1: ruleXCollectionLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCollectionLiteralRule()); 
@@ -5026,23 +5026,23 @@
 
 
     // $ANTLR start "ruleXCollectionLiteral"
-    // InternalPerspectiveDsl.g:1501:1: ruleXCollectionLiteral : ( ( rule__XCollectionLiteral__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:1503:1: ruleXCollectionLiteral : ( ( rule__XCollectionLiteral__Alternatives ) ) ;
     public final void ruleXCollectionLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1505:2: ( ( ( rule__XCollectionLiteral__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:1506:2: ( ( rule__XCollectionLiteral__Alternatives ) )
+            // InternalPerspectiveDsl.g:1507:2: ( ( ( rule__XCollectionLiteral__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:1508:2: ( ( rule__XCollectionLiteral__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:1506:2: ( ( rule__XCollectionLiteral__Alternatives ) )
-            // InternalPerspectiveDsl.g:1507:3: ( rule__XCollectionLiteral__Alternatives )
+            // InternalPerspectiveDsl.g:1508:2: ( ( rule__XCollectionLiteral__Alternatives ) )
+            // InternalPerspectiveDsl.g:1509:3: ( rule__XCollectionLiteral__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:1508:3: ( rule__XCollectionLiteral__Alternatives )
-            // InternalPerspectiveDsl.g:1508:4: rule__XCollectionLiteral__Alternatives
+            // InternalPerspectiveDsl.g:1510:3: ( rule__XCollectionLiteral__Alternatives )
+            // InternalPerspectiveDsl.g:1510:4: rule__XCollectionLiteral__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__XCollectionLiteral__Alternatives();
@@ -5077,11 +5077,11 @@
 
 
     // $ANTLR start "entryRuleXSetLiteral"
-    // InternalPerspectiveDsl.g:1517:1: entryRuleXSetLiteral : ruleXSetLiteral EOF ;
+    // InternalPerspectiveDsl.g:1519:1: entryRuleXSetLiteral : ruleXSetLiteral EOF ;
     public final void entryRuleXSetLiteral() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1518:1: ( ruleXSetLiteral EOF )
-            // InternalPerspectiveDsl.g:1519:1: ruleXSetLiteral EOF
+            // InternalPerspectiveDsl.g:1520:1: ( ruleXSetLiteral EOF )
+            // InternalPerspectiveDsl.g:1521:1: ruleXSetLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralRule()); 
@@ -5111,23 +5111,23 @@
 
 
     // $ANTLR start "ruleXSetLiteral"
-    // InternalPerspectiveDsl.g:1526:1: ruleXSetLiteral : ( ( rule__XSetLiteral__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1528:1: ruleXSetLiteral : ( ( rule__XSetLiteral__Group__0 ) ) ;
     public final void ruleXSetLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1530:2: ( ( ( rule__XSetLiteral__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1531:2: ( ( rule__XSetLiteral__Group__0 ) )
+            // InternalPerspectiveDsl.g:1532:2: ( ( ( rule__XSetLiteral__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1533:2: ( ( rule__XSetLiteral__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1531:2: ( ( rule__XSetLiteral__Group__0 ) )
-            // InternalPerspectiveDsl.g:1532:3: ( rule__XSetLiteral__Group__0 )
+            // InternalPerspectiveDsl.g:1533:2: ( ( rule__XSetLiteral__Group__0 ) )
+            // InternalPerspectiveDsl.g:1534:3: ( rule__XSetLiteral__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1533:3: ( rule__XSetLiteral__Group__0 )
-            // InternalPerspectiveDsl.g:1533:4: rule__XSetLiteral__Group__0
+            // InternalPerspectiveDsl.g:1535:3: ( rule__XSetLiteral__Group__0 )
+            // InternalPerspectiveDsl.g:1535:4: rule__XSetLiteral__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XSetLiteral__Group__0();
@@ -5162,11 +5162,11 @@
 
 
     // $ANTLR start "entryRuleXListLiteral"
-    // InternalPerspectiveDsl.g:1542:1: entryRuleXListLiteral : ruleXListLiteral EOF ;
+    // InternalPerspectiveDsl.g:1544:1: entryRuleXListLiteral : ruleXListLiteral EOF ;
     public final void entryRuleXListLiteral() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1543:1: ( ruleXListLiteral EOF )
-            // InternalPerspectiveDsl.g:1544:1: ruleXListLiteral EOF
+            // InternalPerspectiveDsl.g:1545:1: ( ruleXListLiteral EOF )
+            // InternalPerspectiveDsl.g:1546:1: ruleXListLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralRule()); 
@@ -5196,23 +5196,23 @@
 
 
     // $ANTLR start "ruleXListLiteral"
-    // InternalPerspectiveDsl.g:1551:1: ruleXListLiteral : ( ( rule__XListLiteral__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1553:1: ruleXListLiteral : ( ( rule__XListLiteral__Group__0 ) ) ;
     public final void ruleXListLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1555:2: ( ( ( rule__XListLiteral__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1556:2: ( ( rule__XListLiteral__Group__0 ) )
+            // InternalPerspectiveDsl.g:1557:2: ( ( ( rule__XListLiteral__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1558:2: ( ( rule__XListLiteral__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1556:2: ( ( rule__XListLiteral__Group__0 ) )
-            // InternalPerspectiveDsl.g:1557:3: ( rule__XListLiteral__Group__0 )
+            // InternalPerspectiveDsl.g:1558:2: ( ( rule__XListLiteral__Group__0 ) )
+            // InternalPerspectiveDsl.g:1559:3: ( rule__XListLiteral__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1558:3: ( rule__XListLiteral__Group__0 )
-            // InternalPerspectiveDsl.g:1558:4: rule__XListLiteral__Group__0
+            // InternalPerspectiveDsl.g:1560:3: ( rule__XListLiteral__Group__0 )
+            // InternalPerspectiveDsl.g:1560:4: rule__XListLiteral__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XListLiteral__Group__0();
@@ -5247,11 +5247,11 @@
 
 
     // $ANTLR start "entryRuleXClosure"
-    // InternalPerspectiveDsl.g:1567:1: entryRuleXClosure : ruleXClosure EOF ;
+    // InternalPerspectiveDsl.g:1569:1: entryRuleXClosure : ruleXClosure EOF ;
     public final void entryRuleXClosure() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1568:1: ( ruleXClosure EOF )
-            // InternalPerspectiveDsl.g:1569:1: ruleXClosure EOF
+            // InternalPerspectiveDsl.g:1570:1: ( ruleXClosure EOF )
+            // InternalPerspectiveDsl.g:1571:1: ruleXClosure EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureRule()); 
@@ -5281,23 +5281,23 @@
 
 
     // $ANTLR start "ruleXClosure"
-    // InternalPerspectiveDsl.g:1576:1: ruleXClosure : ( ( rule__XClosure__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1578:1: ruleXClosure : ( ( rule__XClosure__Group__0 ) ) ;
     public final void ruleXClosure() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1580:2: ( ( ( rule__XClosure__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1581:2: ( ( rule__XClosure__Group__0 ) )
+            // InternalPerspectiveDsl.g:1582:2: ( ( ( rule__XClosure__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1583:2: ( ( rule__XClosure__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1581:2: ( ( rule__XClosure__Group__0 ) )
-            // InternalPerspectiveDsl.g:1582:3: ( rule__XClosure__Group__0 )
+            // InternalPerspectiveDsl.g:1583:2: ( ( rule__XClosure__Group__0 ) )
+            // InternalPerspectiveDsl.g:1584:3: ( rule__XClosure__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1583:3: ( rule__XClosure__Group__0 )
-            // InternalPerspectiveDsl.g:1583:4: rule__XClosure__Group__0
+            // InternalPerspectiveDsl.g:1585:3: ( rule__XClosure__Group__0 )
+            // InternalPerspectiveDsl.g:1585:4: rule__XClosure__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group__0();
@@ -5332,11 +5332,11 @@
 
 
     // $ANTLR start "entryRuleXExpressionInClosure"
-    // InternalPerspectiveDsl.g:1592:1: entryRuleXExpressionInClosure : ruleXExpressionInClosure EOF ;
+    // InternalPerspectiveDsl.g:1594:1: entryRuleXExpressionInClosure : ruleXExpressionInClosure EOF ;
     public final void entryRuleXExpressionInClosure() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1593:1: ( ruleXExpressionInClosure EOF )
-            // InternalPerspectiveDsl.g:1594:1: ruleXExpressionInClosure EOF
+            // InternalPerspectiveDsl.g:1595:1: ( ruleXExpressionInClosure EOF )
+            // InternalPerspectiveDsl.g:1596:1: ruleXExpressionInClosure EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionInClosureRule()); 
@@ -5366,23 +5366,23 @@
 
 
     // $ANTLR start "ruleXExpressionInClosure"
-    // InternalPerspectiveDsl.g:1601:1: ruleXExpressionInClosure : ( ( rule__XExpressionInClosure__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1603:1: ruleXExpressionInClosure : ( ( rule__XExpressionInClosure__Group__0 ) ) ;
     public final void ruleXExpressionInClosure() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1605:2: ( ( ( rule__XExpressionInClosure__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1606:2: ( ( rule__XExpressionInClosure__Group__0 ) )
+            // InternalPerspectiveDsl.g:1607:2: ( ( ( rule__XExpressionInClosure__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1608:2: ( ( rule__XExpressionInClosure__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1606:2: ( ( rule__XExpressionInClosure__Group__0 ) )
-            // InternalPerspectiveDsl.g:1607:3: ( rule__XExpressionInClosure__Group__0 )
+            // InternalPerspectiveDsl.g:1608:2: ( ( rule__XExpressionInClosure__Group__0 ) )
+            // InternalPerspectiveDsl.g:1609:3: ( rule__XExpressionInClosure__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionInClosureAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1608:3: ( rule__XExpressionInClosure__Group__0 )
-            // InternalPerspectiveDsl.g:1608:4: rule__XExpressionInClosure__Group__0
+            // InternalPerspectiveDsl.g:1610:3: ( rule__XExpressionInClosure__Group__0 )
+            // InternalPerspectiveDsl.g:1610:4: rule__XExpressionInClosure__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XExpressionInClosure__Group__0();
@@ -5417,11 +5417,11 @@
 
 
     // $ANTLR start "entryRuleXShortClosure"
-    // InternalPerspectiveDsl.g:1617:1: entryRuleXShortClosure : ruleXShortClosure EOF ;
+    // InternalPerspectiveDsl.g:1619:1: entryRuleXShortClosure : ruleXShortClosure EOF ;
     public final void entryRuleXShortClosure() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1618:1: ( ruleXShortClosure EOF )
-            // InternalPerspectiveDsl.g:1619:1: ruleXShortClosure EOF
+            // InternalPerspectiveDsl.g:1620:1: ( ruleXShortClosure EOF )
+            // InternalPerspectiveDsl.g:1621:1: ruleXShortClosure EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureRule()); 
@@ -5451,23 +5451,23 @@
 
 
     // $ANTLR start "ruleXShortClosure"
-    // InternalPerspectiveDsl.g:1626:1: ruleXShortClosure : ( ( rule__XShortClosure__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1628:1: ruleXShortClosure : ( ( rule__XShortClosure__Group__0 ) ) ;
     public final void ruleXShortClosure() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1630:2: ( ( ( rule__XShortClosure__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1631:2: ( ( rule__XShortClosure__Group__0 ) )
+            // InternalPerspectiveDsl.g:1632:2: ( ( ( rule__XShortClosure__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1633:2: ( ( rule__XShortClosure__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1631:2: ( ( rule__XShortClosure__Group__0 ) )
-            // InternalPerspectiveDsl.g:1632:3: ( rule__XShortClosure__Group__0 )
+            // InternalPerspectiveDsl.g:1633:2: ( ( rule__XShortClosure__Group__0 ) )
+            // InternalPerspectiveDsl.g:1634:3: ( rule__XShortClosure__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1633:3: ( rule__XShortClosure__Group__0 )
-            // InternalPerspectiveDsl.g:1633:4: rule__XShortClosure__Group__0
+            // InternalPerspectiveDsl.g:1635:3: ( rule__XShortClosure__Group__0 )
+            // InternalPerspectiveDsl.g:1635:4: rule__XShortClosure__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__Group__0();
@@ -5502,11 +5502,11 @@
 
 
     // $ANTLR start "entryRuleXParenthesizedExpression"
-    // InternalPerspectiveDsl.g:1642:1: entryRuleXParenthesizedExpression : ruleXParenthesizedExpression EOF ;
+    // InternalPerspectiveDsl.g:1644:1: entryRuleXParenthesizedExpression : ruleXParenthesizedExpression EOF ;
     public final void entryRuleXParenthesizedExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1643:1: ( ruleXParenthesizedExpression EOF )
-            // InternalPerspectiveDsl.g:1644:1: ruleXParenthesizedExpression EOF
+            // InternalPerspectiveDsl.g:1645:1: ( ruleXParenthesizedExpression EOF )
+            // InternalPerspectiveDsl.g:1646:1: ruleXParenthesizedExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXParenthesizedExpressionRule()); 
@@ -5536,23 +5536,23 @@
 
 
     // $ANTLR start "ruleXParenthesizedExpression"
-    // InternalPerspectiveDsl.g:1651:1: ruleXParenthesizedExpression : ( ( rule__XParenthesizedExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1653:1: ruleXParenthesizedExpression : ( ( rule__XParenthesizedExpression__Group__0 ) ) ;
     public final void ruleXParenthesizedExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1655:2: ( ( ( rule__XParenthesizedExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1656:2: ( ( rule__XParenthesizedExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1657:2: ( ( ( rule__XParenthesizedExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1658:2: ( ( rule__XParenthesizedExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1656:2: ( ( rule__XParenthesizedExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:1657:3: ( rule__XParenthesizedExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1658:2: ( ( rule__XParenthesizedExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1659:3: ( rule__XParenthesizedExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1658:3: ( rule__XParenthesizedExpression__Group__0 )
-            // InternalPerspectiveDsl.g:1658:4: rule__XParenthesizedExpression__Group__0
+            // InternalPerspectiveDsl.g:1660:3: ( rule__XParenthesizedExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1660:4: rule__XParenthesizedExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XParenthesizedExpression__Group__0();
@@ -5587,11 +5587,11 @@
 
 
     // $ANTLR start "entryRuleXIfExpression"
-    // InternalPerspectiveDsl.g:1667:1: entryRuleXIfExpression : ruleXIfExpression EOF ;
+    // InternalPerspectiveDsl.g:1669:1: entryRuleXIfExpression : ruleXIfExpression EOF ;
     public final void entryRuleXIfExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1668:1: ( ruleXIfExpression EOF )
-            // InternalPerspectiveDsl.g:1669:1: ruleXIfExpression EOF
+            // InternalPerspectiveDsl.g:1670:1: ( ruleXIfExpression EOF )
+            // InternalPerspectiveDsl.g:1671:1: ruleXIfExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionRule()); 
@@ -5621,23 +5621,23 @@
 
 
     // $ANTLR start "ruleXIfExpression"
-    // InternalPerspectiveDsl.g:1676:1: ruleXIfExpression : ( ( rule__XIfExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1678:1: ruleXIfExpression : ( ( rule__XIfExpression__Group__0 ) ) ;
     public final void ruleXIfExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1680:2: ( ( ( rule__XIfExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1681:2: ( ( rule__XIfExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1682:2: ( ( ( rule__XIfExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1683:2: ( ( rule__XIfExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1681:2: ( ( rule__XIfExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:1682:3: ( rule__XIfExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1683:2: ( ( rule__XIfExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1684:3: ( rule__XIfExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1683:3: ( rule__XIfExpression__Group__0 )
-            // InternalPerspectiveDsl.g:1683:4: rule__XIfExpression__Group__0
+            // InternalPerspectiveDsl.g:1685:3: ( rule__XIfExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1685:4: rule__XIfExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XIfExpression__Group__0();
@@ -5672,11 +5672,11 @@
 
 
     // $ANTLR start "entryRuleXSwitchExpression"
-    // InternalPerspectiveDsl.g:1692:1: entryRuleXSwitchExpression : ruleXSwitchExpression EOF ;
+    // InternalPerspectiveDsl.g:1694:1: entryRuleXSwitchExpression : ruleXSwitchExpression EOF ;
     public final void entryRuleXSwitchExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1693:1: ( ruleXSwitchExpression EOF )
-            // InternalPerspectiveDsl.g:1694:1: ruleXSwitchExpression EOF
+            // InternalPerspectiveDsl.g:1695:1: ( ruleXSwitchExpression EOF )
+            // InternalPerspectiveDsl.g:1696:1: ruleXSwitchExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionRule()); 
@@ -5706,23 +5706,23 @@
 
 
     // $ANTLR start "ruleXSwitchExpression"
-    // InternalPerspectiveDsl.g:1701:1: ruleXSwitchExpression : ( ( rule__XSwitchExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1703:1: ruleXSwitchExpression : ( ( rule__XSwitchExpression__Group__0 ) ) ;
     public final void ruleXSwitchExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1705:2: ( ( ( rule__XSwitchExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1706:2: ( ( rule__XSwitchExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1707:2: ( ( ( rule__XSwitchExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1708:2: ( ( rule__XSwitchExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1706:2: ( ( rule__XSwitchExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:1707:3: ( rule__XSwitchExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1708:2: ( ( rule__XSwitchExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1709:3: ( rule__XSwitchExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1708:3: ( rule__XSwitchExpression__Group__0 )
-            // InternalPerspectiveDsl.g:1708:4: rule__XSwitchExpression__Group__0
+            // InternalPerspectiveDsl.g:1710:3: ( rule__XSwitchExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1710:4: rule__XSwitchExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group__0();
@@ -5757,11 +5757,11 @@
 
 
     // $ANTLR start "entryRuleXCasePart"
-    // InternalPerspectiveDsl.g:1717:1: entryRuleXCasePart : ruleXCasePart EOF ;
+    // InternalPerspectiveDsl.g:1719:1: entryRuleXCasePart : ruleXCasePart EOF ;
     public final void entryRuleXCasePart() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1718:1: ( ruleXCasePart EOF )
-            // InternalPerspectiveDsl.g:1719:1: ruleXCasePart EOF
+            // InternalPerspectiveDsl.g:1720:1: ( ruleXCasePart EOF )
+            // InternalPerspectiveDsl.g:1721:1: ruleXCasePart EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartRule()); 
@@ -5791,23 +5791,23 @@
 
 
     // $ANTLR start "ruleXCasePart"
-    // InternalPerspectiveDsl.g:1726:1: ruleXCasePart : ( ( rule__XCasePart__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1728:1: ruleXCasePart : ( ( rule__XCasePart__Group__0 ) ) ;
     public final void ruleXCasePart() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1730:2: ( ( ( rule__XCasePart__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1731:2: ( ( rule__XCasePart__Group__0 ) )
+            // InternalPerspectiveDsl.g:1732:2: ( ( ( rule__XCasePart__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1733:2: ( ( rule__XCasePart__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1731:2: ( ( rule__XCasePart__Group__0 ) )
-            // InternalPerspectiveDsl.g:1732:3: ( rule__XCasePart__Group__0 )
+            // InternalPerspectiveDsl.g:1733:2: ( ( rule__XCasePart__Group__0 ) )
+            // InternalPerspectiveDsl.g:1734:3: ( rule__XCasePart__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1733:3: ( rule__XCasePart__Group__0 )
-            // InternalPerspectiveDsl.g:1733:4: rule__XCasePart__Group__0
+            // InternalPerspectiveDsl.g:1735:3: ( rule__XCasePart__Group__0 )
+            // InternalPerspectiveDsl.g:1735:4: rule__XCasePart__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XCasePart__Group__0();
@@ -5842,11 +5842,11 @@
 
 
     // $ANTLR start "entryRuleXForLoopExpression"
-    // InternalPerspectiveDsl.g:1742:1: entryRuleXForLoopExpression : ruleXForLoopExpression EOF ;
+    // InternalPerspectiveDsl.g:1744:1: entryRuleXForLoopExpression : ruleXForLoopExpression EOF ;
     public final void entryRuleXForLoopExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1743:1: ( ruleXForLoopExpression EOF )
-            // InternalPerspectiveDsl.g:1744:1: ruleXForLoopExpression EOF
+            // InternalPerspectiveDsl.g:1745:1: ( ruleXForLoopExpression EOF )
+            // InternalPerspectiveDsl.g:1746:1: ruleXForLoopExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionRule()); 
@@ -5876,23 +5876,23 @@
 
 
     // $ANTLR start "ruleXForLoopExpression"
-    // InternalPerspectiveDsl.g:1751:1: ruleXForLoopExpression : ( ( rule__XForLoopExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1753:1: ruleXForLoopExpression : ( ( rule__XForLoopExpression__Group__0 ) ) ;
     public final void ruleXForLoopExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1755:2: ( ( ( rule__XForLoopExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1756:2: ( ( rule__XForLoopExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1757:2: ( ( ( rule__XForLoopExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1758:2: ( ( rule__XForLoopExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1756:2: ( ( rule__XForLoopExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:1757:3: ( rule__XForLoopExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1758:2: ( ( rule__XForLoopExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1759:3: ( rule__XForLoopExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1758:3: ( rule__XForLoopExpression__Group__0 )
-            // InternalPerspectiveDsl.g:1758:4: rule__XForLoopExpression__Group__0
+            // InternalPerspectiveDsl.g:1760:3: ( rule__XForLoopExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1760:4: rule__XForLoopExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XForLoopExpression__Group__0();
@@ -5927,11 +5927,11 @@
 
 
     // $ANTLR start "entryRuleXBasicForLoopExpression"
-    // InternalPerspectiveDsl.g:1767:1: entryRuleXBasicForLoopExpression : ruleXBasicForLoopExpression EOF ;
+    // InternalPerspectiveDsl.g:1769:1: entryRuleXBasicForLoopExpression : ruleXBasicForLoopExpression EOF ;
     public final void entryRuleXBasicForLoopExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1768:1: ( ruleXBasicForLoopExpression EOF )
-            // InternalPerspectiveDsl.g:1769:1: ruleXBasicForLoopExpression EOF
+            // InternalPerspectiveDsl.g:1770:1: ( ruleXBasicForLoopExpression EOF )
+            // InternalPerspectiveDsl.g:1771:1: ruleXBasicForLoopExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionRule()); 
@@ -5961,23 +5961,23 @@
 
 
     // $ANTLR start "ruleXBasicForLoopExpression"
-    // InternalPerspectiveDsl.g:1776:1: ruleXBasicForLoopExpression : ( ( rule__XBasicForLoopExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1778:1: ruleXBasicForLoopExpression : ( ( rule__XBasicForLoopExpression__Group__0 ) ) ;
     public final void ruleXBasicForLoopExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1780:2: ( ( ( rule__XBasicForLoopExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1781:2: ( ( rule__XBasicForLoopExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1782:2: ( ( ( rule__XBasicForLoopExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1783:2: ( ( rule__XBasicForLoopExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1781:2: ( ( rule__XBasicForLoopExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:1782:3: ( rule__XBasicForLoopExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1783:2: ( ( rule__XBasicForLoopExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1784:3: ( rule__XBasicForLoopExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1783:3: ( rule__XBasicForLoopExpression__Group__0 )
-            // InternalPerspectiveDsl.g:1783:4: rule__XBasicForLoopExpression__Group__0
+            // InternalPerspectiveDsl.g:1785:3: ( rule__XBasicForLoopExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1785:4: rule__XBasicForLoopExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__Group__0();
@@ -6012,11 +6012,11 @@
 
 
     // $ANTLR start "entryRuleXWhileExpression"
-    // InternalPerspectiveDsl.g:1792:1: entryRuleXWhileExpression : ruleXWhileExpression EOF ;
+    // InternalPerspectiveDsl.g:1794:1: entryRuleXWhileExpression : ruleXWhileExpression EOF ;
     public final void entryRuleXWhileExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1793:1: ( ruleXWhileExpression EOF )
-            // InternalPerspectiveDsl.g:1794:1: ruleXWhileExpression EOF
+            // InternalPerspectiveDsl.g:1795:1: ( ruleXWhileExpression EOF )
+            // InternalPerspectiveDsl.g:1796:1: ruleXWhileExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionRule()); 
@@ -6046,23 +6046,23 @@
 
 
     // $ANTLR start "ruleXWhileExpression"
-    // InternalPerspectiveDsl.g:1801:1: ruleXWhileExpression : ( ( rule__XWhileExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1803:1: ruleXWhileExpression : ( ( rule__XWhileExpression__Group__0 ) ) ;
     public final void ruleXWhileExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1805:2: ( ( ( rule__XWhileExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1806:2: ( ( rule__XWhileExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1807:2: ( ( ( rule__XWhileExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1808:2: ( ( rule__XWhileExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1806:2: ( ( rule__XWhileExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:1807:3: ( rule__XWhileExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1808:2: ( ( rule__XWhileExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1809:3: ( rule__XWhileExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1808:3: ( rule__XWhileExpression__Group__0 )
-            // InternalPerspectiveDsl.g:1808:4: rule__XWhileExpression__Group__0
+            // InternalPerspectiveDsl.g:1810:3: ( rule__XWhileExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1810:4: rule__XWhileExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XWhileExpression__Group__0();
@@ -6097,11 +6097,11 @@
 
 
     // $ANTLR start "entryRuleXDoWhileExpression"
-    // InternalPerspectiveDsl.g:1817:1: entryRuleXDoWhileExpression : ruleXDoWhileExpression EOF ;
+    // InternalPerspectiveDsl.g:1819:1: entryRuleXDoWhileExpression : ruleXDoWhileExpression EOF ;
     public final void entryRuleXDoWhileExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1818:1: ( ruleXDoWhileExpression EOF )
-            // InternalPerspectiveDsl.g:1819:1: ruleXDoWhileExpression EOF
+            // InternalPerspectiveDsl.g:1820:1: ( ruleXDoWhileExpression EOF )
+            // InternalPerspectiveDsl.g:1821:1: ruleXDoWhileExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionRule()); 
@@ -6131,23 +6131,23 @@
 
 
     // $ANTLR start "ruleXDoWhileExpression"
-    // InternalPerspectiveDsl.g:1826:1: ruleXDoWhileExpression : ( ( rule__XDoWhileExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1828:1: ruleXDoWhileExpression : ( ( rule__XDoWhileExpression__Group__0 ) ) ;
     public final void ruleXDoWhileExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1830:2: ( ( ( rule__XDoWhileExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1831:2: ( ( rule__XDoWhileExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1832:2: ( ( ( rule__XDoWhileExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1833:2: ( ( rule__XDoWhileExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1831:2: ( ( rule__XDoWhileExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:1832:3: ( rule__XDoWhileExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1833:2: ( ( rule__XDoWhileExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1834:3: ( rule__XDoWhileExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1833:3: ( rule__XDoWhileExpression__Group__0 )
-            // InternalPerspectiveDsl.g:1833:4: rule__XDoWhileExpression__Group__0
+            // InternalPerspectiveDsl.g:1835:3: ( rule__XDoWhileExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1835:4: rule__XDoWhileExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XDoWhileExpression__Group__0();
@@ -6182,11 +6182,11 @@
 
 
     // $ANTLR start "entryRuleXBlockExpression"
-    // InternalPerspectiveDsl.g:1842:1: entryRuleXBlockExpression : ruleXBlockExpression EOF ;
+    // InternalPerspectiveDsl.g:1844:1: entryRuleXBlockExpression : ruleXBlockExpression EOF ;
     public final void entryRuleXBlockExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1843:1: ( ruleXBlockExpression EOF )
-            // InternalPerspectiveDsl.g:1844:1: ruleXBlockExpression EOF
+            // InternalPerspectiveDsl.g:1845:1: ( ruleXBlockExpression EOF )
+            // InternalPerspectiveDsl.g:1846:1: ruleXBlockExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBlockExpressionRule()); 
@@ -6216,23 +6216,23 @@
 
 
     // $ANTLR start "ruleXBlockExpression"
-    // InternalPerspectiveDsl.g:1851:1: ruleXBlockExpression : ( ( rule__XBlockExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1853:1: ruleXBlockExpression : ( ( rule__XBlockExpression__Group__0 ) ) ;
     public final void ruleXBlockExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1855:2: ( ( ( rule__XBlockExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1856:2: ( ( rule__XBlockExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1857:2: ( ( ( rule__XBlockExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1858:2: ( ( rule__XBlockExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1856:2: ( ( rule__XBlockExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:1857:3: ( rule__XBlockExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1858:2: ( ( rule__XBlockExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:1859:3: ( rule__XBlockExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBlockExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1858:3: ( rule__XBlockExpression__Group__0 )
-            // InternalPerspectiveDsl.g:1858:4: rule__XBlockExpression__Group__0
+            // InternalPerspectiveDsl.g:1860:3: ( rule__XBlockExpression__Group__0 )
+            // InternalPerspectiveDsl.g:1860:4: rule__XBlockExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XBlockExpression__Group__0();
@@ -6267,11 +6267,11 @@
 
 
     // $ANTLR start "entryRuleXExpressionOrVarDeclaration"
-    // InternalPerspectiveDsl.g:1867:1: entryRuleXExpressionOrVarDeclaration : ruleXExpressionOrVarDeclaration EOF ;
+    // InternalPerspectiveDsl.g:1869:1: entryRuleXExpressionOrVarDeclaration : ruleXExpressionOrVarDeclaration EOF ;
     public final void entryRuleXExpressionOrVarDeclaration() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1868:1: ( ruleXExpressionOrVarDeclaration EOF )
-            // InternalPerspectiveDsl.g:1869:1: ruleXExpressionOrVarDeclaration EOF
+            // InternalPerspectiveDsl.g:1870:1: ( ruleXExpressionOrVarDeclaration EOF )
+            // InternalPerspectiveDsl.g:1871:1: ruleXExpressionOrVarDeclaration EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionOrVarDeclarationRule()); 
@@ -6301,23 +6301,23 @@
 
 
     // $ANTLR start "ruleXExpressionOrVarDeclaration"
-    // InternalPerspectiveDsl.g:1876:1: ruleXExpressionOrVarDeclaration : ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:1878:1: ruleXExpressionOrVarDeclaration : ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) ;
     public final void ruleXExpressionOrVarDeclaration() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1880:2: ( ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:1881:2: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
+            // InternalPerspectiveDsl.g:1882:2: ( ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:1883:2: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:1881:2: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
-            // InternalPerspectiveDsl.g:1882:3: ( rule__XExpressionOrVarDeclaration__Alternatives )
+            // InternalPerspectiveDsl.g:1883:2: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
+            // InternalPerspectiveDsl.g:1884:3: ( rule__XExpressionOrVarDeclaration__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:1883:3: ( rule__XExpressionOrVarDeclaration__Alternatives )
-            // InternalPerspectiveDsl.g:1883:4: rule__XExpressionOrVarDeclaration__Alternatives
+            // InternalPerspectiveDsl.g:1885:3: ( rule__XExpressionOrVarDeclaration__Alternatives )
+            // InternalPerspectiveDsl.g:1885:4: rule__XExpressionOrVarDeclaration__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__XExpressionOrVarDeclaration__Alternatives();
@@ -6352,11 +6352,11 @@
 
 
     // $ANTLR start "entryRuleXVariableDeclaration"
-    // InternalPerspectiveDsl.g:1892:1: entryRuleXVariableDeclaration : ruleXVariableDeclaration EOF ;
+    // InternalPerspectiveDsl.g:1894:1: entryRuleXVariableDeclaration : ruleXVariableDeclaration EOF ;
     public final void entryRuleXVariableDeclaration() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1893:1: ( ruleXVariableDeclaration EOF )
-            // InternalPerspectiveDsl.g:1894:1: ruleXVariableDeclaration EOF
+            // InternalPerspectiveDsl.g:1895:1: ( ruleXVariableDeclaration EOF )
+            // InternalPerspectiveDsl.g:1896:1: ruleXVariableDeclaration EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationRule()); 
@@ -6386,23 +6386,23 @@
 
 
     // $ANTLR start "ruleXVariableDeclaration"
-    // InternalPerspectiveDsl.g:1901:1: ruleXVariableDeclaration : ( ( rule__XVariableDeclaration__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1903:1: ruleXVariableDeclaration : ( ( rule__XVariableDeclaration__Group__0 ) ) ;
     public final void ruleXVariableDeclaration() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1905:2: ( ( ( rule__XVariableDeclaration__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1906:2: ( ( rule__XVariableDeclaration__Group__0 ) )
+            // InternalPerspectiveDsl.g:1907:2: ( ( ( rule__XVariableDeclaration__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1908:2: ( ( rule__XVariableDeclaration__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1906:2: ( ( rule__XVariableDeclaration__Group__0 ) )
-            // InternalPerspectiveDsl.g:1907:3: ( rule__XVariableDeclaration__Group__0 )
+            // InternalPerspectiveDsl.g:1908:2: ( ( rule__XVariableDeclaration__Group__0 ) )
+            // InternalPerspectiveDsl.g:1909:3: ( rule__XVariableDeclaration__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1908:3: ( rule__XVariableDeclaration__Group__0 )
-            // InternalPerspectiveDsl.g:1908:4: rule__XVariableDeclaration__Group__0
+            // InternalPerspectiveDsl.g:1910:3: ( rule__XVariableDeclaration__Group__0 )
+            // InternalPerspectiveDsl.g:1910:4: rule__XVariableDeclaration__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__Group__0();
@@ -6437,11 +6437,11 @@
 
 
     // $ANTLR start "entryRuleJvmFormalParameter"
-    // InternalPerspectiveDsl.g:1917:1: entryRuleJvmFormalParameter : ruleJvmFormalParameter EOF ;
+    // InternalPerspectiveDsl.g:1919:1: entryRuleJvmFormalParameter : ruleJvmFormalParameter EOF ;
     public final void entryRuleJvmFormalParameter() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1918:1: ( ruleJvmFormalParameter EOF )
-            // InternalPerspectiveDsl.g:1919:1: ruleJvmFormalParameter EOF
+            // InternalPerspectiveDsl.g:1920:1: ( ruleJvmFormalParameter EOF )
+            // InternalPerspectiveDsl.g:1921:1: ruleJvmFormalParameter EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmFormalParameterRule()); 
@@ -6471,23 +6471,23 @@
 
 
     // $ANTLR start "ruleJvmFormalParameter"
-    // InternalPerspectiveDsl.g:1926:1: ruleJvmFormalParameter : ( ( rule__JvmFormalParameter__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1928:1: ruleJvmFormalParameter : ( ( rule__JvmFormalParameter__Group__0 ) ) ;
     public final void ruleJvmFormalParameter() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1930:2: ( ( ( rule__JvmFormalParameter__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1931:2: ( ( rule__JvmFormalParameter__Group__0 ) )
+            // InternalPerspectiveDsl.g:1932:2: ( ( ( rule__JvmFormalParameter__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1933:2: ( ( rule__JvmFormalParameter__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1931:2: ( ( rule__JvmFormalParameter__Group__0 ) )
-            // InternalPerspectiveDsl.g:1932:3: ( rule__JvmFormalParameter__Group__0 )
+            // InternalPerspectiveDsl.g:1933:2: ( ( rule__JvmFormalParameter__Group__0 ) )
+            // InternalPerspectiveDsl.g:1934:3: ( rule__JvmFormalParameter__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmFormalParameterAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1933:3: ( rule__JvmFormalParameter__Group__0 )
-            // InternalPerspectiveDsl.g:1933:4: rule__JvmFormalParameter__Group__0
+            // InternalPerspectiveDsl.g:1935:3: ( rule__JvmFormalParameter__Group__0 )
+            // InternalPerspectiveDsl.g:1935:4: rule__JvmFormalParameter__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmFormalParameter__Group__0();
@@ -6522,11 +6522,11 @@
 
 
     // $ANTLR start "entryRuleFullJvmFormalParameter"
-    // InternalPerspectiveDsl.g:1942:1: entryRuleFullJvmFormalParameter : ruleFullJvmFormalParameter EOF ;
+    // InternalPerspectiveDsl.g:1944:1: entryRuleFullJvmFormalParameter : ruleFullJvmFormalParameter EOF ;
     public final void entryRuleFullJvmFormalParameter() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1943:1: ( ruleFullJvmFormalParameter EOF )
-            // InternalPerspectiveDsl.g:1944:1: ruleFullJvmFormalParameter EOF
+            // InternalPerspectiveDsl.g:1945:1: ( ruleFullJvmFormalParameter EOF )
+            // InternalPerspectiveDsl.g:1946:1: ruleFullJvmFormalParameter EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFullJvmFormalParameterRule()); 
@@ -6556,23 +6556,23 @@
 
 
     // $ANTLR start "ruleFullJvmFormalParameter"
-    // InternalPerspectiveDsl.g:1951:1: ruleFullJvmFormalParameter : ( ( rule__FullJvmFormalParameter__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1953:1: ruleFullJvmFormalParameter : ( ( rule__FullJvmFormalParameter__Group__0 ) ) ;
     public final void ruleFullJvmFormalParameter() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1955:2: ( ( ( rule__FullJvmFormalParameter__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1956:2: ( ( rule__FullJvmFormalParameter__Group__0 ) )
+            // InternalPerspectiveDsl.g:1957:2: ( ( ( rule__FullJvmFormalParameter__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1958:2: ( ( rule__FullJvmFormalParameter__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1956:2: ( ( rule__FullJvmFormalParameter__Group__0 ) )
-            // InternalPerspectiveDsl.g:1957:3: ( rule__FullJvmFormalParameter__Group__0 )
+            // InternalPerspectiveDsl.g:1958:2: ( ( rule__FullJvmFormalParameter__Group__0 ) )
+            // InternalPerspectiveDsl.g:1959:3: ( rule__FullJvmFormalParameter__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1958:3: ( rule__FullJvmFormalParameter__Group__0 )
-            // InternalPerspectiveDsl.g:1958:4: rule__FullJvmFormalParameter__Group__0
+            // InternalPerspectiveDsl.g:1960:3: ( rule__FullJvmFormalParameter__Group__0 )
+            // InternalPerspectiveDsl.g:1960:4: rule__FullJvmFormalParameter__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__FullJvmFormalParameter__Group__0();
@@ -6607,11 +6607,11 @@
 
 
     // $ANTLR start "entryRuleXFeatureCall"
-    // InternalPerspectiveDsl.g:1967:1: entryRuleXFeatureCall : ruleXFeatureCall EOF ;
+    // InternalPerspectiveDsl.g:1969:1: entryRuleXFeatureCall : ruleXFeatureCall EOF ;
     public final void entryRuleXFeatureCall() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1968:1: ( ruleXFeatureCall EOF )
-            // InternalPerspectiveDsl.g:1969:1: ruleXFeatureCall EOF
+            // InternalPerspectiveDsl.g:1970:1: ( ruleXFeatureCall EOF )
+            // InternalPerspectiveDsl.g:1971:1: ruleXFeatureCall EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallRule()); 
@@ -6641,23 +6641,23 @@
 
 
     // $ANTLR start "ruleXFeatureCall"
-    // InternalPerspectiveDsl.g:1976:1: ruleXFeatureCall : ( ( rule__XFeatureCall__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:1978:1: ruleXFeatureCall : ( ( rule__XFeatureCall__Group__0 ) ) ;
     public final void ruleXFeatureCall() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:1980:2: ( ( ( rule__XFeatureCall__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:1981:2: ( ( rule__XFeatureCall__Group__0 ) )
+            // InternalPerspectiveDsl.g:1982:2: ( ( ( rule__XFeatureCall__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:1983:2: ( ( rule__XFeatureCall__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:1981:2: ( ( rule__XFeatureCall__Group__0 ) )
-            // InternalPerspectiveDsl.g:1982:3: ( rule__XFeatureCall__Group__0 )
+            // InternalPerspectiveDsl.g:1983:2: ( ( rule__XFeatureCall__Group__0 ) )
+            // InternalPerspectiveDsl.g:1984:3: ( rule__XFeatureCall__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:1983:3: ( rule__XFeatureCall__Group__0 )
-            // InternalPerspectiveDsl.g:1983:4: rule__XFeatureCall__Group__0
+            // InternalPerspectiveDsl.g:1985:3: ( rule__XFeatureCall__Group__0 )
+            // InternalPerspectiveDsl.g:1985:4: rule__XFeatureCall__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__Group__0();
@@ -6692,11 +6692,11 @@
 
 
     // $ANTLR start "entryRuleFeatureCallID"
-    // InternalPerspectiveDsl.g:1992:1: entryRuleFeatureCallID : ruleFeatureCallID EOF ;
+    // InternalPerspectiveDsl.g:1994:1: entryRuleFeatureCallID : ruleFeatureCallID EOF ;
     public final void entryRuleFeatureCallID() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:1993:1: ( ruleFeatureCallID EOF )
-            // InternalPerspectiveDsl.g:1994:1: ruleFeatureCallID EOF
+            // InternalPerspectiveDsl.g:1995:1: ( ruleFeatureCallID EOF )
+            // InternalPerspectiveDsl.g:1996:1: ruleFeatureCallID EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFeatureCallIDRule()); 
@@ -6726,23 +6726,23 @@
 
 
     // $ANTLR start "ruleFeatureCallID"
-    // InternalPerspectiveDsl.g:2001:1: ruleFeatureCallID : ( ( rule__FeatureCallID__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:2003:1: ruleFeatureCallID : ( ( rule__FeatureCallID__Alternatives ) ) ;
     public final void ruleFeatureCallID() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2005:2: ( ( ( rule__FeatureCallID__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:2006:2: ( ( rule__FeatureCallID__Alternatives ) )
+            // InternalPerspectiveDsl.g:2007:2: ( ( ( rule__FeatureCallID__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:2008:2: ( ( rule__FeatureCallID__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:2006:2: ( ( rule__FeatureCallID__Alternatives ) )
-            // InternalPerspectiveDsl.g:2007:3: ( rule__FeatureCallID__Alternatives )
+            // InternalPerspectiveDsl.g:2008:2: ( ( rule__FeatureCallID__Alternatives ) )
+            // InternalPerspectiveDsl.g:2009:3: ( rule__FeatureCallID__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFeatureCallIDAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:2008:3: ( rule__FeatureCallID__Alternatives )
-            // InternalPerspectiveDsl.g:2008:4: rule__FeatureCallID__Alternatives
+            // InternalPerspectiveDsl.g:2010:3: ( rule__FeatureCallID__Alternatives )
+            // InternalPerspectiveDsl.g:2010:4: rule__FeatureCallID__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__FeatureCallID__Alternatives();
@@ -6777,11 +6777,11 @@
 
 
     // $ANTLR start "entryRuleIdOrSuper"
-    // InternalPerspectiveDsl.g:2017:1: entryRuleIdOrSuper : ruleIdOrSuper EOF ;
+    // InternalPerspectiveDsl.g:2019:1: entryRuleIdOrSuper : ruleIdOrSuper EOF ;
     public final void entryRuleIdOrSuper() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2018:1: ( ruleIdOrSuper EOF )
-            // InternalPerspectiveDsl.g:2019:1: ruleIdOrSuper EOF
+            // InternalPerspectiveDsl.g:2020:1: ( ruleIdOrSuper EOF )
+            // InternalPerspectiveDsl.g:2021:1: ruleIdOrSuper EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIdOrSuperRule()); 
@@ -6811,23 +6811,23 @@
 
 
     // $ANTLR start "ruleIdOrSuper"
-    // InternalPerspectiveDsl.g:2026:1: ruleIdOrSuper : ( ( rule__IdOrSuper__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:2028:1: ruleIdOrSuper : ( ( rule__IdOrSuper__Alternatives ) ) ;
     public final void ruleIdOrSuper() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2030:2: ( ( ( rule__IdOrSuper__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:2031:2: ( ( rule__IdOrSuper__Alternatives ) )
+            // InternalPerspectiveDsl.g:2032:2: ( ( ( rule__IdOrSuper__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:2033:2: ( ( rule__IdOrSuper__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:2031:2: ( ( rule__IdOrSuper__Alternatives ) )
-            // InternalPerspectiveDsl.g:2032:3: ( rule__IdOrSuper__Alternatives )
+            // InternalPerspectiveDsl.g:2033:2: ( ( rule__IdOrSuper__Alternatives ) )
+            // InternalPerspectiveDsl.g:2034:3: ( rule__IdOrSuper__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIdOrSuperAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:2033:3: ( rule__IdOrSuper__Alternatives )
-            // InternalPerspectiveDsl.g:2033:4: rule__IdOrSuper__Alternatives
+            // InternalPerspectiveDsl.g:2035:3: ( rule__IdOrSuper__Alternatives )
+            // InternalPerspectiveDsl.g:2035:4: rule__IdOrSuper__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__IdOrSuper__Alternatives();
@@ -6862,11 +6862,11 @@
 
 
     // $ANTLR start "entryRuleXConstructorCall"
-    // InternalPerspectiveDsl.g:2042:1: entryRuleXConstructorCall : ruleXConstructorCall EOF ;
+    // InternalPerspectiveDsl.g:2044:1: entryRuleXConstructorCall : ruleXConstructorCall EOF ;
     public final void entryRuleXConstructorCall() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2043:1: ( ruleXConstructorCall EOF )
-            // InternalPerspectiveDsl.g:2044:1: ruleXConstructorCall EOF
+            // InternalPerspectiveDsl.g:2045:1: ( ruleXConstructorCall EOF )
+            // InternalPerspectiveDsl.g:2046:1: ruleXConstructorCall EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallRule()); 
@@ -6896,23 +6896,23 @@
 
 
     // $ANTLR start "ruleXConstructorCall"
-    // InternalPerspectiveDsl.g:2051:1: ruleXConstructorCall : ( ( rule__XConstructorCall__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2053:1: ruleXConstructorCall : ( ( rule__XConstructorCall__Group__0 ) ) ;
     public final void ruleXConstructorCall() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2055:2: ( ( ( rule__XConstructorCall__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2056:2: ( ( rule__XConstructorCall__Group__0 ) )
+            // InternalPerspectiveDsl.g:2057:2: ( ( ( rule__XConstructorCall__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2058:2: ( ( rule__XConstructorCall__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2056:2: ( ( rule__XConstructorCall__Group__0 ) )
-            // InternalPerspectiveDsl.g:2057:3: ( rule__XConstructorCall__Group__0 )
+            // InternalPerspectiveDsl.g:2058:2: ( ( rule__XConstructorCall__Group__0 ) )
+            // InternalPerspectiveDsl.g:2059:3: ( rule__XConstructorCall__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2058:3: ( rule__XConstructorCall__Group__0 )
-            // InternalPerspectiveDsl.g:2058:4: rule__XConstructorCall__Group__0
+            // InternalPerspectiveDsl.g:2060:3: ( rule__XConstructorCall__Group__0 )
+            // InternalPerspectiveDsl.g:2060:4: rule__XConstructorCall__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__Group__0();
@@ -6947,11 +6947,11 @@
 
 
     // $ANTLR start "entryRuleXBooleanLiteral"
-    // InternalPerspectiveDsl.g:2067:1: entryRuleXBooleanLiteral : ruleXBooleanLiteral EOF ;
+    // InternalPerspectiveDsl.g:2069:1: entryRuleXBooleanLiteral : ruleXBooleanLiteral EOF ;
     public final void entryRuleXBooleanLiteral() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2068:1: ( ruleXBooleanLiteral EOF )
-            // InternalPerspectiveDsl.g:2069:1: ruleXBooleanLiteral EOF
+            // InternalPerspectiveDsl.g:2070:1: ( ruleXBooleanLiteral EOF )
+            // InternalPerspectiveDsl.g:2071:1: ruleXBooleanLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBooleanLiteralRule()); 
@@ -6981,23 +6981,23 @@
 
 
     // $ANTLR start "ruleXBooleanLiteral"
-    // InternalPerspectiveDsl.g:2076:1: ruleXBooleanLiteral : ( ( rule__XBooleanLiteral__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2078:1: ruleXBooleanLiteral : ( ( rule__XBooleanLiteral__Group__0 ) ) ;
     public final void ruleXBooleanLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2080:2: ( ( ( rule__XBooleanLiteral__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2081:2: ( ( rule__XBooleanLiteral__Group__0 ) )
+            // InternalPerspectiveDsl.g:2082:2: ( ( ( rule__XBooleanLiteral__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2083:2: ( ( rule__XBooleanLiteral__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2081:2: ( ( rule__XBooleanLiteral__Group__0 ) )
-            // InternalPerspectiveDsl.g:2082:3: ( rule__XBooleanLiteral__Group__0 )
+            // InternalPerspectiveDsl.g:2083:2: ( ( rule__XBooleanLiteral__Group__0 ) )
+            // InternalPerspectiveDsl.g:2084:3: ( rule__XBooleanLiteral__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBooleanLiteralAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2083:3: ( rule__XBooleanLiteral__Group__0 )
-            // InternalPerspectiveDsl.g:2083:4: rule__XBooleanLiteral__Group__0
+            // InternalPerspectiveDsl.g:2085:3: ( rule__XBooleanLiteral__Group__0 )
+            // InternalPerspectiveDsl.g:2085:4: rule__XBooleanLiteral__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XBooleanLiteral__Group__0();
@@ -7032,11 +7032,11 @@
 
 
     // $ANTLR start "entryRuleXNullLiteral"
-    // InternalPerspectiveDsl.g:2092:1: entryRuleXNullLiteral : ruleXNullLiteral EOF ;
+    // InternalPerspectiveDsl.g:2094:1: entryRuleXNullLiteral : ruleXNullLiteral EOF ;
     public final void entryRuleXNullLiteral() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2093:1: ( ruleXNullLiteral EOF )
-            // InternalPerspectiveDsl.g:2094:1: ruleXNullLiteral EOF
+            // InternalPerspectiveDsl.g:2095:1: ( ruleXNullLiteral EOF )
+            // InternalPerspectiveDsl.g:2096:1: ruleXNullLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXNullLiteralRule()); 
@@ -7066,23 +7066,23 @@
 
 
     // $ANTLR start "ruleXNullLiteral"
-    // InternalPerspectiveDsl.g:2101:1: ruleXNullLiteral : ( ( rule__XNullLiteral__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2103:1: ruleXNullLiteral : ( ( rule__XNullLiteral__Group__0 ) ) ;
     public final void ruleXNullLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2105:2: ( ( ( rule__XNullLiteral__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2106:2: ( ( rule__XNullLiteral__Group__0 ) )
+            // InternalPerspectiveDsl.g:2107:2: ( ( ( rule__XNullLiteral__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2108:2: ( ( rule__XNullLiteral__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2106:2: ( ( rule__XNullLiteral__Group__0 ) )
-            // InternalPerspectiveDsl.g:2107:3: ( rule__XNullLiteral__Group__0 )
+            // InternalPerspectiveDsl.g:2108:2: ( ( rule__XNullLiteral__Group__0 ) )
+            // InternalPerspectiveDsl.g:2109:3: ( rule__XNullLiteral__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXNullLiteralAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2108:3: ( rule__XNullLiteral__Group__0 )
-            // InternalPerspectiveDsl.g:2108:4: rule__XNullLiteral__Group__0
+            // InternalPerspectiveDsl.g:2110:3: ( rule__XNullLiteral__Group__0 )
+            // InternalPerspectiveDsl.g:2110:4: rule__XNullLiteral__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XNullLiteral__Group__0();
@@ -7117,11 +7117,11 @@
 
 
     // $ANTLR start "entryRuleXNumberLiteral"
-    // InternalPerspectiveDsl.g:2117:1: entryRuleXNumberLiteral : ruleXNumberLiteral EOF ;
+    // InternalPerspectiveDsl.g:2119:1: entryRuleXNumberLiteral : ruleXNumberLiteral EOF ;
     public final void entryRuleXNumberLiteral() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2118:1: ( ruleXNumberLiteral EOF )
-            // InternalPerspectiveDsl.g:2119:1: ruleXNumberLiteral EOF
+            // InternalPerspectiveDsl.g:2120:1: ( ruleXNumberLiteral EOF )
+            // InternalPerspectiveDsl.g:2121:1: ruleXNumberLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXNumberLiteralRule()); 
@@ -7151,23 +7151,23 @@
 
 
     // $ANTLR start "ruleXNumberLiteral"
-    // InternalPerspectiveDsl.g:2126:1: ruleXNumberLiteral : ( ( rule__XNumberLiteral__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2128:1: ruleXNumberLiteral : ( ( rule__XNumberLiteral__Group__0 ) ) ;
     public final void ruleXNumberLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2130:2: ( ( ( rule__XNumberLiteral__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2131:2: ( ( rule__XNumberLiteral__Group__0 ) )
+            // InternalPerspectiveDsl.g:2132:2: ( ( ( rule__XNumberLiteral__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2133:2: ( ( rule__XNumberLiteral__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2131:2: ( ( rule__XNumberLiteral__Group__0 ) )
-            // InternalPerspectiveDsl.g:2132:3: ( rule__XNumberLiteral__Group__0 )
+            // InternalPerspectiveDsl.g:2133:2: ( ( rule__XNumberLiteral__Group__0 ) )
+            // InternalPerspectiveDsl.g:2134:3: ( rule__XNumberLiteral__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXNumberLiteralAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2133:3: ( rule__XNumberLiteral__Group__0 )
-            // InternalPerspectiveDsl.g:2133:4: rule__XNumberLiteral__Group__0
+            // InternalPerspectiveDsl.g:2135:3: ( rule__XNumberLiteral__Group__0 )
+            // InternalPerspectiveDsl.g:2135:4: rule__XNumberLiteral__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XNumberLiteral__Group__0();
@@ -7202,11 +7202,11 @@
 
 
     // $ANTLR start "entryRuleXStringLiteral"
-    // InternalPerspectiveDsl.g:2142:1: entryRuleXStringLiteral : ruleXStringLiteral EOF ;
+    // InternalPerspectiveDsl.g:2144:1: entryRuleXStringLiteral : ruleXStringLiteral EOF ;
     public final void entryRuleXStringLiteral() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2143:1: ( ruleXStringLiteral EOF )
-            // InternalPerspectiveDsl.g:2144:1: ruleXStringLiteral EOF
+            // InternalPerspectiveDsl.g:2145:1: ( ruleXStringLiteral EOF )
+            // InternalPerspectiveDsl.g:2146:1: ruleXStringLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXStringLiteralRule()); 
@@ -7236,23 +7236,23 @@
 
 
     // $ANTLR start "ruleXStringLiteral"
-    // InternalPerspectiveDsl.g:2151:1: ruleXStringLiteral : ( ( rule__XStringLiteral__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2153:1: ruleXStringLiteral : ( ( rule__XStringLiteral__Group__0 ) ) ;
     public final void ruleXStringLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2155:2: ( ( ( rule__XStringLiteral__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2156:2: ( ( rule__XStringLiteral__Group__0 ) )
+            // InternalPerspectiveDsl.g:2157:2: ( ( ( rule__XStringLiteral__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2158:2: ( ( rule__XStringLiteral__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2156:2: ( ( rule__XStringLiteral__Group__0 ) )
-            // InternalPerspectiveDsl.g:2157:3: ( rule__XStringLiteral__Group__0 )
+            // InternalPerspectiveDsl.g:2158:2: ( ( rule__XStringLiteral__Group__0 ) )
+            // InternalPerspectiveDsl.g:2159:3: ( rule__XStringLiteral__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXStringLiteralAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2158:3: ( rule__XStringLiteral__Group__0 )
-            // InternalPerspectiveDsl.g:2158:4: rule__XStringLiteral__Group__0
+            // InternalPerspectiveDsl.g:2160:3: ( rule__XStringLiteral__Group__0 )
+            // InternalPerspectiveDsl.g:2160:4: rule__XStringLiteral__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XStringLiteral__Group__0();
@@ -7287,11 +7287,11 @@
 
 
     // $ANTLR start "entryRuleXTypeLiteral"
-    // InternalPerspectiveDsl.g:2167:1: entryRuleXTypeLiteral : ruleXTypeLiteral EOF ;
+    // InternalPerspectiveDsl.g:2169:1: entryRuleXTypeLiteral : ruleXTypeLiteral EOF ;
     public final void entryRuleXTypeLiteral() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2168:1: ( ruleXTypeLiteral EOF )
-            // InternalPerspectiveDsl.g:2169:1: ruleXTypeLiteral EOF
+            // InternalPerspectiveDsl.g:2170:1: ( ruleXTypeLiteral EOF )
+            // InternalPerspectiveDsl.g:2171:1: ruleXTypeLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralRule()); 
@@ -7321,23 +7321,23 @@
 
 
     // $ANTLR start "ruleXTypeLiteral"
-    // InternalPerspectiveDsl.g:2176:1: ruleXTypeLiteral : ( ( rule__XTypeLiteral__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2178:1: ruleXTypeLiteral : ( ( rule__XTypeLiteral__Group__0 ) ) ;
     public final void ruleXTypeLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2180:2: ( ( ( rule__XTypeLiteral__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2181:2: ( ( rule__XTypeLiteral__Group__0 ) )
+            // InternalPerspectiveDsl.g:2182:2: ( ( ( rule__XTypeLiteral__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2183:2: ( ( rule__XTypeLiteral__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2181:2: ( ( rule__XTypeLiteral__Group__0 ) )
-            // InternalPerspectiveDsl.g:2182:3: ( rule__XTypeLiteral__Group__0 )
+            // InternalPerspectiveDsl.g:2183:2: ( ( rule__XTypeLiteral__Group__0 ) )
+            // InternalPerspectiveDsl.g:2184:3: ( rule__XTypeLiteral__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2183:3: ( rule__XTypeLiteral__Group__0 )
-            // InternalPerspectiveDsl.g:2183:4: rule__XTypeLiteral__Group__0
+            // InternalPerspectiveDsl.g:2185:3: ( rule__XTypeLiteral__Group__0 )
+            // InternalPerspectiveDsl.g:2185:4: rule__XTypeLiteral__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XTypeLiteral__Group__0();
@@ -7372,11 +7372,11 @@
 
 
     // $ANTLR start "entryRuleXThrowExpression"
-    // InternalPerspectiveDsl.g:2192:1: entryRuleXThrowExpression : ruleXThrowExpression EOF ;
+    // InternalPerspectiveDsl.g:2194:1: entryRuleXThrowExpression : ruleXThrowExpression EOF ;
     public final void entryRuleXThrowExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2193:1: ( ruleXThrowExpression EOF )
-            // InternalPerspectiveDsl.g:2194:1: ruleXThrowExpression EOF
+            // InternalPerspectiveDsl.g:2195:1: ( ruleXThrowExpression EOF )
+            // InternalPerspectiveDsl.g:2196:1: ruleXThrowExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXThrowExpressionRule()); 
@@ -7406,23 +7406,23 @@
 
 
     // $ANTLR start "ruleXThrowExpression"
-    // InternalPerspectiveDsl.g:2201:1: ruleXThrowExpression : ( ( rule__XThrowExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2203:1: ruleXThrowExpression : ( ( rule__XThrowExpression__Group__0 ) ) ;
     public final void ruleXThrowExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2205:2: ( ( ( rule__XThrowExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2206:2: ( ( rule__XThrowExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:2207:2: ( ( ( rule__XThrowExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2208:2: ( ( rule__XThrowExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2206:2: ( ( rule__XThrowExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:2207:3: ( rule__XThrowExpression__Group__0 )
+            // InternalPerspectiveDsl.g:2208:2: ( ( rule__XThrowExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:2209:3: ( rule__XThrowExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXThrowExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2208:3: ( rule__XThrowExpression__Group__0 )
-            // InternalPerspectiveDsl.g:2208:4: rule__XThrowExpression__Group__0
+            // InternalPerspectiveDsl.g:2210:3: ( rule__XThrowExpression__Group__0 )
+            // InternalPerspectiveDsl.g:2210:4: rule__XThrowExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XThrowExpression__Group__0();
@@ -7457,11 +7457,11 @@
 
 
     // $ANTLR start "entryRuleXReturnExpression"
-    // InternalPerspectiveDsl.g:2217:1: entryRuleXReturnExpression : ruleXReturnExpression EOF ;
+    // InternalPerspectiveDsl.g:2219:1: entryRuleXReturnExpression : ruleXReturnExpression EOF ;
     public final void entryRuleXReturnExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2218:1: ( ruleXReturnExpression EOF )
-            // InternalPerspectiveDsl.g:2219:1: ruleXReturnExpression EOF
+            // InternalPerspectiveDsl.g:2220:1: ( ruleXReturnExpression EOF )
+            // InternalPerspectiveDsl.g:2221:1: ruleXReturnExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXReturnExpressionRule()); 
@@ -7491,23 +7491,23 @@
 
 
     // $ANTLR start "ruleXReturnExpression"
-    // InternalPerspectiveDsl.g:2226:1: ruleXReturnExpression : ( ( rule__XReturnExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2228:1: ruleXReturnExpression : ( ( rule__XReturnExpression__Group__0 ) ) ;
     public final void ruleXReturnExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2230:2: ( ( ( rule__XReturnExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2231:2: ( ( rule__XReturnExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:2232:2: ( ( ( rule__XReturnExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2233:2: ( ( rule__XReturnExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2231:2: ( ( rule__XReturnExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:2232:3: ( rule__XReturnExpression__Group__0 )
+            // InternalPerspectiveDsl.g:2233:2: ( ( rule__XReturnExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:2234:3: ( rule__XReturnExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXReturnExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2233:3: ( rule__XReturnExpression__Group__0 )
-            // InternalPerspectiveDsl.g:2233:4: rule__XReturnExpression__Group__0
+            // InternalPerspectiveDsl.g:2235:3: ( rule__XReturnExpression__Group__0 )
+            // InternalPerspectiveDsl.g:2235:4: rule__XReturnExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XReturnExpression__Group__0();
@@ -7542,11 +7542,11 @@
 
 
     // $ANTLR start "entryRuleXTryCatchFinallyExpression"
-    // InternalPerspectiveDsl.g:2242:1: entryRuleXTryCatchFinallyExpression : ruleXTryCatchFinallyExpression EOF ;
+    // InternalPerspectiveDsl.g:2244:1: entryRuleXTryCatchFinallyExpression : ruleXTryCatchFinallyExpression EOF ;
     public final void entryRuleXTryCatchFinallyExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2243:1: ( ruleXTryCatchFinallyExpression EOF )
-            // InternalPerspectiveDsl.g:2244:1: ruleXTryCatchFinallyExpression EOF
+            // InternalPerspectiveDsl.g:2245:1: ( ruleXTryCatchFinallyExpression EOF )
+            // InternalPerspectiveDsl.g:2246:1: ruleXTryCatchFinallyExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionRule()); 
@@ -7576,23 +7576,23 @@
 
 
     // $ANTLR start "ruleXTryCatchFinallyExpression"
-    // InternalPerspectiveDsl.g:2251:1: ruleXTryCatchFinallyExpression : ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2253:1: ruleXTryCatchFinallyExpression : ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) ;
     public final void ruleXTryCatchFinallyExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2255:2: ( ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2256:2: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:2257:2: ( ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2258:2: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2256:2: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:2257:3: ( rule__XTryCatchFinallyExpression__Group__0 )
+            // InternalPerspectiveDsl.g:2258:2: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:2259:3: ( rule__XTryCatchFinallyExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2258:3: ( rule__XTryCatchFinallyExpression__Group__0 )
-            // InternalPerspectiveDsl.g:2258:4: rule__XTryCatchFinallyExpression__Group__0
+            // InternalPerspectiveDsl.g:2260:3: ( rule__XTryCatchFinallyExpression__Group__0 )
+            // InternalPerspectiveDsl.g:2260:4: rule__XTryCatchFinallyExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XTryCatchFinallyExpression__Group__0();
@@ -7627,11 +7627,11 @@
 
 
     // $ANTLR start "entryRuleXSynchronizedExpression"
-    // InternalPerspectiveDsl.g:2267:1: entryRuleXSynchronizedExpression : ruleXSynchronizedExpression EOF ;
+    // InternalPerspectiveDsl.g:2269:1: entryRuleXSynchronizedExpression : ruleXSynchronizedExpression EOF ;
     public final void entryRuleXSynchronizedExpression() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2268:1: ( ruleXSynchronizedExpression EOF )
-            // InternalPerspectiveDsl.g:2269:1: ruleXSynchronizedExpression EOF
+            // InternalPerspectiveDsl.g:2270:1: ( ruleXSynchronizedExpression EOF )
+            // InternalPerspectiveDsl.g:2271:1: ruleXSynchronizedExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionRule()); 
@@ -7661,23 +7661,23 @@
 
 
     // $ANTLR start "ruleXSynchronizedExpression"
-    // InternalPerspectiveDsl.g:2276:1: ruleXSynchronizedExpression : ( ( rule__XSynchronizedExpression__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2278:1: ruleXSynchronizedExpression : ( ( rule__XSynchronizedExpression__Group__0 ) ) ;
     public final void ruleXSynchronizedExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2280:2: ( ( ( rule__XSynchronizedExpression__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2281:2: ( ( rule__XSynchronizedExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:2282:2: ( ( ( rule__XSynchronizedExpression__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2283:2: ( ( rule__XSynchronizedExpression__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2281:2: ( ( rule__XSynchronizedExpression__Group__0 ) )
-            // InternalPerspectiveDsl.g:2282:3: ( rule__XSynchronizedExpression__Group__0 )
+            // InternalPerspectiveDsl.g:2283:2: ( ( rule__XSynchronizedExpression__Group__0 ) )
+            // InternalPerspectiveDsl.g:2284:3: ( rule__XSynchronizedExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2283:3: ( rule__XSynchronizedExpression__Group__0 )
-            // InternalPerspectiveDsl.g:2283:4: rule__XSynchronizedExpression__Group__0
+            // InternalPerspectiveDsl.g:2285:3: ( rule__XSynchronizedExpression__Group__0 )
+            // InternalPerspectiveDsl.g:2285:4: rule__XSynchronizedExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XSynchronizedExpression__Group__0();
@@ -7712,11 +7712,11 @@
 
 
     // $ANTLR start "entryRuleXCatchClause"
-    // InternalPerspectiveDsl.g:2292:1: entryRuleXCatchClause : ruleXCatchClause EOF ;
+    // InternalPerspectiveDsl.g:2294:1: entryRuleXCatchClause : ruleXCatchClause EOF ;
     public final void entryRuleXCatchClause() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2293:1: ( ruleXCatchClause EOF )
-            // InternalPerspectiveDsl.g:2294:1: ruleXCatchClause EOF
+            // InternalPerspectiveDsl.g:2295:1: ( ruleXCatchClause EOF )
+            // InternalPerspectiveDsl.g:2296:1: ruleXCatchClause EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCatchClauseRule()); 
@@ -7746,23 +7746,23 @@
 
 
     // $ANTLR start "ruleXCatchClause"
-    // InternalPerspectiveDsl.g:2301:1: ruleXCatchClause : ( ( rule__XCatchClause__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2303:1: ruleXCatchClause : ( ( rule__XCatchClause__Group__0 ) ) ;
     public final void ruleXCatchClause() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2305:2: ( ( ( rule__XCatchClause__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2306:2: ( ( rule__XCatchClause__Group__0 ) )
+            // InternalPerspectiveDsl.g:2307:2: ( ( ( rule__XCatchClause__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2308:2: ( ( rule__XCatchClause__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2306:2: ( ( rule__XCatchClause__Group__0 ) )
-            // InternalPerspectiveDsl.g:2307:3: ( rule__XCatchClause__Group__0 )
+            // InternalPerspectiveDsl.g:2308:2: ( ( rule__XCatchClause__Group__0 ) )
+            // InternalPerspectiveDsl.g:2309:3: ( rule__XCatchClause__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCatchClauseAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2308:3: ( rule__XCatchClause__Group__0 )
-            // InternalPerspectiveDsl.g:2308:4: rule__XCatchClause__Group__0
+            // InternalPerspectiveDsl.g:2310:3: ( rule__XCatchClause__Group__0 )
+            // InternalPerspectiveDsl.g:2310:4: rule__XCatchClause__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XCatchClause__Group__0();
@@ -7797,11 +7797,11 @@
 
 
     // $ANTLR start "entryRuleQualifiedName"
-    // InternalPerspectiveDsl.g:2317:1: entryRuleQualifiedName : ruleQualifiedName EOF ;
+    // InternalPerspectiveDsl.g:2319:1: entryRuleQualifiedName : ruleQualifiedName EOF ;
     public final void entryRuleQualifiedName() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2318:1: ( ruleQualifiedName EOF )
-            // InternalPerspectiveDsl.g:2319:1: ruleQualifiedName EOF
+            // InternalPerspectiveDsl.g:2320:1: ( ruleQualifiedName EOF )
+            // InternalPerspectiveDsl.g:2321:1: ruleQualifiedName EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameRule()); 
@@ -7831,23 +7831,23 @@
 
 
     // $ANTLR start "ruleQualifiedName"
-    // InternalPerspectiveDsl.g:2326:1: ruleQualifiedName : ( ( rule__QualifiedName__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2328:1: ruleQualifiedName : ( ( rule__QualifiedName__Group__0 ) ) ;
     public final void ruleQualifiedName() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2330:2: ( ( ( rule__QualifiedName__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2331:2: ( ( rule__QualifiedName__Group__0 ) )
+            // InternalPerspectiveDsl.g:2332:2: ( ( ( rule__QualifiedName__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2333:2: ( ( rule__QualifiedName__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2331:2: ( ( rule__QualifiedName__Group__0 ) )
-            // InternalPerspectiveDsl.g:2332:3: ( rule__QualifiedName__Group__0 )
+            // InternalPerspectiveDsl.g:2333:2: ( ( rule__QualifiedName__Group__0 ) )
+            // InternalPerspectiveDsl.g:2334:3: ( rule__QualifiedName__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2333:3: ( rule__QualifiedName__Group__0 )
-            // InternalPerspectiveDsl.g:2333:4: rule__QualifiedName__Group__0
+            // InternalPerspectiveDsl.g:2335:3: ( rule__QualifiedName__Group__0 )
+            // InternalPerspectiveDsl.g:2335:4: rule__QualifiedName__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__QualifiedName__Group__0();
@@ -7882,14 +7882,14 @@
 
 
     // $ANTLR start "entryRuleNumber"
-    // InternalPerspectiveDsl.g:2342:1: entryRuleNumber : ruleNumber EOF ;
+    // InternalPerspectiveDsl.g:2344:1: entryRuleNumber : ruleNumber EOF ;
     public final void entryRuleNumber() throws RecognitionException {
          
         	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
 
         try {
-            // InternalPerspectiveDsl.g:2346:1: ( ruleNumber EOF )
-            // InternalPerspectiveDsl.g:2347:1: ruleNumber EOF
+            // InternalPerspectiveDsl.g:2348:1: ( ruleNumber EOF )
+            // InternalPerspectiveDsl.g:2349:1: ruleNumber EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNumberRule()); 
@@ -7922,24 +7922,24 @@
 
 
     // $ANTLR start "ruleNumber"
-    // InternalPerspectiveDsl.g:2357:1: ruleNumber : ( ( rule__Number__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:2359:1: ruleNumber : ( ( rule__Number__Alternatives ) ) ;
     public final void ruleNumber() throws RecognitionException {
 
         		HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2362:2: ( ( ( rule__Number__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:2363:2: ( ( rule__Number__Alternatives ) )
+            // InternalPerspectiveDsl.g:2364:2: ( ( ( rule__Number__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:2365:2: ( ( rule__Number__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:2363:2: ( ( rule__Number__Alternatives ) )
-            // InternalPerspectiveDsl.g:2364:3: ( rule__Number__Alternatives )
+            // InternalPerspectiveDsl.g:2365:2: ( ( rule__Number__Alternatives ) )
+            // InternalPerspectiveDsl.g:2366:3: ( rule__Number__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNumberAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:2365:3: ( rule__Number__Alternatives )
-            // InternalPerspectiveDsl.g:2365:4: rule__Number__Alternatives
+            // InternalPerspectiveDsl.g:2367:3: ( rule__Number__Alternatives )
+            // InternalPerspectiveDsl.g:2367:4: rule__Number__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__Number__Alternatives();
@@ -7975,11 +7975,11 @@
 
 
     // $ANTLR start "entryRuleJvmTypeReference"
-    // InternalPerspectiveDsl.g:2375:1: entryRuleJvmTypeReference : ruleJvmTypeReference EOF ;
+    // InternalPerspectiveDsl.g:2377:1: entryRuleJvmTypeReference : ruleJvmTypeReference EOF ;
     public final void entryRuleJvmTypeReference() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2376:1: ( ruleJvmTypeReference EOF )
-            // InternalPerspectiveDsl.g:2377:1: ruleJvmTypeReference EOF
+            // InternalPerspectiveDsl.g:2378:1: ( ruleJvmTypeReference EOF )
+            // InternalPerspectiveDsl.g:2379:1: ruleJvmTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmTypeReferenceRule()); 
@@ -8009,23 +8009,23 @@
 
 
     // $ANTLR start "ruleJvmTypeReference"
-    // InternalPerspectiveDsl.g:2384:1: ruleJvmTypeReference : ( ( rule__JvmTypeReference__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:2386:1: ruleJvmTypeReference : ( ( rule__JvmTypeReference__Alternatives ) ) ;
     public final void ruleJvmTypeReference() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2388:2: ( ( ( rule__JvmTypeReference__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:2389:2: ( ( rule__JvmTypeReference__Alternatives ) )
+            // InternalPerspectiveDsl.g:2390:2: ( ( ( rule__JvmTypeReference__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:2391:2: ( ( rule__JvmTypeReference__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:2389:2: ( ( rule__JvmTypeReference__Alternatives ) )
-            // InternalPerspectiveDsl.g:2390:3: ( rule__JvmTypeReference__Alternatives )
+            // InternalPerspectiveDsl.g:2391:2: ( ( rule__JvmTypeReference__Alternatives ) )
+            // InternalPerspectiveDsl.g:2392:3: ( rule__JvmTypeReference__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:2391:3: ( rule__JvmTypeReference__Alternatives )
-            // InternalPerspectiveDsl.g:2391:4: rule__JvmTypeReference__Alternatives
+            // InternalPerspectiveDsl.g:2393:3: ( rule__JvmTypeReference__Alternatives )
+            // InternalPerspectiveDsl.g:2393:4: rule__JvmTypeReference__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__JvmTypeReference__Alternatives();
@@ -8060,11 +8060,11 @@
 
 
     // $ANTLR start "entryRuleArrayBrackets"
-    // InternalPerspectiveDsl.g:2400:1: entryRuleArrayBrackets : ruleArrayBrackets EOF ;
+    // InternalPerspectiveDsl.g:2402:1: entryRuleArrayBrackets : ruleArrayBrackets EOF ;
     public final void entryRuleArrayBrackets() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2401:1: ( ruleArrayBrackets EOF )
-            // InternalPerspectiveDsl.g:2402:1: ruleArrayBrackets EOF
+            // InternalPerspectiveDsl.g:2403:1: ( ruleArrayBrackets EOF )
+            // InternalPerspectiveDsl.g:2404:1: ruleArrayBrackets EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getArrayBracketsRule()); 
@@ -8094,23 +8094,23 @@
 
 
     // $ANTLR start "ruleArrayBrackets"
-    // InternalPerspectiveDsl.g:2409:1: ruleArrayBrackets : ( ( rule__ArrayBrackets__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2411:1: ruleArrayBrackets : ( ( rule__ArrayBrackets__Group__0 ) ) ;
     public final void ruleArrayBrackets() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2413:2: ( ( ( rule__ArrayBrackets__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2414:2: ( ( rule__ArrayBrackets__Group__0 ) )
+            // InternalPerspectiveDsl.g:2415:2: ( ( ( rule__ArrayBrackets__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2416:2: ( ( rule__ArrayBrackets__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2414:2: ( ( rule__ArrayBrackets__Group__0 ) )
-            // InternalPerspectiveDsl.g:2415:3: ( rule__ArrayBrackets__Group__0 )
+            // InternalPerspectiveDsl.g:2416:2: ( ( rule__ArrayBrackets__Group__0 ) )
+            // InternalPerspectiveDsl.g:2417:3: ( rule__ArrayBrackets__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getArrayBracketsAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2416:3: ( rule__ArrayBrackets__Group__0 )
-            // InternalPerspectiveDsl.g:2416:4: rule__ArrayBrackets__Group__0
+            // InternalPerspectiveDsl.g:2418:3: ( rule__ArrayBrackets__Group__0 )
+            // InternalPerspectiveDsl.g:2418:4: rule__ArrayBrackets__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__ArrayBrackets__Group__0();
@@ -8145,11 +8145,11 @@
 
 
     // $ANTLR start "entryRuleXFunctionTypeRef"
-    // InternalPerspectiveDsl.g:2425:1: entryRuleXFunctionTypeRef : ruleXFunctionTypeRef EOF ;
+    // InternalPerspectiveDsl.g:2427:1: entryRuleXFunctionTypeRef : ruleXFunctionTypeRef EOF ;
     public final void entryRuleXFunctionTypeRef() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2426:1: ( ruleXFunctionTypeRef EOF )
-            // InternalPerspectiveDsl.g:2427:1: ruleXFunctionTypeRef EOF
+            // InternalPerspectiveDsl.g:2428:1: ( ruleXFunctionTypeRef EOF )
+            // InternalPerspectiveDsl.g:2429:1: ruleXFunctionTypeRef EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefRule()); 
@@ -8179,23 +8179,23 @@
 
 
     // $ANTLR start "ruleXFunctionTypeRef"
-    // InternalPerspectiveDsl.g:2434:1: ruleXFunctionTypeRef : ( ( rule__XFunctionTypeRef__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2436:1: ruleXFunctionTypeRef : ( ( rule__XFunctionTypeRef__Group__0 ) ) ;
     public final void ruleXFunctionTypeRef() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2438:2: ( ( ( rule__XFunctionTypeRef__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2439:2: ( ( rule__XFunctionTypeRef__Group__0 ) )
+            // InternalPerspectiveDsl.g:2440:2: ( ( ( rule__XFunctionTypeRef__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2441:2: ( ( rule__XFunctionTypeRef__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2439:2: ( ( rule__XFunctionTypeRef__Group__0 ) )
-            // InternalPerspectiveDsl.g:2440:3: ( rule__XFunctionTypeRef__Group__0 )
+            // InternalPerspectiveDsl.g:2441:2: ( ( rule__XFunctionTypeRef__Group__0 ) )
+            // InternalPerspectiveDsl.g:2442:3: ( rule__XFunctionTypeRef__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2441:3: ( rule__XFunctionTypeRef__Group__0 )
-            // InternalPerspectiveDsl.g:2441:4: rule__XFunctionTypeRef__Group__0
+            // InternalPerspectiveDsl.g:2443:3: ( rule__XFunctionTypeRef__Group__0 )
+            // InternalPerspectiveDsl.g:2443:4: rule__XFunctionTypeRef__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XFunctionTypeRef__Group__0();
@@ -8230,11 +8230,11 @@
 
 
     // $ANTLR start "entryRuleJvmParameterizedTypeReference"
-    // InternalPerspectiveDsl.g:2450:1: entryRuleJvmParameterizedTypeReference : ruleJvmParameterizedTypeReference EOF ;
+    // InternalPerspectiveDsl.g:2452:1: entryRuleJvmParameterizedTypeReference : ruleJvmParameterizedTypeReference EOF ;
     public final void entryRuleJvmParameterizedTypeReference() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2451:1: ( ruleJvmParameterizedTypeReference EOF )
-            // InternalPerspectiveDsl.g:2452:1: ruleJvmParameterizedTypeReference EOF
+            // InternalPerspectiveDsl.g:2453:1: ( ruleJvmParameterizedTypeReference EOF )
+            // InternalPerspectiveDsl.g:2454:1: ruleJvmParameterizedTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
@@ -8264,23 +8264,23 @@
 
 
     // $ANTLR start "ruleJvmParameterizedTypeReference"
-    // InternalPerspectiveDsl.g:2459:1: ruleJvmParameterizedTypeReference : ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2461:1: ruleJvmParameterizedTypeReference : ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) ;
     public final void ruleJvmParameterizedTypeReference() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2463:2: ( ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2464:2: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
+            // InternalPerspectiveDsl.g:2465:2: ( ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2466:2: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2464:2: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
-            // InternalPerspectiveDsl.g:2465:3: ( rule__JvmParameterizedTypeReference__Group__0 )
+            // InternalPerspectiveDsl.g:2466:2: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
+            // InternalPerspectiveDsl.g:2467:3: ( rule__JvmParameterizedTypeReference__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2466:3: ( rule__JvmParameterizedTypeReference__Group__0 )
-            // InternalPerspectiveDsl.g:2466:4: rule__JvmParameterizedTypeReference__Group__0
+            // InternalPerspectiveDsl.g:2468:3: ( rule__JvmParameterizedTypeReference__Group__0 )
+            // InternalPerspectiveDsl.g:2468:4: rule__JvmParameterizedTypeReference__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group__0();
@@ -8315,11 +8315,11 @@
 
 
     // $ANTLR start "entryRuleJvmArgumentTypeReference"
-    // InternalPerspectiveDsl.g:2475:1: entryRuleJvmArgumentTypeReference : ruleJvmArgumentTypeReference EOF ;
+    // InternalPerspectiveDsl.g:2477:1: entryRuleJvmArgumentTypeReference : ruleJvmArgumentTypeReference EOF ;
     public final void entryRuleJvmArgumentTypeReference() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2476:1: ( ruleJvmArgumentTypeReference EOF )
-            // InternalPerspectiveDsl.g:2477:1: ruleJvmArgumentTypeReference EOF
+            // InternalPerspectiveDsl.g:2478:1: ( ruleJvmArgumentTypeReference EOF )
+            // InternalPerspectiveDsl.g:2479:1: ruleJvmArgumentTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmArgumentTypeReferenceRule()); 
@@ -8349,23 +8349,23 @@
 
 
     // $ANTLR start "ruleJvmArgumentTypeReference"
-    // InternalPerspectiveDsl.g:2484:1: ruleJvmArgumentTypeReference : ( ( rule__JvmArgumentTypeReference__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:2486:1: ruleJvmArgumentTypeReference : ( ( rule__JvmArgumentTypeReference__Alternatives ) ) ;
     public final void ruleJvmArgumentTypeReference() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2488:2: ( ( ( rule__JvmArgumentTypeReference__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:2489:2: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
+            // InternalPerspectiveDsl.g:2490:2: ( ( ( rule__JvmArgumentTypeReference__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:2491:2: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:2489:2: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
-            // InternalPerspectiveDsl.g:2490:3: ( rule__JvmArgumentTypeReference__Alternatives )
+            // InternalPerspectiveDsl.g:2491:2: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
+            // InternalPerspectiveDsl.g:2492:3: ( rule__JvmArgumentTypeReference__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:2491:3: ( rule__JvmArgumentTypeReference__Alternatives )
-            // InternalPerspectiveDsl.g:2491:4: rule__JvmArgumentTypeReference__Alternatives
+            // InternalPerspectiveDsl.g:2493:3: ( rule__JvmArgumentTypeReference__Alternatives )
+            // InternalPerspectiveDsl.g:2493:4: rule__JvmArgumentTypeReference__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__JvmArgumentTypeReference__Alternatives();
@@ -8400,11 +8400,11 @@
 
 
     // $ANTLR start "entryRuleJvmWildcardTypeReference"
-    // InternalPerspectiveDsl.g:2500:1: entryRuleJvmWildcardTypeReference : ruleJvmWildcardTypeReference EOF ;
+    // InternalPerspectiveDsl.g:2502:1: entryRuleJvmWildcardTypeReference : ruleJvmWildcardTypeReference EOF ;
     public final void entryRuleJvmWildcardTypeReference() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2501:1: ( ruleJvmWildcardTypeReference EOF )
-            // InternalPerspectiveDsl.g:2502:1: ruleJvmWildcardTypeReference EOF
+            // InternalPerspectiveDsl.g:2503:1: ( ruleJvmWildcardTypeReference EOF )
+            // InternalPerspectiveDsl.g:2504:1: ruleJvmWildcardTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceRule()); 
@@ -8434,23 +8434,23 @@
 
 
     // $ANTLR start "ruleJvmWildcardTypeReference"
-    // InternalPerspectiveDsl.g:2509:1: ruleJvmWildcardTypeReference : ( ( rule__JvmWildcardTypeReference__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2511:1: ruleJvmWildcardTypeReference : ( ( rule__JvmWildcardTypeReference__Group__0 ) ) ;
     public final void ruleJvmWildcardTypeReference() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2513:2: ( ( ( rule__JvmWildcardTypeReference__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2514:2: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
+            // InternalPerspectiveDsl.g:2515:2: ( ( ( rule__JvmWildcardTypeReference__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2516:2: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2514:2: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
-            // InternalPerspectiveDsl.g:2515:3: ( rule__JvmWildcardTypeReference__Group__0 )
+            // InternalPerspectiveDsl.g:2516:2: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
+            // InternalPerspectiveDsl.g:2517:3: ( rule__JvmWildcardTypeReference__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2516:3: ( rule__JvmWildcardTypeReference__Group__0 )
-            // InternalPerspectiveDsl.g:2516:4: rule__JvmWildcardTypeReference__Group__0
+            // InternalPerspectiveDsl.g:2518:3: ( rule__JvmWildcardTypeReference__Group__0 )
+            // InternalPerspectiveDsl.g:2518:4: rule__JvmWildcardTypeReference__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmWildcardTypeReference__Group__0();
@@ -8485,11 +8485,11 @@
 
 
     // $ANTLR start "entryRuleJvmUpperBound"
-    // InternalPerspectiveDsl.g:2525:1: entryRuleJvmUpperBound : ruleJvmUpperBound EOF ;
+    // InternalPerspectiveDsl.g:2527:1: entryRuleJvmUpperBound : ruleJvmUpperBound EOF ;
     public final void entryRuleJvmUpperBound() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2526:1: ( ruleJvmUpperBound EOF )
-            // InternalPerspectiveDsl.g:2527:1: ruleJvmUpperBound EOF
+            // InternalPerspectiveDsl.g:2528:1: ( ruleJvmUpperBound EOF )
+            // InternalPerspectiveDsl.g:2529:1: ruleJvmUpperBound EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundRule()); 
@@ -8519,23 +8519,23 @@
 
 
     // $ANTLR start "ruleJvmUpperBound"
-    // InternalPerspectiveDsl.g:2534:1: ruleJvmUpperBound : ( ( rule__JvmUpperBound__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2536:1: ruleJvmUpperBound : ( ( rule__JvmUpperBound__Group__0 ) ) ;
     public final void ruleJvmUpperBound() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2538:2: ( ( ( rule__JvmUpperBound__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2539:2: ( ( rule__JvmUpperBound__Group__0 ) )
+            // InternalPerspectiveDsl.g:2540:2: ( ( ( rule__JvmUpperBound__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2541:2: ( ( rule__JvmUpperBound__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2539:2: ( ( rule__JvmUpperBound__Group__0 ) )
-            // InternalPerspectiveDsl.g:2540:3: ( rule__JvmUpperBound__Group__0 )
+            // InternalPerspectiveDsl.g:2541:2: ( ( rule__JvmUpperBound__Group__0 ) )
+            // InternalPerspectiveDsl.g:2542:3: ( rule__JvmUpperBound__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2541:3: ( rule__JvmUpperBound__Group__0 )
-            // InternalPerspectiveDsl.g:2541:4: rule__JvmUpperBound__Group__0
+            // InternalPerspectiveDsl.g:2543:3: ( rule__JvmUpperBound__Group__0 )
+            // InternalPerspectiveDsl.g:2543:4: rule__JvmUpperBound__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmUpperBound__Group__0();
@@ -8570,11 +8570,11 @@
 
 
     // $ANTLR start "entryRuleJvmUpperBoundAnded"
-    // InternalPerspectiveDsl.g:2550:1: entryRuleJvmUpperBoundAnded : ruleJvmUpperBoundAnded EOF ;
+    // InternalPerspectiveDsl.g:2552:1: entryRuleJvmUpperBoundAnded : ruleJvmUpperBoundAnded EOF ;
     public final void entryRuleJvmUpperBoundAnded() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2551:1: ( ruleJvmUpperBoundAnded EOF )
-            // InternalPerspectiveDsl.g:2552:1: ruleJvmUpperBoundAnded EOF
+            // InternalPerspectiveDsl.g:2553:1: ( ruleJvmUpperBoundAnded EOF )
+            // InternalPerspectiveDsl.g:2554:1: ruleJvmUpperBoundAnded EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundAndedRule()); 
@@ -8604,23 +8604,23 @@
 
 
     // $ANTLR start "ruleJvmUpperBoundAnded"
-    // InternalPerspectiveDsl.g:2559:1: ruleJvmUpperBoundAnded : ( ( rule__JvmUpperBoundAnded__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2561:1: ruleJvmUpperBoundAnded : ( ( rule__JvmUpperBoundAnded__Group__0 ) ) ;
     public final void ruleJvmUpperBoundAnded() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2563:2: ( ( ( rule__JvmUpperBoundAnded__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2564:2: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
+            // InternalPerspectiveDsl.g:2565:2: ( ( ( rule__JvmUpperBoundAnded__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2566:2: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2564:2: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
-            // InternalPerspectiveDsl.g:2565:3: ( rule__JvmUpperBoundAnded__Group__0 )
+            // InternalPerspectiveDsl.g:2566:2: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
+            // InternalPerspectiveDsl.g:2567:3: ( rule__JvmUpperBoundAnded__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2566:3: ( rule__JvmUpperBoundAnded__Group__0 )
-            // InternalPerspectiveDsl.g:2566:4: rule__JvmUpperBoundAnded__Group__0
+            // InternalPerspectiveDsl.g:2568:3: ( rule__JvmUpperBoundAnded__Group__0 )
+            // InternalPerspectiveDsl.g:2568:4: rule__JvmUpperBoundAnded__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmUpperBoundAnded__Group__0();
@@ -8655,11 +8655,11 @@
 
 
     // $ANTLR start "entryRuleJvmLowerBound"
-    // InternalPerspectiveDsl.g:2575:1: entryRuleJvmLowerBound : ruleJvmLowerBound EOF ;
+    // InternalPerspectiveDsl.g:2577:1: entryRuleJvmLowerBound : ruleJvmLowerBound EOF ;
     public final void entryRuleJvmLowerBound() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2576:1: ( ruleJvmLowerBound EOF )
-            // InternalPerspectiveDsl.g:2577:1: ruleJvmLowerBound EOF
+            // InternalPerspectiveDsl.g:2578:1: ( ruleJvmLowerBound EOF )
+            // InternalPerspectiveDsl.g:2579:1: ruleJvmLowerBound EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundRule()); 
@@ -8689,23 +8689,23 @@
 
 
     // $ANTLR start "ruleJvmLowerBound"
-    // InternalPerspectiveDsl.g:2584:1: ruleJvmLowerBound : ( ( rule__JvmLowerBound__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2586:1: ruleJvmLowerBound : ( ( rule__JvmLowerBound__Group__0 ) ) ;
     public final void ruleJvmLowerBound() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2588:2: ( ( ( rule__JvmLowerBound__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2589:2: ( ( rule__JvmLowerBound__Group__0 ) )
+            // InternalPerspectiveDsl.g:2590:2: ( ( ( rule__JvmLowerBound__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2591:2: ( ( rule__JvmLowerBound__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2589:2: ( ( rule__JvmLowerBound__Group__0 ) )
-            // InternalPerspectiveDsl.g:2590:3: ( rule__JvmLowerBound__Group__0 )
+            // InternalPerspectiveDsl.g:2591:2: ( ( rule__JvmLowerBound__Group__0 ) )
+            // InternalPerspectiveDsl.g:2592:3: ( rule__JvmLowerBound__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2591:3: ( rule__JvmLowerBound__Group__0 )
-            // InternalPerspectiveDsl.g:2591:4: rule__JvmLowerBound__Group__0
+            // InternalPerspectiveDsl.g:2593:3: ( rule__JvmLowerBound__Group__0 )
+            // InternalPerspectiveDsl.g:2593:4: rule__JvmLowerBound__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmLowerBound__Group__0();
@@ -8740,11 +8740,11 @@
 
 
     // $ANTLR start "entryRuleJvmLowerBoundAnded"
-    // InternalPerspectiveDsl.g:2600:1: entryRuleJvmLowerBoundAnded : ruleJvmLowerBoundAnded EOF ;
+    // InternalPerspectiveDsl.g:2602:1: entryRuleJvmLowerBoundAnded : ruleJvmLowerBoundAnded EOF ;
     public final void entryRuleJvmLowerBoundAnded() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2601:1: ( ruleJvmLowerBoundAnded EOF )
-            // InternalPerspectiveDsl.g:2602:1: ruleJvmLowerBoundAnded EOF
+            // InternalPerspectiveDsl.g:2603:1: ( ruleJvmLowerBoundAnded EOF )
+            // InternalPerspectiveDsl.g:2604:1: ruleJvmLowerBoundAnded EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundAndedRule()); 
@@ -8774,23 +8774,23 @@
 
 
     // $ANTLR start "ruleJvmLowerBoundAnded"
-    // InternalPerspectiveDsl.g:2609:1: ruleJvmLowerBoundAnded : ( ( rule__JvmLowerBoundAnded__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2611:1: ruleJvmLowerBoundAnded : ( ( rule__JvmLowerBoundAnded__Group__0 ) ) ;
     public final void ruleJvmLowerBoundAnded() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2613:2: ( ( ( rule__JvmLowerBoundAnded__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2614:2: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
+            // InternalPerspectiveDsl.g:2615:2: ( ( ( rule__JvmLowerBoundAnded__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2616:2: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2614:2: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
-            // InternalPerspectiveDsl.g:2615:3: ( rule__JvmLowerBoundAnded__Group__0 )
+            // InternalPerspectiveDsl.g:2616:2: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
+            // InternalPerspectiveDsl.g:2617:3: ( rule__JvmLowerBoundAnded__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2616:3: ( rule__JvmLowerBoundAnded__Group__0 )
-            // InternalPerspectiveDsl.g:2616:4: rule__JvmLowerBoundAnded__Group__0
+            // InternalPerspectiveDsl.g:2618:3: ( rule__JvmLowerBoundAnded__Group__0 )
+            // InternalPerspectiveDsl.g:2618:4: rule__JvmLowerBoundAnded__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmLowerBoundAnded__Group__0();
@@ -8825,11 +8825,11 @@
 
 
     // $ANTLR start "entryRuleQualifiedNameWithWildcard"
-    // InternalPerspectiveDsl.g:2625:1: entryRuleQualifiedNameWithWildcard : ruleQualifiedNameWithWildcard EOF ;
+    // InternalPerspectiveDsl.g:2627:1: entryRuleQualifiedNameWithWildcard : ruleQualifiedNameWithWildcard EOF ;
     public final void entryRuleQualifiedNameWithWildcard() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2626:1: ( ruleQualifiedNameWithWildcard EOF )
-            // InternalPerspectiveDsl.g:2627:1: ruleQualifiedNameWithWildcard EOF
+            // InternalPerspectiveDsl.g:2628:1: ( ruleQualifiedNameWithWildcard EOF )
+            // InternalPerspectiveDsl.g:2629:1: ruleQualifiedNameWithWildcard EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameWithWildcardRule()); 
@@ -8859,23 +8859,23 @@
 
 
     // $ANTLR start "ruleQualifiedNameWithWildcard"
-    // InternalPerspectiveDsl.g:2634:1: ruleQualifiedNameWithWildcard : ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) ;
+    // InternalPerspectiveDsl.g:2636:1: ruleQualifiedNameWithWildcard : ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) ;
     public final void ruleQualifiedNameWithWildcard() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2638:2: ( ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) )
-            // InternalPerspectiveDsl.g:2639:2: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
+            // InternalPerspectiveDsl.g:2640:2: ( ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) )
+            // InternalPerspectiveDsl.g:2641:2: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
             {
-            // InternalPerspectiveDsl.g:2639:2: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
-            // InternalPerspectiveDsl.g:2640:3: ( rule__QualifiedNameWithWildcard__Group__0 )
+            // InternalPerspectiveDsl.g:2641:2: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
+            // InternalPerspectiveDsl.g:2642:3: ( rule__QualifiedNameWithWildcard__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2641:3: ( rule__QualifiedNameWithWildcard__Group__0 )
-            // InternalPerspectiveDsl.g:2641:4: rule__QualifiedNameWithWildcard__Group__0
+            // InternalPerspectiveDsl.g:2643:3: ( rule__QualifiedNameWithWildcard__Group__0 )
+            // InternalPerspectiveDsl.g:2643:4: rule__QualifiedNameWithWildcard__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__QualifiedNameWithWildcard__Group__0();
@@ -8910,11 +8910,11 @@
 
 
     // $ANTLR start "entryRuleValidID"
-    // InternalPerspectiveDsl.g:2650:1: entryRuleValidID : ruleValidID EOF ;
+    // InternalPerspectiveDsl.g:2652:1: entryRuleValidID : ruleValidID EOF ;
     public final void entryRuleValidID() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2651:1: ( ruleValidID EOF )
-            // InternalPerspectiveDsl.g:2652:1: ruleValidID EOF
+            // InternalPerspectiveDsl.g:2653:1: ( ruleValidID EOF )
+            // InternalPerspectiveDsl.g:2654:1: ruleValidID EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getValidIDRule()); 
@@ -8944,17 +8944,17 @@
 
 
     // $ANTLR start "ruleValidID"
-    // InternalPerspectiveDsl.g:2659:1: ruleValidID : ( RULE_ID ) ;
+    // InternalPerspectiveDsl.g:2661:1: ruleValidID : ( RULE_ID ) ;
     public final void ruleValidID() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2663:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:2664:2: ( RULE_ID )
+            // InternalPerspectiveDsl.g:2665:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:2666:2: ( RULE_ID )
             {
-            // InternalPerspectiveDsl.g:2664:2: ( RULE_ID )
-            // InternalPerspectiveDsl.g:2665:3: RULE_ID
+            // InternalPerspectiveDsl.g:2666:2: ( RULE_ID )
+            // InternalPerspectiveDsl.g:2667:3: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); 
@@ -8985,11 +8985,11 @@
 
 
     // $ANTLR start "entryRuleXImportSection"
-    // InternalPerspectiveDsl.g:2675:1: entryRuleXImportSection : ruleXImportSection EOF ;
+    // InternalPerspectiveDsl.g:2677:1: entryRuleXImportSection : ruleXImportSection EOF ;
     public final void entryRuleXImportSection() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2676:1: ( ruleXImportSection EOF )
-            // InternalPerspectiveDsl.g:2677:1: ruleXImportSection EOF
+            // InternalPerspectiveDsl.g:2678:1: ( ruleXImportSection EOF )
+            // InternalPerspectiveDsl.g:2679:1: ruleXImportSection EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportSectionRule()); 
@@ -9019,26 +9019,26 @@
 
 
     // $ANTLR start "ruleXImportSection"
-    // InternalPerspectiveDsl.g:2684:1: ruleXImportSection : ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) ) ;
+    // InternalPerspectiveDsl.g:2686:1: ruleXImportSection : ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) ) ;
     public final void ruleXImportSection() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2688:2: ( ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) ) )
-            // InternalPerspectiveDsl.g:2689:2: ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) )
+            // InternalPerspectiveDsl.g:2690:2: ( ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) ) )
+            // InternalPerspectiveDsl.g:2691:2: ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) )
             {
-            // InternalPerspectiveDsl.g:2689:2: ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) )
-            // InternalPerspectiveDsl.g:2690:3: ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* )
+            // InternalPerspectiveDsl.g:2691:2: ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) )
+            // InternalPerspectiveDsl.g:2692:3: ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* )
             {
-            // InternalPerspectiveDsl.g:2690:3: ( ( rule__XImportSection__ImportDeclarationsAssignment ) )
-            // InternalPerspectiveDsl.g:2691:4: ( rule__XImportSection__ImportDeclarationsAssignment )
+            // InternalPerspectiveDsl.g:2692:3: ( ( rule__XImportSection__ImportDeclarationsAssignment ) )
+            // InternalPerspectiveDsl.g:2693:4: ( rule__XImportSection__ImportDeclarationsAssignment )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment()); 
             }
-            // InternalPerspectiveDsl.g:2692:4: ( rule__XImportSection__ImportDeclarationsAssignment )
-            // InternalPerspectiveDsl.g:2692:5: rule__XImportSection__ImportDeclarationsAssignment
+            // InternalPerspectiveDsl.g:2694:4: ( rule__XImportSection__ImportDeclarationsAssignment )
+            // InternalPerspectiveDsl.g:2694:5: rule__XImportSection__ImportDeclarationsAssignment
             {
             pushFollow(FOLLOW_3);
             rule__XImportSection__ImportDeclarationsAssignment();
@@ -9054,13 +9054,13 @@
 
             }
 
-            // InternalPerspectiveDsl.g:2695:3: ( ( rule__XImportSection__ImportDeclarationsAssignment )* )
-            // InternalPerspectiveDsl.g:2696:4: ( rule__XImportSection__ImportDeclarationsAssignment )*
+            // InternalPerspectiveDsl.g:2697:3: ( ( rule__XImportSection__ImportDeclarationsAssignment )* )
+            // InternalPerspectiveDsl.g:2698:4: ( rule__XImportSection__ImportDeclarationsAssignment )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment()); 
             }
-            // InternalPerspectiveDsl.g:2697:4: ( rule__XImportSection__ImportDeclarationsAssignment )*
+            // InternalPerspectiveDsl.g:2699:4: ( rule__XImportSection__ImportDeclarationsAssignment )*
             loop1:
             do {
                 int alt1=2;
@@ -9073,7 +9073,7 @@
 
                 switch (alt1) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:2697:5: rule__XImportSection__ImportDeclarationsAssignment
+            	    // InternalPerspectiveDsl.g:2699:5: rule__XImportSection__ImportDeclarationsAssignment
             	    {
             	    pushFollow(FOLLOW_3);
             	    rule__XImportSection__ImportDeclarationsAssignment();
@@ -9117,11 +9117,11 @@
 
 
     // $ANTLR start "entryRuleQualifiedNameInStaticImport"
-    // InternalPerspectiveDsl.g:2707:1: entryRuleQualifiedNameInStaticImport : ruleQualifiedNameInStaticImport EOF ;
+    // InternalPerspectiveDsl.g:2709:1: entryRuleQualifiedNameInStaticImport : ruleQualifiedNameInStaticImport EOF ;
     public final void entryRuleQualifiedNameInStaticImport() throws RecognitionException {
         try {
-            // InternalPerspectiveDsl.g:2708:1: ( ruleQualifiedNameInStaticImport EOF )
-            // InternalPerspectiveDsl.g:2709:1: ruleQualifiedNameInStaticImport EOF
+            // InternalPerspectiveDsl.g:2710:1: ( ruleQualifiedNameInStaticImport EOF )
+            // InternalPerspectiveDsl.g:2711:1: ruleQualifiedNameInStaticImport EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameInStaticImportRule()); 
@@ -9151,26 +9151,26 @@
 
 
     // $ANTLR start "ruleQualifiedNameInStaticImport"
-    // InternalPerspectiveDsl.g:2716:1: ruleQualifiedNameInStaticImport : ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) ;
+    // InternalPerspectiveDsl.g:2718:1: ruleQualifiedNameInStaticImport : ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) ;
     public final void ruleQualifiedNameInStaticImport() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2720:2: ( ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) )
-            // InternalPerspectiveDsl.g:2721:2: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
+            // InternalPerspectiveDsl.g:2722:2: ( ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) )
+            // InternalPerspectiveDsl.g:2723:2: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
             {
-            // InternalPerspectiveDsl.g:2721:2: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
-            // InternalPerspectiveDsl.g:2722:3: ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
+            // InternalPerspectiveDsl.g:2723:2: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
+            // InternalPerspectiveDsl.g:2724:3: ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
             {
-            // InternalPerspectiveDsl.g:2722:3: ( ( rule__QualifiedNameInStaticImport__Group__0 ) )
-            // InternalPerspectiveDsl.g:2723:4: ( rule__QualifiedNameInStaticImport__Group__0 )
+            // InternalPerspectiveDsl.g:2724:3: ( ( rule__QualifiedNameInStaticImport__Group__0 ) )
+            // InternalPerspectiveDsl.g:2725:4: ( rule__QualifiedNameInStaticImport__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2724:4: ( rule__QualifiedNameInStaticImport__Group__0 )
-            // InternalPerspectiveDsl.g:2724:5: rule__QualifiedNameInStaticImport__Group__0
+            // InternalPerspectiveDsl.g:2726:4: ( rule__QualifiedNameInStaticImport__Group__0 )
+            // InternalPerspectiveDsl.g:2726:5: rule__QualifiedNameInStaticImport__Group__0
             {
             pushFollow(FOLLOW_4);
             rule__QualifiedNameInStaticImport__Group__0();
@@ -9186,13 +9186,13 @@
 
             }
 
-            // InternalPerspectiveDsl.g:2727:3: ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
-            // InternalPerspectiveDsl.g:2728:4: ( rule__QualifiedNameInStaticImport__Group__0 )*
+            // InternalPerspectiveDsl.g:2729:3: ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
+            // InternalPerspectiveDsl.g:2730:4: ( rule__QualifiedNameInStaticImport__Group__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
             }
-            // InternalPerspectiveDsl.g:2729:4: ( rule__QualifiedNameInStaticImport__Group__0 )*
+            // InternalPerspectiveDsl.g:2731:4: ( rule__QualifiedNameInStaticImport__Group__0 )*
             loop2:
             do {
                 int alt2=2;
@@ -9211,7 +9211,7 @@
 
                 switch (alt2) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:2729:5: rule__QualifiedNameInStaticImport__Group__0
+            	    // InternalPerspectiveDsl.g:2731:5: rule__QualifiedNameInStaticImport__Group__0
             	    {
             	    pushFollow(FOLLOW_4);
             	    rule__QualifiedNameInStaticImport__Group__0();
@@ -9255,23 +9255,23 @@
 
 
     // $ANTLR start "ruleSashOrientation"
-    // InternalPerspectiveDsl.g:2739:1: ruleSashOrientation : ( ( rule__SashOrientation__Alternatives ) ) ;
+    // InternalPerspectiveDsl.g:2741:1: ruleSashOrientation : ( ( rule__SashOrientation__Alternatives ) ) ;
     public final void ruleSashOrientation() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2743:1: ( ( ( rule__SashOrientation__Alternatives ) ) )
-            // InternalPerspectiveDsl.g:2744:2: ( ( rule__SashOrientation__Alternatives ) )
+            // InternalPerspectiveDsl.g:2745:1: ( ( ( rule__SashOrientation__Alternatives ) ) )
+            // InternalPerspectiveDsl.g:2746:2: ( ( rule__SashOrientation__Alternatives ) )
             {
-            // InternalPerspectiveDsl.g:2744:2: ( ( rule__SashOrientation__Alternatives ) )
-            // InternalPerspectiveDsl.g:2745:3: ( rule__SashOrientation__Alternatives )
+            // InternalPerspectiveDsl.g:2746:2: ( ( rule__SashOrientation__Alternatives ) )
+            // InternalPerspectiveDsl.g:2747:3: ( rule__SashOrientation__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getSashOrientationAccess().getAlternatives()); 
             }
-            // InternalPerspectiveDsl.g:2746:3: ( rule__SashOrientation__Alternatives )
-            // InternalPerspectiveDsl.g:2746:4: rule__SashOrientation__Alternatives
+            // InternalPerspectiveDsl.g:2748:3: ( rule__SashOrientation__Alternatives )
+            // InternalPerspectiveDsl.g:2748:4: rule__SashOrientation__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__SashOrientation__Alternatives();
@@ -9306,13 +9306,13 @@
 
 
     // $ANTLR start "rule__PerspectiveElement__Alternatives"
-    // InternalPerspectiveDsl.g:2754:1: rule__PerspectiveElement__Alternatives : ( ( rulePerspectiveSashContainer ) | ( rulePerspectivePartStack ) | ( rulePerspectivePart ) );
+    // InternalPerspectiveDsl.g:2756:1: rule__PerspectiveElement__Alternatives : ( ( rulePerspectiveSashContainer ) | ( rulePerspectivePartStack ) | ( rulePerspectivePart ) );
     public final void rule__PerspectiveElement__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2758:1: ( ( rulePerspectiveSashContainer ) | ( rulePerspectivePartStack ) | ( rulePerspectivePart ) )
+            // InternalPerspectiveDsl.g:2760:1: ( ( rulePerspectiveSashContainer ) | ( rulePerspectivePartStack ) | ( rulePerspectivePart ) )
             int alt3=3;
             switch ( input.LA(1) ) {
             case 62:
@@ -9340,10 +9340,10 @@
 
             switch (alt3) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:2759:2: ( rulePerspectiveSashContainer )
+                    // InternalPerspectiveDsl.g:2761:2: ( rulePerspectiveSashContainer )
                     {
-                    // InternalPerspectiveDsl.g:2759:2: ( rulePerspectiveSashContainer )
-                    // InternalPerspectiveDsl.g:2760:3: rulePerspectiveSashContainer
+                    // InternalPerspectiveDsl.g:2761:2: ( rulePerspectiveSashContainer )
+                    // InternalPerspectiveDsl.g:2762:3: rulePerspectiveSashContainer
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveElementAccess().getPerspectiveSashContainerParserRuleCall_0()); 
@@ -9363,10 +9363,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:2765:2: ( rulePerspectivePartStack )
+                    // InternalPerspectiveDsl.g:2767:2: ( rulePerspectivePartStack )
                     {
-                    // InternalPerspectiveDsl.g:2765:2: ( rulePerspectivePartStack )
-                    // InternalPerspectiveDsl.g:2766:3: rulePerspectivePartStack
+                    // InternalPerspectiveDsl.g:2767:2: ( rulePerspectivePartStack )
+                    // InternalPerspectiveDsl.g:2768:3: rulePerspectivePartStack
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveElementAccess().getPerspectivePartStackParserRuleCall_1()); 
@@ -9386,10 +9386,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:2771:2: ( rulePerspectivePart )
+                    // InternalPerspectiveDsl.g:2773:2: ( rulePerspectivePart )
                     {
-                    // InternalPerspectiveDsl.g:2771:2: ( rulePerspectivePart )
-                    // InternalPerspectiveDsl.g:2772:3: rulePerspectivePart
+                    // InternalPerspectiveDsl.g:2773:2: ( rulePerspectivePart )
+                    // InternalPerspectiveDsl.g:2774:3: rulePerspectivePart
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveElementAccess().getPerspectivePartParserRuleCall_2()); 
@@ -9426,13 +9426,13 @@
 
 
     // $ANTLR start "rule__PerspectiveView__Alternatives"
-    // InternalPerspectiveDsl.g:2781:1: rule__PerspectiveView__Alternatives : ( ( rulePerspectiveSelection ) | ( rulePerspectiveTable ) | ( rulePerspectiveChart ) | ( rulePerspectiveReport ) | ( rulePerspectiveOrganization ) | ( rulePerspectiveTopology ) | ( rulePerspectiveDialog ) | ( rulePerspectiveGrid ) | ( rulePerspectiveWelcome ) | ( rulePerspectiveSearch ) | ( rulePerspectiveDataInterchange ) | ( rulePerspectiveBPMN ) | ( rulePerspectiveKanban ) | ( rulePerspectiveTitle ) | ( rulePerspectiveDashboard ) );
+    // InternalPerspectiveDsl.g:2783:1: rule__PerspectiveView__Alternatives : ( ( rulePerspectiveSelection ) | ( rulePerspectiveTable ) | ( rulePerspectiveChart ) | ( rulePerspectiveReport ) | ( rulePerspectiveOrganization ) | ( rulePerspectiveTopology ) | ( rulePerspectiveDialog ) | ( rulePerspectiveGrid ) | ( rulePerspectiveWelcome ) | ( rulePerspectiveSearch ) | ( rulePerspectiveDataInterchange ) | ( rulePerspectiveBPMN ) | ( rulePerspectiveKanban ) | ( rulePerspectiveTitle ) | ( rulePerspectiveDashboard ) );
     public final void rule__PerspectiveView__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2785:1: ( ( rulePerspectiveSelection ) | ( rulePerspectiveTable ) | ( rulePerspectiveChart ) | ( rulePerspectiveReport ) | ( rulePerspectiveOrganization ) | ( rulePerspectiveTopology ) | ( rulePerspectiveDialog ) | ( rulePerspectiveGrid ) | ( rulePerspectiveWelcome ) | ( rulePerspectiveSearch ) | ( rulePerspectiveDataInterchange ) | ( rulePerspectiveBPMN ) | ( rulePerspectiveKanban ) | ( rulePerspectiveTitle ) | ( rulePerspectiveDashboard ) )
+            // InternalPerspectiveDsl.g:2787:1: ( ( rulePerspectiveSelection ) | ( rulePerspectiveTable ) | ( rulePerspectiveChart ) | ( rulePerspectiveReport ) | ( rulePerspectiveOrganization ) | ( rulePerspectiveTopology ) | ( rulePerspectiveDialog ) | ( rulePerspectiveGrid ) | ( rulePerspectiveWelcome ) | ( rulePerspectiveSearch ) | ( rulePerspectiveDataInterchange ) | ( rulePerspectiveBPMN ) | ( rulePerspectiveKanban ) | ( rulePerspectiveTitle ) | ( rulePerspectiveDashboard ) )
             int alt4=15;
             switch ( input.LA(1) ) {
             case 69:
@@ -9520,10 +9520,10 @@
 
             switch (alt4) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:2786:2: ( rulePerspectiveSelection )
+                    // InternalPerspectiveDsl.g:2788:2: ( rulePerspectiveSelection )
                     {
-                    // InternalPerspectiveDsl.g:2786:2: ( rulePerspectiveSelection )
-                    // InternalPerspectiveDsl.g:2787:3: rulePerspectiveSelection
+                    // InternalPerspectiveDsl.g:2788:2: ( rulePerspectiveSelection )
+                    // InternalPerspectiveDsl.g:2789:3: rulePerspectiveSelection
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveViewAccess().getPerspectiveSelectionParserRuleCall_0()); 
@@ -9543,10 +9543,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:2792:2: ( rulePerspectiveTable )
+                    // InternalPerspectiveDsl.g:2794:2: ( rulePerspectiveTable )
                     {
-                    // InternalPerspectiveDsl.g:2792:2: ( rulePerspectiveTable )
-                    // InternalPerspectiveDsl.g:2793:3: rulePerspectiveTable
+                    // InternalPerspectiveDsl.g:2794:2: ( rulePerspectiveTable )
+                    // InternalPerspectiveDsl.g:2795:3: rulePerspectiveTable
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveViewAccess().getPerspectiveTableParserRuleCall_1()); 
@@ -9566,10 +9566,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:2798:2: ( rulePerspectiveChart )
+                    // InternalPerspectiveDsl.g:2800:2: ( rulePerspectiveChart )
                     {
-                    // InternalPerspectiveDsl.g:2798:2: ( rulePerspectiveChart )
-                    // InternalPerspectiveDsl.g:2799:3: rulePerspectiveChart
+                    // InternalPerspectiveDsl.g:2800:2: ( rulePerspectiveChart )
+                    // InternalPerspectiveDsl.g:2801:3: rulePerspectiveChart
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveViewAccess().getPerspectiveChartParserRuleCall_2()); 
@@ -9589,10 +9589,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:2804:2: ( rulePerspectiveReport )
+                    // InternalPerspectiveDsl.g:2806:2: ( rulePerspectiveReport )
                     {
-                    // InternalPerspectiveDsl.g:2804:2: ( rulePerspectiveReport )
-                    // InternalPerspectiveDsl.g:2805:3: rulePerspectiveReport
+                    // InternalPerspectiveDsl.g:2806:2: ( rulePerspectiveReport )
+                    // InternalPerspectiveDsl.g:2807:3: rulePerspectiveReport
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveViewAccess().getPerspectiveReportParserRuleCall_3()); 
@@ -9612,10 +9612,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalPerspectiveDsl.g:2810:2: ( rulePerspectiveOrganization )
+                    // InternalPerspectiveDsl.g:2812:2: ( rulePerspectiveOrganization )
                     {
-                    // InternalPerspectiveDsl.g:2810:2: ( rulePerspectiveOrganization )
-                    // InternalPerspectiveDsl.g:2811:3: rulePerspectiveOrganization
+                    // InternalPerspectiveDsl.g:2812:2: ( rulePerspectiveOrganization )
+                    // InternalPerspectiveDsl.g:2813:3: rulePerspectiveOrganization
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveViewAccess().getPerspectiveOrganizationParserRuleCall_4()); 
@@ -9635,10 +9635,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalPerspectiveDsl.g:2816:2: ( rulePerspectiveTopology )
+                    // InternalPerspectiveDsl.g:2818:2: ( rulePerspectiveTopology )
                     {
-                    // InternalPerspectiveDsl.g:2816:2: ( rulePerspectiveTopology )
-                    // InternalPerspectiveDsl.g:2817:3: rulePerspectiveTopology
+                    // InternalPerspectiveDsl.g:2818:2: ( rulePerspectiveTopology )
+                    // InternalPerspectiveDsl.g:2819:3: rulePerspectiveTopology
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveViewAccess().getPerspectiveTopologyParserRuleCall_5()); 
@@ -9658,10 +9658,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalPerspectiveDsl.g:2822:2: ( rulePerspectiveDialog )
+                    // InternalPerspectiveDsl.g:2824:2: ( rulePerspectiveDialog )
                     {
-                    // InternalPerspectiveDsl.g:2822:2: ( rulePerspectiveDialog )
-                    // InternalPerspectiveDsl.g:2823:3: rulePerspectiveDialog
+                    // InternalPerspectiveDsl.g:2824:2: ( rulePerspectiveDialog )
+                    // InternalPerspectiveDsl.g:2825:3: rulePerspectiveDialog
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveViewAccess().getPerspectiveDialogParserRuleCall_6()); 
@@ -9681,10 +9681,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalPerspectiveDsl.g:2828:2: ( rulePerspectiveGrid )
+                    // InternalPerspectiveDsl.g:2830:2: ( rulePerspectiveGrid )
                     {
-                    // InternalPerspectiveDsl.g:2828:2: ( rulePerspectiveGrid )
-                    // InternalPerspectiveDsl.g:2829:3: rulePerspectiveGrid
+                    // InternalPerspectiveDsl.g:2830:2: ( rulePerspectiveGrid )
+                    // InternalPerspectiveDsl.g:2831:3: rulePerspectiveGrid
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveViewAccess().getPerspectiveGridParserRuleCall_7()); 
@@ -9704,10 +9704,10 @@
                     }
                     break;
                 case 9 :
-                    // InternalPerspectiveDsl.g:2834:2: ( rulePerspectiveWelcome )
+                    // InternalPerspectiveDsl.g:2836:2: ( rulePerspectiveWelcome )
                     {
-                    // InternalPerspectiveDsl.g:2834:2: ( rulePerspectiveWelcome )
-                    // InternalPerspectiveDsl.g:2835:3: rulePerspectiveWelcome
+                    // InternalPerspectiveDsl.g:2836:2: ( rulePerspectiveWelcome )
+                    // InternalPerspectiveDsl.g:2837:3: rulePerspectiveWelcome
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveViewAccess().getPerspectiveWelcomeParserRuleCall_8()); 
@@ -9727,10 +9727,10 @@
                     }
                     break;
                 case 10 :
-                    // InternalPerspectiveDsl.g:2840:2: ( rulePerspectiveSearch )
+                    // InternalPerspectiveDsl.g:2842:2: ( rulePerspectiveSearch )
                     {
-                    // InternalPerspectiveDsl.g:2840:2: ( rulePerspectiveSearch )
-                    // InternalPerspectiveDsl.g:2841:3: rulePerspectiveSearch
+                    // InternalPerspectiveDsl.g:2842:2: ( rulePerspectiveSearch )
+                    // InternalPerspectiveDsl.g:2843:3: rulePerspectiveSearch
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveViewAccess().getPerspectiveSearchParserRuleCall_9()); 
@@ -9750,10 +9750,10 @@
                     }
                     break;
                 case 11 :
-                    // InternalPerspectiveDsl.g:2846:2: ( rulePerspectiveDataInterchange )
+                    // InternalPerspectiveDsl.g:2848:2: ( rulePerspectiveDataInterchange )
                     {
-                    // InternalPerspectiveDsl.g:2846:2: ( rulePerspectiveDataInterchange )
-                    // InternalPerspectiveDsl.g:2847:3: rulePerspectiveDataInterchange
+                    // InternalPerspectiveDsl.g:2848:2: ( rulePerspectiveDataInterchange )
+                    // InternalPerspectiveDsl.g:2849:3: rulePerspectiveDataInterchange
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveViewAccess().getPerspectiveDataInterchangeParserRuleCall_10()); 
@@ -9773,10 +9773,10 @@
                     }
                     break;
                 case 12 :
-                    // InternalPerspectiveDsl.g:2852:2: ( rulePerspectiveBPMN )
+                    // InternalPerspectiveDsl.g:2854:2: ( rulePerspectiveBPMN )
                     {
-                    // InternalPerspectiveDsl.g:2852:2: ( rulePerspectiveBPMN )
-                    // InternalPerspectiveDsl.g:2853:3: rulePerspectiveBPMN
+                    // InternalPerspectiveDsl.g:2854:2: ( rulePerspectiveBPMN )
+                    // InternalPerspectiveDsl.g:2855:3: rulePerspectiveBPMN
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveViewAccess().getPerspectiveBPMNParserRuleCall_11()); 
@@ -9796,10 +9796,10 @@
                     }
                     break;
                 case 13 :
-                    // InternalPerspectiveDsl.g:2858:2: ( rulePerspectiveKanban )
+                    // InternalPerspectiveDsl.g:2860:2: ( rulePerspectiveKanban )
                     {
-                    // InternalPerspectiveDsl.g:2858:2: ( rulePerspectiveKanban )
-                    // InternalPerspectiveDsl.g:2859:3: rulePerspectiveKanban
+                    // InternalPerspectiveDsl.g:2860:2: ( rulePerspectiveKanban )
+                    // InternalPerspectiveDsl.g:2861:3: rulePerspectiveKanban
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveViewAccess().getPerspectiveKanbanParserRuleCall_12()); 
@@ -9819,10 +9819,10 @@
                     }
                     break;
                 case 14 :
-                    // InternalPerspectiveDsl.g:2864:2: ( rulePerspectiveTitle )
+                    // InternalPerspectiveDsl.g:2866:2: ( rulePerspectiveTitle )
                     {
-                    // InternalPerspectiveDsl.g:2864:2: ( rulePerspectiveTitle )
-                    // InternalPerspectiveDsl.g:2865:3: rulePerspectiveTitle
+                    // InternalPerspectiveDsl.g:2866:2: ( rulePerspectiveTitle )
+                    // InternalPerspectiveDsl.g:2867:3: rulePerspectiveTitle
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveViewAccess().getPerspectiveTitleParserRuleCall_13()); 
@@ -9842,10 +9842,10 @@
                     }
                     break;
                 case 15 :
-                    // InternalPerspectiveDsl.g:2870:2: ( rulePerspectiveDashboard )
+                    // InternalPerspectiveDsl.g:2872:2: ( rulePerspectiveDashboard )
                     {
-                    // InternalPerspectiveDsl.g:2870:2: ( rulePerspectiveDashboard )
-                    // InternalPerspectiveDsl.g:2871:3: rulePerspectiveDashboard
+                    // InternalPerspectiveDsl.g:2872:2: ( rulePerspectiveDashboard )
+                    // InternalPerspectiveDsl.g:2873:3: rulePerspectiveDashboard
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveViewAccess().getPerspectiveDashboardParserRuleCall_14()); 
@@ -9882,27 +9882,27 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Alternatives_2"
-    // InternalPerspectiveDsl.g:2880:1: rule__XImportDeclaration__Alternatives_2 : ( ( ( rule__XImportDeclaration__Group_2_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) ) | ( ( rule__XImportDeclaration__Group_2_3__0 ) ) );
+    // InternalPerspectiveDsl.g:2882:1: rule__XImportDeclaration__Alternatives_2 : ( ( ( rule__XImportDeclaration__Group_2_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) ) | ( ( rule__XImportDeclaration__Group_2_3__0 ) ) );
     public final void rule__XImportDeclaration__Alternatives_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2884:1: ( ( ( rule__XImportDeclaration__Group_2_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) ) | ( ( rule__XImportDeclaration__Group_2_3__0 ) ) )
+            // InternalPerspectiveDsl.g:2886:1: ( ( ( rule__XImportDeclaration__Group_2_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) ) | ( ( rule__XImportDeclaration__Group_2_3__0 ) ) )
             int alt5=4;
             alt5 = dfa5.predict(input);
             switch (alt5) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:2885:2: ( ( rule__XImportDeclaration__Group_2_0__0 ) )
+                    // InternalPerspectiveDsl.g:2887:2: ( ( rule__XImportDeclaration__Group_2_0__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:2885:2: ( ( rule__XImportDeclaration__Group_2_0__0 ) )
-                    // InternalPerspectiveDsl.g:2886:3: ( rule__XImportDeclaration__Group_2_0__0 )
+                    // InternalPerspectiveDsl.g:2887:2: ( ( rule__XImportDeclaration__Group_2_0__0 ) )
+                    // InternalPerspectiveDsl.g:2888:3: ( rule__XImportDeclaration__Group_2_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXImportDeclarationAccess().getGroup_2_0()); 
                     }
-                    // InternalPerspectiveDsl.g:2887:3: ( rule__XImportDeclaration__Group_2_0__0 )
-                    // InternalPerspectiveDsl.g:2887:4: rule__XImportDeclaration__Group_2_0__0
+                    // InternalPerspectiveDsl.g:2889:3: ( rule__XImportDeclaration__Group_2_0__0 )
+                    // InternalPerspectiveDsl.g:2889:4: rule__XImportDeclaration__Group_2_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XImportDeclaration__Group_2_0__0();
@@ -9922,16 +9922,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:2891:2: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) )
+                    // InternalPerspectiveDsl.g:2893:2: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) )
                     {
-                    // InternalPerspectiveDsl.g:2891:2: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) )
-                    // InternalPerspectiveDsl.g:2892:3: ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 )
+                    // InternalPerspectiveDsl.g:2893:2: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) )
+                    // InternalPerspectiveDsl.g:2894:3: ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_2_1()); 
                     }
-                    // InternalPerspectiveDsl.g:2893:3: ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 )
-                    // InternalPerspectiveDsl.g:2893:4: rule__XImportDeclaration__ImportedTypeAssignment_2_1
+                    // InternalPerspectiveDsl.g:2895:3: ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 )
+                    // InternalPerspectiveDsl.g:2895:4: rule__XImportDeclaration__ImportedTypeAssignment_2_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XImportDeclaration__ImportedTypeAssignment_2_1();
@@ -9951,16 +9951,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:2897:2: ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) )
+                    // InternalPerspectiveDsl.g:2899:2: ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) )
                     {
-                    // InternalPerspectiveDsl.g:2897:2: ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) )
-                    // InternalPerspectiveDsl.g:2898:3: ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 )
+                    // InternalPerspectiveDsl.g:2899:2: ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) )
+                    // InternalPerspectiveDsl.g:2900:3: ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_2_2()); 
                     }
-                    // InternalPerspectiveDsl.g:2899:3: ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 )
-                    // InternalPerspectiveDsl.g:2899:4: rule__XImportDeclaration__ImportedNamespaceAssignment_2_2
+                    // InternalPerspectiveDsl.g:2901:3: ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 )
+                    // InternalPerspectiveDsl.g:2901:4: rule__XImportDeclaration__ImportedNamespaceAssignment_2_2
                     {
                     pushFollow(FOLLOW_2);
                     rule__XImportDeclaration__ImportedNamespaceAssignment_2_2();
@@ -9980,16 +9980,16 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:2903:2: ( ( rule__XImportDeclaration__Group_2_3__0 ) )
+                    // InternalPerspectiveDsl.g:2905:2: ( ( rule__XImportDeclaration__Group_2_3__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:2903:2: ( ( rule__XImportDeclaration__Group_2_3__0 ) )
-                    // InternalPerspectiveDsl.g:2904:3: ( rule__XImportDeclaration__Group_2_3__0 )
+                    // InternalPerspectiveDsl.g:2905:2: ( ( rule__XImportDeclaration__Group_2_3__0 ) )
+                    // InternalPerspectiveDsl.g:2906:3: ( rule__XImportDeclaration__Group_2_3__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXImportDeclarationAccess().getGroup_2_3()); 
                     }
-                    // InternalPerspectiveDsl.g:2905:3: ( rule__XImportDeclaration__Group_2_3__0 )
-                    // InternalPerspectiveDsl.g:2905:4: rule__XImportDeclaration__Group_2_3__0
+                    // InternalPerspectiveDsl.g:2907:3: ( rule__XImportDeclaration__Group_2_3__0 )
+                    // InternalPerspectiveDsl.g:2907:4: rule__XImportDeclaration__Group_2_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XImportDeclaration__Group_2_3__0();
@@ -10026,13 +10026,13 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Alternatives_2_0_3"
-    // InternalPerspectiveDsl.g:2913:1: rule__XImportDeclaration__Alternatives_2_0_3 : ( ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) ) | ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) ) );
+    // InternalPerspectiveDsl.g:2915:1: rule__XImportDeclaration__Alternatives_2_0_3 : ( ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) ) | ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) ) );
     public final void rule__XImportDeclaration__Alternatives_2_0_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2917:1: ( ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) ) | ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) ) )
+            // InternalPerspectiveDsl.g:2919:1: ( ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) ) | ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) ) )
             int alt6=2;
             int LA6_0 = input.LA(1);
 
@@ -10051,16 +10051,16 @@
             }
             switch (alt6) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:2918:2: ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) )
+                    // InternalPerspectiveDsl.g:2920:2: ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) )
                     {
-                    // InternalPerspectiveDsl.g:2918:2: ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) )
-                    // InternalPerspectiveDsl.g:2919:3: ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 )
+                    // InternalPerspectiveDsl.g:2920:2: ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) )
+                    // InternalPerspectiveDsl.g:2921:3: ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_2_0_3_0()); 
                     }
-                    // InternalPerspectiveDsl.g:2920:3: ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 )
-                    // InternalPerspectiveDsl.g:2920:4: rule__XImportDeclaration__WildcardAssignment_2_0_3_0
+                    // InternalPerspectiveDsl.g:2922:3: ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 )
+                    // InternalPerspectiveDsl.g:2922:4: rule__XImportDeclaration__WildcardAssignment_2_0_3_0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XImportDeclaration__WildcardAssignment_2_0_3_0();
@@ -10080,16 +10080,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:2924:2: ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) )
+                    // InternalPerspectiveDsl.g:2926:2: ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) )
                     {
-                    // InternalPerspectiveDsl.g:2924:2: ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) )
-                    // InternalPerspectiveDsl.g:2925:3: ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 )
+                    // InternalPerspectiveDsl.g:2926:2: ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) )
+                    // InternalPerspectiveDsl.g:2927:3: ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_2_0_3_1()); 
                     }
-                    // InternalPerspectiveDsl.g:2926:3: ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 )
-                    // InternalPerspectiveDsl.g:2926:4: rule__XImportDeclaration__MemberNameAssignment_2_0_3_1
+                    // InternalPerspectiveDsl.g:2928:3: ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 )
+                    // InternalPerspectiveDsl.g:2928:4: rule__XImportDeclaration__MemberNameAssignment_2_0_3_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XImportDeclaration__MemberNameAssignment_2_0_3_1();
@@ -10126,27 +10126,27 @@
 
 
     // $ANTLR start "rule__XAnnotation__Alternatives_3_1"
-    // InternalPerspectiveDsl.g:2934:1: rule__XAnnotation__Alternatives_3_1 : ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) );
+    // InternalPerspectiveDsl.g:2936:1: rule__XAnnotation__Alternatives_3_1 : ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) );
     public final void rule__XAnnotation__Alternatives_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2938:1: ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) )
+            // InternalPerspectiveDsl.g:2940:1: ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) )
             int alt7=2;
             alt7 = dfa7.predict(input);
             switch (alt7) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:2939:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
+                    // InternalPerspectiveDsl.g:2941:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:2939:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
-                    // InternalPerspectiveDsl.g:2940:3: ( rule__XAnnotation__Group_3_1_0__0 )
+                    // InternalPerspectiveDsl.g:2941:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
+                    // InternalPerspectiveDsl.g:2942:3: ( rule__XAnnotation__Group_3_1_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); 
                     }
-                    // InternalPerspectiveDsl.g:2941:3: ( rule__XAnnotation__Group_3_1_0__0 )
-                    // InternalPerspectiveDsl.g:2941:4: rule__XAnnotation__Group_3_1_0__0
+                    // InternalPerspectiveDsl.g:2943:3: ( rule__XAnnotation__Group_3_1_0__0 )
+                    // InternalPerspectiveDsl.g:2943:4: rule__XAnnotation__Group_3_1_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotation__Group_3_1_0__0();
@@ -10166,16 +10166,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:2945:2: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
+                    // InternalPerspectiveDsl.g:2947:2: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
                     {
-                    // InternalPerspectiveDsl.g:2945:2: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
-                    // InternalPerspectiveDsl.g:2946:3: ( rule__XAnnotation__ValueAssignment_3_1_1 )
+                    // InternalPerspectiveDsl.g:2947:2: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
+                    // InternalPerspectiveDsl.g:2948:3: ( rule__XAnnotation__ValueAssignment_3_1_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); 
                     }
-                    // InternalPerspectiveDsl.g:2947:3: ( rule__XAnnotation__ValueAssignment_3_1_1 )
-                    // InternalPerspectiveDsl.g:2947:4: rule__XAnnotation__ValueAssignment_3_1_1
+                    // InternalPerspectiveDsl.g:2949:3: ( rule__XAnnotation__ValueAssignment_3_1_1 )
+                    // InternalPerspectiveDsl.g:2949:4: rule__XAnnotation__ValueAssignment_3_1_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotation__ValueAssignment_3_1_1();
@@ -10212,27 +10212,27 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Alternatives"
-    // InternalPerspectiveDsl.g:2955:1: rule__XAnnotationElementValueOrCommaList__Alternatives : ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) );
+    // InternalPerspectiveDsl.g:2957:1: rule__XAnnotationElementValueOrCommaList__Alternatives : ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) );
     public final void rule__XAnnotationElementValueOrCommaList__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2959:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) )
+            // InternalPerspectiveDsl.g:2961:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) )
             int alt8=2;
             alt8 = dfa8.predict(input);
             switch (alt8) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:2960:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
+                    // InternalPerspectiveDsl.g:2962:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:2960:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
-                    // InternalPerspectiveDsl.g:2961:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
+                    // InternalPerspectiveDsl.g:2962:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
+                    // InternalPerspectiveDsl.g:2963:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); 
                     }
-                    // InternalPerspectiveDsl.g:2962:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
-                    // InternalPerspectiveDsl.g:2962:4: rule__XAnnotationElementValueOrCommaList__Group_0__0
+                    // InternalPerspectiveDsl.g:2964:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
+                    // InternalPerspectiveDsl.g:2964:4: rule__XAnnotationElementValueOrCommaList__Group_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotationElementValueOrCommaList__Group_0__0();
@@ -10252,16 +10252,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:2966:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
+                    // InternalPerspectiveDsl.g:2968:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:2966:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
-                    // InternalPerspectiveDsl.g:2967:3: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
+                    // InternalPerspectiveDsl.g:2968:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
+                    // InternalPerspectiveDsl.g:2969:3: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); 
                     }
-                    // InternalPerspectiveDsl.g:2968:3: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
-                    // InternalPerspectiveDsl.g:2968:4: rule__XAnnotationElementValueOrCommaList__Group_1__0
+                    // InternalPerspectiveDsl.g:2970:3: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
+                    // InternalPerspectiveDsl.g:2970:4: rule__XAnnotationElementValueOrCommaList__Group_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotationElementValueOrCommaList__Group_1__0();
@@ -10298,27 +10298,27 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Alternatives"
-    // InternalPerspectiveDsl.g:2976:1: rule__XAnnotationElementValue__Alternatives : ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) );
+    // InternalPerspectiveDsl.g:2978:1: rule__XAnnotationElementValue__Alternatives : ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) );
     public final void rule__XAnnotationElementValue__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:2980:1: ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) )
+            // InternalPerspectiveDsl.g:2982:1: ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) )
             int alt9=2;
             alt9 = dfa9.predict(input);
             switch (alt9) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:2981:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
+                    // InternalPerspectiveDsl.g:2983:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:2981:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
-                    // InternalPerspectiveDsl.g:2982:3: ( rule__XAnnotationElementValue__Group_0__0 )
+                    // InternalPerspectiveDsl.g:2983:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
+                    // InternalPerspectiveDsl.g:2984:3: ( rule__XAnnotationElementValue__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); 
                     }
-                    // InternalPerspectiveDsl.g:2983:3: ( rule__XAnnotationElementValue__Group_0__0 )
-                    // InternalPerspectiveDsl.g:2983:4: rule__XAnnotationElementValue__Group_0__0
+                    // InternalPerspectiveDsl.g:2985:3: ( rule__XAnnotationElementValue__Group_0__0 )
+                    // InternalPerspectiveDsl.g:2985:4: rule__XAnnotationElementValue__Group_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotationElementValue__Group_0__0();
@@ -10338,10 +10338,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:2987:2: ( ruleXAnnotationOrExpression )
+                    // InternalPerspectiveDsl.g:2989:2: ( ruleXAnnotationOrExpression )
                     {
-                    // InternalPerspectiveDsl.g:2987:2: ( ruleXAnnotationOrExpression )
-                    // InternalPerspectiveDsl.g:2988:3: ruleXAnnotationOrExpression
+                    // InternalPerspectiveDsl.g:2989:2: ( ruleXAnnotationOrExpression )
+                    // InternalPerspectiveDsl.g:2990:3: ruleXAnnotationOrExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); 
@@ -10378,13 +10378,13 @@
 
 
     // $ANTLR start "rule__XAnnotationOrExpression__Alternatives"
-    // InternalPerspectiveDsl.g:2997:1: rule__XAnnotationOrExpression__Alternatives : ( ( ruleXAnnotation ) | ( ruleXExpression ) );
+    // InternalPerspectiveDsl.g:2999:1: rule__XAnnotationOrExpression__Alternatives : ( ( ruleXAnnotation ) | ( ruleXExpression ) );
     public final void rule__XAnnotationOrExpression__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3001:1: ( ( ruleXAnnotation ) | ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:3003:1: ( ( ruleXAnnotation ) | ( ruleXExpression ) )
             int alt10=2;
             int LA10_0 = input.LA(1);
 
@@ -10403,10 +10403,10 @@
             }
             switch (alt10) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3002:2: ( ruleXAnnotation )
+                    // InternalPerspectiveDsl.g:3004:2: ( ruleXAnnotation )
                     {
-                    // InternalPerspectiveDsl.g:3002:2: ( ruleXAnnotation )
-                    // InternalPerspectiveDsl.g:3003:3: ruleXAnnotation
+                    // InternalPerspectiveDsl.g:3004:2: ( ruleXAnnotation )
+                    // InternalPerspectiveDsl.g:3005:3: ruleXAnnotation
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); 
@@ -10426,10 +10426,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3008:2: ( ruleXExpression )
+                    // InternalPerspectiveDsl.g:3010:2: ( ruleXExpression )
                     {
-                    // InternalPerspectiveDsl.g:3008:2: ( ruleXExpression )
-                    // InternalPerspectiveDsl.g:3009:3: ruleXExpression
+                    // InternalPerspectiveDsl.g:3010:2: ( ruleXExpression )
+                    // InternalPerspectiveDsl.g:3011:3: ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); 
@@ -10466,13 +10466,13 @@
 
 
     // $ANTLR start "rule__XAssignment__Alternatives"
-    // InternalPerspectiveDsl.g:3018:1: rule__XAssignment__Alternatives : ( ( ( rule__XAssignment__Group_0__0 ) ) | ( ( rule__XAssignment__Group_1__0 ) ) );
+    // InternalPerspectiveDsl.g:3020:1: rule__XAssignment__Alternatives : ( ( ( rule__XAssignment__Group_0__0 ) ) | ( ( rule__XAssignment__Group_1__0 ) ) );
     public final void rule__XAssignment__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3022:1: ( ( ( rule__XAssignment__Group_0__0 ) ) | ( ( rule__XAssignment__Group_1__0 ) ) )
+            // InternalPerspectiveDsl.g:3024:1: ( ( ( rule__XAssignment__Group_0__0 ) ) | ( ( rule__XAssignment__Group_1__0 ) ) )
             int alt11=2;
             switch ( input.LA(1) ) {
             case RULE_ID:
@@ -10611,16 +10611,16 @@
 
             switch (alt11) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3023:2: ( ( rule__XAssignment__Group_0__0 ) )
+                    // InternalPerspectiveDsl.g:3025:2: ( ( rule__XAssignment__Group_0__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3023:2: ( ( rule__XAssignment__Group_0__0 ) )
-                    // InternalPerspectiveDsl.g:3024:3: ( rule__XAssignment__Group_0__0 )
+                    // InternalPerspectiveDsl.g:3025:2: ( ( rule__XAssignment__Group_0__0 ) )
+                    // InternalPerspectiveDsl.g:3026:3: ( rule__XAssignment__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAssignmentAccess().getGroup_0()); 
                     }
-                    // InternalPerspectiveDsl.g:3025:3: ( rule__XAssignment__Group_0__0 )
-                    // InternalPerspectiveDsl.g:3025:4: rule__XAssignment__Group_0__0
+                    // InternalPerspectiveDsl.g:3027:3: ( rule__XAssignment__Group_0__0 )
+                    // InternalPerspectiveDsl.g:3027:4: rule__XAssignment__Group_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAssignment__Group_0__0();
@@ -10640,16 +10640,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3029:2: ( ( rule__XAssignment__Group_1__0 ) )
+                    // InternalPerspectiveDsl.g:3031:2: ( ( rule__XAssignment__Group_1__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3029:2: ( ( rule__XAssignment__Group_1__0 ) )
-                    // InternalPerspectiveDsl.g:3030:3: ( rule__XAssignment__Group_1__0 )
+                    // InternalPerspectiveDsl.g:3031:2: ( ( rule__XAssignment__Group_1__0 ) )
+                    // InternalPerspectiveDsl.g:3032:3: ( rule__XAssignment__Group_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAssignmentAccess().getGroup_1()); 
                     }
-                    // InternalPerspectiveDsl.g:3031:3: ( rule__XAssignment__Group_1__0 )
-                    // InternalPerspectiveDsl.g:3031:4: rule__XAssignment__Group_1__0
+                    // InternalPerspectiveDsl.g:3033:3: ( rule__XAssignment__Group_1__0 )
+                    // InternalPerspectiveDsl.g:3033:4: rule__XAssignment__Group_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAssignment__Group_1__0();
@@ -10686,13 +10686,13 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Alternatives"
-    // InternalPerspectiveDsl.g:3039:1: rule__OpMultiAssign__Alternatives : ( ( '+=' ) | ( '-=' ) | ( '*=' ) | ( '/=' ) | ( '%=' ) | ( ( rule__OpMultiAssign__Group_5__0 ) ) | ( ( rule__OpMultiAssign__Group_6__0 ) ) );
+    // InternalPerspectiveDsl.g:3041:1: rule__OpMultiAssign__Alternatives : ( ( '+=' ) | ( '-=' ) | ( '*=' ) | ( '/=' ) | ( '%=' ) | ( ( rule__OpMultiAssign__Group_5__0 ) ) | ( ( rule__OpMultiAssign__Group_6__0 ) ) );
     public final void rule__OpMultiAssign__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3043:1: ( ( '+=' ) | ( '-=' ) | ( '*=' ) | ( '/=' ) | ( '%=' ) | ( ( rule__OpMultiAssign__Group_5__0 ) ) | ( ( rule__OpMultiAssign__Group_6__0 ) ) )
+            // InternalPerspectiveDsl.g:3045:1: ( ( '+=' ) | ( '-=' ) | ( '*=' ) | ( '/=' ) | ( '%=' ) | ( ( rule__OpMultiAssign__Group_5__0 ) ) | ( ( rule__OpMultiAssign__Group_6__0 ) ) )
             int alt12=7;
             switch ( input.LA(1) ) {
             case 16:
@@ -10740,10 +10740,10 @@
 
             switch (alt12) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3044:2: ( '+=' )
+                    // InternalPerspectiveDsl.g:3046:2: ( '+=' )
                     {
-                    // InternalPerspectiveDsl.g:3044:2: ( '+=' )
-                    // InternalPerspectiveDsl.g:3045:3: '+='
+                    // InternalPerspectiveDsl.g:3046:2: ( '+=' )
+                    // InternalPerspectiveDsl.g:3047:3: '+='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); 
@@ -10759,10 +10759,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3050:2: ( '-=' )
+                    // InternalPerspectiveDsl.g:3052:2: ( '-=' )
                     {
-                    // InternalPerspectiveDsl.g:3050:2: ( '-=' )
-                    // InternalPerspectiveDsl.g:3051:3: '-='
+                    // InternalPerspectiveDsl.g:3052:2: ( '-=' )
+                    // InternalPerspectiveDsl.g:3053:3: '-='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); 
@@ -10778,10 +10778,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:3056:2: ( '*=' )
+                    // InternalPerspectiveDsl.g:3058:2: ( '*=' )
                     {
-                    // InternalPerspectiveDsl.g:3056:2: ( '*=' )
-                    // InternalPerspectiveDsl.g:3057:3: '*='
+                    // InternalPerspectiveDsl.g:3058:2: ( '*=' )
+                    // InternalPerspectiveDsl.g:3059:3: '*='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); 
@@ -10797,10 +10797,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:3062:2: ( '/=' )
+                    // InternalPerspectiveDsl.g:3064:2: ( '/=' )
                     {
-                    // InternalPerspectiveDsl.g:3062:2: ( '/=' )
-                    // InternalPerspectiveDsl.g:3063:3: '/='
+                    // InternalPerspectiveDsl.g:3064:2: ( '/=' )
+                    // InternalPerspectiveDsl.g:3065:3: '/='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); 
@@ -10816,10 +10816,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalPerspectiveDsl.g:3068:2: ( '%=' )
+                    // InternalPerspectiveDsl.g:3070:2: ( '%=' )
                     {
-                    // InternalPerspectiveDsl.g:3068:2: ( '%=' )
-                    // InternalPerspectiveDsl.g:3069:3: '%='
+                    // InternalPerspectiveDsl.g:3070:2: ( '%=' )
+                    // InternalPerspectiveDsl.g:3071:3: '%='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); 
@@ -10835,16 +10835,16 @@
                     }
                     break;
                 case 6 :
-                    // InternalPerspectiveDsl.g:3074:2: ( ( rule__OpMultiAssign__Group_5__0 ) )
+                    // InternalPerspectiveDsl.g:3076:2: ( ( rule__OpMultiAssign__Group_5__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3074:2: ( ( rule__OpMultiAssign__Group_5__0 ) )
-                    // InternalPerspectiveDsl.g:3075:3: ( rule__OpMultiAssign__Group_5__0 )
+                    // InternalPerspectiveDsl.g:3076:2: ( ( rule__OpMultiAssign__Group_5__0 ) )
+                    // InternalPerspectiveDsl.g:3077:3: ( rule__OpMultiAssign__Group_5__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAssignAccess().getGroup_5()); 
                     }
-                    // InternalPerspectiveDsl.g:3076:3: ( rule__OpMultiAssign__Group_5__0 )
-                    // InternalPerspectiveDsl.g:3076:4: rule__OpMultiAssign__Group_5__0
+                    // InternalPerspectiveDsl.g:3078:3: ( rule__OpMultiAssign__Group_5__0 )
+                    // InternalPerspectiveDsl.g:3078:4: rule__OpMultiAssign__Group_5__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__OpMultiAssign__Group_5__0();
@@ -10864,16 +10864,16 @@
                     }
                     break;
                 case 7 :
-                    // InternalPerspectiveDsl.g:3080:2: ( ( rule__OpMultiAssign__Group_6__0 ) )
+                    // InternalPerspectiveDsl.g:3082:2: ( ( rule__OpMultiAssign__Group_6__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3080:2: ( ( rule__OpMultiAssign__Group_6__0 ) )
-                    // InternalPerspectiveDsl.g:3081:3: ( rule__OpMultiAssign__Group_6__0 )
+                    // InternalPerspectiveDsl.g:3082:2: ( ( rule__OpMultiAssign__Group_6__0 ) )
+                    // InternalPerspectiveDsl.g:3083:3: ( rule__OpMultiAssign__Group_6__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAssignAccess().getGroup_6()); 
                     }
-                    // InternalPerspectiveDsl.g:3082:3: ( rule__OpMultiAssign__Group_6__0 )
-                    // InternalPerspectiveDsl.g:3082:4: rule__OpMultiAssign__Group_6__0
+                    // InternalPerspectiveDsl.g:3084:3: ( rule__OpMultiAssign__Group_6__0 )
+                    // InternalPerspectiveDsl.g:3084:4: rule__OpMultiAssign__Group_6__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__OpMultiAssign__Group_6__0();
@@ -10910,13 +10910,13 @@
 
 
     // $ANTLR start "rule__OpEquality__Alternatives"
-    // InternalPerspectiveDsl.g:3090:1: rule__OpEquality__Alternatives : ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '!==' ) );
+    // InternalPerspectiveDsl.g:3092:1: rule__OpEquality__Alternatives : ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '!==' ) );
     public final void rule__OpEquality__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3094:1: ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '!==' ) )
+            // InternalPerspectiveDsl.g:3096:1: ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '!==' ) )
             int alt13=4;
             switch ( input.LA(1) ) {
             case 21:
@@ -10949,10 +10949,10 @@
 
             switch (alt13) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3095:2: ( '==' )
+                    // InternalPerspectiveDsl.g:3097:2: ( '==' )
                     {
-                    // InternalPerspectiveDsl.g:3095:2: ( '==' )
-                    // InternalPerspectiveDsl.g:3096:3: '=='
+                    // InternalPerspectiveDsl.g:3097:2: ( '==' )
+                    // InternalPerspectiveDsl.g:3098:3: '=='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); 
@@ -10968,10 +10968,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3101:2: ( '!=' )
+                    // InternalPerspectiveDsl.g:3103:2: ( '!=' )
                     {
-                    // InternalPerspectiveDsl.g:3101:2: ( '!=' )
-                    // InternalPerspectiveDsl.g:3102:3: '!='
+                    // InternalPerspectiveDsl.g:3103:2: ( '!=' )
+                    // InternalPerspectiveDsl.g:3104:3: '!='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); 
@@ -10987,10 +10987,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:3107:2: ( '===' )
+                    // InternalPerspectiveDsl.g:3109:2: ( '===' )
                     {
-                    // InternalPerspectiveDsl.g:3107:2: ( '===' )
-                    // InternalPerspectiveDsl.g:3108:3: '==='
+                    // InternalPerspectiveDsl.g:3109:2: ( '===' )
+                    // InternalPerspectiveDsl.g:3110:3: '==='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); 
@@ -11006,10 +11006,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:3113:2: ( '!==' )
+                    // InternalPerspectiveDsl.g:3115:2: ( '!==' )
                     {
-                    // InternalPerspectiveDsl.g:3113:2: ( '!==' )
-                    // InternalPerspectiveDsl.g:3114:3: '!=='
+                    // InternalPerspectiveDsl.g:3115:2: ( '!==' )
+                    // InternalPerspectiveDsl.g:3116:3: '!=='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); 
@@ -11042,13 +11042,13 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Alternatives_1"
-    // InternalPerspectiveDsl.g:3123:1: rule__XRelationalExpression__Alternatives_1 : ( ( ( rule__XRelationalExpression__Group_1_0__0 ) ) | ( ( rule__XRelationalExpression__Group_1_1__0 ) ) );
+    // InternalPerspectiveDsl.g:3125:1: rule__XRelationalExpression__Alternatives_1 : ( ( ( rule__XRelationalExpression__Group_1_0__0 ) ) | ( ( rule__XRelationalExpression__Group_1_1__0 ) ) );
     public final void rule__XRelationalExpression__Alternatives_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3127:1: ( ( ( rule__XRelationalExpression__Group_1_0__0 ) ) | ( ( rule__XRelationalExpression__Group_1_1__0 ) ) )
+            // InternalPerspectiveDsl.g:3129:1: ( ( ( rule__XRelationalExpression__Group_1_0__0 ) ) | ( ( rule__XRelationalExpression__Group_1_1__0 ) ) )
             int alt14=2;
             int LA14_0 = input.LA(1);
 
@@ -11067,16 +11067,16 @@
             }
             switch (alt14) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3128:2: ( ( rule__XRelationalExpression__Group_1_0__0 ) )
+                    // InternalPerspectiveDsl.g:3130:2: ( ( rule__XRelationalExpression__Group_1_0__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3128:2: ( ( rule__XRelationalExpression__Group_1_0__0 ) )
-                    // InternalPerspectiveDsl.g:3129:3: ( rule__XRelationalExpression__Group_1_0__0 )
+                    // InternalPerspectiveDsl.g:3130:2: ( ( rule__XRelationalExpression__Group_1_0__0 ) )
+                    // InternalPerspectiveDsl.g:3131:3: ( rule__XRelationalExpression__Group_1_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); 
                     }
-                    // InternalPerspectiveDsl.g:3130:3: ( rule__XRelationalExpression__Group_1_0__0 )
-                    // InternalPerspectiveDsl.g:3130:4: rule__XRelationalExpression__Group_1_0__0
+                    // InternalPerspectiveDsl.g:3132:3: ( rule__XRelationalExpression__Group_1_0__0 )
+                    // InternalPerspectiveDsl.g:3132:4: rule__XRelationalExpression__Group_1_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XRelationalExpression__Group_1_0__0();
@@ -11096,16 +11096,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3134:2: ( ( rule__XRelationalExpression__Group_1_1__0 ) )
+                    // InternalPerspectiveDsl.g:3136:2: ( ( rule__XRelationalExpression__Group_1_1__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3134:2: ( ( rule__XRelationalExpression__Group_1_1__0 ) )
-                    // InternalPerspectiveDsl.g:3135:3: ( rule__XRelationalExpression__Group_1_1__0 )
+                    // InternalPerspectiveDsl.g:3136:2: ( ( rule__XRelationalExpression__Group_1_1__0 ) )
+                    // InternalPerspectiveDsl.g:3137:3: ( rule__XRelationalExpression__Group_1_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); 
                     }
-                    // InternalPerspectiveDsl.g:3136:3: ( rule__XRelationalExpression__Group_1_1__0 )
-                    // InternalPerspectiveDsl.g:3136:4: rule__XRelationalExpression__Group_1_1__0
+                    // InternalPerspectiveDsl.g:3138:3: ( rule__XRelationalExpression__Group_1_1__0 )
+                    // InternalPerspectiveDsl.g:3138:4: rule__XRelationalExpression__Group_1_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XRelationalExpression__Group_1_1__0();
@@ -11142,13 +11142,13 @@
 
 
     // $ANTLR start "rule__OpCompare__Alternatives"
-    // InternalPerspectiveDsl.g:3144:1: rule__OpCompare__Alternatives : ( ( '>=' ) | ( ( rule__OpCompare__Group_1__0 ) ) | ( '>' ) | ( '<' ) );
+    // InternalPerspectiveDsl.g:3146:1: rule__OpCompare__Alternatives : ( ( '>=' ) | ( ( rule__OpCompare__Group_1__0 ) ) | ( '>' ) | ( '<' ) );
     public final void rule__OpCompare__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3148:1: ( ( '>=' ) | ( ( rule__OpCompare__Group_1__0 ) ) | ( '>' ) | ( '<' ) )
+            // InternalPerspectiveDsl.g:3150:1: ( ( '>=' ) | ( ( rule__OpCompare__Group_1__0 ) ) | ( '>' ) | ( '<' ) )
             int alt15=4;
             switch ( input.LA(1) ) {
             case 25:
@@ -11190,10 +11190,10 @@
 
             switch (alt15) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3149:2: ( '>=' )
+                    // InternalPerspectiveDsl.g:3151:2: ( '>=' )
                     {
-                    // InternalPerspectiveDsl.g:3149:2: ( '>=' )
-                    // InternalPerspectiveDsl.g:3150:3: '>='
+                    // InternalPerspectiveDsl.g:3151:2: ( '>=' )
+                    // InternalPerspectiveDsl.g:3152:3: '>='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); 
@@ -11209,16 +11209,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3155:2: ( ( rule__OpCompare__Group_1__0 ) )
+                    // InternalPerspectiveDsl.g:3157:2: ( ( rule__OpCompare__Group_1__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3155:2: ( ( rule__OpCompare__Group_1__0 ) )
-                    // InternalPerspectiveDsl.g:3156:3: ( rule__OpCompare__Group_1__0 )
+                    // InternalPerspectiveDsl.g:3157:2: ( ( rule__OpCompare__Group_1__0 ) )
+                    // InternalPerspectiveDsl.g:3158:3: ( rule__OpCompare__Group_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpCompareAccess().getGroup_1()); 
                     }
-                    // InternalPerspectiveDsl.g:3157:3: ( rule__OpCompare__Group_1__0 )
-                    // InternalPerspectiveDsl.g:3157:4: rule__OpCompare__Group_1__0
+                    // InternalPerspectiveDsl.g:3159:3: ( rule__OpCompare__Group_1__0 )
+                    // InternalPerspectiveDsl.g:3159:4: rule__OpCompare__Group_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__OpCompare__Group_1__0();
@@ -11238,10 +11238,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:3161:2: ( '>' )
+                    // InternalPerspectiveDsl.g:3163:2: ( '>' )
                     {
-                    // InternalPerspectiveDsl.g:3161:2: ( '>' )
-                    // InternalPerspectiveDsl.g:3162:3: '>'
+                    // InternalPerspectiveDsl.g:3163:2: ( '>' )
+                    // InternalPerspectiveDsl.g:3164:3: '>'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); 
@@ -11257,10 +11257,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:3167:2: ( '<' )
+                    // InternalPerspectiveDsl.g:3169:2: ( '<' )
                     {
-                    // InternalPerspectiveDsl.g:3167:2: ( '<' )
-                    // InternalPerspectiveDsl.g:3168:3: '<'
+                    // InternalPerspectiveDsl.g:3169:2: ( '<' )
+                    // InternalPerspectiveDsl.g:3170:3: '<'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); 
@@ -11293,21 +11293,21 @@
 
 
     // $ANTLR start "rule__OpOther__Alternatives"
-    // InternalPerspectiveDsl.g:3177:1: rule__OpOther__Alternatives : ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) );
+    // InternalPerspectiveDsl.g:3179:1: rule__OpOther__Alternatives : ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) );
     public final void rule__OpOther__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3181:1: ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) )
+            // InternalPerspectiveDsl.g:3183:1: ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) )
             int alt16=9;
             alt16 = dfa16.predict(input);
             switch (alt16) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3182:2: ( '->' )
+                    // InternalPerspectiveDsl.g:3184:2: ( '->' )
                     {
-                    // InternalPerspectiveDsl.g:3182:2: ( '->' )
-                    // InternalPerspectiveDsl.g:3183:3: '->'
+                    // InternalPerspectiveDsl.g:3184:2: ( '->' )
+                    // InternalPerspectiveDsl.g:3185:3: '->'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); 
@@ -11323,10 +11323,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3188:2: ( '..<' )
+                    // InternalPerspectiveDsl.g:3190:2: ( '..<' )
                     {
-                    // InternalPerspectiveDsl.g:3188:2: ( '..<' )
-                    // InternalPerspectiveDsl.g:3189:3: '..<'
+                    // InternalPerspectiveDsl.g:3190:2: ( '..<' )
+                    // InternalPerspectiveDsl.g:3191:3: '..<'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); 
@@ -11342,16 +11342,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:3194:2: ( ( rule__OpOther__Group_2__0 ) )
+                    // InternalPerspectiveDsl.g:3196:2: ( ( rule__OpOther__Group_2__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3194:2: ( ( rule__OpOther__Group_2__0 ) )
-                    // InternalPerspectiveDsl.g:3195:3: ( rule__OpOther__Group_2__0 )
+                    // InternalPerspectiveDsl.g:3196:2: ( ( rule__OpOther__Group_2__0 ) )
+                    // InternalPerspectiveDsl.g:3197:3: ( rule__OpOther__Group_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getGroup_2()); 
                     }
-                    // InternalPerspectiveDsl.g:3196:3: ( rule__OpOther__Group_2__0 )
-                    // InternalPerspectiveDsl.g:3196:4: rule__OpOther__Group_2__0
+                    // InternalPerspectiveDsl.g:3198:3: ( rule__OpOther__Group_2__0 )
+                    // InternalPerspectiveDsl.g:3198:4: rule__OpOther__Group_2__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__OpOther__Group_2__0();
@@ -11371,10 +11371,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:3200:2: ( '..' )
+                    // InternalPerspectiveDsl.g:3202:2: ( '..' )
                     {
-                    // InternalPerspectiveDsl.g:3200:2: ( '..' )
-                    // InternalPerspectiveDsl.g:3201:3: '..'
+                    // InternalPerspectiveDsl.g:3202:2: ( '..' )
+                    // InternalPerspectiveDsl.g:3203:3: '..'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); 
@@ -11390,10 +11390,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalPerspectiveDsl.g:3206:2: ( '=>' )
+                    // InternalPerspectiveDsl.g:3208:2: ( '=>' )
                     {
-                    // InternalPerspectiveDsl.g:3206:2: ( '=>' )
-                    // InternalPerspectiveDsl.g:3207:3: '=>'
+                    // InternalPerspectiveDsl.g:3208:2: ( '=>' )
+                    // InternalPerspectiveDsl.g:3209:3: '=>'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); 
@@ -11409,16 +11409,16 @@
                     }
                     break;
                 case 6 :
-                    // InternalPerspectiveDsl.g:3212:2: ( ( rule__OpOther__Group_5__0 ) )
+                    // InternalPerspectiveDsl.g:3214:2: ( ( rule__OpOther__Group_5__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3212:2: ( ( rule__OpOther__Group_5__0 ) )
-                    // InternalPerspectiveDsl.g:3213:3: ( rule__OpOther__Group_5__0 )
+                    // InternalPerspectiveDsl.g:3214:2: ( ( rule__OpOther__Group_5__0 ) )
+                    // InternalPerspectiveDsl.g:3215:3: ( rule__OpOther__Group_5__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getGroup_5()); 
                     }
-                    // InternalPerspectiveDsl.g:3214:3: ( rule__OpOther__Group_5__0 )
-                    // InternalPerspectiveDsl.g:3214:4: rule__OpOther__Group_5__0
+                    // InternalPerspectiveDsl.g:3216:3: ( rule__OpOther__Group_5__0 )
+                    // InternalPerspectiveDsl.g:3216:4: rule__OpOther__Group_5__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__OpOther__Group_5__0();
@@ -11438,16 +11438,16 @@
                     }
                     break;
                 case 7 :
-                    // InternalPerspectiveDsl.g:3218:2: ( ( rule__OpOther__Group_6__0 ) )
+                    // InternalPerspectiveDsl.g:3220:2: ( ( rule__OpOther__Group_6__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3218:2: ( ( rule__OpOther__Group_6__0 ) )
-                    // InternalPerspectiveDsl.g:3219:3: ( rule__OpOther__Group_6__0 )
+                    // InternalPerspectiveDsl.g:3220:2: ( ( rule__OpOther__Group_6__0 ) )
+                    // InternalPerspectiveDsl.g:3221:3: ( rule__OpOther__Group_6__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getGroup_6()); 
                     }
-                    // InternalPerspectiveDsl.g:3220:3: ( rule__OpOther__Group_6__0 )
-                    // InternalPerspectiveDsl.g:3220:4: rule__OpOther__Group_6__0
+                    // InternalPerspectiveDsl.g:3222:3: ( rule__OpOther__Group_6__0 )
+                    // InternalPerspectiveDsl.g:3222:4: rule__OpOther__Group_6__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__OpOther__Group_6__0();
@@ -11467,10 +11467,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalPerspectiveDsl.g:3224:2: ( '<>' )
+                    // InternalPerspectiveDsl.g:3226:2: ( '<>' )
                     {
-                    // InternalPerspectiveDsl.g:3224:2: ( '<>' )
-                    // InternalPerspectiveDsl.g:3225:3: '<>'
+                    // InternalPerspectiveDsl.g:3226:2: ( '<>' )
+                    // InternalPerspectiveDsl.g:3227:3: '<>'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); 
@@ -11486,10 +11486,10 @@
                     }
                     break;
                 case 9 :
-                    // InternalPerspectiveDsl.g:3230:2: ( '?:' )
+                    // InternalPerspectiveDsl.g:3232:2: ( '?:' )
                     {
-                    // InternalPerspectiveDsl.g:3230:2: ( '?:' )
-                    // InternalPerspectiveDsl.g:3231:3: '?:'
+                    // InternalPerspectiveDsl.g:3232:2: ( '?:' )
+                    // InternalPerspectiveDsl.g:3233:3: '?:'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); 
@@ -11522,13 +11522,13 @@
 
 
     // $ANTLR start "rule__OpOther__Alternatives_5_1"
-    // InternalPerspectiveDsl.g:3240:1: rule__OpOther__Alternatives_5_1 : ( ( ( rule__OpOther__Group_5_1_0__0 ) ) | ( '>' ) );
+    // InternalPerspectiveDsl.g:3242:1: rule__OpOther__Alternatives_5_1 : ( ( ( rule__OpOther__Group_5_1_0__0 ) ) | ( '>' ) );
     public final void rule__OpOther__Alternatives_5_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3244:1: ( ( ( rule__OpOther__Group_5_1_0__0 ) ) | ( '>' ) )
+            // InternalPerspectiveDsl.g:3246:1: ( ( ( rule__OpOther__Group_5_1_0__0 ) ) | ( '>' ) )
             int alt17=2;
             int LA17_0 = input.LA(1);
 
@@ -11558,16 +11558,16 @@
             }
             switch (alt17) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3245:2: ( ( rule__OpOther__Group_5_1_0__0 ) )
+                    // InternalPerspectiveDsl.g:3247:2: ( ( rule__OpOther__Group_5_1_0__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3245:2: ( ( rule__OpOther__Group_5_1_0__0 ) )
-                    // InternalPerspectiveDsl.g:3246:3: ( rule__OpOther__Group_5_1_0__0 )
+                    // InternalPerspectiveDsl.g:3247:2: ( ( rule__OpOther__Group_5_1_0__0 ) )
+                    // InternalPerspectiveDsl.g:3248:3: ( rule__OpOther__Group_5_1_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); 
                     }
-                    // InternalPerspectiveDsl.g:3247:3: ( rule__OpOther__Group_5_1_0__0 )
-                    // InternalPerspectiveDsl.g:3247:4: rule__OpOther__Group_5_1_0__0
+                    // InternalPerspectiveDsl.g:3249:3: ( rule__OpOther__Group_5_1_0__0 )
+                    // InternalPerspectiveDsl.g:3249:4: rule__OpOther__Group_5_1_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__OpOther__Group_5_1_0__0();
@@ -11587,10 +11587,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3251:2: ( '>' )
+                    // InternalPerspectiveDsl.g:3253:2: ( '>' )
                     {
-                    // InternalPerspectiveDsl.g:3251:2: ( '>' )
-                    // InternalPerspectiveDsl.g:3252:3: '>'
+                    // InternalPerspectiveDsl.g:3253:2: ( '>' )
+                    // InternalPerspectiveDsl.g:3254:3: '>'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); 
@@ -11623,13 +11623,13 @@
 
 
     // $ANTLR start "rule__OpOther__Alternatives_6_1"
-    // InternalPerspectiveDsl.g:3261:1: rule__OpOther__Alternatives_6_1 : ( ( ( rule__OpOther__Group_6_1_0__0 ) ) | ( '<' ) | ( '=>' ) );
+    // InternalPerspectiveDsl.g:3263:1: rule__OpOther__Alternatives_6_1 : ( ( ( rule__OpOther__Group_6_1_0__0 ) ) | ( '<' ) | ( '=>' ) );
     public final void rule__OpOther__Alternatives_6_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3265:1: ( ( ( rule__OpOther__Group_6_1_0__0 ) ) | ( '<' ) | ( '=>' ) )
+            // InternalPerspectiveDsl.g:3267:1: ( ( ( rule__OpOther__Group_6_1_0__0 ) ) | ( '<' ) | ( '=>' ) )
             int alt18=3;
             int LA18_0 = input.LA(1);
 
@@ -11662,16 +11662,16 @@
             }
             switch (alt18) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3266:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
+                    // InternalPerspectiveDsl.g:3268:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3266:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
-                    // InternalPerspectiveDsl.g:3267:3: ( rule__OpOther__Group_6_1_0__0 )
+                    // InternalPerspectiveDsl.g:3268:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
+                    // InternalPerspectiveDsl.g:3269:3: ( rule__OpOther__Group_6_1_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); 
                     }
-                    // InternalPerspectiveDsl.g:3268:3: ( rule__OpOther__Group_6_1_0__0 )
-                    // InternalPerspectiveDsl.g:3268:4: rule__OpOther__Group_6_1_0__0
+                    // InternalPerspectiveDsl.g:3270:3: ( rule__OpOther__Group_6_1_0__0 )
+                    // InternalPerspectiveDsl.g:3270:4: rule__OpOther__Group_6_1_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__OpOther__Group_6_1_0__0();
@@ -11691,10 +11691,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3272:2: ( '<' )
+                    // InternalPerspectiveDsl.g:3274:2: ( '<' )
                     {
-                    // InternalPerspectiveDsl.g:3272:2: ( '<' )
-                    // InternalPerspectiveDsl.g:3273:3: '<'
+                    // InternalPerspectiveDsl.g:3274:2: ( '<' )
+                    // InternalPerspectiveDsl.g:3275:3: '<'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); 
@@ -11710,10 +11710,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:3278:2: ( '=>' )
+                    // InternalPerspectiveDsl.g:3280:2: ( '=>' )
                     {
-                    // InternalPerspectiveDsl.g:3278:2: ( '=>' )
-                    // InternalPerspectiveDsl.g:3279:3: '=>'
+                    // InternalPerspectiveDsl.g:3280:2: ( '=>' )
+                    // InternalPerspectiveDsl.g:3281:3: '=>'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); 
@@ -11746,13 +11746,13 @@
 
 
     // $ANTLR start "rule__OpAdd__Alternatives"
-    // InternalPerspectiveDsl.g:3288:1: rule__OpAdd__Alternatives : ( ( '+' ) | ( '-' ) );
+    // InternalPerspectiveDsl.g:3290:1: rule__OpAdd__Alternatives : ( ( '+' ) | ( '-' ) );
     public final void rule__OpAdd__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3292:1: ( ( '+' ) | ( '-' ) )
+            // InternalPerspectiveDsl.g:3294:1: ( ( '+' ) | ( '-' ) )
             int alt19=2;
             int LA19_0 = input.LA(1);
 
@@ -11771,10 +11771,10 @@
             }
             switch (alt19) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3293:2: ( '+' )
+                    // InternalPerspectiveDsl.g:3295:2: ( '+' )
                     {
-                    // InternalPerspectiveDsl.g:3293:2: ( '+' )
-                    // InternalPerspectiveDsl.g:3294:3: '+'
+                    // InternalPerspectiveDsl.g:3295:2: ( '+' )
+                    // InternalPerspectiveDsl.g:3296:3: '+'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); 
@@ -11790,10 +11790,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3299:2: ( '-' )
+                    // InternalPerspectiveDsl.g:3301:2: ( '-' )
                     {
-                    // InternalPerspectiveDsl.g:3299:2: ( '-' )
-                    // InternalPerspectiveDsl.g:3300:3: '-'
+                    // InternalPerspectiveDsl.g:3301:2: ( '-' )
+                    // InternalPerspectiveDsl.g:3302:3: '-'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); 
@@ -11826,13 +11826,13 @@
 
 
     // $ANTLR start "rule__OpMulti__Alternatives"
-    // InternalPerspectiveDsl.g:3309:1: rule__OpMulti__Alternatives : ( ( '*' ) | ( '**' ) | ( '/' ) | ( '%' ) );
+    // InternalPerspectiveDsl.g:3311:1: rule__OpMulti__Alternatives : ( ( '*' ) | ( '**' ) | ( '/' ) | ( '%' ) );
     public final void rule__OpMulti__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3313:1: ( ( '*' ) | ( '**' ) | ( '/' ) | ( '%' ) )
+            // InternalPerspectiveDsl.g:3315:1: ( ( '*' ) | ( '**' ) | ( '/' ) | ( '%' ) )
             int alt20=4;
             switch ( input.LA(1) ) {
             case 36:
@@ -11865,10 +11865,10 @@
 
             switch (alt20) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3314:2: ( '*' )
+                    // InternalPerspectiveDsl.g:3316:2: ( '*' )
                     {
-                    // InternalPerspectiveDsl.g:3314:2: ( '*' )
-                    // InternalPerspectiveDsl.g:3315:3: '*'
+                    // InternalPerspectiveDsl.g:3316:2: ( '*' )
+                    // InternalPerspectiveDsl.g:3317:3: '*'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); 
@@ -11884,10 +11884,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3320:2: ( '**' )
+                    // InternalPerspectiveDsl.g:3322:2: ( '**' )
                     {
-                    // InternalPerspectiveDsl.g:3320:2: ( '**' )
-                    // InternalPerspectiveDsl.g:3321:3: '**'
+                    // InternalPerspectiveDsl.g:3322:2: ( '**' )
+                    // InternalPerspectiveDsl.g:3323:3: '**'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); 
@@ -11903,10 +11903,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:3326:2: ( '/' )
+                    // InternalPerspectiveDsl.g:3328:2: ( '/' )
                     {
-                    // InternalPerspectiveDsl.g:3326:2: ( '/' )
-                    // InternalPerspectiveDsl.g:3327:3: '/'
+                    // InternalPerspectiveDsl.g:3328:2: ( '/' )
+                    // InternalPerspectiveDsl.g:3329:3: '/'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); 
@@ -11922,10 +11922,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:3332:2: ( '%' )
+                    // InternalPerspectiveDsl.g:3334:2: ( '%' )
                     {
-                    // InternalPerspectiveDsl.g:3332:2: ( '%' )
-                    // InternalPerspectiveDsl.g:3333:3: '%'
+                    // InternalPerspectiveDsl.g:3334:2: ( '%' )
+                    // InternalPerspectiveDsl.g:3335:3: '%'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); 
@@ -11958,13 +11958,13 @@
 
 
     // $ANTLR start "rule__XUnaryOperation__Alternatives"
-    // InternalPerspectiveDsl.g:3342:1: rule__XUnaryOperation__Alternatives : ( ( ( rule__XUnaryOperation__Group_0__0 ) ) | ( ruleXCastedExpression ) );
+    // InternalPerspectiveDsl.g:3344:1: rule__XUnaryOperation__Alternatives : ( ( ( rule__XUnaryOperation__Group_0__0 ) ) | ( ruleXCastedExpression ) );
     public final void rule__XUnaryOperation__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3346:1: ( ( ( rule__XUnaryOperation__Group_0__0 ) ) | ( ruleXCastedExpression ) )
+            // InternalPerspectiveDsl.g:3348:1: ( ( ( rule__XUnaryOperation__Group_0__0 ) ) | ( ruleXCastedExpression ) )
             int alt21=2;
             int LA21_0 = input.LA(1);
 
@@ -11983,16 +11983,16 @@
             }
             switch (alt21) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3347:2: ( ( rule__XUnaryOperation__Group_0__0 ) )
+                    // InternalPerspectiveDsl.g:3349:2: ( ( rule__XUnaryOperation__Group_0__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3347:2: ( ( rule__XUnaryOperation__Group_0__0 ) )
-                    // InternalPerspectiveDsl.g:3348:3: ( rule__XUnaryOperation__Group_0__0 )
+                    // InternalPerspectiveDsl.g:3349:2: ( ( rule__XUnaryOperation__Group_0__0 ) )
+                    // InternalPerspectiveDsl.g:3350:3: ( rule__XUnaryOperation__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXUnaryOperationAccess().getGroup_0()); 
                     }
-                    // InternalPerspectiveDsl.g:3349:3: ( rule__XUnaryOperation__Group_0__0 )
-                    // InternalPerspectiveDsl.g:3349:4: rule__XUnaryOperation__Group_0__0
+                    // InternalPerspectiveDsl.g:3351:3: ( rule__XUnaryOperation__Group_0__0 )
+                    // InternalPerspectiveDsl.g:3351:4: rule__XUnaryOperation__Group_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XUnaryOperation__Group_0__0();
@@ -12012,10 +12012,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3353:2: ( ruleXCastedExpression )
+                    // InternalPerspectiveDsl.g:3355:2: ( ruleXCastedExpression )
                     {
-                    // InternalPerspectiveDsl.g:3353:2: ( ruleXCastedExpression )
-                    // InternalPerspectiveDsl.g:3354:3: ruleXCastedExpression
+                    // InternalPerspectiveDsl.g:3355:2: ( ruleXCastedExpression )
+                    // InternalPerspectiveDsl.g:3356:3: ruleXCastedExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); 
@@ -12052,13 +12052,13 @@
 
 
     // $ANTLR start "rule__OpUnary__Alternatives"
-    // InternalPerspectiveDsl.g:3363:1: rule__OpUnary__Alternatives : ( ( '!' ) | ( '-' ) | ( '+' ) );
+    // InternalPerspectiveDsl.g:3365:1: rule__OpUnary__Alternatives : ( ( '!' ) | ( '-' ) | ( '+' ) );
     public final void rule__OpUnary__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3367:1: ( ( '!' ) | ( '-' ) | ( '+' ) )
+            // InternalPerspectiveDsl.g:3369:1: ( ( '!' ) | ( '-' ) | ( '+' ) )
             int alt22=3;
             switch ( input.LA(1) ) {
             case 40:
@@ -12086,10 +12086,10 @@
 
             switch (alt22) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3368:2: ( '!' )
+                    // InternalPerspectiveDsl.g:3370:2: ( '!' )
                     {
-                    // InternalPerspectiveDsl.g:3368:2: ( '!' )
-                    // InternalPerspectiveDsl.g:3369:3: '!'
+                    // InternalPerspectiveDsl.g:3370:2: ( '!' )
+                    // InternalPerspectiveDsl.g:3371:3: '!'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); 
@@ -12105,10 +12105,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3374:2: ( '-' )
+                    // InternalPerspectiveDsl.g:3376:2: ( '-' )
                     {
-                    // InternalPerspectiveDsl.g:3374:2: ( '-' )
-                    // InternalPerspectiveDsl.g:3375:3: '-'
+                    // InternalPerspectiveDsl.g:3376:2: ( '-' )
+                    // InternalPerspectiveDsl.g:3377:3: '-'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); 
@@ -12124,10 +12124,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:3380:2: ( '+' )
+                    // InternalPerspectiveDsl.g:3382:2: ( '+' )
                     {
-                    // InternalPerspectiveDsl.g:3380:2: ( '+' )
-                    // InternalPerspectiveDsl.g:3381:3: '+'
+                    // InternalPerspectiveDsl.g:3382:2: ( '+' )
+                    // InternalPerspectiveDsl.g:3383:3: '+'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); 
@@ -12160,13 +12160,13 @@
 
 
     // $ANTLR start "rule__OpPostfix__Alternatives"
-    // InternalPerspectiveDsl.g:3390:1: rule__OpPostfix__Alternatives : ( ( '++' ) | ( '--' ) );
+    // InternalPerspectiveDsl.g:3392:1: rule__OpPostfix__Alternatives : ( ( '++' ) | ( '--' ) );
     public final void rule__OpPostfix__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3394:1: ( ( '++' ) | ( '--' ) )
+            // InternalPerspectiveDsl.g:3396:1: ( ( '++' ) | ( '--' ) )
             int alt23=2;
             int LA23_0 = input.LA(1);
 
@@ -12185,10 +12185,10 @@
             }
             switch (alt23) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3395:2: ( '++' )
+                    // InternalPerspectiveDsl.g:3397:2: ( '++' )
                     {
-                    // InternalPerspectiveDsl.g:3395:2: ( '++' )
-                    // InternalPerspectiveDsl.g:3396:3: '++'
+                    // InternalPerspectiveDsl.g:3397:2: ( '++' )
+                    // InternalPerspectiveDsl.g:3398:3: '++'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); 
@@ -12204,10 +12204,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3401:2: ( '--' )
+                    // InternalPerspectiveDsl.g:3403:2: ( '--' )
                     {
-                    // InternalPerspectiveDsl.g:3401:2: ( '--' )
-                    // InternalPerspectiveDsl.g:3402:3: '--'
+                    // InternalPerspectiveDsl.g:3403:2: ( '--' )
+                    // InternalPerspectiveDsl.g:3404:3: '--'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); 
@@ -12240,27 +12240,27 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Alternatives_1"
-    // InternalPerspectiveDsl.g:3411:1: rule__XMemberFeatureCall__Alternatives_1 : ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) );
+    // InternalPerspectiveDsl.g:3413:1: rule__XMemberFeatureCall__Alternatives_1 : ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) );
     public final void rule__XMemberFeatureCall__Alternatives_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3415:1: ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) )
+            // InternalPerspectiveDsl.g:3417:1: ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) )
             int alt24=2;
             alt24 = dfa24.predict(input);
             switch (alt24) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3416:2: ( ( rule__XMemberFeatureCall__Group_1_0__0 ) )
+                    // InternalPerspectiveDsl.g:3418:2: ( ( rule__XMemberFeatureCall__Group_1_0__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3416:2: ( ( rule__XMemberFeatureCall__Group_1_0__0 ) )
-                    // InternalPerspectiveDsl.g:3417:3: ( rule__XMemberFeatureCall__Group_1_0__0 )
+                    // InternalPerspectiveDsl.g:3418:2: ( ( rule__XMemberFeatureCall__Group_1_0__0 ) )
+                    // InternalPerspectiveDsl.g:3419:3: ( rule__XMemberFeatureCall__Group_1_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); 
                     }
-                    // InternalPerspectiveDsl.g:3418:3: ( rule__XMemberFeatureCall__Group_1_0__0 )
-                    // InternalPerspectiveDsl.g:3418:4: rule__XMemberFeatureCall__Group_1_0__0
+                    // InternalPerspectiveDsl.g:3420:3: ( rule__XMemberFeatureCall__Group_1_0__0 )
+                    // InternalPerspectiveDsl.g:3420:4: rule__XMemberFeatureCall__Group_1_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__Group_1_0__0();
@@ -12280,16 +12280,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3422:2: ( ( rule__XMemberFeatureCall__Group_1_1__0 ) )
+                    // InternalPerspectiveDsl.g:3424:2: ( ( rule__XMemberFeatureCall__Group_1_1__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3422:2: ( ( rule__XMemberFeatureCall__Group_1_1__0 ) )
-                    // InternalPerspectiveDsl.g:3423:3: ( rule__XMemberFeatureCall__Group_1_1__0 )
+                    // InternalPerspectiveDsl.g:3424:2: ( ( rule__XMemberFeatureCall__Group_1_1__0 ) )
+                    // InternalPerspectiveDsl.g:3425:3: ( rule__XMemberFeatureCall__Group_1_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1()); 
                     }
-                    // InternalPerspectiveDsl.g:3424:3: ( rule__XMemberFeatureCall__Group_1_1__0 )
-                    // InternalPerspectiveDsl.g:3424:4: rule__XMemberFeatureCall__Group_1_1__0
+                    // InternalPerspectiveDsl.g:3426:3: ( rule__XMemberFeatureCall__Group_1_1__0 )
+                    // InternalPerspectiveDsl.g:3426:4: rule__XMemberFeatureCall__Group_1_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__Group_1_1__0();
@@ -12326,13 +12326,13 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Alternatives_1_0_0_0_1"
-    // InternalPerspectiveDsl.g:3432:1: rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 : ( ( '.' ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) ) );
+    // InternalPerspectiveDsl.g:3434:1: rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 : ( ( '.' ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) ) );
     public final void rule__XMemberFeatureCall__Alternatives_1_0_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3436:1: ( ( '.' ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) ) )
+            // InternalPerspectiveDsl.g:3438:1: ( ( '.' ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) ) )
             int alt25=2;
             int LA25_0 = input.LA(1);
 
@@ -12351,10 +12351,10 @@
             }
             switch (alt25) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3437:2: ( '.' )
+                    // InternalPerspectiveDsl.g:3439:2: ( '.' )
                     {
-                    // InternalPerspectiveDsl.g:3437:2: ( '.' )
-                    // InternalPerspectiveDsl.g:3438:3: '.'
+                    // InternalPerspectiveDsl.g:3439:2: ( '.' )
+                    // InternalPerspectiveDsl.g:3440:3: '.'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0()); 
@@ -12370,16 +12370,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3443:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) )
+                    // InternalPerspectiveDsl.g:3445:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) )
                     {
-                    // InternalPerspectiveDsl.g:3443:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) )
-                    // InternalPerspectiveDsl.g:3444:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 )
+                    // InternalPerspectiveDsl.g:3445:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) )
+                    // InternalPerspectiveDsl.g:3446:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1()); 
                     }
-                    // InternalPerspectiveDsl.g:3445:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 )
-                    // InternalPerspectiveDsl.g:3445:4: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1
+                    // InternalPerspectiveDsl.g:3447:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 )
+                    // InternalPerspectiveDsl.g:3447:4: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1();
@@ -12416,13 +12416,13 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Alternatives_1_1_0_0_1"
-    // InternalPerspectiveDsl.g:3453:1: rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 : ( ( '.' ) | ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) ) );
+    // InternalPerspectiveDsl.g:3455:1: rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 : ( ( '.' ) | ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) ) );
     public final void rule__XMemberFeatureCall__Alternatives_1_1_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3457:1: ( ( '.' ) | ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) ) )
+            // InternalPerspectiveDsl.g:3459:1: ( ( '.' ) | ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) ) )
             int alt26=3;
             switch ( input.LA(1) ) {
             case 43:
@@ -12450,10 +12450,10 @@
 
             switch (alt26) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3458:2: ( '.' )
+                    // InternalPerspectiveDsl.g:3460:2: ( '.' )
                     {
-                    // InternalPerspectiveDsl.g:3458:2: ( '.' )
-                    // InternalPerspectiveDsl.g:3459:3: '.'
+                    // InternalPerspectiveDsl.g:3460:2: ( '.' )
+                    // InternalPerspectiveDsl.g:3461:3: '.'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0()); 
@@ -12469,16 +12469,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3464:2: ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) )
+                    // InternalPerspectiveDsl.g:3466:2: ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) )
                     {
-                    // InternalPerspectiveDsl.g:3464:2: ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) )
-                    // InternalPerspectiveDsl.g:3465:3: ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 )
+                    // InternalPerspectiveDsl.g:3466:2: ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) )
+                    // InternalPerspectiveDsl.g:3467:3: ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXMemberFeatureCallAccess().getNullSafeAssignment_1_1_0_0_1_1()); 
                     }
-                    // InternalPerspectiveDsl.g:3466:3: ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 )
-                    // InternalPerspectiveDsl.g:3466:4: rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1
+                    // InternalPerspectiveDsl.g:3468:3: ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 )
+                    // InternalPerspectiveDsl.g:3468:4: rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1();
@@ -12498,16 +12498,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:3470:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) )
+                    // InternalPerspectiveDsl.g:3472:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) )
                     {
-                    // InternalPerspectiveDsl.g:3470:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) )
-                    // InternalPerspectiveDsl.g:3471:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 )
+                    // InternalPerspectiveDsl.g:3472:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) )
+                    // InternalPerspectiveDsl.g:3473:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_1_0_0_1_2()); 
                     }
-                    // InternalPerspectiveDsl.g:3472:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 )
-                    // InternalPerspectiveDsl.g:3472:4: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2
+                    // InternalPerspectiveDsl.g:3474:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 )
+                    // InternalPerspectiveDsl.g:3474:4: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2();
@@ -12544,27 +12544,27 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Alternatives_1_1_3_1"
-    // InternalPerspectiveDsl.g:3480:1: rule__XMemberFeatureCall__Alternatives_1_1_3_1 : ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) ) );
+    // InternalPerspectiveDsl.g:3482:1: rule__XMemberFeatureCall__Alternatives_1_1_3_1 : ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) ) );
     public final void rule__XMemberFeatureCall__Alternatives_1_1_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3484:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) ) )
+            // InternalPerspectiveDsl.g:3486:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) ) )
             int alt27=2;
             alt27 = dfa27.predict(input);
             switch (alt27) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3485:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
+                    // InternalPerspectiveDsl.g:3487:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3485:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
-                    // InternalPerspectiveDsl.g:3486:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
+                    // InternalPerspectiveDsl.g:3487:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
+                    // InternalPerspectiveDsl.g:3488:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0()); 
                     }
-                    // InternalPerspectiveDsl.g:3487:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
-                    // InternalPerspectiveDsl.g:3487:4: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0
+                    // InternalPerspectiveDsl.g:3489:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
+                    // InternalPerspectiveDsl.g:3489:4: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0();
@@ -12584,16 +12584,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3491:2: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) )
+                    // InternalPerspectiveDsl.g:3493:2: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3491:2: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) )
-                    // InternalPerspectiveDsl.g:3492:3: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 )
+                    // InternalPerspectiveDsl.g:3493:2: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) )
+                    // InternalPerspectiveDsl.g:3494:3: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1()); 
                     }
-                    // InternalPerspectiveDsl.g:3493:3: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 )
-                    // InternalPerspectiveDsl.g:3493:4: rule__XMemberFeatureCall__Group_1_1_3_1_1__0
+                    // InternalPerspectiveDsl.g:3495:3: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 )
+                    // InternalPerspectiveDsl.g:3495:4: rule__XMemberFeatureCall__Group_1_1_3_1_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__Group_1_1_3_1_1__0();
@@ -12630,21 +12630,21 @@
 
 
     // $ANTLR start "rule__XPrimaryExpression__Alternatives"
-    // InternalPerspectiveDsl.g:3501:1: rule__XPrimaryExpression__Alternatives : ( ( ruleXConstructorCall ) | ( ruleXBlockExpression ) | ( ruleXSwitchExpression ) | ( ( ruleXSynchronizedExpression ) ) | ( ruleXFeatureCall ) | ( ruleXLiteral ) | ( ruleXIfExpression ) | ( ( ruleXForLoopExpression ) ) | ( ruleXBasicForLoopExpression ) | ( ruleXWhileExpression ) | ( ruleXDoWhileExpression ) | ( ruleXThrowExpression ) | ( ruleXReturnExpression ) | ( ruleXTryCatchFinallyExpression ) | ( ruleXParenthesizedExpression ) );
+    // InternalPerspectiveDsl.g:3503:1: rule__XPrimaryExpression__Alternatives : ( ( ruleXConstructorCall ) | ( ruleXBlockExpression ) | ( ruleXSwitchExpression ) | ( ( ruleXSynchronizedExpression ) ) | ( ruleXFeatureCall ) | ( ruleXLiteral ) | ( ruleXIfExpression ) | ( ( ruleXForLoopExpression ) ) | ( ruleXBasicForLoopExpression ) | ( ruleXWhileExpression ) | ( ruleXDoWhileExpression ) | ( ruleXThrowExpression ) | ( ruleXReturnExpression ) | ( ruleXTryCatchFinallyExpression ) | ( ruleXParenthesizedExpression ) );
     public final void rule__XPrimaryExpression__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3505:1: ( ( ruleXConstructorCall ) | ( ruleXBlockExpression ) | ( ruleXSwitchExpression ) | ( ( ruleXSynchronizedExpression ) ) | ( ruleXFeatureCall ) | ( ruleXLiteral ) | ( ruleXIfExpression ) | ( ( ruleXForLoopExpression ) ) | ( ruleXBasicForLoopExpression ) | ( ruleXWhileExpression ) | ( ruleXDoWhileExpression ) | ( ruleXThrowExpression ) | ( ruleXReturnExpression ) | ( ruleXTryCatchFinallyExpression ) | ( ruleXParenthesizedExpression ) )
+            // InternalPerspectiveDsl.g:3507:1: ( ( ruleXConstructorCall ) | ( ruleXBlockExpression ) | ( ruleXSwitchExpression ) | ( ( ruleXSynchronizedExpression ) ) | ( ruleXFeatureCall ) | ( ruleXLiteral ) | ( ruleXIfExpression ) | ( ( ruleXForLoopExpression ) ) | ( ruleXBasicForLoopExpression ) | ( ruleXWhileExpression ) | ( ruleXDoWhileExpression ) | ( ruleXThrowExpression ) | ( ruleXReturnExpression ) | ( ruleXTryCatchFinallyExpression ) | ( ruleXParenthesizedExpression ) )
             int alt28=15;
             alt28 = dfa28.predict(input);
             switch (alt28) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3506:2: ( ruleXConstructorCall )
+                    // InternalPerspectiveDsl.g:3508:2: ( ruleXConstructorCall )
                     {
-                    // InternalPerspectiveDsl.g:3506:2: ( ruleXConstructorCall )
-                    // InternalPerspectiveDsl.g:3507:3: ruleXConstructorCall
+                    // InternalPerspectiveDsl.g:3508:2: ( ruleXConstructorCall )
+                    // InternalPerspectiveDsl.g:3509:3: ruleXConstructorCall
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0()); 
@@ -12664,10 +12664,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3512:2: ( ruleXBlockExpression )
+                    // InternalPerspectiveDsl.g:3514:2: ( ruleXBlockExpression )
                     {
-                    // InternalPerspectiveDsl.g:3512:2: ( ruleXBlockExpression )
-                    // InternalPerspectiveDsl.g:3513:3: ruleXBlockExpression
+                    // InternalPerspectiveDsl.g:3514:2: ( ruleXBlockExpression )
+                    // InternalPerspectiveDsl.g:3515:3: ruleXBlockExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1()); 
@@ -12687,10 +12687,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:3518:2: ( ruleXSwitchExpression )
+                    // InternalPerspectiveDsl.g:3520:2: ( ruleXSwitchExpression )
                     {
-                    // InternalPerspectiveDsl.g:3518:2: ( ruleXSwitchExpression )
-                    // InternalPerspectiveDsl.g:3519:3: ruleXSwitchExpression
+                    // InternalPerspectiveDsl.g:3520:2: ( ruleXSwitchExpression )
+                    // InternalPerspectiveDsl.g:3521:3: ruleXSwitchExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2()); 
@@ -12710,16 +12710,16 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:3524:2: ( ( ruleXSynchronizedExpression ) )
+                    // InternalPerspectiveDsl.g:3526:2: ( ( ruleXSynchronizedExpression ) )
                     {
-                    // InternalPerspectiveDsl.g:3524:2: ( ( ruleXSynchronizedExpression ) )
-                    // InternalPerspectiveDsl.g:3525:3: ( ruleXSynchronizedExpression )
+                    // InternalPerspectiveDsl.g:3526:2: ( ( ruleXSynchronizedExpression ) )
+                    // InternalPerspectiveDsl.g:3527:3: ( ruleXSynchronizedExpression )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3()); 
                     }
-                    // InternalPerspectiveDsl.g:3526:3: ( ruleXSynchronizedExpression )
-                    // InternalPerspectiveDsl.g:3526:4: ruleXSynchronizedExpression
+                    // InternalPerspectiveDsl.g:3528:3: ( ruleXSynchronizedExpression )
+                    // InternalPerspectiveDsl.g:3528:4: ruleXSynchronizedExpression
                     {
                     pushFollow(FOLLOW_2);
                     ruleXSynchronizedExpression();
@@ -12739,10 +12739,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalPerspectiveDsl.g:3530:2: ( ruleXFeatureCall )
+                    // InternalPerspectiveDsl.g:3532:2: ( ruleXFeatureCall )
                     {
-                    // InternalPerspectiveDsl.g:3530:2: ( ruleXFeatureCall )
-                    // InternalPerspectiveDsl.g:3531:3: ruleXFeatureCall
+                    // InternalPerspectiveDsl.g:3532:2: ( ruleXFeatureCall )
+                    // InternalPerspectiveDsl.g:3533:3: ruleXFeatureCall
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4()); 
@@ -12762,10 +12762,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalPerspectiveDsl.g:3536:2: ( ruleXLiteral )
+                    // InternalPerspectiveDsl.g:3538:2: ( ruleXLiteral )
                     {
-                    // InternalPerspectiveDsl.g:3536:2: ( ruleXLiteral )
-                    // InternalPerspectiveDsl.g:3537:3: ruleXLiteral
+                    // InternalPerspectiveDsl.g:3538:2: ( ruleXLiteral )
+                    // InternalPerspectiveDsl.g:3539:3: ruleXLiteral
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5()); 
@@ -12785,10 +12785,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalPerspectiveDsl.g:3542:2: ( ruleXIfExpression )
+                    // InternalPerspectiveDsl.g:3544:2: ( ruleXIfExpression )
                     {
-                    // InternalPerspectiveDsl.g:3542:2: ( ruleXIfExpression )
-                    // InternalPerspectiveDsl.g:3543:3: ruleXIfExpression
+                    // InternalPerspectiveDsl.g:3544:2: ( ruleXIfExpression )
+                    // InternalPerspectiveDsl.g:3545:3: ruleXIfExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6()); 
@@ -12808,16 +12808,16 @@
                     }
                     break;
                 case 8 :
-                    // InternalPerspectiveDsl.g:3548:2: ( ( ruleXForLoopExpression ) )
+                    // InternalPerspectiveDsl.g:3550:2: ( ( ruleXForLoopExpression ) )
                     {
-                    // InternalPerspectiveDsl.g:3548:2: ( ( ruleXForLoopExpression ) )
-                    // InternalPerspectiveDsl.g:3549:3: ( ruleXForLoopExpression )
+                    // InternalPerspectiveDsl.g:3550:2: ( ( ruleXForLoopExpression ) )
+                    // InternalPerspectiveDsl.g:3551:3: ( ruleXForLoopExpression )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); 
                     }
-                    // InternalPerspectiveDsl.g:3550:3: ( ruleXForLoopExpression )
-                    // InternalPerspectiveDsl.g:3550:4: ruleXForLoopExpression
+                    // InternalPerspectiveDsl.g:3552:3: ( ruleXForLoopExpression )
+                    // InternalPerspectiveDsl.g:3552:4: ruleXForLoopExpression
                     {
                     pushFollow(FOLLOW_2);
                     ruleXForLoopExpression();
@@ -12837,10 +12837,10 @@
                     }
                     break;
                 case 9 :
-                    // InternalPerspectiveDsl.g:3554:2: ( ruleXBasicForLoopExpression )
+                    // InternalPerspectiveDsl.g:3556:2: ( ruleXBasicForLoopExpression )
                     {
-                    // InternalPerspectiveDsl.g:3554:2: ( ruleXBasicForLoopExpression )
-                    // InternalPerspectiveDsl.g:3555:3: ruleXBasicForLoopExpression
+                    // InternalPerspectiveDsl.g:3556:2: ( ruleXBasicForLoopExpression )
+                    // InternalPerspectiveDsl.g:3557:3: ruleXBasicForLoopExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); 
@@ -12860,10 +12860,10 @@
                     }
                     break;
                 case 10 :
-                    // InternalPerspectiveDsl.g:3560:2: ( ruleXWhileExpression )
+                    // InternalPerspectiveDsl.g:3562:2: ( ruleXWhileExpression )
                     {
-                    // InternalPerspectiveDsl.g:3560:2: ( ruleXWhileExpression )
-                    // InternalPerspectiveDsl.g:3561:3: ruleXWhileExpression
+                    // InternalPerspectiveDsl.g:3562:2: ( ruleXWhileExpression )
+                    // InternalPerspectiveDsl.g:3563:3: ruleXWhileExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9()); 
@@ -12883,10 +12883,10 @@
                     }
                     break;
                 case 11 :
-                    // InternalPerspectiveDsl.g:3566:2: ( ruleXDoWhileExpression )
+                    // InternalPerspectiveDsl.g:3568:2: ( ruleXDoWhileExpression )
                     {
-                    // InternalPerspectiveDsl.g:3566:2: ( ruleXDoWhileExpression )
-                    // InternalPerspectiveDsl.g:3567:3: ruleXDoWhileExpression
+                    // InternalPerspectiveDsl.g:3568:2: ( ruleXDoWhileExpression )
+                    // InternalPerspectiveDsl.g:3569:3: ruleXDoWhileExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10()); 
@@ -12906,10 +12906,10 @@
                     }
                     break;
                 case 12 :
-                    // InternalPerspectiveDsl.g:3572:2: ( ruleXThrowExpression )
+                    // InternalPerspectiveDsl.g:3574:2: ( ruleXThrowExpression )
                     {
-                    // InternalPerspectiveDsl.g:3572:2: ( ruleXThrowExpression )
-                    // InternalPerspectiveDsl.g:3573:3: ruleXThrowExpression
+                    // InternalPerspectiveDsl.g:3574:2: ( ruleXThrowExpression )
+                    // InternalPerspectiveDsl.g:3575:3: ruleXThrowExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11()); 
@@ -12929,10 +12929,10 @@
                     }
                     break;
                 case 13 :
-                    // InternalPerspectiveDsl.g:3578:2: ( ruleXReturnExpression )
+                    // InternalPerspectiveDsl.g:3580:2: ( ruleXReturnExpression )
                     {
-                    // InternalPerspectiveDsl.g:3578:2: ( ruleXReturnExpression )
-                    // InternalPerspectiveDsl.g:3579:3: ruleXReturnExpression
+                    // InternalPerspectiveDsl.g:3580:2: ( ruleXReturnExpression )
+                    // InternalPerspectiveDsl.g:3581:3: ruleXReturnExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12()); 
@@ -12952,10 +12952,10 @@
                     }
                     break;
                 case 14 :
-                    // InternalPerspectiveDsl.g:3584:2: ( ruleXTryCatchFinallyExpression )
+                    // InternalPerspectiveDsl.g:3586:2: ( ruleXTryCatchFinallyExpression )
                     {
-                    // InternalPerspectiveDsl.g:3584:2: ( ruleXTryCatchFinallyExpression )
-                    // InternalPerspectiveDsl.g:3585:3: ruleXTryCatchFinallyExpression
+                    // InternalPerspectiveDsl.g:3586:2: ( ruleXTryCatchFinallyExpression )
+                    // InternalPerspectiveDsl.g:3587:3: ruleXTryCatchFinallyExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13()); 
@@ -12975,10 +12975,10 @@
                     }
                     break;
                 case 15 :
-                    // InternalPerspectiveDsl.g:3590:2: ( ruleXParenthesizedExpression )
+                    // InternalPerspectiveDsl.g:3592:2: ( ruleXParenthesizedExpression )
                     {
-                    // InternalPerspectiveDsl.g:3590:2: ( ruleXParenthesizedExpression )
-                    // InternalPerspectiveDsl.g:3591:3: ruleXParenthesizedExpression
+                    // InternalPerspectiveDsl.g:3592:2: ( ruleXParenthesizedExpression )
+                    // InternalPerspectiveDsl.g:3593:3: ruleXParenthesizedExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14()); 
@@ -13015,13 +13015,13 @@
 
 
     // $ANTLR start "rule__XLiteral__Alternatives"
-    // InternalPerspectiveDsl.g:3600:1: rule__XLiteral__Alternatives : ( ( ruleXCollectionLiteral ) | ( ( ruleXClosure ) ) | ( ruleXBooleanLiteral ) | ( ruleXNumberLiteral ) | ( ruleXNullLiteral ) | ( ruleXStringLiteral ) | ( ruleXTypeLiteral ) );
+    // InternalPerspectiveDsl.g:3602:1: rule__XLiteral__Alternatives : ( ( ruleXCollectionLiteral ) | ( ( ruleXClosure ) ) | ( ruleXBooleanLiteral ) | ( ruleXNumberLiteral ) | ( ruleXNullLiteral ) | ( ruleXStringLiteral ) | ( ruleXTypeLiteral ) );
     public final void rule__XLiteral__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3604:1: ( ( ruleXCollectionLiteral ) | ( ( ruleXClosure ) ) | ( ruleXBooleanLiteral ) | ( ruleXNumberLiteral ) | ( ruleXNullLiteral ) | ( ruleXStringLiteral ) | ( ruleXTypeLiteral ) )
+            // InternalPerspectiveDsl.g:3606:1: ( ( ruleXCollectionLiteral ) | ( ( ruleXClosure ) ) | ( ruleXBooleanLiteral ) | ( ruleXNumberLiteral ) | ( ruleXNullLiteral ) | ( ruleXStringLiteral ) | ( ruleXTypeLiteral ) )
             int alt29=7;
             switch ( input.LA(1) ) {
             case 95:
@@ -13072,10 +13072,10 @@
 
             switch (alt29) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3605:2: ( ruleXCollectionLiteral )
+                    // InternalPerspectiveDsl.g:3607:2: ( ruleXCollectionLiteral )
                     {
-                    // InternalPerspectiveDsl.g:3605:2: ( ruleXCollectionLiteral )
-                    // InternalPerspectiveDsl.g:3606:3: ruleXCollectionLiteral
+                    // InternalPerspectiveDsl.g:3607:2: ( ruleXCollectionLiteral )
+                    // InternalPerspectiveDsl.g:3608:3: ruleXCollectionLiteral
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0()); 
@@ -13095,16 +13095,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3611:2: ( ( ruleXClosure ) )
+                    // InternalPerspectiveDsl.g:3613:2: ( ( ruleXClosure ) )
                     {
-                    // InternalPerspectiveDsl.g:3611:2: ( ( ruleXClosure ) )
-                    // InternalPerspectiveDsl.g:3612:3: ( ruleXClosure )
+                    // InternalPerspectiveDsl.g:3613:2: ( ( ruleXClosure ) )
+                    // InternalPerspectiveDsl.g:3614:3: ( ruleXClosure )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1()); 
                     }
-                    // InternalPerspectiveDsl.g:3613:3: ( ruleXClosure )
-                    // InternalPerspectiveDsl.g:3613:4: ruleXClosure
+                    // InternalPerspectiveDsl.g:3615:3: ( ruleXClosure )
+                    // InternalPerspectiveDsl.g:3615:4: ruleXClosure
                     {
                     pushFollow(FOLLOW_2);
                     ruleXClosure();
@@ -13124,10 +13124,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:3617:2: ( ruleXBooleanLiteral )
+                    // InternalPerspectiveDsl.g:3619:2: ( ruleXBooleanLiteral )
                     {
-                    // InternalPerspectiveDsl.g:3617:2: ( ruleXBooleanLiteral )
-                    // InternalPerspectiveDsl.g:3618:3: ruleXBooleanLiteral
+                    // InternalPerspectiveDsl.g:3619:2: ( ruleXBooleanLiteral )
+                    // InternalPerspectiveDsl.g:3620:3: ruleXBooleanLiteral
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2()); 
@@ -13147,10 +13147,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:3623:2: ( ruleXNumberLiteral )
+                    // InternalPerspectiveDsl.g:3625:2: ( ruleXNumberLiteral )
                     {
-                    // InternalPerspectiveDsl.g:3623:2: ( ruleXNumberLiteral )
-                    // InternalPerspectiveDsl.g:3624:3: ruleXNumberLiteral
+                    // InternalPerspectiveDsl.g:3625:2: ( ruleXNumberLiteral )
+                    // InternalPerspectiveDsl.g:3626:3: ruleXNumberLiteral
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3()); 
@@ -13170,10 +13170,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalPerspectiveDsl.g:3629:2: ( ruleXNullLiteral )
+                    // InternalPerspectiveDsl.g:3631:2: ( ruleXNullLiteral )
                     {
-                    // InternalPerspectiveDsl.g:3629:2: ( ruleXNullLiteral )
-                    // InternalPerspectiveDsl.g:3630:3: ruleXNullLiteral
+                    // InternalPerspectiveDsl.g:3631:2: ( ruleXNullLiteral )
+                    // InternalPerspectiveDsl.g:3632:3: ruleXNullLiteral
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4()); 
@@ -13193,10 +13193,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalPerspectiveDsl.g:3635:2: ( ruleXStringLiteral )
+                    // InternalPerspectiveDsl.g:3637:2: ( ruleXStringLiteral )
                     {
-                    // InternalPerspectiveDsl.g:3635:2: ( ruleXStringLiteral )
-                    // InternalPerspectiveDsl.g:3636:3: ruleXStringLiteral
+                    // InternalPerspectiveDsl.g:3637:2: ( ruleXStringLiteral )
+                    // InternalPerspectiveDsl.g:3638:3: ruleXStringLiteral
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5()); 
@@ -13216,10 +13216,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalPerspectiveDsl.g:3641:2: ( ruleXTypeLiteral )
+                    // InternalPerspectiveDsl.g:3643:2: ( ruleXTypeLiteral )
                     {
-                    // InternalPerspectiveDsl.g:3641:2: ( ruleXTypeLiteral )
-                    // InternalPerspectiveDsl.g:3642:3: ruleXTypeLiteral
+                    // InternalPerspectiveDsl.g:3643:2: ( ruleXTypeLiteral )
+                    // InternalPerspectiveDsl.g:3644:3: ruleXTypeLiteral
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6()); 
@@ -13256,13 +13256,13 @@
 
 
     // $ANTLR start "rule__XCollectionLiteral__Alternatives"
-    // InternalPerspectiveDsl.g:3651:1: rule__XCollectionLiteral__Alternatives : ( ( ruleXSetLiteral ) | ( ruleXListLiteral ) );
+    // InternalPerspectiveDsl.g:3653:1: rule__XCollectionLiteral__Alternatives : ( ( ruleXSetLiteral ) | ( ruleXListLiteral ) );
     public final void rule__XCollectionLiteral__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3655:1: ( ( ruleXSetLiteral ) | ( ruleXListLiteral ) )
+            // InternalPerspectiveDsl.g:3657:1: ( ( ruleXSetLiteral ) | ( ruleXListLiteral ) )
             int alt30=2;
             int LA30_0 = input.LA(1);
 
@@ -13292,10 +13292,10 @@
             }
             switch (alt30) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3656:2: ( ruleXSetLiteral )
+                    // InternalPerspectiveDsl.g:3658:2: ( ruleXSetLiteral )
                     {
-                    // InternalPerspectiveDsl.g:3656:2: ( ruleXSetLiteral )
-                    // InternalPerspectiveDsl.g:3657:3: ruleXSetLiteral
+                    // InternalPerspectiveDsl.g:3658:2: ( ruleXSetLiteral )
+                    // InternalPerspectiveDsl.g:3659:3: ruleXSetLiteral
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0()); 
@@ -13315,10 +13315,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3662:2: ( ruleXListLiteral )
+                    // InternalPerspectiveDsl.g:3664:2: ( ruleXListLiteral )
                     {
-                    // InternalPerspectiveDsl.g:3662:2: ( ruleXListLiteral )
-                    // InternalPerspectiveDsl.g:3663:3: ruleXListLiteral
+                    // InternalPerspectiveDsl.g:3664:2: ( ruleXListLiteral )
+                    // InternalPerspectiveDsl.g:3665:3: ruleXListLiteral
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1()); 
@@ -13355,27 +13355,27 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Alternatives_2"
-    // InternalPerspectiveDsl.g:3672:1: rule__XSwitchExpression__Alternatives_2 : ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) | ( ( rule__XSwitchExpression__Group_2_1__0 ) ) );
+    // InternalPerspectiveDsl.g:3674:1: rule__XSwitchExpression__Alternatives_2 : ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) | ( ( rule__XSwitchExpression__Group_2_1__0 ) ) );
     public final void rule__XSwitchExpression__Alternatives_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3676:1: ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) | ( ( rule__XSwitchExpression__Group_2_1__0 ) ) )
+            // InternalPerspectiveDsl.g:3678:1: ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) | ( ( rule__XSwitchExpression__Group_2_1__0 ) ) )
             int alt31=2;
             alt31 = dfa31.predict(input);
             switch (alt31) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3677:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
+                    // InternalPerspectiveDsl.g:3679:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3677:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
-                    // InternalPerspectiveDsl.g:3678:3: ( rule__XSwitchExpression__Group_2_0__0 )
+                    // InternalPerspectiveDsl.g:3679:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
+                    // InternalPerspectiveDsl.g:3680:3: ( rule__XSwitchExpression__Group_2_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0()); 
                     }
-                    // InternalPerspectiveDsl.g:3679:3: ( rule__XSwitchExpression__Group_2_0__0 )
-                    // InternalPerspectiveDsl.g:3679:4: rule__XSwitchExpression__Group_2_0__0
+                    // InternalPerspectiveDsl.g:3681:3: ( rule__XSwitchExpression__Group_2_0__0 )
+                    // InternalPerspectiveDsl.g:3681:4: rule__XSwitchExpression__Group_2_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XSwitchExpression__Group_2_0__0();
@@ -13395,16 +13395,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3683:2: ( ( rule__XSwitchExpression__Group_2_1__0 ) )
+                    // InternalPerspectiveDsl.g:3685:2: ( ( rule__XSwitchExpression__Group_2_1__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3683:2: ( ( rule__XSwitchExpression__Group_2_1__0 ) )
-                    // InternalPerspectiveDsl.g:3684:3: ( rule__XSwitchExpression__Group_2_1__0 )
+                    // InternalPerspectiveDsl.g:3685:2: ( ( rule__XSwitchExpression__Group_2_1__0 ) )
+                    // InternalPerspectiveDsl.g:3686:3: ( rule__XSwitchExpression__Group_2_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1()); 
                     }
-                    // InternalPerspectiveDsl.g:3685:3: ( rule__XSwitchExpression__Group_2_1__0 )
-                    // InternalPerspectiveDsl.g:3685:4: rule__XSwitchExpression__Group_2_1__0
+                    // InternalPerspectiveDsl.g:3687:3: ( rule__XSwitchExpression__Group_2_1__0 )
+                    // InternalPerspectiveDsl.g:3687:4: rule__XSwitchExpression__Group_2_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XSwitchExpression__Group_2_1__0();
@@ -13441,13 +13441,13 @@
 
 
     // $ANTLR start "rule__XCasePart__Alternatives_3"
-    // InternalPerspectiveDsl.g:3693:1: rule__XCasePart__Alternatives_3 : ( ( ( rule__XCasePart__Group_3_0__0 ) ) | ( ( rule__XCasePart__FallThroughAssignment_3_1 ) ) );
+    // InternalPerspectiveDsl.g:3695:1: rule__XCasePart__Alternatives_3 : ( ( ( rule__XCasePart__Group_3_0__0 ) ) | ( ( rule__XCasePart__FallThroughAssignment_3_1 ) ) );
     public final void rule__XCasePart__Alternatives_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3697:1: ( ( ( rule__XCasePart__Group_3_0__0 ) ) | ( ( rule__XCasePart__FallThroughAssignment_3_1 ) ) )
+            // InternalPerspectiveDsl.g:3699:1: ( ( ( rule__XCasePart__Group_3_0__0 ) ) | ( ( rule__XCasePart__FallThroughAssignment_3_1 ) ) )
             int alt32=2;
             int LA32_0 = input.LA(1);
 
@@ -13466,16 +13466,16 @@
             }
             switch (alt32) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3698:2: ( ( rule__XCasePart__Group_3_0__0 ) )
+                    // InternalPerspectiveDsl.g:3700:2: ( ( rule__XCasePart__Group_3_0__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3698:2: ( ( rule__XCasePart__Group_3_0__0 ) )
-                    // InternalPerspectiveDsl.g:3699:3: ( rule__XCasePart__Group_3_0__0 )
+                    // InternalPerspectiveDsl.g:3700:2: ( ( rule__XCasePart__Group_3_0__0 ) )
+                    // InternalPerspectiveDsl.g:3701:3: ( rule__XCasePart__Group_3_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXCasePartAccess().getGroup_3_0()); 
                     }
-                    // InternalPerspectiveDsl.g:3700:3: ( rule__XCasePart__Group_3_0__0 )
-                    // InternalPerspectiveDsl.g:3700:4: rule__XCasePart__Group_3_0__0
+                    // InternalPerspectiveDsl.g:3702:3: ( rule__XCasePart__Group_3_0__0 )
+                    // InternalPerspectiveDsl.g:3702:4: rule__XCasePart__Group_3_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XCasePart__Group_3_0__0();
@@ -13495,16 +13495,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3704:2: ( ( rule__XCasePart__FallThroughAssignment_3_1 ) )
+                    // InternalPerspectiveDsl.g:3706:2: ( ( rule__XCasePart__FallThroughAssignment_3_1 ) )
                     {
-                    // InternalPerspectiveDsl.g:3704:2: ( ( rule__XCasePart__FallThroughAssignment_3_1 ) )
-                    // InternalPerspectiveDsl.g:3705:3: ( rule__XCasePart__FallThroughAssignment_3_1 )
+                    // InternalPerspectiveDsl.g:3706:2: ( ( rule__XCasePart__FallThroughAssignment_3_1 ) )
+                    // InternalPerspectiveDsl.g:3707:3: ( rule__XCasePart__FallThroughAssignment_3_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXCasePartAccess().getFallThroughAssignment_3_1()); 
                     }
-                    // InternalPerspectiveDsl.g:3706:3: ( rule__XCasePart__FallThroughAssignment_3_1 )
-                    // InternalPerspectiveDsl.g:3706:4: rule__XCasePart__FallThroughAssignment_3_1
+                    // InternalPerspectiveDsl.g:3708:3: ( rule__XCasePart__FallThroughAssignment_3_1 )
+                    // InternalPerspectiveDsl.g:3708:4: rule__XCasePart__FallThroughAssignment_3_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XCasePart__FallThroughAssignment_3_1();
@@ -13541,13 +13541,13 @@
 
 
     // $ANTLR start "rule__XExpressionOrVarDeclaration__Alternatives"
-    // InternalPerspectiveDsl.g:3714:1: rule__XExpressionOrVarDeclaration__Alternatives : ( ( ruleXVariableDeclaration ) | ( ruleXExpression ) );
+    // InternalPerspectiveDsl.g:3716:1: rule__XExpressionOrVarDeclaration__Alternatives : ( ( ruleXVariableDeclaration ) | ( ruleXExpression ) );
     public final void rule__XExpressionOrVarDeclaration__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3718:1: ( ( ruleXVariableDeclaration ) | ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:3720:1: ( ( ruleXVariableDeclaration ) | ( ruleXExpression ) )
             int alt33=2;
             int LA33_0 = input.LA(1);
 
@@ -13566,10 +13566,10 @@
             }
             switch (alt33) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3719:2: ( ruleXVariableDeclaration )
+                    // InternalPerspectiveDsl.g:3721:2: ( ruleXVariableDeclaration )
                     {
-                    // InternalPerspectiveDsl.g:3719:2: ( ruleXVariableDeclaration )
-                    // InternalPerspectiveDsl.g:3720:3: ruleXVariableDeclaration
+                    // InternalPerspectiveDsl.g:3721:2: ( ruleXVariableDeclaration )
+                    // InternalPerspectiveDsl.g:3722:3: ruleXVariableDeclaration
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0()); 
@@ -13589,10 +13589,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3725:2: ( ruleXExpression )
+                    // InternalPerspectiveDsl.g:3727:2: ( ruleXExpression )
                     {
-                    // InternalPerspectiveDsl.g:3725:2: ( ruleXExpression )
-                    // InternalPerspectiveDsl.g:3726:3: ruleXExpression
+                    // InternalPerspectiveDsl.g:3727:2: ( ruleXExpression )
+                    // InternalPerspectiveDsl.g:3728:3: ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1()); 
@@ -13629,13 +13629,13 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Alternatives_1"
-    // InternalPerspectiveDsl.g:3735:1: rule__XVariableDeclaration__Alternatives_1 : ( ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) ) | ( 'val' ) );
+    // InternalPerspectiveDsl.g:3737:1: rule__XVariableDeclaration__Alternatives_1 : ( ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) ) | ( 'val' ) );
     public final void rule__XVariableDeclaration__Alternatives_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3739:1: ( ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) ) | ( 'val' ) )
+            // InternalPerspectiveDsl.g:3741:1: ( ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) ) | ( 'val' ) )
             int alt34=2;
             int LA34_0 = input.LA(1);
 
@@ -13654,16 +13654,16 @@
             }
             switch (alt34) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3740:2: ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) )
+                    // InternalPerspectiveDsl.g:3742:2: ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3740:2: ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) )
-                    // InternalPerspectiveDsl.g:3741:3: ( rule__XVariableDeclaration__WriteableAssignment_1_0 )
+                    // InternalPerspectiveDsl.g:3742:2: ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) )
+                    // InternalPerspectiveDsl.g:3743:3: ( rule__XVariableDeclaration__WriteableAssignment_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXVariableDeclarationAccess().getWriteableAssignment_1_0()); 
                     }
-                    // InternalPerspectiveDsl.g:3742:3: ( rule__XVariableDeclaration__WriteableAssignment_1_0 )
-                    // InternalPerspectiveDsl.g:3742:4: rule__XVariableDeclaration__WriteableAssignment_1_0
+                    // InternalPerspectiveDsl.g:3744:3: ( rule__XVariableDeclaration__WriteableAssignment_1_0 )
+                    // InternalPerspectiveDsl.g:3744:4: rule__XVariableDeclaration__WriteableAssignment_1_0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XVariableDeclaration__WriteableAssignment_1_0();
@@ -13683,10 +13683,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3746:2: ( 'val' )
+                    // InternalPerspectiveDsl.g:3748:2: ( 'val' )
                     {
-                    // InternalPerspectiveDsl.g:3746:2: ( 'val' )
-                    // InternalPerspectiveDsl.g:3747:3: 'val'
+                    // InternalPerspectiveDsl.g:3748:2: ( 'val' )
+                    // InternalPerspectiveDsl.g:3749:3: 'val'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1()); 
@@ -13719,13 +13719,13 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Alternatives_2"
-    // InternalPerspectiveDsl.g:3756:1: rule__XVariableDeclaration__Alternatives_2 : ( ( ( rule__XVariableDeclaration__Group_2_0__0 ) ) | ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) ) );
+    // InternalPerspectiveDsl.g:3758:1: rule__XVariableDeclaration__Alternatives_2 : ( ( ( rule__XVariableDeclaration__Group_2_0__0 ) ) | ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) ) );
     public final void rule__XVariableDeclaration__Alternatives_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3760:1: ( ( ( rule__XVariableDeclaration__Group_2_0__0 ) ) | ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) ) )
+            // InternalPerspectiveDsl.g:3762:1: ( ( ( rule__XVariableDeclaration__Group_2_0__0 ) ) | ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) ) )
             int alt35=2;
             int LA35_0 = input.LA(1);
 
@@ -13758,16 +13758,16 @@
             }
             switch (alt35) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3761:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
+                    // InternalPerspectiveDsl.g:3763:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3761:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
-                    // InternalPerspectiveDsl.g:3762:3: ( rule__XVariableDeclaration__Group_2_0__0 )
+                    // InternalPerspectiveDsl.g:3763:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
+                    // InternalPerspectiveDsl.g:3764:3: ( rule__XVariableDeclaration__Group_2_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0()); 
                     }
-                    // InternalPerspectiveDsl.g:3763:3: ( rule__XVariableDeclaration__Group_2_0__0 )
-                    // InternalPerspectiveDsl.g:3763:4: rule__XVariableDeclaration__Group_2_0__0
+                    // InternalPerspectiveDsl.g:3765:3: ( rule__XVariableDeclaration__Group_2_0__0 )
+                    // InternalPerspectiveDsl.g:3765:4: rule__XVariableDeclaration__Group_2_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XVariableDeclaration__Group_2_0__0();
@@ -13787,16 +13787,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3767:2: ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) )
+                    // InternalPerspectiveDsl.g:3769:2: ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) )
                     {
-                    // InternalPerspectiveDsl.g:3767:2: ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) )
-                    // InternalPerspectiveDsl.g:3768:3: ( rule__XVariableDeclaration__NameAssignment_2_1 )
+                    // InternalPerspectiveDsl.g:3769:2: ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) )
+                    // InternalPerspectiveDsl.g:3770:3: ( rule__XVariableDeclaration__NameAssignment_2_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_1()); 
                     }
-                    // InternalPerspectiveDsl.g:3769:3: ( rule__XVariableDeclaration__NameAssignment_2_1 )
-                    // InternalPerspectiveDsl.g:3769:4: rule__XVariableDeclaration__NameAssignment_2_1
+                    // InternalPerspectiveDsl.g:3771:3: ( rule__XVariableDeclaration__NameAssignment_2_1 )
+                    // InternalPerspectiveDsl.g:3771:4: rule__XVariableDeclaration__NameAssignment_2_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XVariableDeclaration__NameAssignment_2_1();
@@ -13833,27 +13833,27 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Alternatives_3_1"
-    // InternalPerspectiveDsl.g:3777:1: rule__XFeatureCall__Alternatives_3_1 : ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) | ( ( rule__XFeatureCall__Group_3_1_1__0 ) ) );
+    // InternalPerspectiveDsl.g:3779:1: rule__XFeatureCall__Alternatives_3_1 : ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) | ( ( rule__XFeatureCall__Group_3_1_1__0 ) ) );
     public final void rule__XFeatureCall__Alternatives_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3781:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) | ( ( rule__XFeatureCall__Group_3_1_1__0 ) ) )
+            // InternalPerspectiveDsl.g:3783:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) | ( ( rule__XFeatureCall__Group_3_1_1__0 ) ) )
             int alt36=2;
             alt36 = dfa36.predict(input);
             switch (alt36) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3782:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
+                    // InternalPerspectiveDsl.g:3784:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3782:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
-                    // InternalPerspectiveDsl.g:3783:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
+                    // InternalPerspectiveDsl.g:3784:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
+                    // InternalPerspectiveDsl.g:3785:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0()); 
                     }
-                    // InternalPerspectiveDsl.g:3784:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
-                    // InternalPerspectiveDsl.g:3784:4: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0
+                    // InternalPerspectiveDsl.g:3786:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
+                    // InternalPerspectiveDsl.g:3786:4: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0();
@@ -13873,16 +13873,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3788:2: ( ( rule__XFeatureCall__Group_3_1_1__0 ) )
+                    // InternalPerspectiveDsl.g:3790:2: ( ( rule__XFeatureCall__Group_3_1_1__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3788:2: ( ( rule__XFeatureCall__Group_3_1_1__0 ) )
-                    // InternalPerspectiveDsl.g:3789:3: ( rule__XFeatureCall__Group_3_1_1__0 )
+                    // InternalPerspectiveDsl.g:3790:2: ( ( rule__XFeatureCall__Group_3_1_1__0 ) )
+                    // InternalPerspectiveDsl.g:3791:3: ( rule__XFeatureCall__Group_3_1_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1()); 
                     }
-                    // InternalPerspectiveDsl.g:3790:3: ( rule__XFeatureCall__Group_3_1_1__0 )
-                    // InternalPerspectiveDsl.g:3790:4: rule__XFeatureCall__Group_3_1_1__0
+                    // InternalPerspectiveDsl.g:3792:3: ( rule__XFeatureCall__Group_3_1_1__0 )
+                    // InternalPerspectiveDsl.g:3792:4: rule__XFeatureCall__Group_3_1_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XFeatureCall__Group_3_1_1__0();
@@ -13919,13 +13919,13 @@
 
 
     // $ANTLR start "rule__FeatureCallID__Alternatives"
-    // InternalPerspectiveDsl.g:3798:1: rule__FeatureCallID__Alternatives : ( ( ruleValidID ) | ( 'extends' ) | ( 'static' ) | ( 'import' ) | ( 'extension' ) );
+    // InternalPerspectiveDsl.g:3800:1: rule__FeatureCallID__Alternatives : ( ( ruleValidID ) | ( 'extends' ) | ( 'static' ) | ( 'import' ) | ( 'extension' ) );
     public final void rule__FeatureCallID__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3802:1: ( ( ruleValidID ) | ( 'extends' ) | ( 'static' ) | ( 'import' ) | ( 'extension' ) )
+            // InternalPerspectiveDsl.g:3804:1: ( ( ruleValidID ) | ( 'extends' ) | ( 'static' ) | ( 'import' ) | ( 'extension' ) )
             int alt37=5;
             switch ( input.LA(1) ) {
             case RULE_ID:
@@ -13963,10 +13963,10 @@
 
             switch (alt37) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3803:2: ( ruleValidID )
+                    // InternalPerspectiveDsl.g:3805:2: ( ruleValidID )
                     {
-                    // InternalPerspectiveDsl.g:3803:2: ( ruleValidID )
-                    // InternalPerspectiveDsl.g:3804:3: ruleValidID
+                    // InternalPerspectiveDsl.g:3805:2: ( ruleValidID )
+                    // InternalPerspectiveDsl.g:3806:3: ruleValidID
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0()); 
@@ -13986,10 +13986,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3809:2: ( 'extends' )
+                    // InternalPerspectiveDsl.g:3811:2: ( 'extends' )
                     {
-                    // InternalPerspectiveDsl.g:3809:2: ( 'extends' )
-                    // InternalPerspectiveDsl.g:3810:3: 'extends'
+                    // InternalPerspectiveDsl.g:3811:2: ( 'extends' )
+                    // InternalPerspectiveDsl.g:3812:3: 'extends'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1()); 
@@ -14005,10 +14005,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:3815:2: ( 'static' )
+                    // InternalPerspectiveDsl.g:3817:2: ( 'static' )
                     {
-                    // InternalPerspectiveDsl.g:3815:2: ( 'static' )
-                    // InternalPerspectiveDsl.g:3816:3: 'static'
+                    // InternalPerspectiveDsl.g:3817:2: ( 'static' )
+                    // InternalPerspectiveDsl.g:3818:3: 'static'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2()); 
@@ -14024,10 +14024,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:3821:2: ( 'import' )
+                    // InternalPerspectiveDsl.g:3823:2: ( 'import' )
                     {
-                    // InternalPerspectiveDsl.g:3821:2: ( 'import' )
-                    // InternalPerspectiveDsl.g:3822:3: 'import'
+                    // InternalPerspectiveDsl.g:3823:2: ( 'import' )
+                    // InternalPerspectiveDsl.g:3824:3: 'import'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getFeatureCallIDAccess().getImportKeyword_3()); 
@@ -14043,10 +14043,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalPerspectiveDsl.g:3827:2: ( 'extension' )
+                    // InternalPerspectiveDsl.g:3829:2: ( 'extension' )
                     {
-                    // InternalPerspectiveDsl.g:3827:2: ( 'extension' )
-                    // InternalPerspectiveDsl.g:3828:3: 'extension'
+                    // InternalPerspectiveDsl.g:3829:2: ( 'extension' )
+                    // InternalPerspectiveDsl.g:3830:3: 'extension'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4()); 
@@ -14079,13 +14079,13 @@
 
 
     // $ANTLR start "rule__IdOrSuper__Alternatives"
-    // InternalPerspectiveDsl.g:3837:1: rule__IdOrSuper__Alternatives : ( ( ruleFeatureCallID ) | ( 'super' ) );
+    // InternalPerspectiveDsl.g:3839:1: rule__IdOrSuper__Alternatives : ( ( ruleFeatureCallID ) | ( 'super' ) );
     public final void rule__IdOrSuper__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3841:1: ( ( ruleFeatureCallID ) | ( 'super' ) )
+            // InternalPerspectiveDsl.g:3843:1: ( ( ruleFeatureCallID ) | ( 'super' ) )
             int alt38=2;
             int LA38_0 = input.LA(1);
 
@@ -14104,10 +14104,10 @@
             }
             switch (alt38) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3842:2: ( ruleFeatureCallID )
+                    // InternalPerspectiveDsl.g:3844:2: ( ruleFeatureCallID )
                     {
-                    // InternalPerspectiveDsl.g:3842:2: ( ruleFeatureCallID )
-                    // InternalPerspectiveDsl.g:3843:3: ruleFeatureCallID
+                    // InternalPerspectiveDsl.g:3844:2: ( ruleFeatureCallID )
+                    // InternalPerspectiveDsl.g:3845:3: ruleFeatureCallID
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0()); 
@@ -14127,10 +14127,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3848:2: ( 'super' )
+                    // InternalPerspectiveDsl.g:3850:2: ( 'super' )
                     {
-                    // InternalPerspectiveDsl.g:3848:2: ( 'super' )
-                    // InternalPerspectiveDsl.g:3849:3: 'super'
+                    // InternalPerspectiveDsl.g:3850:2: ( 'super' )
+                    // InternalPerspectiveDsl.g:3851:3: 'super'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIdOrSuperAccess().getSuperKeyword_1()); 
@@ -14163,27 +14163,27 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Alternatives_4_1"
-    // InternalPerspectiveDsl.g:3858:1: rule__XConstructorCall__Alternatives_4_1 : ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) | ( ( rule__XConstructorCall__Group_4_1_1__0 ) ) );
+    // InternalPerspectiveDsl.g:3860:1: rule__XConstructorCall__Alternatives_4_1 : ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) | ( ( rule__XConstructorCall__Group_4_1_1__0 ) ) );
     public final void rule__XConstructorCall__Alternatives_4_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3862:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) | ( ( rule__XConstructorCall__Group_4_1_1__0 ) ) )
+            // InternalPerspectiveDsl.g:3864:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) | ( ( rule__XConstructorCall__Group_4_1_1__0 ) ) )
             int alt39=2;
             alt39 = dfa39.predict(input);
             switch (alt39) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3863:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
+                    // InternalPerspectiveDsl.g:3865:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3863:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
-                    // InternalPerspectiveDsl.g:3864:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
+                    // InternalPerspectiveDsl.g:3865:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
+                    // InternalPerspectiveDsl.g:3866:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0()); 
                     }
-                    // InternalPerspectiveDsl.g:3865:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
-                    // InternalPerspectiveDsl.g:3865:4: rule__XConstructorCall__ArgumentsAssignment_4_1_0
+                    // InternalPerspectiveDsl.g:3867:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
+                    // InternalPerspectiveDsl.g:3867:4: rule__XConstructorCall__ArgumentsAssignment_4_1_0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XConstructorCall__ArgumentsAssignment_4_1_0();
@@ -14203,16 +14203,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3869:2: ( ( rule__XConstructorCall__Group_4_1_1__0 ) )
+                    // InternalPerspectiveDsl.g:3871:2: ( ( rule__XConstructorCall__Group_4_1_1__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3869:2: ( ( rule__XConstructorCall__Group_4_1_1__0 ) )
-                    // InternalPerspectiveDsl.g:3870:3: ( rule__XConstructorCall__Group_4_1_1__0 )
+                    // InternalPerspectiveDsl.g:3871:2: ( ( rule__XConstructorCall__Group_4_1_1__0 ) )
+                    // InternalPerspectiveDsl.g:3872:3: ( rule__XConstructorCall__Group_4_1_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1()); 
                     }
-                    // InternalPerspectiveDsl.g:3871:3: ( rule__XConstructorCall__Group_4_1_1__0 )
-                    // InternalPerspectiveDsl.g:3871:4: rule__XConstructorCall__Group_4_1_1__0
+                    // InternalPerspectiveDsl.g:3873:3: ( rule__XConstructorCall__Group_4_1_1__0 )
+                    // InternalPerspectiveDsl.g:3873:4: rule__XConstructorCall__Group_4_1_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XConstructorCall__Group_4_1_1__0();
@@ -14249,13 +14249,13 @@
 
 
     // $ANTLR start "rule__XBooleanLiteral__Alternatives_1"
-    // InternalPerspectiveDsl.g:3879:1: rule__XBooleanLiteral__Alternatives_1 : ( ( 'false' ) | ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) ) );
+    // InternalPerspectiveDsl.g:3881:1: rule__XBooleanLiteral__Alternatives_1 : ( ( 'false' ) | ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) ) );
     public final void rule__XBooleanLiteral__Alternatives_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3883:1: ( ( 'false' ) | ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) ) )
+            // InternalPerspectiveDsl.g:3885:1: ( ( 'false' ) | ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) ) )
             int alt40=2;
             int LA40_0 = input.LA(1);
 
@@ -14274,10 +14274,10 @@
             }
             switch (alt40) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3884:2: ( 'false' )
+                    // InternalPerspectiveDsl.g:3886:2: ( 'false' )
                     {
-                    // InternalPerspectiveDsl.g:3884:2: ( 'false' )
-                    // InternalPerspectiveDsl.g:3885:3: 'false'
+                    // InternalPerspectiveDsl.g:3886:2: ( 'false' )
+                    // InternalPerspectiveDsl.g:3887:3: 'false'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0()); 
@@ -14293,16 +14293,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3890:2: ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) )
+                    // InternalPerspectiveDsl.g:3892:2: ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) )
                     {
-                    // InternalPerspectiveDsl.g:3890:2: ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) )
-                    // InternalPerspectiveDsl.g:3891:3: ( rule__XBooleanLiteral__IsTrueAssignment_1_1 )
+                    // InternalPerspectiveDsl.g:3892:2: ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) )
+                    // InternalPerspectiveDsl.g:3893:3: ( rule__XBooleanLiteral__IsTrueAssignment_1_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXBooleanLiteralAccess().getIsTrueAssignment_1_1()); 
                     }
-                    // InternalPerspectiveDsl.g:3892:3: ( rule__XBooleanLiteral__IsTrueAssignment_1_1 )
-                    // InternalPerspectiveDsl.g:3892:4: rule__XBooleanLiteral__IsTrueAssignment_1_1
+                    // InternalPerspectiveDsl.g:3894:3: ( rule__XBooleanLiteral__IsTrueAssignment_1_1 )
+                    // InternalPerspectiveDsl.g:3894:4: rule__XBooleanLiteral__IsTrueAssignment_1_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XBooleanLiteral__IsTrueAssignment_1_1();
@@ -14339,13 +14339,13 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Alternatives_3"
-    // InternalPerspectiveDsl.g:3900:1: rule__XTryCatchFinallyExpression__Alternatives_3 : ( ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) ) | ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) ) );
+    // InternalPerspectiveDsl.g:3902:1: rule__XTryCatchFinallyExpression__Alternatives_3 : ( ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) ) | ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) ) );
     public final void rule__XTryCatchFinallyExpression__Alternatives_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3904:1: ( ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) ) | ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) ) )
+            // InternalPerspectiveDsl.g:3906:1: ( ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) ) | ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) ) )
             int alt41=2;
             int LA41_0 = input.LA(1);
 
@@ -14364,16 +14364,16 @@
             }
             switch (alt41) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3905:2: ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) )
+                    // InternalPerspectiveDsl.g:3907:2: ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3905:2: ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) )
-                    // InternalPerspectiveDsl.g:3906:3: ( rule__XTryCatchFinallyExpression__Group_3_0__0 )
+                    // InternalPerspectiveDsl.g:3907:2: ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) )
+                    // InternalPerspectiveDsl.g:3908:3: ( rule__XTryCatchFinallyExpression__Group_3_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0()); 
                     }
-                    // InternalPerspectiveDsl.g:3907:3: ( rule__XTryCatchFinallyExpression__Group_3_0__0 )
-                    // InternalPerspectiveDsl.g:3907:4: rule__XTryCatchFinallyExpression__Group_3_0__0
+                    // InternalPerspectiveDsl.g:3909:3: ( rule__XTryCatchFinallyExpression__Group_3_0__0 )
+                    // InternalPerspectiveDsl.g:3909:4: rule__XTryCatchFinallyExpression__Group_3_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XTryCatchFinallyExpression__Group_3_0__0();
@@ -14393,16 +14393,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3911:2: ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) )
+                    // InternalPerspectiveDsl.g:3913:2: ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3911:2: ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) )
-                    // InternalPerspectiveDsl.g:3912:3: ( rule__XTryCatchFinallyExpression__Group_3_1__0 )
+                    // InternalPerspectiveDsl.g:3913:2: ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) )
+                    // InternalPerspectiveDsl.g:3914:3: ( rule__XTryCatchFinallyExpression__Group_3_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_1()); 
                     }
-                    // InternalPerspectiveDsl.g:3913:3: ( rule__XTryCatchFinallyExpression__Group_3_1__0 )
-                    // InternalPerspectiveDsl.g:3913:4: rule__XTryCatchFinallyExpression__Group_3_1__0
+                    // InternalPerspectiveDsl.g:3915:3: ( rule__XTryCatchFinallyExpression__Group_3_1__0 )
+                    // InternalPerspectiveDsl.g:3915:4: rule__XTryCatchFinallyExpression__Group_3_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XTryCatchFinallyExpression__Group_3_1__0();
@@ -14439,13 +14439,13 @@
 
 
     // $ANTLR start "rule__Number__Alternatives"
-    // InternalPerspectiveDsl.g:3921:1: rule__Number__Alternatives : ( ( RULE_HEX ) | ( ( rule__Number__Group_1__0 ) ) );
+    // InternalPerspectiveDsl.g:3923:1: rule__Number__Alternatives : ( ( RULE_HEX ) | ( ( rule__Number__Group_1__0 ) ) );
     public final void rule__Number__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3925:1: ( ( RULE_HEX ) | ( ( rule__Number__Group_1__0 ) ) )
+            // InternalPerspectiveDsl.g:3927:1: ( ( RULE_HEX ) | ( ( rule__Number__Group_1__0 ) ) )
             int alt42=2;
             int LA42_0 = input.LA(1);
 
@@ -14464,10 +14464,10 @@
             }
             switch (alt42) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3926:2: ( RULE_HEX )
+                    // InternalPerspectiveDsl.g:3928:2: ( RULE_HEX )
                     {
-                    // InternalPerspectiveDsl.g:3926:2: ( RULE_HEX )
-                    // InternalPerspectiveDsl.g:3927:3: RULE_HEX
+                    // InternalPerspectiveDsl.g:3928:2: ( RULE_HEX )
+                    // InternalPerspectiveDsl.g:3929:3: RULE_HEX
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0()); 
@@ -14483,16 +14483,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3932:2: ( ( rule__Number__Group_1__0 ) )
+                    // InternalPerspectiveDsl.g:3934:2: ( ( rule__Number__Group_1__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3932:2: ( ( rule__Number__Group_1__0 ) )
-                    // InternalPerspectiveDsl.g:3933:3: ( rule__Number__Group_1__0 )
+                    // InternalPerspectiveDsl.g:3934:2: ( ( rule__Number__Group_1__0 ) )
+                    // InternalPerspectiveDsl.g:3935:3: ( rule__Number__Group_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNumberAccess().getGroup_1()); 
                     }
-                    // InternalPerspectiveDsl.g:3934:3: ( rule__Number__Group_1__0 )
-                    // InternalPerspectiveDsl.g:3934:4: rule__Number__Group_1__0
+                    // InternalPerspectiveDsl.g:3936:3: ( rule__Number__Group_1__0 )
+                    // InternalPerspectiveDsl.g:3936:4: rule__Number__Group_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__Number__Group_1__0();
@@ -14529,13 +14529,13 @@
 
 
     // $ANTLR start "rule__Number__Alternatives_1_0"
-    // InternalPerspectiveDsl.g:3942:1: rule__Number__Alternatives_1_0 : ( ( RULE_INT ) | ( RULE_DECIMAL ) );
+    // InternalPerspectiveDsl.g:3944:1: rule__Number__Alternatives_1_0 : ( ( RULE_INT ) | ( RULE_DECIMAL ) );
     public final void rule__Number__Alternatives_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3946:1: ( ( RULE_INT ) | ( RULE_DECIMAL ) )
+            // InternalPerspectiveDsl.g:3948:1: ( ( RULE_INT ) | ( RULE_DECIMAL ) )
             int alt43=2;
             int LA43_0 = input.LA(1);
 
@@ -14554,10 +14554,10 @@
             }
             switch (alt43) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3947:2: ( RULE_INT )
+                    // InternalPerspectiveDsl.g:3949:2: ( RULE_INT )
                     {
-                    // InternalPerspectiveDsl.g:3947:2: ( RULE_INT )
-                    // InternalPerspectiveDsl.g:3948:3: RULE_INT
+                    // InternalPerspectiveDsl.g:3949:2: ( RULE_INT )
+                    // InternalPerspectiveDsl.g:3950:3: RULE_INT
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0()); 
@@ -14573,10 +14573,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3953:2: ( RULE_DECIMAL )
+                    // InternalPerspectiveDsl.g:3955:2: ( RULE_DECIMAL )
                     {
-                    // InternalPerspectiveDsl.g:3953:2: ( RULE_DECIMAL )
-                    // InternalPerspectiveDsl.g:3954:3: RULE_DECIMAL
+                    // InternalPerspectiveDsl.g:3955:2: ( RULE_DECIMAL )
+                    // InternalPerspectiveDsl.g:3956:3: RULE_DECIMAL
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1()); 
@@ -14609,13 +14609,13 @@
 
 
     // $ANTLR start "rule__Number__Alternatives_1_1_1"
-    // InternalPerspectiveDsl.g:3963:1: rule__Number__Alternatives_1_1_1 : ( ( RULE_INT ) | ( RULE_DECIMAL ) );
+    // InternalPerspectiveDsl.g:3965:1: rule__Number__Alternatives_1_1_1 : ( ( RULE_INT ) | ( RULE_DECIMAL ) );
     public final void rule__Number__Alternatives_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3967:1: ( ( RULE_INT ) | ( RULE_DECIMAL ) )
+            // InternalPerspectiveDsl.g:3969:1: ( ( RULE_INT ) | ( RULE_DECIMAL ) )
             int alt44=2;
             int LA44_0 = input.LA(1);
 
@@ -14634,10 +14634,10 @@
             }
             switch (alt44) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3968:2: ( RULE_INT )
+                    // InternalPerspectiveDsl.g:3970:2: ( RULE_INT )
                     {
-                    // InternalPerspectiveDsl.g:3968:2: ( RULE_INT )
-                    // InternalPerspectiveDsl.g:3969:3: RULE_INT
+                    // InternalPerspectiveDsl.g:3970:2: ( RULE_INT )
+                    // InternalPerspectiveDsl.g:3971:3: RULE_INT
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0()); 
@@ -14653,10 +14653,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3974:2: ( RULE_DECIMAL )
+                    // InternalPerspectiveDsl.g:3976:2: ( RULE_DECIMAL )
                     {
-                    // InternalPerspectiveDsl.g:3974:2: ( RULE_DECIMAL )
-                    // InternalPerspectiveDsl.g:3975:3: RULE_DECIMAL
+                    // InternalPerspectiveDsl.g:3976:2: ( RULE_DECIMAL )
+                    // InternalPerspectiveDsl.g:3977:3: RULE_DECIMAL
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1()); 
@@ -14689,13 +14689,13 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Alternatives"
-    // InternalPerspectiveDsl.g:3984:1: rule__JvmTypeReference__Alternatives : ( ( ( rule__JvmTypeReference__Group_0__0 ) ) | ( ruleXFunctionTypeRef ) );
+    // InternalPerspectiveDsl.g:3986:1: rule__JvmTypeReference__Alternatives : ( ( ( rule__JvmTypeReference__Group_0__0 ) ) | ( ruleXFunctionTypeRef ) );
     public final void rule__JvmTypeReference__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:3988:1: ( ( ( rule__JvmTypeReference__Group_0__0 ) ) | ( ruleXFunctionTypeRef ) )
+            // InternalPerspectiveDsl.g:3990:1: ( ( ( rule__JvmTypeReference__Group_0__0 ) ) | ( ruleXFunctionTypeRef ) )
             int alt45=2;
             int LA45_0 = input.LA(1);
 
@@ -14714,16 +14714,16 @@
             }
             switch (alt45) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3989:2: ( ( rule__JvmTypeReference__Group_0__0 ) )
+                    // InternalPerspectiveDsl.g:3991:2: ( ( rule__JvmTypeReference__Group_0__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:3989:2: ( ( rule__JvmTypeReference__Group_0__0 ) )
-                    // InternalPerspectiveDsl.g:3990:3: ( rule__JvmTypeReference__Group_0__0 )
+                    // InternalPerspectiveDsl.g:3991:2: ( ( rule__JvmTypeReference__Group_0__0 ) )
+                    // InternalPerspectiveDsl.g:3992:3: ( rule__JvmTypeReference__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); 
                     }
-                    // InternalPerspectiveDsl.g:3991:3: ( rule__JvmTypeReference__Group_0__0 )
-                    // InternalPerspectiveDsl.g:3991:4: rule__JvmTypeReference__Group_0__0
+                    // InternalPerspectiveDsl.g:3993:3: ( rule__JvmTypeReference__Group_0__0 )
+                    // InternalPerspectiveDsl.g:3993:4: rule__JvmTypeReference__Group_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__JvmTypeReference__Group_0__0();
@@ -14743,10 +14743,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3995:2: ( ruleXFunctionTypeRef )
+                    // InternalPerspectiveDsl.g:3997:2: ( ruleXFunctionTypeRef )
                     {
-                    // InternalPerspectiveDsl.g:3995:2: ( ruleXFunctionTypeRef )
-                    // InternalPerspectiveDsl.g:3996:3: ruleXFunctionTypeRef
+                    // InternalPerspectiveDsl.g:3997:2: ( ruleXFunctionTypeRef )
+                    // InternalPerspectiveDsl.g:3998:3: ruleXFunctionTypeRef
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); 
@@ -14783,13 +14783,13 @@
 
 
     // $ANTLR start "rule__JvmArgumentTypeReference__Alternatives"
-    // InternalPerspectiveDsl.g:4005:1: rule__JvmArgumentTypeReference__Alternatives : ( ( ruleJvmTypeReference ) | ( ruleJvmWildcardTypeReference ) );
+    // InternalPerspectiveDsl.g:4007:1: rule__JvmArgumentTypeReference__Alternatives : ( ( ruleJvmTypeReference ) | ( ruleJvmWildcardTypeReference ) );
     public final void rule__JvmArgumentTypeReference__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4009:1: ( ( ruleJvmTypeReference ) | ( ruleJvmWildcardTypeReference ) )
+            // InternalPerspectiveDsl.g:4011:1: ( ( ruleJvmTypeReference ) | ( ruleJvmWildcardTypeReference ) )
             int alt46=2;
             int LA46_0 = input.LA(1);
 
@@ -14808,10 +14808,10 @@
             }
             switch (alt46) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:4010:2: ( ruleJvmTypeReference )
+                    // InternalPerspectiveDsl.g:4012:2: ( ruleJvmTypeReference )
                     {
-                    // InternalPerspectiveDsl.g:4010:2: ( ruleJvmTypeReference )
-                    // InternalPerspectiveDsl.g:4011:3: ruleJvmTypeReference
+                    // InternalPerspectiveDsl.g:4012:2: ( ruleJvmTypeReference )
+                    // InternalPerspectiveDsl.g:4013:3: ruleJvmTypeReference
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); 
@@ -14831,10 +14831,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:4016:2: ( ruleJvmWildcardTypeReference )
+                    // InternalPerspectiveDsl.g:4018:2: ( ruleJvmWildcardTypeReference )
                     {
-                    // InternalPerspectiveDsl.g:4016:2: ( ruleJvmWildcardTypeReference )
-                    // InternalPerspectiveDsl.g:4017:3: ruleJvmWildcardTypeReference
+                    // InternalPerspectiveDsl.g:4018:2: ( ruleJvmWildcardTypeReference )
+                    // InternalPerspectiveDsl.g:4019:3: ruleJvmWildcardTypeReference
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); 
@@ -14871,13 +14871,13 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Alternatives_2"
-    // InternalPerspectiveDsl.g:4026:1: rule__JvmWildcardTypeReference__Alternatives_2 : ( ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) ) | ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) ) );
+    // InternalPerspectiveDsl.g:4028:1: rule__JvmWildcardTypeReference__Alternatives_2 : ( ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) ) | ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) ) );
     public final void rule__JvmWildcardTypeReference__Alternatives_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4030:1: ( ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) ) | ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) ) )
+            // InternalPerspectiveDsl.g:4032:1: ( ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) ) | ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) ) )
             int alt47=2;
             int LA47_0 = input.LA(1);
 
@@ -14896,16 +14896,16 @@
             }
             switch (alt47) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:4031:2: ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) )
+                    // InternalPerspectiveDsl.g:4033:2: ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:4031:2: ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) )
-                    // InternalPerspectiveDsl.g:4032:3: ( rule__JvmWildcardTypeReference__Group_2_0__0 )
+                    // InternalPerspectiveDsl.g:4033:2: ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) )
+                    // InternalPerspectiveDsl.g:4034:3: ( rule__JvmWildcardTypeReference__Group_2_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0()); 
                     }
-                    // InternalPerspectiveDsl.g:4033:3: ( rule__JvmWildcardTypeReference__Group_2_0__0 )
-                    // InternalPerspectiveDsl.g:4033:4: rule__JvmWildcardTypeReference__Group_2_0__0
+                    // InternalPerspectiveDsl.g:4035:3: ( rule__JvmWildcardTypeReference__Group_2_0__0 )
+                    // InternalPerspectiveDsl.g:4035:4: rule__JvmWildcardTypeReference__Group_2_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__JvmWildcardTypeReference__Group_2_0__0();
@@ -14925,16 +14925,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:4037:2: ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) )
+                    // InternalPerspectiveDsl.g:4039:2: ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) )
                     {
-                    // InternalPerspectiveDsl.g:4037:2: ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) )
-                    // InternalPerspectiveDsl.g:4038:3: ( rule__JvmWildcardTypeReference__Group_2_1__0 )
+                    // InternalPerspectiveDsl.g:4039:2: ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) )
+                    // InternalPerspectiveDsl.g:4040:3: ( rule__JvmWildcardTypeReference__Group_2_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1()); 
                     }
-                    // InternalPerspectiveDsl.g:4039:3: ( rule__JvmWildcardTypeReference__Group_2_1__0 )
-                    // InternalPerspectiveDsl.g:4039:4: rule__JvmWildcardTypeReference__Group_2_1__0
+                    // InternalPerspectiveDsl.g:4041:3: ( rule__JvmWildcardTypeReference__Group_2_1__0 )
+                    // InternalPerspectiveDsl.g:4041:4: rule__JvmWildcardTypeReference__Group_2_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__JvmWildcardTypeReference__Group_2_1__0();
@@ -14971,13 +14971,13 @@
 
 
     // $ANTLR start "rule__SashOrientation__Alternatives"
-    // InternalPerspectiveDsl.g:4047:1: rule__SashOrientation__Alternatives : ( ( ( 'horizontal' ) ) | ( ( 'vertical' ) ) );
+    // InternalPerspectiveDsl.g:4049:1: rule__SashOrientation__Alternatives : ( ( ( 'horizontal' ) ) | ( ( 'vertical' ) ) );
     public final void rule__SashOrientation__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4051:1: ( ( ( 'horizontal' ) ) | ( ( 'vertical' ) ) )
+            // InternalPerspectiveDsl.g:4053:1: ( ( ( 'horizontal' ) ) | ( ( 'vertical' ) ) )
             int alt48=2;
             int LA48_0 = input.LA(1);
 
@@ -14996,16 +14996,16 @@
             }
             switch (alt48) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:4052:2: ( ( 'horizontal' ) )
+                    // InternalPerspectiveDsl.g:4054:2: ( ( 'horizontal' ) )
                     {
-                    // InternalPerspectiveDsl.g:4052:2: ( ( 'horizontal' ) )
-                    // InternalPerspectiveDsl.g:4053:3: ( 'horizontal' )
+                    // InternalPerspectiveDsl.g:4054:2: ( ( 'horizontal' ) )
+                    // InternalPerspectiveDsl.g:4055:3: ( 'horizontal' )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getSashOrientationAccess().getHORIZONTALEnumLiteralDeclaration_0()); 
                     }
-                    // InternalPerspectiveDsl.g:4054:3: ( 'horizontal' )
-                    // InternalPerspectiveDsl.g:4054:4: 'horizontal'
+                    // InternalPerspectiveDsl.g:4056:3: ( 'horizontal' )
+                    // InternalPerspectiveDsl.g:4056:4: 'horizontal'
                     {
                     match(input,51,FOLLOW_2); if (state.failed) return ;
 
@@ -15021,16 +15021,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:4058:2: ( ( 'vertical' ) )
+                    // InternalPerspectiveDsl.g:4060:2: ( ( 'vertical' ) )
                     {
-                    // InternalPerspectiveDsl.g:4058:2: ( ( 'vertical' ) )
-                    // InternalPerspectiveDsl.g:4059:3: ( 'vertical' )
+                    // InternalPerspectiveDsl.g:4060:2: ( ( 'vertical' ) )
+                    // InternalPerspectiveDsl.g:4061:3: ( 'vertical' )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getSashOrientationAccess().getVERTICALEnumLiteralDeclaration_1()); 
                     }
-                    // InternalPerspectiveDsl.g:4060:3: ( 'vertical' )
-                    // InternalPerspectiveDsl.g:4060:4: 'vertical'
+                    // InternalPerspectiveDsl.g:4062:3: ( 'vertical' )
+                    // InternalPerspectiveDsl.g:4062:4: 'vertical'
                     {
                     match(input,52,FOLLOW_2); if (state.failed) return ;
 
@@ -15063,14 +15063,14 @@
 
 
     // $ANTLR start "rule__PerspectiveModel__Group__0"
-    // InternalPerspectiveDsl.g:4068:1: rule__PerspectiveModel__Group__0 : rule__PerspectiveModel__Group__0__Impl rule__PerspectiveModel__Group__1 ;
+    // InternalPerspectiveDsl.g:4070:1: rule__PerspectiveModel__Group__0 : rule__PerspectiveModel__Group__0__Impl rule__PerspectiveModel__Group__1 ;
     public final void rule__PerspectiveModel__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4072:1: ( rule__PerspectiveModel__Group__0__Impl rule__PerspectiveModel__Group__1 )
-            // InternalPerspectiveDsl.g:4073:2: rule__PerspectiveModel__Group__0__Impl rule__PerspectiveModel__Group__1
+            // InternalPerspectiveDsl.g:4074:1: ( rule__PerspectiveModel__Group__0__Impl rule__PerspectiveModel__Group__1 )
+            // InternalPerspectiveDsl.g:4075:2: rule__PerspectiveModel__Group__0__Impl rule__PerspectiveModel__Group__1
             {
             pushFollow(FOLLOW_5);
             rule__PerspectiveModel__Group__0__Impl();
@@ -15101,22 +15101,22 @@
 
 
     // $ANTLR start "rule__PerspectiveModel__Group__0__Impl"
-    // InternalPerspectiveDsl.g:4080:1: rule__PerspectiveModel__Group__0__Impl : ( ( rule__PerspectiveModel__ImportSectionAssignment_0 )? ) ;
+    // InternalPerspectiveDsl.g:4082:1: rule__PerspectiveModel__Group__0__Impl : ( ( rule__PerspectiveModel__ImportSectionAssignment_0 )? ) ;
     public final void rule__PerspectiveModel__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4084:1: ( ( ( rule__PerspectiveModel__ImportSectionAssignment_0 )? ) )
-            // InternalPerspectiveDsl.g:4085:1: ( ( rule__PerspectiveModel__ImportSectionAssignment_0 )? )
+            // InternalPerspectiveDsl.g:4086:1: ( ( ( rule__PerspectiveModel__ImportSectionAssignment_0 )? ) )
+            // InternalPerspectiveDsl.g:4087:1: ( ( rule__PerspectiveModel__ImportSectionAssignment_0 )? )
             {
-            // InternalPerspectiveDsl.g:4085:1: ( ( rule__PerspectiveModel__ImportSectionAssignment_0 )? )
-            // InternalPerspectiveDsl.g:4086:2: ( rule__PerspectiveModel__ImportSectionAssignment_0 )?
+            // InternalPerspectiveDsl.g:4087:1: ( ( rule__PerspectiveModel__ImportSectionAssignment_0 )? )
+            // InternalPerspectiveDsl.g:4088:2: ( rule__PerspectiveModel__ImportSectionAssignment_0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveModelAccess().getImportSectionAssignment_0()); 
             }
-            // InternalPerspectiveDsl.g:4087:2: ( rule__PerspectiveModel__ImportSectionAssignment_0 )?
+            // InternalPerspectiveDsl.g:4089:2: ( rule__PerspectiveModel__ImportSectionAssignment_0 )?
             int alt49=2;
             int LA49_0 = input.LA(1);
 
@@ -15125,7 +15125,7 @@
             }
             switch (alt49) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:4087:3: rule__PerspectiveModel__ImportSectionAssignment_0
+                    // InternalPerspectiveDsl.g:4089:3: rule__PerspectiveModel__ImportSectionAssignment_0
                     {
                     pushFollow(FOLLOW_2);
                     rule__PerspectiveModel__ImportSectionAssignment_0();
@@ -15163,14 +15163,14 @@
 
 
     // $ANTLR start "rule__PerspectiveModel__Group__1"
-    // InternalPerspectiveDsl.g:4095:1: rule__PerspectiveModel__Group__1 : rule__PerspectiveModel__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:4097:1: rule__PerspectiveModel__Group__1 : rule__PerspectiveModel__Group__1__Impl ;
     public final void rule__PerspectiveModel__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4099:1: ( rule__PerspectiveModel__Group__1__Impl )
-            // InternalPerspectiveDsl.g:4100:2: rule__PerspectiveModel__Group__1__Impl
+            // InternalPerspectiveDsl.g:4101:1: ( rule__PerspectiveModel__Group__1__Impl )
+            // InternalPerspectiveDsl.g:4102:2: rule__PerspectiveModel__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveModel__Group__1__Impl();
@@ -15196,22 +15196,22 @@
 
 
     // $ANTLR start "rule__PerspectiveModel__Group__1__Impl"
-    // InternalPerspectiveDsl.g:4106:1: rule__PerspectiveModel__Group__1__Impl : ( ( rule__PerspectiveModel__PackagesAssignment_1 )* ) ;
+    // InternalPerspectiveDsl.g:4108:1: rule__PerspectiveModel__Group__1__Impl : ( ( rule__PerspectiveModel__PackagesAssignment_1 )* ) ;
     public final void rule__PerspectiveModel__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4110:1: ( ( ( rule__PerspectiveModel__PackagesAssignment_1 )* ) )
-            // InternalPerspectiveDsl.g:4111:1: ( ( rule__PerspectiveModel__PackagesAssignment_1 )* )
+            // InternalPerspectiveDsl.g:4112:1: ( ( ( rule__PerspectiveModel__PackagesAssignment_1 )* ) )
+            // InternalPerspectiveDsl.g:4113:1: ( ( rule__PerspectiveModel__PackagesAssignment_1 )* )
             {
-            // InternalPerspectiveDsl.g:4111:1: ( ( rule__PerspectiveModel__PackagesAssignment_1 )* )
-            // InternalPerspectiveDsl.g:4112:2: ( rule__PerspectiveModel__PackagesAssignment_1 )*
+            // InternalPerspectiveDsl.g:4113:1: ( ( rule__PerspectiveModel__PackagesAssignment_1 )* )
+            // InternalPerspectiveDsl.g:4114:2: ( rule__PerspectiveModel__PackagesAssignment_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveModelAccess().getPackagesAssignment_1()); 
             }
-            // InternalPerspectiveDsl.g:4113:2: ( rule__PerspectiveModel__PackagesAssignment_1 )*
+            // InternalPerspectiveDsl.g:4115:2: ( rule__PerspectiveModel__PackagesAssignment_1 )*
             loop50:
             do {
                 int alt50=2;
@@ -15224,7 +15224,7 @@
 
                 switch (alt50) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:4113:3: rule__PerspectiveModel__PackagesAssignment_1
+            	    // InternalPerspectiveDsl.g:4115:3: rule__PerspectiveModel__PackagesAssignment_1
             	    {
             	    pushFollow(FOLLOW_6);
             	    rule__PerspectiveModel__PackagesAssignment_1();
@@ -15265,14 +15265,14 @@
 
 
     // $ANTLR start "rule__PerspectivePackage__Group__0"
-    // InternalPerspectiveDsl.g:4122:1: rule__PerspectivePackage__Group__0 : rule__PerspectivePackage__Group__0__Impl rule__PerspectivePackage__Group__1 ;
+    // InternalPerspectiveDsl.g:4124:1: rule__PerspectivePackage__Group__0 : rule__PerspectivePackage__Group__0__Impl rule__PerspectivePackage__Group__1 ;
     public final void rule__PerspectivePackage__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4126:1: ( rule__PerspectivePackage__Group__0__Impl rule__PerspectivePackage__Group__1 )
-            // InternalPerspectiveDsl.g:4127:2: rule__PerspectivePackage__Group__0__Impl rule__PerspectivePackage__Group__1
+            // InternalPerspectiveDsl.g:4128:1: ( rule__PerspectivePackage__Group__0__Impl rule__PerspectivePackage__Group__1 )
+            // InternalPerspectiveDsl.g:4129:2: rule__PerspectivePackage__Group__0__Impl rule__PerspectivePackage__Group__1
             {
             pushFollow(FOLLOW_5);
             rule__PerspectivePackage__Group__0__Impl();
@@ -15303,23 +15303,23 @@
 
 
     // $ANTLR start "rule__PerspectivePackage__Group__0__Impl"
-    // InternalPerspectiveDsl.g:4134:1: rule__PerspectivePackage__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:4136:1: rule__PerspectivePackage__Group__0__Impl : ( () ) ;
     public final void rule__PerspectivePackage__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4138:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:4139:1: ( () )
+            // InternalPerspectiveDsl.g:4140:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:4141:1: ( () )
             {
-            // InternalPerspectiveDsl.g:4139:1: ( () )
-            // InternalPerspectiveDsl.g:4140:2: ()
+            // InternalPerspectiveDsl.g:4141:1: ( () )
+            // InternalPerspectiveDsl.g:4142:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePackageAccess().getPerspectivePackageAction_0()); 
             }
-            // InternalPerspectiveDsl.g:4141:2: ()
-            // InternalPerspectiveDsl.g:4141:3: 
+            // InternalPerspectiveDsl.g:4143:2: ()
+            // InternalPerspectiveDsl.g:4143:3: 
             {
             }
 
@@ -15344,14 +15344,14 @@
 
 
     // $ANTLR start "rule__PerspectivePackage__Group__1"
-    // InternalPerspectiveDsl.g:4149:1: rule__PerspectivePackage__Group__1 : rule__PerspectivePackage__Group__1__Impl rule__PerspectivePackage__Group__2 ;
+    // InternalPerspectiveDsl.g:4151:1: rule__PerspectivePackage__Group__1 : rule__PerspectivePackage__Group__1__Impl rule__PerspectivePackage__Group__2 ;
     public final void rule__PerspectivePackage__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4153:1: ( rule__PerspectivePackage__Group__1__Impl rule__PerspectivePackage__Group__2 )
-            // InternalPerspectiveDsl.g:4154:2: rule__PerspectivePackage__Group__1__Impl rule__PerspectivePackage__Group__2
+            // InternalPerspectiveDsl.g:4155:1: ( rule__PerspectivePackage__Group__1__Impl rule__PerspectivePackage__Group__2 )
+            // InternalPerspectiveDsl.g:4156:2: rule__PerspectivePackage__Group__1__Impl rule__PerspectivePackage__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__PerspectivePackage__Group__1__Impl();
@@ -15382,17 +15382,17 @@
 
 
     // $ANTLR start "rule__PerspectivePackage__Group__1__Impl"
-    // InternalPerspectiveDsl.g:4161:1: rule__PerspectivePackage__Group__1__Impl : ( 'package' ) ;
+    // InternalPerspectiveDsl.g:4163:1: rule__PerspectivePackage__Group__1__Impl : ( 'package' ) ;
     public final void rule__PerspectivePackage__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4165:1: ( ( 'package' ) )
-            // InternalPerspectiveDsl.g:4166:1: ( 'package' )
+            // InternalPerspectiveDsl.g:4167:1: ( ( 'package' ) )
+            // InternalPerspectiveDsl.g:4168:1: ( 'package' )
             {
-            // InternalPerspectiveDsl.g:4166:1: ( 'package' )
-            // InternalPerspectiveDsl.g:4167:2: 'package'
+            // InternalPerspectiveDsl.g:4168:1: ( 'package' )
+            // InternalPerspectiveDsl.g:4169:2: 'package'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePackageAccess().getPackageKeyword_1()); 
@@ -15423,14 +15423,14 @@
 
 
     // $ANTLR start "rule__PerspectivePackage__Group__2"
-    // InternalPerspectiveDsl.g:4176:1: rule__PerspectivePackage__Group__2 : rule__PerspectivePackage__Group__2__Impl rule__PerspectivePackage__Group__3 ;
+    // InternalPerspectiveDsl.g:4178:1: rule__PerspectivePackage__Group__2 : rule__PerspectivePackage__Group__2__Impl rule__PerspectivePackage__Group__3 ;
     public final void rule__PerspectivePackage__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4180:1: ( rule__PerspectivePackage__Group__2__Impl rule__PerspectivePackage__Group__3 )
-            // InternalPerspectiveDsl.g:4181:2: rule__PerspectivePackage__Group__2__Impl rule__PerspectivePackage__Group__3
+            // InternalPerspectiveDsl.g:4182:1: ( rule__PerspectivePackage__Group__2__Impl rule__PerspectivePackage__Group__3 )
+            // InternalPerspectiveDsl.g:4183:2: rule__PerspectivePackage__Group__2__Impl rule__PerspectivePackage__Group__3
             {
             pushFollow(FOLLOW_8);
             rule__PerspectivePackage__Group__2__Impl();
@@ -15461,23 +15461,23 @@
 
 
     // $ANTLR start "rule__PerspectivePackage__Group__2__Impl"
-    // InternalPerspectiveDsl.g:4188:1: rule__PerspectivePackage__Group__2__Impl : ( ( rule__PerspectivePackage__NameAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:4190:1: rule__PerspectivePackage__Group__2__Impl : ( ( rule__PerspectivePackage__NameAssignment_2 ) ) ;
     public final void rule__PerspectivePackage__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4192:1: ( ( ( rule__PerspectivePackage__NameAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:4193:1: ( ( rule__PerspectivePackage__NameAssignment_2 ) )
+            // InternalPerspectiveDsl.g:4194:1: ( ( ( rule__PerspectivePackage__NameAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:4195:1: ( ( rule__PerspectivePackage__NameAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:4193:1: ( ( rule__PerspectivePackage__NameAssignment_2 ) )
-            // InternalPerspectiveDsl.g:4194:2: ( rule__PerspectivePackage__NameAssignment_2 )
+            // InternalPerspectiveDsl.g:4195:1: ( ( rule__PerspectivePackage__NameAssignment_2 ) )
+            // InternalPerspectiveDsl.g:4196:2: ( rule__PerspectivePackage__NameAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePackageAccess().getNameAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:4195:2: ( rule__PerspectivePackage__NameAssignment_2 )
-            // InternalPerspectiveDsl.g:4195:3: rule__PerspectivePackage__NameAssignment_2
+            // InternalPerspectiveDsl.g:4197:2: ( rule__PerspectivePackage__NameAssignment_2 )
+            // InternalPerspectiveDsl.g:4197:3: rule__PerspectivePackage__NameAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePackage__NameAssignment_2();
@@ -15512,14 +15512,14 @@
 
 
     // $ANTLR start "rule__PerspectivePackage__Group__3"
-    // InternalPerspectiveDsl.g:4203:1: rule__PerspectivePackage__Group__3 : rule__PerspectivePackage__Group__3__Impl ;
+    // InternalPerspectiveDsl.g:4205:1: rule__PerspectivePackage__Group__3 : rule__PerspectivePackage__Group__3__Impl ;
     public final void rule__PerspectivePackage__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4207:1: ( rule__PerspectivePackage__Group__3__Impl )
-            // InternalPerspectiveDsl.g:4208:2: rule__PerspectivePackage__Group__3__Impl
+            // InternalPerspectiveDsl.g:4209:1: ( rule__PerspectivePackage__Group__3__Impl )
+            // InternalPerspectiveDsl.g:4210:2: rule__PerspectivePackage__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePackage__Group__3__Impl();
@@ -15545,22 +15545,22 @@
 
 
     // $ANTLR start "rule__PerspectivePackage__Group__3__Impl"
-    // InternalPerspectiveDsl.g:4214:1: rule__PerspectivePackage__Group__3__Impl : ( ( rule__PerspectivePackage__Group_3__0 )? ) ;
+    // InternalPerspectiveDsl.g:4216:1: rule__PerspectivePackage__Group__3__Impl : ( ( rule__PerspectivePackage__Group_3__0 )? ) ;
     public final void rule__PerspectivePackage__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4218:1: ( ( ( rule__PerspectivePackage__Group_3__0 )? ) )
-            // InternalPerspectiveDsl.g:4219:1: ( ( rule__PerspectivePackage__Group_3__0 )? )
+            // InternalPerspectiveDsl.g:4220:1: ( ( ( rule__PerspectivePackage__Group_3__0 )? ) )
+            // InternalPerspectiveDsl.g:4221:1: ( ( rule__PerspectivePackage__Group_3__0 )? )
             {
-            // InternalPerspectiveDsl.g:4219:1: ( ( rule__PerspectivePackage__Group_3__0 )? )
-            // InternalPerspectiveDsl.g:4220:2: ( rule__PerspectivePackage__Group_3__0 )?
+            // InternalPerspectiveDsl.g:4221:1: ( ( rule__PerspectivePackage__Group_3__0 )? )
+            // InternalPerspectiveDsl.g:4222:2: ( rule__PerspectivePackage__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePackageAccess().getGroup_3()); 
             }
-            // InternalPerspectiveDsl.g:4221:2: ( rule__PerspectivePackage__Group_3__0 )?
+            // InternalPerspectiveDsl.g:4223:2: ( rule__PerspectivePackage__Group_3__0 )?
             int alt51=2;
             int LA51_0 = input.LA(1);
 
@@ -15569,7 +15569,7 @@
             }
             switch (alt51) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:4221:3: rule__PerspectivePackage__Group_3__0
+                    // InternalPerspectiveDsl.g:4223:3: rule__PerspectivePackage__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__PerspectivePackage__Group_3__0();
@@ -15607,14 +15607,14 @@
 
 
     // $ANTLR start "rule__PerspectivePackage__Group_3__0"
-    // InternalPerspectiveDsl.g:4230:1: rule__PerspectivePackage__Group_3__0 : rule__PerspectivePackage__Group_3__0__Impl rule__PerspectivePackage__Group_3__1 ;
+    // InternalPerspectiveDsl.g:4232:1: rule__PerspectivePackage__Group_3__0 : rule__PerspectivePackage__Group_3__0__Impl rule__PerspectivePackage__Group_3__1 ;
     public final void rule__PerspectivePackage__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4234:1: ( rule__PerspectivePackage__Group_3__0__Impl rule__PerspectivePackage__Group_3__1 )
-            // InternalPerspectiveDsl.g:4235:2: rule__PerspectivePackage__Group_3__0__Impl rule__PerspectivePackage__Group_3__1
+            // InternalPerspectiveDsl.g:4236:1: ( rule__PerspectivePackage__Group_3__0__Impl rule__PerspectivePackage__Group_3__1 )
+            // InternalPerspectiveDsl.g:4237:2: rule__PerspectivePackage__Group_3__0__Impl rule__PerspectivePackage__Group_3__1
             {
             pushFollow(FOLLOW_9);
             rule__PerspectivePackage__Group_3__0__Impl();
@@ -15645,17 +15645,17 @@
 
 
     // $ANTLR start "rule__PerspectivePackage__Group_3__0__Impl"
-    // InternalPerspectiveDsl.g:4242:1: rule__PerspectivePackage__Group_3__0__Impl : ( '{' ) ;
+    // InternalPerspectiveDsl.g:4244:1: rule__PerspectivePackage__Group_3__0__Impl : ( '{' ) ;
     public final void rule__PerspectivePackage__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4246:1: ( ( '{' ) )
-            // InternalPerspectiveDsl.g:4247:1: ( '{' )
+            // InternalPerspectiveDsl.g:4248:1: ( ( '{' ) )
+            // InternalPerspectiveDsl.g:4249:1: ( '{' )
             {
-            // InternalPerspectiveDsl.g:4247:1: ( '{' )
-            // InternalPerspectiveDsl.g:4248:2: '{'
+            // InternalPerspectiveDsl.g:4249:1: ( '{' )
+            // InternalPerspectiveDsl.g:4250:2: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePackageAccess().getLeftCurlyBracketKeyword_3_0()); 
@@ -15686,14 +15686,14 @@
 
 
     // $ANTLR start "rule__PerspectivePackage__Group_3__1"
-    // InternalPerspectiveDsl.g:4257:1: rule__PerspectivePackage__Group_3__1 : rule__PerspectivePackage__Group_3__1__Impl rule__PerspectivePackage__Group_3__2 ;
+    // InternalPerspectiveDsl.g:4259:1: rule__PerspectivePackage__Group_3__1 : rule__PerspectivePackage__Group_3__1__Impl rule__PerspectivePackage__Group_3__2 ;
     public final void rule__PerspectivePackage__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4261:1: ( rule__PerspectivePackage__Group_3__1__Impl rule__PerspectivePackage__Group_3__2 )
-            // InternalPerspectiveDsl.g:4262:2: rule__PerspectivePackage__Group_3__1__Impl rule__PerspectivePackage__Group_3__2
+            // InternalPerspectiveDsl.g:4263:1: ( rule__PerspectivePackage__Group_3__1__Impl rule__PerspectivePackage__Group_3__2 )
+            // InternalPerspectiveDsl.g:4264:2: rule__PerspectivePackage__Group_3__1__Impl rule__PerspectivePackage__Group_3__2
             {
             pushFollow(FOLLOW_9);
             rule__PerspectivePackage__Group_3__1__Impl();
@@ -15724,22 +15724,22 @@
 
 
     // $ANTLR start "rule__PerspectivePackage__Group_3__1__Impl"
-    // InternalPerspectiveDsl.g:4269:1: rule__PerspectivePackage__Group_3__1__Impl : ( ( rule__PerspectivePackage__PerspectivesAssignment_3_1 )* ) ;
+    // InternalPerspectiveDsl.g:4271:1: rule__PerspectivePackage__Group_3__1__Impl : ( ( rule__PerspectivePackage__PerspectivesAssignment_3_1 )* ) ;
     public final void rule__PerspectivePackage__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4273:1: ( ( ( rule__PerspectivePackage__PerspectivesAssignment_3_1 )* ) )
-            // InternalPerspectiveDsl.g:4274:1: ( ( rule__PerspectivePackage__PerspectivesAssignment_3_1 )* )
+            // InternalPerspectiveDsl.g:4275:1: ( ( ( rule__PerspectivePackage__PerspectivesAssignment_3_1 )* ) )
+            // InternalPerspectiveDsl.g:4276:1: ( ( rule__PerspectivePackage__PerspectivesAssignment_3_1 )* )
             {
-            // InternalPerspectiveDsl.g:4274:1: ( ( rule__PerspectivePackage__PerspectivesAssignment_3_1 )* )
-            // InternalPerspectiveDsl.g:4275:2: ( rule__PerspectivePackage__PerspectivesAssignment_3_1 )*
+            // InternalPerspectiveDsl.g:4276:1: ( ( rule__PerspectivePackage__PerspectivesAssignment_3_1 )* )
+            // InternalPerspectiveDsl.g:4277:2: ( rule__PerspectivePackage__PerspectivesAssignment_3_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePackageAccess().getPerspectivesAssignment_3_1()); 
             }
-            // InternalPerspectiveDsl.g:4276:2: ( rule__PerspectivePackage__PerspectivesAssignment_3_1 )*
+            // InternalPerspectiveDsl.g:4278:2: ( rule__PerspectivePackage__PerspectivesAssignment_3_1 )*
             loop52:
             do {
                 int alt52=2;
@@ -15752,7 +15752,7 @@
 
                 switch (alt52) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:4276:3: rule__PerspectivePackage__PerspectivesAssignment_3_1
+            	    // InternalPerspectiveDsl.g:4278:3: rule__PerspectivePackage__PerspectivesAssignment_3_1
             	    {
             	    pushFollow(FOLLOW_10);
             	    rule__PerspectivePackage__PerspectivesAssignment_3_1();
@@ -15793,14 +15793,14 @@
 
 
     // $ANTLR start "rule__PerspectivePackage__Group_3__2"
-    // InternalPerspectiveDsl.g:4284:1: rule__PerspectivePackage__Group_3__2 : rule__PerspectivePackage__Group_3__2__Impl ;
+    // InternalPerspectiveDsl.g:4286:1: rule__PerspectivePackage__Group_3__2 : rule__PerspectivePackage__Group_3__2__Impl ;
     public final void rule__PerspectivePackage__Group_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4288:1: ( rule__PerspectivePackage__Group_3__2__Impl )
-            // InternalPerspectiveDsl.g:4289:2: rule__PerspectivePackage__Group_3__2__Impl
+            // InternalPerspectiveDsl.g:4290:1: ( rule__PerspectivePackage__Group_3__2__Impl )
+            // InternalPerspectiveDsl.g:4291:2: rule__PerspectivePackage__Group_3__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePackage__Group_3__2__Impl();
@@ -15826,17 +15826,17 @@
 
 
     // $ANTLR start "rule__PerspectivePackage__Group_3__2__Impl"
-    // InternalPerspectiveDsl.g:4295:1: rule__PerspectivePackage__Group_3__2__Impl : ( '}' ) ;
+    // InternalPerspectiveDsl.g:4297:1: rule__PerspectivePackage__Group_3__2__Impl : ( '}' ) ;
     public final void rule__PerspectivePackage__Group_3__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4299:1: ( ( '}' ) )
-            // InternalPerspectiveDsl.g:4300:1: ( '}' )
+            // InternalPerspectiveDsl.g:4301:1: ( ( '}' ) )
+            // InternalPerspectiveDsl.g:4302:1: ( '}' )
             {
-            // InternalPerspectiveDsl.g:4300:1: ( '}' )
-            // InternalPerspectiveDsl.g:4301:2: '}'
+            // InternalPerspectiveDsl.g:4302:1: ( '}' )
+            // InternalPerspectiveDsl.g:4303:2: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePackageAccess().getRightCurlyBracketKeyword_3_2()); 
@@ -15867,14 +15867,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group__0"
-    // InternalPerspectiveDsl.g:4311:1: rule__Perspective__Group__0 : rule__Perspective__Group__0__Impl rule__Perspective__Group__1 ;
+    // InternalPerspectiveDsl.g:4313:1: rule__Perspective__Group__0 : rule__Perspective__Group__0__Impl rule__Perspective__Group__1 ;
     public final void rule__Perspective__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4315:1: ( rule__Perspective__Group__0__Impl rule__Perspective__Group__1 )
-            // InternalPerspectiveDsl.g:4316:2: rule__Perspective__Group__0__Impl rule__Perspective__Group__1
+            // InternalPerspectiveDsl.g:4317:1: ( rule__Perspective__Group__0__Impl rule__Perspective__Group__1 )
+            // InternalPerspectiveDsl.g:4318:2: rule__Perspective__Group__0__Impl rule__Perspective__Group__1
             {
             pushFollow(FOLLOW_11);
             rule__Perspective__Group__0__Impl();
@@ -15905,23 +15905,23 @@
 
 
     // $ANTLR start "rule__Perspective__Group__0__Impl"
-    // InternalPerspectiveDsl.g:4323:1: rule__Perspective__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:4325:1: rule__Perspective__Group__0__Impl : ( () ) ;
     public final void rule__Perspective__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4327:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:4328:1: ( () )
+            // InternalPerspectiveDsl.g:4329:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:4330:1: ( () )
             {
-            // InternalPerspectiveDsl.g:4328:1: ( () )
-            // InternalPerspectiveDsl.g:4329:2: ()
+            // InternalPerspectiveDsl.g:4330:1: ( () )
+            // InternalPerspectiveDsl.g:4331:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getPerspectiveAction_0()); 
             }
-            // InternalPerspectiveDsl.g:4330:2: ()
-            // InternalPerspectiveDsl.g:4330:3: 
+            // InternalPerspectiveDsl.g:4332:2: ()
+            // InternalPerspectiveDsl.g:4332:3: 
             {
             }
 
@@ -15946,14 +15946,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group__1"
-    // InternalPerspectiveDsl.g:4338:1: rule__Perspective__Group__1 : rule__Perspective__Group__1__Impl rule__Perspective__Group__2 ;
+    // InternalPerspectiveDsl.g:4340:1: rule__Perspective__Group__1 : rule__Perspective__Group__1__Impl rule__Perspective__Group__2 ;
     public final void rule__Perspective__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4342:1: ( rule__Perspective__Group__1__Impl rule__Perspective__Group__2 )
-            // InternalPerspectiveDsl.g:4343:2: rule__Perspective__Group__1__Impl rule__Perspective__Group__2
+            // InternalPerspectiveDsl.g:4344:1: ( rule__Perspective__Group__1__Impl rule__Perspective__Group__2 )
+            // InternalPerspectiveDsl.g:4345:2: rule__Perspective__Group__1__Impl rule__Perspective__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__Perspective__Group__1__Impl();
@@ -15984,17 +15984,17 @@
 
 
     // $ANTLR start "rule__Perspective__Group__1__Impl"
-    // InternalPerspectiveDsl.g:4350:1: rule__Perspective__Group__1__Impl : ( 'perspective' ) ;
+    // InternalPerspectiveDsl.g:4352:1: rule__Perspective__Group__1__Impl : ( 'perspective' ) ;
     public final void rule__Perspective__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4354:1: ( ( 'perspective' ) )
-            // InternalPerspectiveDsl.g:4355:1: ( 'perspective' )
+            // InternalPerspectiveDsl.g:4356:1: ( ( 'perspective' ) )
+            // InternalPerspectiveDsl.g:4357:1: ( 'perspective' )
             {
-            // InternalPerspectiveDsl.g:4355:1: ( 'perspective' )
-            // InternalPerspectiveDsl.g:4356:2: 'perspective'
+            // InternalPerspectiveDsl.g:4357:1: ( 'perspective' )
+            // InternalPerspectiveDsl.g:4358:2: 'perspective'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getPerspectiveKeyword_1()); 
@@ -16025,14 +16025,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group__2"
-    // InternalPerspectiveDsl.g:4365:1: rule__Perspective__Group__2 : rule__Perspective__Group__2__Impl rule__Perspective__Group__3 ;
+    // InternalPerspectiveDsl.g:4367:1: rule__Perspective__Group__2 : rule__Perspective__Group__2__Impl rule__Perspective__Group__3 ;
     public final void rule__Perspective__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4369:1: ( rule__Perspective__Group__2__Impl rule__Perspective__Group__3 )
-            // InternalPerspectiveDsl.g:4370:2: rule__Perspective__Group__2__Impl rule__Perspective__Group__3
+            // InternalPerspectiveDsl.g:4371:1: ( rule__Perspective__Group__2__Impl rule__Perspective__Group__3 )
+            // InternalPerspectiveDsl.g:4372:2: rule__Perspective__Group__2__Impl rule__Perspective__Group__3
             {
             pushFollow(FOLLOW_12);
             rule__Perspective__Group__2__Impl();
@@ -16063,23 +16063,23 @@
 
 
     // $ANTLR start "rule__Perspective__Group__2__Impl"
-    // InternalPerspectiveDsl.g:4377:1: rule__Perspective__Group__2__Impl : ( ( rule__Perspective__NameAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:4379:1: rule__Perspective__Group__2__Impl : ( ( rule__Perspective__NameAssignment_2 ) ) ;
     public final void rule__Perspective__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4381:1: ( ( ( rule__Perspective__NameAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:4382:1: ( ( rule__Perspective__NameAssignment_2 ) )
+            // InternalPerspectiveDsl.g:4383:1: ( ( ( rule__Perspective__NameAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:4384:1: ( ( rule__Perspective__NameAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:4382:1: ( ( rule__Perspective__NameAssignment_2 ) )
-            // InternalPerspectiveDsl.g:4383:2: ( rule__Perspective__NameAssignment_2 )
+            // InternalPerspectiveDsl.g:4384:1: ( ( rule__Perspective__NameAssignment_2 ) )
+            // InternalPerspectiveDsl.g:4385:2: ( rule__Perspective__NameAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getNameAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:4384:2: ( rule__Perspective__NameAssignment_2 )
-            // InternalPerspectiveDsl.g:4384:3: rule__Perspective__NameAssignment_2
+            // InternalPerspectiveDsl.g:4386:2: ( rule__Perspective__NameAssignment_2 )
+            // InternalPerspectiveDsl.g:4386:3: rule__Perspective__NameAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__Perspective__NameAssignment_2();
@@ -16114,14 +16114,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group__3"
-    // InternalPerspectiveDsl.g:4392:1: rule__Perspective__Group__3 : rule__Perspective__Group__3__Impl rule__Perspective__Group__4 ;
+    // InternalPerspectiveDsl.g:4394:1: rule__Perspective__Group__3 : rule__Perspective__Group__3__Impl rule__Perspective__Group__4 ;
     public final void rule__Perspective__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4396:1: ( rule__Perspective__Group__3__Impl rule__Perspective__Group__4 )
-            // InternalPerspectiveDsl.g:4397:2: rule__Perspective__Group__3__Impl rule__Perspective__Group__4
+            // InternalPerspectiveDsl.g:4398:1: ( rule__Perspective__Group__3__Impl rule__Perspective__Group__4 )
+            // InternalPerspectiveDsl.g:4399:2: rule__Perspective__Group__3__Impl rule__Perspective__Group__4
             {
             pushFollow(FOLLOW_12);
             rule__Perspective__Group__3__Impl();
@@ -16152,22 +16152,22 @@
 
 
     // $ANTLR start "rule__Perspective__Group__3__Impl"
-    // InternalPerspectiveDsl.g:4404:1: rule__Perspective__Group__3__Impl : ( ( rule__Perspective__Group_3__0 )? ) ;
+    // InternalPerspectiveDsl.g:4406:1: rule__Perspective__Group__3__Impl : ( ( rule__Perspective__Group_3__0 )? ) ;
     public final void rule__Perspective__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4408:1: ( ( ( rule__Perspective__Group_3__0 )? ) )
-            // InternalPerspectiveDsl.g:4409:1: ( ( rule__Perspective__Group_3__0 )? )
+            // InternalPerspectiveDsl.g:4410:1: ( ( ( rule__Perspective__Group_3__0 )? ) )
+            // InternalPerspectiveDsl.g:4411:1: ( ( rule__Perspective__Group_3__0 )? )
             {
-            // InternalPerspectiveDsl.g:4409:1: ( ( rule__Perspective__Group_3__0 )? )
-            // InternalPerspectiveDsl.g:4410:2: ( rule__Perspective__Group_3__0 )?
+            // InternalPerspectiveDsl.g:4411:1: ( ( rule__Perspective__Group_3__0 )? )
+            // InternalPerspectiveDsl.g:4412:2: ( rule__Perspective__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getGroup_3()); 
             }
-            // InternalPerspectiveDsl.g:4411:2: ( rule__Perspective__Group_3__0 )?
+            // InternalPerspectiveDsl.g:4413:2: ( rule__Perspective__Group_3__0 )?
             int alt53=2;
             int LA53_0 = input.LA(1);
 
@@ -16176,7 +16176,7 @@
             }
             switch (alt53) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:4411:3: rule__Perspective__Group_3__0
+                    // InternalPerspectiveDsl.g:4413:3: rule__Perspective__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__Perspective__Group_3__0();
@@ -16214,14 +16214,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group__4"
-    // InternalPerspectiveDsl.g:4419:1: rule__Perspective__Group__4 : rule__Perspective__Group__4__Impl rule__Perspective__Group__5 ;
+    // InternalPerspectiveDsl.g:4421:1: rule__Perspective__Group__4 : rule__Perspective__Group__4__Impl rule__Perspective__Group__5 ;
     public final void rule__Perspective__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4423:1: ( rule__Perspective__Group__4__Impl rule__Perspective__Group__5 )
-            // InternalPerspectiveDsl.g:4424:2: rule__Perspective__Group__4__Impl rule__Perspective__Group__5
+            // InternalPerspectiveDsl.g:4425:1: ( rule__Perspective__Group__4__Impl rule__Perspective__Group__5 )
+            // InternalPerspectiveDsl.g:4426:2: rule__Perspective__Group__4__Impl rule__Perspective__Group__5
             {
             pushFollow(FOLLOW_12);
             rule__Perspective__Group__4__Impl();
@@ -16252,22 +16252,22 @@
 
 
     // $ANTLR start "rule__Perspective__Group__4__Impl"
-    // InternalPerspectiveDsl.g:4431:1: rule__Perspective__Group__4__Impl : ( ( rule__Perspective__Group_4__0 )? ) ;
+    // InternalPerspectiveDsl.g:4433:1: rule__Perspective__Group__4__Impl : ( ( rule__Perspective__Group_4__0 )? ) ;
     public final void rule__Perspective__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4435:1: ( ( ( rule__Perspective__Group_4__0 )? ) )
-            // InternalPerspectiveDsl.g:4436:1: ( ( rule__Perspective__Group_4__0 )? )
+            // InternalPerspectiveDsl.g:4437:1: ( ( ( rule__Perspective__Group_4__0 )? ) )
+            // InternalPerspectiveDsl.g:4438:1: ( ( rule__Perspective__Group_4__0 )? )
             {
-            // InternalPerspectiveDsl.g:4436:1: ( ( rule__Perspective__Group_4__0 )? )
-            // InternalPerspectiveDsl.g:4437:2: ( rule__Perspective__Group_4__0 )?
+            // InternalPerspectiveDsl.g:4438:1: ( ( rule__Perspective__Group_4__0 )? )
+            // InternalPerspectiveDsl.g:4439:2: ( rule__Perspective__Group_4__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getGroup_4()); 
             }
-            // InternalPerspectiveDsl.g:4438:2: ( rule__Perspective__Group_4__0 )?
+            // InternalPerspectiveDsl.g:4440:2: ( rule__Perspective__Group_4__0 )?
             int alt54=2;
             int LA54_0 = input.LA(1);
 
@@ -16276,7 +16276,7 @@
             }
             switch (alt54) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:4438:3: rule__Perspective__Group_4__0
+                    // InternalPerspectiveDsl.g:4440:3: rule__Perspective__Group_4__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__Perspective__Group_4__0();
@@ -16314,14 +16314,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group__5"
-    // InternalPerspectiveDsl.g:4446:1: rule__Perspective__Group__5 : rule__Perspective__Group__5__Impl rule__Perspective__Group__6 ;
+    // InternalPerspectiveDsl.g:4448:1: rule__Perspective__Group__5 : rule__Perspective__Group__5__Impl rule__Perspective__Group__6 ;
     public final void rule__Perspective__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4450:1: ( rule__Perspective__Group__5__Impl rule__Perspective__Group__6 )
-            // InternalPerspectiveDsl.g:4451:2: rule__Perspective__Group__5__Impl rule__Perspective__Group__6
+            // InternalPerspectiveDsl.g:4452:1: ( rule__Perspective__Group__5__Impl rule__Perspective__Group__6 )
+            // InternalPerspectiveDsl.g:4453:2: rule__Perspective__Group__5__Impl rule__Perspective__Group__6
             {
             pushFollow(FOLLOW_8);
             rule__Perspective__Group__5__Impl();
@@ -16352,23 +16352,23 @@
 
 
     // $ANTLR start "rule__Perspective__Group__5__Impl"
-    // InternalPerspectiveDsl.g:4458:1: rule__Perspective__Group__5__Impl : ( ( rule__Perspective__UnorderedGroup_5 ) ) ;
+    // InternalPerspectiveDsl.g:4460:1: rule__Perspective__Group__5__Impl : ( ( rule__Perspective__UnorderedGroup_5 ) ) ;
     public final void rule__Perspective__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4462:1: ( ( ( rule__Perspective__UnorderedGroup_5 ) ) )
-            // InternalPerspectiveDsl.g:4463:1: ( ( rule__Perspective__UnorderedGroup_5 ) )
+            // InternalPerspectiveDsl.g:4464:1: ( ( ( rule__Perspective__UnorderedGroup_5 ) ) )
+            // InternalPerspectiveDsl.g:4465:1: ( ( rule__Perspective__UnorderedGroup_5 ) )
             {
-            // InternalPerspectiveDsl.g:4463:1: ( ( rule__Perspective__UnorderedGroup_5 ) )
-            // InternalPerspectiveDsl.g:4464:2: ( rule__Perspective__UnorderedGroup_5 )
+            // InternalPerspectiveDsl.g:4465:1: ( ( rule__Perspective__UnorderedGroup_5 ) )
+            // InternalPerspectiveDsl.g:4466:2: ( rule__Perspective__UnorderedGroup_5 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5()); 
             }
-            // InternalPerspectiveDsl.g:4465:2: ( rule__Perspective__UnorderedGroup_5 )
-            // InternalPerspectiveDsl.g:4465:3: rule__Perspective__UnorderedGroup_5
+            // InternalPerspectiveDsl.g:4467:2: ( rule__Perspective__UnorderedGroup_5 )
+            // InternalPerspectiveDsl.g:4467:3: rule__Perspective__UnorderedGroup_5
             {
             pushFollow(FOLLOW_2);
             rule__Perspective__UnorderedGroup_5();
@@ -16403,14 +16403,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group__6"
-    // InternalPerspectiveDsl.g:4473:1: rule__Perspective__Group__6 : rule__Perspective__Group__6__Impl rule__Perspective__Group__7 ;
+    // InternalPerspectiveDsl.g:4475:1: rule__Perspective__Group__6 : rule__Perspective__Group__6__Impl rule__Perspective__Group__7 ;
     public final void rule__Perspective__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4477:1: ( rule__Perspective__Group__6__Impl rule__Perspective__Group__7 )
-            // InternalPerspectiveDsl.g:4478:2: rule__Perspective__Group__6__Impl rule__Perspective__Group__7
+            // InternalPerspectiveDsl.g:4479:1: ( rule__Perspective__Group__6__Impl rule__Perspective__Group__7 )
+            // InternalPerspectiveDsl.g:4480:2: rule__Perspective__Group__6__Impl rule__Perspective__Group__7
             {
             pushFollow(FOLLOW_13);
             rule__Perspective__Group__6__Impl();
@@ -16441,17 +16441,17 @@
 
 
     // $ANTLR start "rule__Perspective__Group__6__Impl"
-    // InternalPerspectiveDsl.g:4485:1: rule__Perspective__Group__6__Impl : ( '{' ) ;
+    // InternalPerspectiveDsl.g:4487:1: rule__Perspective__Group__6__Impl : ( '{' ) ;
     public final void rule__Perspective__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4489:1: ( ( '{' ) )
-            // InternalPerspectiveDsl.g:4490:1: ( '{' )
+            // InternalPerspectiveDsl.g:4491:1: ( ( '{' ) )
+            // InternalPerspectiveDsl.g:4492:1: ( '{' )
             {
-            // InternalPerspectiveDsl.g:4490:1: ( '{' )
-            // InternalPerspectiveDsl.g:4491:2: '{'
+            // InternalPerspectiveDsl.g:4492:1: ( '{' )
+            // InternalPerspectiveDsl.g:4493:2: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getLeftCurlyBracketKeyword_6()); 
@@ -16482,14 +16482,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group__7"
-    // InternalPerspectiveDsl.g:4500:1: rule__Perspective__Group__7 : rule__Perspective__Group__7__Impl rule__Perspective__Group__8 ;
+    // InternalPerspectiveDsl.g:4502:1: rule__Perspective__Group__7 : rule__Perspective__Group__7__Impl rule__Perspective__Group__8 ;
     public final void rule__Perspective__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4504:1: ( rule__Perspective__Group__7__Impl rule__Perspective__Group__8 )
-            // InternalPerspectiveDsl.g:4505:2: rule__Perspective__Group__7__Impl rule__Perspective__Group__8
+            // InternalPerspectiveDsl.g:4506:1: ( rule__Perspective__Group__7__Impl rule__Perspective__Group__8 )
+            // InternalPerspectiveDsl.g:4507:2: rule__Perspective__Group__7__Impl rule__Perspective__Group__8
             {
             pushFollow(FOLLOW_13);
             rule__Perspective__Group__7__Impl();
@@ -16520,22 +16520,22 @@
 
 
     // $ANTLR start "rule__Perspective__Group__7__Impl"
-    // InternalPerspectiveDsl.g:4512:1: rule__Perspective__Group__7__Impl : ( ( rule__Perspective__ElementsAssignment_7 )* ) ;
+    // InternalPerspectiveDsl.g:4514:1: rule__Perspective__Group__7__Impl : ( ( rule__Perspective__ElementsAssignment_7 )* ) ;
     public final void rule__Perspective__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4516:1: ( ( ( rule__Perspective__ElementsAssignment_7 )* ) )
-            // InternalPerspectiveDsl.g:4517:1: ( ( rule__Perspective__ElementsAssignment_7 )* )
+            // InternalPerspectiveDsl.g:4518:1: ( ( ( rule__Perspective__ElementsAssignment_7 )* ) )
+            // InternalPerspectiveDsl.g:4519:1: ( ( rule__Perspective__ElementsAssignment_7 )* )
             {
-            // InternalPerspectiveDsl.g:4517:1: ( ( rule__Perspective__ElementsAssignment_7 )* )
-            // InternalPerspectiveDsl.g:4518:2: ( rule__Perspective__ElementsAssignment_7 )*
+            // InternalPerspectiveDsl.g:4519:1: ( ( rule__Perspective__ElementsAssignment_7 )* )
+            // InternalPerspectiveDsl.g:4520:2: ( rule__Perspective__ElementsAssignment_7 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getElementsAssignment_7()); 
             }
-            // InternalPerspectiveDsl.g:4519:2: ( rule__Perspective__ElementsAssignment_7 )*
+            // InternalPerspectiveDsl.g:4521:2: ( rule__Perspective__ElementsAssignment_7 )*
             loop55:
             do {
                 int alt55=2;
@@ -16548,7 +16548,7 @@
 
                 switch (alt55) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:4519:3: rule__Perspective__ElementsAssignment_7
+            	    // InternalPerspectiveDsl.g:4521:3: rule__Perspective__ElementsAssignment_7
             	    {
             	    pushFollow(FOLLOW_14);
             	    rule__Perspective__ElementsAssignment_7();
@@ -16589,14 +16589,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group__8"
-    // InternalPerspectiveDsl.g:4527:1: rule__Perspective__Group__8 : rule__Perspective__Group__8__Impl ;
+    // InternalPerspectiveDsl.g:4529:1: rule__Perspective__Group__8 : rule__Perspective__Group__8__Impl ;
     public final void rule__Perspective__Group__8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4531:1: ( rule__Perspective__Group__8__Impl )
-            // InternalPerspectiveDsl.g:4532:2: rule__Perspective__Group__8__Impl
+            // InternalPerspectiveDsl.g:4533:1: ( rule__Perspective__Group__8__Impl )
+            // InternalPerspectiveDsl.g:4534:2: rule__Perspective__Group__8__Impl
             {
             pushFollow(FOLLOW_2);
             rule__Perspective__Group__8__Impl();
@@ -16622,17 +16622,17 @@
 
 
     // $ANTLR start "rule__Perspective__Group__8__Impl"
-    // InternalPerspectiveDsl.g:4538:1: rule__Perspective__Group__8__Impl : ( '}' ) ;
+    // InternalPerspectiveDsl.g:4540:1: rule__Perspective__Group__8__Impl : ( '}' ) ;
     public final void rule__Perspective__Group__8__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4542:1: ( ( '}' ) )
-            // InternalPerspectiveDsl.g:4543:1: ( '}' )
+            // InternalPerspectiveDsl.g:4544:1: ( ( '}' ) )
+            // InternalPerspectiveDsl.g:4545:1: ( '}' )
             {
-            // InternalPerspectiveDsl.g:4543:1: ( '}' )
-            // InternalPerspectiveDsl.g:4544:2: '}'
+            // InternalPerspectiveDsl.g:4545:1: ( '}' )
+            // InternalPerspectiveDsl.g:4546:2: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getRightCurlyBracketKeyword_8()); 
@@ -16663,14 +16663,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group_3__0"
-    // InternalPerspectiveDsl.g:4554:1: rule__Perspective__Group_3__0 : rule__Perspective__Group_3__0__Impl rule__Perspective__Group_3__1 ;
+    // InternalPerspectiveDsl.g:4556:1: rule__Perspective__Group_3__0 : rule__Perspective__Group_3__0__Impl rule__Perspective__Group_3__1 ;
     public final void rule__Perspective__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4558:1: ( rule__Perspective__Group_3__0__Impl rule__Perspective__Group_3__1 )
-            // InternalPerspectiveDsl.g:4559:2: rule__Perspective__Group_3__0__Impl rule__Perspective__Group_3__1
+            // InternalPerspectiveDsl.g:4560:1: ( rule__Perspective__Group_3__0__Impl rule__Perspective__Group_3__1 )
+            // InternalPerspectiveDsl.g:4561:2: rule__Perspective__Group_3__0__Impl rule__Perspective__Group_3__1
             {
             pushFollow(FOLLOW_15);
             rule__Perspective__Group_3__0__Impl();
@@ -16701,23 +16701,23 @@
 
 
     // $ANTLR start "rule__Perspective__Group_3__0__Impl"
-    // InternalPerspectiveDsl.g:4566:1: rule__Perspective__Group_3__0__Impl : ( ( rule__Perspective__DescriptionAssignment_3_0 ) ) ;
+    // InternalPerspectiveDsl.g:4568:1: rule__Perspective__Group_3__0__Impl : ( ( rule__Perspective__DescriptionAssignment_3_0 ) ) ;
     public final void rule__Perspective__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4570:1: ( ( ( rule__Perspective__DescriptionAssignment_3_0 ) ) )
-            // InternalPerspectiveDsl.g:4571:1: ( ( rule__Perspective__DescriptionAssignment_3_0 ) )
+            // InternalPerspectiveDsl.g:4572:1: ( ( ( rule__Perspective__DescriptionAssignment_3_0 ) ) )
+            // InternalPerspectiveDsl.g:4573:1: ( ( rule__Perspective__DescriptionAssignment_3_0 ) )
             {
-            // InternalPerspectiveDsl.g:4571:1: ( ( rule__Perspective__DescriptionAssignment_3_0 ) )
-            // InternalPerspectiveDsl.g:4572:2: ( rule__Perspective__DescriptionAssignment_3_0 )
+            // InternalPerspectiveDsl.g:4573:1: ( ( rule__Perspective__DescriptionAssignment_3_0 ) )
+            // InternalPerspectiveDsl.g:4574:2: ( rule__Perspective__DescriptionAssignment_3_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getDescriptionAssignment_3_0()); 
             }
-            // InternalPerspectiveDsl.g:4573:2: ( rule__Perspective__DescriptionAssignment_3_0 )
-            // InternalPerspectiveDsl.g:4573:3: rule__Perspective__DescriptionAssignment_3_0
+            // InternalPerspectiveDsl.g:4575:2: ( rule__Perspective__DescriptionAssignment_3_0 )
+            // InternalPerspectiveDsl.g:4575:3: rule__Perspective__DescriptionAssignment_3_0
             {
             pushFollow(FOLLOW_2);
             rule__Perspective__DescriptionAssignment_3_0();
@@ -16752,14 +16752,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group_3__1"
-    // InternalPerspectiveDsl.g:4581:1: rule__Perspective__Group_3__1 : rule__Perspective__Group_3__1__Impl ;
+    // InternalPerspectiveDsl.g:4583:1: rule__Perspective__Group_3__1 : rule__Perspective__Group_3__1__Impl ;
     public final void rule__Perspective__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4585:1: ( rule__Perspective__Group_3__1__Impl )
-            // InternalPerspectiveDsl.g:4586:2: rule__Perspective__Group_3__1__Impl
+            // InternalPerspectiveDsl.g:4587:1: ( rule__Perspective__Group_3__1__Impl )
+            // InternalPerspectiveDsl.g:4588:2: rule__Perspective__Group_3__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__Perspective__Group_3__1__Impl();
@@ -16785,23 +16785,23 @@
 
 
     // $ANTLR start "rule__Perspective__Group_3__1__Impl"
-    // InternalPerspectiveDsl.g:4592:1: rule__Perspective__Group_3__1__Impl : ( ( rule__Perspective__DescriptionValueAssignment_3_1 ) ) ;
+    // InternalPerspectiveDsl.g:4594:1: rule__Perspective__Group_3__1__Impl : ( ( rule__Perspective__DescriptionValueAssignment_3_1 ) ) ;
     public final void rule__Perspective__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4596:1: ( ( ( rule__Perspective__DescriptionValueAssignment_3_1 ) ) )
-            // InternalPerspectiveDsl.g:4597:1: ( ( rule__Perspective__DescriptionValueAssignment_3_1 ) )
+            // InternalPerspectiveDsl.g:4598:1: ( ( ( rule__Perspective__DescriptionValueAssignment_3_1 ) ) )
+            // InternalPerspectiveDsl.g:4599:1: ( ( rule__Perspective__DescriptionValueAssignment_3_1 ) )
             {
-            // InternalPerspectiveDsl.g:4597:1: ( ( rule__Perspective__DescriptionValueAssignment_3_1 ) )
-            // InternalPerspectiveDsl.g:4598:2: ( rule__Perspective__DescriptionValueAssignment_3_1 )
+            // InternalPerspectiveDsl.g:4599:1: ( ( rule__Perspective__DescriptionValueAssignment_3_1 ) )
+            // InternalPerspectiveDsl.g:4600:2: ( rule__Perspective__DescriptionValueAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getDescriptionValueAssignment_3_1()); 
             }
-            // InternalPerspectiveDsl.g:4599:2: ( rule__Perspective__DescriptionValueAssignment_3_1 )
-            // InternalPerspectiveDsl.g:4599:3: rule__Perspective__DescriptionValueAssignment_3_1
+            // InternalPerspectiveDsl.g:4601:2: ( rule__Perspective__DescriptionValueAssignment_3_1 )
+            // InternalPerspectiveDsl.g:4601:3: rule__Perspective__DescriptionValueAssignment_3_1
             {
             pushFollow(FOLLOW_2);
             rule__Perspective__DescriptionValueAssignment_3_1();
@@ -16836,14 +16836,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group_4__0"
-    // InternalPerspectiveDsl.g:4608:1: rule__Perspective__Group_4__0 : rule__Perspective__Group_4__0__Impl rule__Perspective__Group_4__1 ;
+    // InternalPerspectiveDsl.g:4610:1: rule__Perspective__Group_4__0 : rule__Perspective__Group_4__0__Impl rule__Perspective__Group_4__1 ;
     public final void rule__Perspective__Group_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4612:1: ( rule__Perspective__Group_4__0__Impl rule__Perspective__Group_4__1 )
-            // InternalPerspectiveDsl.g:4613:2: rule__Perspective__Group_4__0__Impl rule__Perspective__Group_4__1
+            // InternalPerspectiveDsl.g:4614:1: ( rule__Perspective__Group_4__0__Impl rule__Perspective__Group_4__1 )
+            // InternalPerspectiveDsl.g:4615:2: rule__Perspective__Group_4__0__Impl rule__Perspective__Group_4__1
             {
             pushFollow(FOLLOW_7);
             rule__Perspective__Group_4__0__Impl();
@@ -16874,17 +16874,17 @@
 
 
     // $ANTLR start "rule__Perspective__Group_4__0__Impl"
-    // InternalPerspectiveDsl.g:4620:1: rule__Perspective__Group_4__0__Impl : ( 'process' ) ;
+    // InternalPerspectiveDsl.g:4622:1: rule__Perspective__Group_4__0__Impl : ( 'process' ) ;
     public final void rule__Perspective__Group_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4624:1: ( ( 'process' ) )
-            // InternalPerspectiveDsl.g:4625:1: ( 'process' )
+            // InternalPerspectiveDsl.g:4626:1: ( ( 'process' ) )
+            // InternalPerspectiveDsl.g:4627:1: ( 'process' )
             {
-            // InternalPerspectiveDsl.g:4625:1: ( 'process' )
-            // InternalPerspectiveDsl.g:4626:2: 'process'
+            // InternalPerspectiveDsl.g:4627:1: ( 'process' )
+            // InternalPerspectiveDsl.g:4628:2: 'process'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getProcessKeyword_4_0()); 
@@ -16915,14 +16915,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group_4__1"
-    // InternalPerspectiveDsl.g:4635:1: rule__Perspective__Group_4__1 : rule__Perspective__Group_4__1__Impl rule__Perspective__Group_4__2 ;
+    // InternalPerspectiveDsl.g:4637:1: rule__Perspective__Group_4__1 : rule__Perspective__Group_4__1__Impl rule__Perspective__Group_4__2 ;
     public final void rule__Perspective__Group_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4639:1: ( rule__Perspective__Group_4__1__Impl rule__Perspective__Group_4__2 )
-            // InternalPerspectiveDsl.g:4640:2: rule__Perspective__Group_4__1__Impl rule__Perspective__Group_4__2
+            // InternalPerspectiveDsl.g:4641:1: ( rule__Perspective__Group_4__1__Impl rule__Perspective__Group_4__2 )
+            // InternalPerspectiveDsl.g:4642:2: rule__Perspective__Group_4__1__Impl rule__Perspective__Group_4__2
             {
             pushFollow(FOLLOW_16);
             rule__Perspective__Group_4__1__Impl();
@@ -16953,23 +16953,23 @@
 
 
     // $ANTLR start "rule__Perspective__Group_4__1__Impl"
-    // InternalPerspectiveDsl.g:4647:1: rule__Perspective__Group_4__1__Impl : ( ( rule__Perspective__ProcessAssignment_4_1 ) ) ;
+    // InternalPerspectiveDsl.g:4649:1: rule__Perspective__Group_4__1__Impl : ( ( rule__Perspective__ProcessAssignment_4_1 ) ) ;
     public final void rule__Perspective__Group_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4651:1: ( ( ( rule__Perspective__ProcessAssignment_4_1 ) ) )
-            // InternalPerspectiveDsl.g:4652:1: ( ( rule__Perspective__ProcessAssignment_4_1 ) )
+            // InternalPerspectiveDsl.g:4653:1: ( ( ( rule__Perspective__ProcessAssignment_4_1 ) ) )
+            // InternalPerspectiveDsl.g:4654:1: ( ( rule__Perspective__ProcessAssignment_4_1 ) )
             {
-            // InternalPerspectiveDsl.g:4652:1: ( ( rule__Perspective__ProcessAssignment_4_1 ) )
-            // InternalPerspectiveDsl.g:4653:2: ( rule__Perspective__ProcessAssignment_4_1 )
+            // InternalPerspectiveDsl.g:4654:1: ( ( rule__Perspective__ProcessAssignment_4_1 ) )
+            // InternalPerspectiveDsl.g:4655:2: ( rule__Perspective__ProcessAssignment_4_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getProcessAssignment_4_1()); 
             }
-            // InternalPerspectiveDsl.g:4654:2: ( rule__Perspective__ProcessAssignment_4_1 )
-            // InternalPerspectiveDsl.g:4654:3: rule__Perspective__ProcessAssignment_4_1
+            // InternalPerspectiveDsl.g:4656:2: ( rule__Perspective__ProcessAssignment_4_1 )
+            // InternalPerspectiveDsl.g:4656:3: rule__Perspective__ProcessAssignment_4_1
             {
             pushFollow(FOLLOW_2);
             rule__Perspective__ProcessAssignment_4_1();
@@ -17004,14 +17004,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group_4__2"
-    // InternalPerspectiveDsl.g:4662:1: rule__Perspective__Group_4__2 : rule__Perspective__Group_4__2__Impl rule__Perspective__Group_4__3 ;
+    // InternalPerspectiveDsl.g:4664:1: rule__Perspective__Group_4__2 : rule__Perspective__Group_4__2__Impl rule__Perspective__Group_4__3 ;
     public final void rule__Perspective__Group_4__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4666:1: ( rule__Perspective__Group_4__2__Impl rule__Perspective__Group_4__3 )
-            // InternalPerspectiveDsl.g:4667:2: rule__Perspective__Group_4__2__Impl rule__Perspective__Group_4__3
+            // InternalPerspectiveDsl.g:4668:1: ( rule__Perspective__Group_4__2__Impl rule__Perspective__Group_4__3 )
+            // InternalPerspectiveDsl.g:4669:2: rule__Perspective__Group_4__2__Impl rule__Perspective__Group_4__3
             {
             pushFollow(FOLLOW_7);
             rule__Perspective__Group_4__2__Impl();
@@ -17042,17 +17042,17 @@
 
 
     // $ANTLR start "rule__Perspective__Group_4__2__Impl"
-    // InternalPerspectiveDsl.g:4674:1: rule__Perspective__Group_4__2__Impl : ( 'usertask' ) ;
+    // InternalPerspectiveDsl.g:4676:1: rule__Perspective__Group_4__2__Impl : ( 'usertask' ) ;
     public final void rule__Perspective__Group_4__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4678:1: ( ( 'usertask' ) )
-            // InternalPerspectiveDsl.g:4679:1: ( 'usertask' )
+            // InternalPerspectiveDsl.g:4680:1: ( ( 'usertask' ) )
+            // InternalPerspectiveDsl.g:4681:1: ( 'usertask' )
             {
-            // InternalPerspectiveDsl.g:4679:1: ( 'usertask' )
-            // InternalPerspectiveDsl.g:4680:2: 'usertask'
+            // InternalPerspectiveDsl.g:4681:1: ( 'usertask' )
+            // InternalPerspectiveDsl.g:4682:2: 'usertask'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getUsertaskKeyword_4_2()); 
@@ -17083,14 +17083,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group_4__3"
-    // InternalPerspectiveDsl.g:4689:1: rule__Perspective__Group_4__3 : rule__Perspective__Group_4__3__Impl ;
+    // InternalPerspectiveDsl.g:4691:1: rule__Perspective__Group_4__3 : rule__Perspective__Group_4__3__Impl ;
     public final void rule__Perspective__Group_4__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4693:1: ( rule__Perspective__Group_4__3__Impl )
-            // InternalPerspectiveDsl.g:4694:2: rule__Perspective__Group_4__3__Impl
+            // InternalPerspectiveDsl.g:4695:1: ( rule__Perspective__Group_4__3__Impl )
+            // InternalPerspectiveDsl.g:4696:2: rule__Perspective__Group_4__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__Perspective__Group_4__3__Impl();
@@ -17116,23 +17116,23 @@
 
 
     // $ANTLR start "rule__Perspective__Group_4__3__Impl"
-    // InternalPerspectiveDsl.g:4700:1: rule__Perspective__Group_4__3__Impl : ( ( rule__Perspective__UserTaskAssignment_4_3 ) ) ;
+    // InternalPerspectiveDsl.g:4702:1: rule__Perspective__Group_4__3__Impl : ( ( rule__Perspective__UserTaskAssignment_4_3 ) ) ;
     public final void rule__Perspective__Group_4__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4704:1: ( ( ( rule__Perspective__UserTaskAssignment_4_3 ) ) )
-            // InternalPerspectiveDsl.g:4705:1: ( ( rule__Perspective__UserTaskAssignment_4_3 ) )
+            // InternalPerspectiveDsl.g:4706:1: ( ( ( rule__Perspective__UserTaskAssignment_4_3 ) ) )
+            // InternalPerspectiveDsl.g:4707:1: ( ( rule__Perspective__UserTaskAssignment_4_3 ) )
             {
-            // InternalPerspectiveDsl.g:4705:1: ( ( rule__Perspective__UserTaskAssignment_4_3 ) )
-            // InternalPerspectiveDsl.g:4706:2: ( rule__Perspective__UserTaskAssignment_4_3 )
+            // InternalPerspectiveDsl.g:4707:1: ( ( rule__Perspective__UserTaskAssignment_4_3 ) )
+            // InternalPerspectiveDsl.g:4708:2: ( rule__Perspective__UserTaskAssignment_4_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getUserTaskAssignment_4_3()); 
             }
-            // InternalPerspectiveDsl.g:4707:2: ( rule__Perspective__UserTaskAssignment_4_3 )
-            // InternalPerspectiveDsl.g:4707:3: rule__Perspective__UserTaskAssignment_4_3
+            // InternalPerspectiveDsl.g:4709:2: ( rule__Perspective__UserTaskAssignment_4_3 )
+            // InternalPerspectiveDsl.g:4709:3: rule__Perspective__UserTaskAssignment_4_3
             {
             pushFollow(FOLLOW_2);
             rule__Perspective__UserTaskAssignment_4_3();
@@ -17167,14 +17167,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group_5_0__0"
-    // InternalPerspectiveDsl.g:4716:1: rule__Perspective__Group_5_0__0 : rule__Perspective__Group_5_0__0__Impl rule__Perspective__Group_5_0__1 ;
+    // InternalPerspectiveDsl.g:4718:1: rule__Perspective__Group_5_0__0 : rule__Perspective__Group_5_0__0__Impl rule__Perspective__Group_5_0__1 ;
     public final void rule__Perspective__Group_5_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4720:1: ( rule__Perspective__Group_5_0__0__Impl rule__Perspective__Group_5_0__1 )
-            // InternalPerspectiveDsl.g:4721:2: rule__Perspective__Group_5_0__0__Impl rule__Perspective__Group_5_0__1
+            // InternalPerspectiveDsl.g:4722:1: ( rule__Perspective__Group_5_0__0__Impl rule__Perspective__Group_5_0__1 )
+            // InternalPerspectiveDsl.g:4723:2: rule__Perspective__Group_5_0__0__Impl rule__Perspective__Group_5_0__1
             {
             pushFollow(FOLLOW_15);
             rule__Perspective__Group_5_0__0__Impl();
@@ -17205,17 +17205,17 @@
 
 
     // $ANTLR start "rule__Perspective__Group_5_0__0__Impl"
-    // InternalPerspectiveDsl.g:4728:1: rule__Perspective__Group_5_0__0__Impl : ( 'iconURI' ) ;
+    // InternalPerspectiveDsl.g:4730:1: rule__Perspective__Group_5_0__0__Impl : ( 'iconURI' ) ;
     public final void rule__Perspective__Group_5_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4732:1: ( ( 'iconURI' ) )
-            // InternalPerspectiveDsl.g:4733:1: ( 'iconURI' )
+            // InternalPerspectiveDsl.g:4734:1: ( ( 'iconURI' ) )
+            // InternalPerspectiveDsl.g:4735:1: ( 'iconURI' )
             {
-            // InternalPerspectiveDsl.g:4733:1: ( 'iconURI' )
-            // InternalPerspectiveDsl.g:4734:2: 'iconURI'
+            // InternalPerspectiveDsl.g:4735:1: ( 'iconURI' )
+            // InternalPerspectiveDsl.g:4736:2: 'iconURI'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getIconURIKeyword_5_0_0()); 
@@ -17246,14 +17246,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group_5_0__1"
-    // InternalPerspectiveDsl.g:4743:1: rule__Perspective__Group_5_0__1 : rule__Perspective__Group_5_0__1__Impl ;
+    // InternalPerspectiveDsl.g:4745:1: rule__Perspective__Group_5_0__1 : rule__Perspective__Group_5_0__1__Impl ;
     public final void rule__Perspective__Group_5_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4747:1: ( rule__Perspective__Group_5_0__1__Impl )
-            // InternalPerspectiveDsl.g:4748:2: rule__Perspective__Group_5_0__1__Impl
+            // InternalPerspectiveDsl.g:4749:1: ( rule__Perspective__Group_5_0__1__Impl )
+            // InternalPerspectiveDsl.g:4750:2: rule__Perspective__Group_5_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__Perspective__Group_5_0__1__Impl();
@@ -17279,23 +17279,23 @@
 
 
     // $ANTLR start "rule__Perspective__Group_5_0__1__Impl"
-    // InternalPerspectiveDsl.g:4754:1: rule__Perspective__Group_5_0__1__Impl : ( ( rule__Perspective__IconURIAssignment_5_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:4756:1: rule__Perspective__Group_5_0__1__Impl : ( ( rule__Perspective__IconURIAssignment_5_0_1 ) ) ;
     public final void rule__Perspective__Group_5_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4758:1: ( ( ( rule__Perspective__IconURIAssignment_5_0_1 ) ) )
-            // InternalPerspectiveDsl.g:4759:1: ( ( rule__Perspective__IconURIAssignment_5_0_1 ) )
+            // InternalPerspectiveDsl.g:4760:1: ( ( ( rule__Perspective__IconURIAssignment_5_0_1 ) ) )
+            // InternalPerspectiveDsl.g:4761:1: ( ( rule__Perspective__IconURIAssignment_5_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:4759:1: ( ( rule__Perspective__IconURIAssignment_5_0_1 ) )
-            // InternalPerspectiveDsl.g:4760:2: ( rule__Perspective__IconURIAssignment_5_0_1 )
+            // InternalPerspectiveDsl.g:4761:1: ( ( rule__Perspective__IconURIAssignment_5_0_1 ) )
+            // InternalPerspectiveDsl.g:4762:2: ( rule__Perspective__IconURIAssignment_5_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getIconURIAssignment_5_0_1()); 
             }
-            // InternalPerspectiveDsl.g:4761:2: ( rule__Perspective__IconURIAssignment_5_0_1 )
-            // InternalPerspectiveDsl.g:4761:3: rule__Perspective__IconURIAssignment_5_0_1
+            // InternalPerspectiveDsl.g:4763:2: ( rule__Perspective__IconURIAssignment_5_0_1 )
+            // InternalPerspectiveDsl.g:4763:3: rule__Perspective__IconURIAssignment_5_0_1
             {
             pushFollow(FOLLOW_2);
             rule__Perspective__IconURIAssignment_5_0_1();
@@ -17330,14 +17330,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group_5_1__0"
-    // InternalPerspectiveDsl.g:4770:1: rule__Perspective__Group_5_1__0 : rule__Perspective__Group_5_1__0__Impl rule__Perspective__Group_5_1__1 ;
+    // InternalPerspectiveDsl.g:4772:1: rule__Perspective__Group_5_1__0 : rule__Perspective__Group_5_1__0__Impl rule__Perspective__Group_5_1__1 ;
     public final void rule__Perspective__Group_5_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4774:1: ( rule__Perspective__Group_5_1__0__Impl rule__Perspective__Group_5_1__1 )
-            // InternalPerspectiveDsl.g:4775:2: rule__Perspective__Group_5_1__0__Impl rule__Perspective__Group_5_1__1
+            // InternalPerspectiveDsl.g:4776:1: ( rule__Perspective__Group_5_1__0__Impl rule__Perspective__Group_5_1__1 )
+            // InternalPerspectiveDsl.g:4777:2: rule__Perspective__Group_5_1__0__Impl rule__Perspective__Group_5_1__1
             {
             pushFollow(FOLLOW_15);
             rule__Perspective__Group_5_1__0__Impl();
@@ -17368,17 +17368,17 @@
 
 
     // $ANTLR start "rule__Perspective__Group_5_1__0__Impl"
-    // InternalPerspectiveDsl.g:4782:1: rule__Perspective__Group_5_1__0__Impl : ( 'accessibility' ) ;
+    // InternalPerspectiveDsl.g:4784:1: rule__Perspective__Group_5_1__0__Impl : ( 'accessibility' ) ;
     public final void rule__Perspective__Group_5_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4786:1: ( ( 'accessibility' ) )
-            // InternalPerspectiveDsl.g:4787:1: ( 'accessibility' )
+            // InternalPerspectiveDsl.g:4788:1: ( ( 'accessibility' ) )
+            // InternalPerspectiveDsl.g:4789:1: ( 'accessibility' )
             {
-            // InternalPerspectiveDsl.g:4787:1: ( 'accessibility' )
-            // InternalPerspectiveDsl.g:4788:2: 'accessibility'
+            // InternalPerspectiveDsl.g:4789:1: ( 'accessibility' )
+            // InternalPerspectiveDsl.g:4790:2: 'accessibility'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getAccessibilityKeyword_5_1_0()); 
@@ -17409,14 +17409,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group_5_1__1"
-    // InternalPerspectiveDsl.g:4797:1: rule__Perspective__Group_5_1__1 : rule__Perspective__Group_5_1__1__Impl ;
+    // InternalPerspectiveDsl.g:4799:1: rule__Perspective__Group_5_1__1 : rule__Perspective__Group_5_1__1__Impl ;
     public final void rule__Perspective__Group_5_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4801:1: ( rule__Perspective__Group_5_1__1__Impl )
-            // InternalPerspectiveDsl.g:4802:2: rule__Perspective__Group_5_1__1__Impl
+            // InternalPerspectiveDsl.g:4803:1: ( rule__Perspective__Group_5_1__1__Impl )
+            // InternalPerspectiveDsl.g:4804:2: rule__Perspective__Group_5_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__Perspective__Group_5_1__1__Impl();
@@ -17442,23 +17442,23 @@
 
 
     // $ANTLR start "rule__Perspective__Group_5_1__1__Impl"
-    // InternalPerspectiveDsl.g:4808:1: rule__Perspective__Group_5_1__1__Impl : ( ( rule__Perspective__AccessibilityPhraseAssignment_5_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:4810:1: rule__Perspective__Group_5_1__1__Impl : ( ( rule__Perspective__AccessibilityPhraseAssignment_5_1_1 ) ) ;
     public final void rule__Perspective__Group_5_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4812:1: ( ( ( rule__Perspective__AccessibilityPhraseAssignment_5_1_1 ) ) )
-            // InternalPerspectiveDsl.g:4813:1: ( ( rule__Perspective__AccessibilityPhraseAssignment_5_1_1 ) )
+            // InternalPerspectiveDsl.g:4814:1: ( ( ( rule__Perspective__AccessibilityPhraseAssignment_5_1_1 ) ) )
+            // InternalPerspectiveDsl.g:4815:1: ( ( rule__Perspective__AccessibilityPhraseAssignment_5_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:4813:1: ( ( rule__Perspective__AccessibilityPhraseAssignment_5_1_1 ) )
-            // InternalPerspectiveDsl.g:4814:2: ( rule__Perspective__AccessibilityPhraseAssignment_5_1_1 )
+            // InternalPerspectiveDsl.g:4815:1: ( ( rule__Perspective__AccessibilityPhraseAssignment_5_1_1 ) )
+            // InternalPerspectiveDsl.g:4816:2: ( rule__Perspective__AccessibilityPhraseAssignment_5_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getAccessibilityPhraseAssignment_5_1_1()); 
             }
-            // InternalPerspectiveDsl.g:4815:2: ( rule__Perspective__AccessibilityPhraseAssignment_5_1_1 )
-            // InternalPerspectiveDsl.g:4815:3: rule__Perspective__AccessibilityPhraseAssignment_5_1_1
+            // InternalPerspectiveDsl.g:4817:2: ( rule__Perspective__AccessibilityPhraseAssignment_5_1_1 )
+            // InternalPerspectiveDsl.g:4817:3: rule__Perspective__AccessibilityPhraseAssignment_5_1_1
             {
             pushFollow(FOLLOW_2);
             rule__Perspective__AccessibilityPhraseAssignment_5_1_1();
@@ -17493,14 +17493,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group_5_2__0"
-    // InternalPerspectiveDsl.g:4824:1: rule__Perspective__Group_5_2__0 : rule__Perspective__Group_5_2__0__Impl rule__Perspective__Group_5_2__1 ;
+    // InternalPerspectiveDsl.g:4826:1: rule__Perspective__Group_5_2__0 : rule__Perspective__Group_5_2__0__Impl rule__Perspective__Group_5_2__1 ;
     public final void rule__Perspective__Group_5_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4828:1: ( rule__Perspective__Group_5_2__0__Impl rule__Perspective__Group_5_2__1 )
-            // InternalPerspectiveDsl.g:4829:2: rule__Perspective__Group_5_2__0__Impl rule__Perspective__Group_5_2__1
+            // InternalPerspectiveDsl.g:4830:1: ( rule__Perspective__Group_5_2__0__Impl rule__Perspective__Group_5_2__1 )
+            // InternalPerspectiveDsl.g:4831:2: rule__Perspective__Group_5_2__0__Impl rule__Perspective__Group_5_2__1
             {
             pushFollow(FOLLOW_7);
             rule__Perspective__Group_5_2__0__Impl();
@@ -17531,17 +17531,17 @@
 
 
     // $ANTLR start "rule__Perspective__Group_5_2__0__Impl"
-    // InternalPerspectiveDsl.g:4836:1: rule__Perspective__Group_5_2__0__Impl : ( 'toolbar' ) ;
+    // InternalPerspectiveDsl.g:4838:1: rule__Perspective__Group_5_2__0__Impl : ( 'toolbar' ) ;
     public final void rule__Perspective__Group_5_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4840:1: ( ( 'toolbar' ) )
-            // InternalPerspectiveDsl.g:4841:1: ( 'toolbar' )
+            // InternalPerspectiveDsl.g:4842:1: ( ( 'toolbar' ) )
+            // InternalPerspectiveDsl.g:4843:1: ( 'toolbar' )
             {
-            // InternalPerspectiveDsl.g:4841:1: ( 'toolbar' )
-            // InternalPerspectiveDsl.g:4842:2: 'toolbar'
+            // InternalPerspectiveDsl.g:4843:1: ( 'toolbar' )
+            // InternalPerspectiveDsl.g:4844:2: 'toolbar'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getToolbarKeyword_5_2_0()); 
@@ -17572,14 +17572,14 @@
 
 
     // $ANTLR start "rule__Perspective__Group_5_2__1"
-    // InternalPerspectiveDsl.g:4851:1: rule__Perspective__Group_5_2__1 : rule__Perspective__Group_5_2__1__Impl ;
+    // InternalPerspectiveDsl.g:4853:1: rule__Perspective__Group_5_2__1 : rule__Perspective__Group_5_2__1__Impl ;
     public final void rule__Perspective__Group_5_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4855:1: ( rule__Perspective__Group_5_2__1__Impl )
-            // InternalPerspectiveDsl.g:4856:2: rule__Perspective__Group_5_2__1__Impl
+            // InternalPerspectiveDsl.g:4857:1: ( rule__Perspective__Group_5_2__1__Impl )
+            // InternalPerspectiveDsl.g:4858:2: rule__Perspective__Group_5_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__Perspective__Group_5_2__1__Impl();
@@ -17605,23 +17605,23 @@
 
 
     // $ANTLR start "rule__Perspective__Group_5_2__1__Impl"
-    // InternalPerspectiveDsl.g:4862:1: rule__Perspective__Group_5_2__1__Impl : ( ( rule__Perspective__ToolbarAssignment_5_2_1 ) ) ;
+    // InternalPerspectiveDsl.g:4864:1: rule__Perspective__Group_5_2__1__Impl : ( ( rule__Perspective__ToolbarAssignment_5_2_1 ) ) ;
     public final void rule__Perspective__Group_5_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4866:1: ( ( ( rule__Perspective__ToolbarAssignment_5_2_1 ) ) )
-            // InternalPerspectiveDsl.g:4867:1: ( ( rule__Perspective__ToolbarAssignment_5_2_1 ) )
+            // InternalPerspectiveDsl.g:4868:1: ( ( ( rule__Perspective__ToolbarAssignment_5_2_1 ) ) )
+            // InternalPerspectiveDsl.g:4869:1: ( ( rule__Perspective__ToolbarAssignment_5_2_1 ) )
             {
-            // InternalPerspectiveDsl.g:4867:1: ( ( rule__Perspective__ToolbarAssignment_5_2_1 ) )
-            // InternalPerspectiveDsl.g:4868:2: ( rule__Perspective__ToolbarAssignment_5_2_1 )
+            // InternalPerspectiveDsl.g:4869:1: ( ( rule__Perspective__ToolbarAssignment_5_2_1 ) )
+            // InternalPerspectiveDsl.g:4870:2: ( rule__Perspective__ToolbarAssignment_5_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getToolbarAssignment_5_2_1()); 
             }
-            // InternalPerspectiveDsl.g:4869:2: ( rule__Perspective__ToolbarAssignment_5_2_1 )
-            // InternalPerspectiveDsl.g:4869:3: rule__Perspective__ToolbarAssignment_5_2_1
+            // InternalPerspectiveDsl.g:4871:2: ( rule__Perspective__ToolbarAssignment_5_2_1 )
+            // InternalPerspectiveDsl.g:4871:3: rule__Perspective__ToolbarAssignment_5_2_1
             {
             pushFollow(FOLLOW_2);
             rule__Perspective__ToolbarAssignment_5_2_1();
@@ -17656,14 +17656,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group__0"
-    // InternalPerspectiveDsl.g:4878:1: rule__PerspectiveSashContainer__Group__0 : rule__PerspectiveSashContainer__Group__0__Impl rule__PerspectiveSashContainer__Group__1 ;
+    // InternalPerspectiveDsl.g:4880:1: rule__PerspectiveSashContainer__Group__0 : rule__PerspectiveSashContainer__Group__0__Impl rule__PerspectiveSashContainer__Group__1 ;
     public final void rule__PerspectiveSashContainer__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4882:1: ( rule__PerspectiveSashContainer__Group__0__Impl rule__PerspectiveSashContainer__Group__1 )
-            // InternalPerspectiveDsl.g:4883:2: rule__PerspectiveSashContainer__Group__0__Impl rule__PerspectiveSashContainer__Group__1
+            // InternalPerspectiveDsl.g:4884:1: ( rule__PerspectiveSashContainer__Group__0__Impl rule__PerspectiveSashContainer__Group__1 )
+            // InternalPerspectiveDsl.g:4885:2: rule__PerspectiveSashContainer__Group__0__Impl rule__PerspectiveSashContainer__Group__1
             {
             pushFollow(FOLLOW_17);
             rule__PerspectiveSashContainer__Group__0__Impl();
@@ -17694,23 +17694,23 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group__0__Impl"
-    // InternalPerspectiveDsl.g:4890:1: rule__PerspectiveSashContainer__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:4892:1: rule__PerspectiveSashContainer__Group__0__Impl : ( () ) ;
     public final void rule__PerspectiveSashContainer__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4894:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:4895:1: ( () )
+            // InternalPerspectiveDsl.g:4896:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:4897:1: ( () )
             {
-            // InternalPerspectiveDsl.g:4895:1: ( () )
-            // InternalPerspectiveDsl.g:4896:2: ()
+            // InternalPerspectiveDsl.g:4897:1: ( () )
+            // InternalPerspectiveDsl.g:4898:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getPerspectiveSashContainerAction_0()); 
             }
-            // InternalPerspectiveDsl.g:4897:2: ()
-            // InternalPerspectiveDsl.g:4897:3: 
+            // InternalPerspectiveDsl.g:4899:2: ()
+            // InternalPerspectiveDsl.g:4899:3: 
             {
             }
 
@@ -17735,14 +17735,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group__1"
-    // InternalPerspectiveDsl.g:4905:1: rule__PerspectiveSashContainer__Group__1 : rule__PerspectiveSashContainer__Group__1__Impl rule__PerspectiveSashContainer__Group__2 ;
+    // InternalPerspectiveDsl.g:4907:1: rule__PerspectiveSashContainer__Group__1 : rule__PerspectiveSashContainer__Group__1__Impl rule__PerspectiveSashContainer__Group__2 ;
     public final void rule__PerspectiveSashContainer__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4909:1: ( rule__PerspectiveSashContainer__Group__1__Impl rule__PerspectiveSashContainer__Group__2 )
-            // InternalPerspectiveDsl.g:4910:2: rule__PerspectiveSashContainer__Group__1__Impl rule__PerspectiveSashContainer__Group__2
+            // InternalPerspectiveDsl.g:4911:1: ( rule__PerspectiveSashContainer__Group__1__Impl rule__PerspectiveSashContainer__Group__2 )
+            // InternalPerspectiveDsl.g:4912:2: rule__PerspectiveSashContainer__Group__1__Impl rule__PerspectiveSashContainer__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__PerspectiveSashContainer__Group__1__Impl();
@@ -17773,17 +17773,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group__1__Impl"
-    // InternalPerspectiveDsl.g:4917:1: rule__PerspectiveSashContainer__Group__1__Impl : ( 'sashContainer' ) ;
+    // InternalPerspectiveDsl.g:4919:1: rule__PerspectiveSashContainer__Group__1__Impl : ( 'sashContainer' ) ;
     public final void rule__PerspectiveSashContainer__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4921:1: ( ( 'sashContainer' ) )
-            // InternalPerspectiveDsl.g:4922:1: ( 'sashContainer' )
+            // InternalPerspectiveDsl.g:4923:1: ( ( 'sashContainer' ) )
+            // InternalPerspectiveDsl.g:4924:1: ( 'sashContainer' )
             {
-            // InternalPerspectiveDsl.g:4922:1: ( 'sashContainer' )
-            // InternalPerspectiveDsl.g:4923:2: 'sashContainer'
+            // InternalPerspectiveDsl.g:4924:1: ( 'sashContainer' )
+            // InternalPerspectiveDsl.g:4925:2: 'sashContainer'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getSashContainerKeyword_1()); 
@@ -17814,14 +17814,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group__2"
-    // InternalPerspectiveDsl.g:4932:1: rule__PerspectiveSashContainer__Group__2 : rule__PerspectiveSashContainer__Group__2__Impl rule__PerspectiveSashContainer__Group__3 ;
+    // InternalPerspectiveDsl.g:4934:1: rule__PerspectiveSashContainer__Group__2 : rule__PerspectiveSashContainer__Group__2__Impl rule__PerspectiveSashContainer__Group__3 ;
     public final void rule__PerspectiveSashContainer__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4936:1: ( rule__PerspectiveSashContainer__Group__2__Impl rule__PerspectiveSashContainer__Group__3 )
-            // InternalPerspectiveDsl.g:4937:2: rule__PerspectiveSashContainer__Group__2__Impl rule__PerspectiveSashContainer__Group__3
+            // InternalPerspectiveDsl.g:4938:1: ( rule__PerspectiveSashContainer__Group__2__Impl rule__PerspectiveSashContainer__Group__3 )
+            // InternalPerspectiveDsl.g:4939:2: rule__PerspectiveSashContainer__Group__2__Impl rule__PerspectiveSashContainer__Group__3
             {
             pushFollow(FOLLOW_18);
             rule__PerspectiveSashContainer__Group__2__Impl();
@@ -17852,23 +17852,23 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group__2__Impl"
-    // InternalPerspectiveDsl.g:4944:1: rule__PerspectiveSashContainer__Group__2__Impl : ( ( rule__PerspectiveSashContainer__ElementIdAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:4946:1: rule__PerspectiveSashContainer__Group__2__Impl : ( ( rule__PerspectiveSashContainer__ElementIdAssignment_2 ) ) ;
     public final void rule__PerspectiveSashContainer__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4948:1: ( ( ( rule__PerspectiveSashContainer__ElementIdAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:4949:1: ( ( rule__PerspectiveSashContainer__ElementIdAssignment_2 ) )
+            // InternalPerspectiveDsl.g:4950:1: ( ( ( rule__PerspectiveSashContainer__ElementIdAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:4951:1: ( ( rule__PerspectiveSashContainer__ElementIdAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:4949:1: ( ( rule__PerspectiveSashContainer__ElementIdAssignment_2 ) )
-            // InternalPerspectiveDsl.g:4950:2: ( rule__PerspectiveSashContainer__ElementIdAssignment_2 )
+            // InternalPerspectiveDsl.g:4951:1: ( ( rule__PerspectiveSashContainer__ElementIdAssignment_2 ) )
+            // InternalPerspectiveDsl.g:4952:2: ( rule__PerspectiveSashContainer__ElementIdAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getElementIdAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:4951:2: ( rule__PerspectiveSashContainer__ElementIdAssignment_2 )
-            // InternalPerspectiveDsl.g:4951:3: rule__PerspectiveSashContainer__ElementIdAssignment_2
+            // InternalPerspectiveDsl.g:4953:2: ( rule__PerspectiveSashContainer__ElementIdAssignment_2 )
+            // InternalPerspectiveDsl.g:4953:3: rule__PerspectiveSashContainer__ElementIdAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSashContainer__ElementIdAssignment_2();
@@ -17903,14 +17903,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group__3"
-    // InternalPerspectiveDsl.g:4959:1: rule__PerspectiveSashContainer__Group__3 : rule__PerspectiveSashContainer__Group__3__Impl rule__PerspectiveSashContainer__Group__4 ;
+    // InternalPerspectiveDsl.g:4961:1: rule__PerspectiveSashContainer__Group__3 : rule__PerspectiveSashContainer__Group__3__Impl rule__PerspectiveSashContainer__Group__4 ;
     public final void rule__PerspectiveSashContainer__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4963:1: ( rule__PerspectiveSashContainer__Group__3__Impl rule__PerspectiveSashContainer__Group__4 )
-            // InternalPerspectiveDsl.g:4964:2: rule__PerspectiveSashContainer__Group__3__Impl rule__PerspectiveSashContainer__Group__4
+            // InternalPerspectiveDsl.g:4965:1: ( rule__PerspectiveSashContainer__Group__3__Impl rule__PerspectiveSashContainer__Group__4 )
+            // InternalPerspectiveDsl.g:4966:2: rule__PerspectiveSashContainer__Group__3__Impl rule__PerspectiveSashContainer__Group__4
             {
             pushFollow(FOLLOW_8);
             rule__PerspectiveSashContainer__Group__3__Impl();
@@ -17941,23 +17941,23 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group__3__Impl"
-    // InternalPerspectiveDsl.g:4971:1: rule__PerspectiveSashContainer__Group__3__Impl : ( ( rule__PerspectiveSashContainer__UnorderedGroup_3 ) ) ;
+    // InternalPerspectiveDsl.g:4973:1: rule__PerspectiveSashContainer__Group__3__Impl : ( ( rule__PerspectiveSashContainer__UnorderedGroup_3 ) ) ;
     public final void rule__PerspectiveSashContainer__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4975:1: ( ( ( rule__PerspectiveSashContainer__UnorderedGroup_3 ) ) )
-            // InternalPerspectiveDsl.g:4976:1: ( ( rule__PerspectiveSashContainer__UnorderedGroup_3 ) )
+            // InternalPerspectiveDsl.g:4977:1: ( ( ( rule__PerspectiveSashContainer__UnorderedGroup_3 ) ) )
+            // InternalPerspectiveDsl.g:4978:1: ( ( rule__PerspectiveSashContainer__UnorderedGroup_3 ) )
             {
-            // InternalPerspectiveDsl.g:4976:1: ( ( rule__PerspectiveSashContainer__UnorderedGroup_3 ) )
-            // InternalPerspectiveDsl.g:4977:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3 )
+            // InternalPerspectiveDsl.g:4978:1: ( ( rule__PerspectiveSashContainer__UnorderedGroup_3 ) )
+            // InternalPerspectiveDsl.g:4979:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3()); 
             }
-            // InternalPerspectiveDsl.g:4978:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3 )
-            // InternalPerspectiveDsl.g:4978:3: rule__PerspectiveSashContainer__UnorderedGroup_3
+            // InternalPerspectiveDsl.g:4980:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3 )
+            // InternalPerspectiveDsl.g:4980:3: rule__PerspectiveSashContainer__UnorderedGroup_3
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSashContainer__UnorderedGroup_3();
@@ -17992,14 +17992,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group__4"
-    // InternalPerspectiveDsl.g:4986:1: rule__PerspectiveSashContainer__Group__4 : rule__PerspectiveSashContainer__Group__4__Impl rule__PerspectiveSashContainer__Group__5 ;
+    // InternalPerspectiveDsl.g:4988:1: rule__PerspectiveSashContainer__Group__4 : rule__PerspectiveSashContainer__Group__4__Impl rule__PerspectiveSashContainer__Group__5 ;
     public final void rule__PerspectiveSashContainer__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:4990:1: ( rule__PerspectiveSashContainer__Group__4__Impl rule__PerspectiveSashContainer__Group__5 )
-            // InternalPerspectiveDsl.g:4991:2: rule__PerspectiveSashContainer__Group__4__Impl rule__PerspectiveSashContainer__Group__5
+            // InternalPerspectiveDsl.g:4992:1: ( rule__PerspectiveSashContainer__Group__4__Impl rule__PerspectiveSashContainer__Group__5 )
+            // InternalPerspectiveDsl.g:4993:2: rule__PerspectiveSashContainer__Group__4__Impl rule__PerspectiveSashContainer__Group__5
             {
             pushFollow(FOLLOW_13);
             rule__PerspectiveSashContainer__Group__4__Impl();
@@ -18030,17 +18030,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group__4__Impl"
-    // InternalPerspectiveDsl.g:4998:1: rule__PerspectiveSashContainer__Group__4__Impl : ( '{' ) ;
+    // InternalPerspectiveDsl.g:5000:1: rule__PerspectiveSashContainer__Group__4__Impl : ( '{' ) ;
     public final void rule__PerspectiveSashContainer__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5002:1: ( ( '{' ) )
-            // InternalPerspectiveDsl.g:5003:1: ( '{' )
+            // InternalPerspectiveDsl.g:5004:1: ( ( '{' ) )
+            // InternalPerspectiveDsl.g:5005:1: ( '{' )
             {
-            // InternalPerspectiveDsl.g:5003:1: ( '{' )
-            // InternalPerspectiveDsl.g:5004:2: '{'
+            // InternalPerspectiveDsl.g:5005:1: ( '{' )
+            // InternalPerspectiveDsl.g:5006:2: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getLeftCurlyBracketKeyword_4()); 
@@ -18071,14 +18071,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group__5"
-    // InternalPerspectiveDsl.g:5013:1: rule__PerspectiveSashContainer__Group__5 : rule__PerspectiveSashContainer__Group__5__Impl rule__PerspectiveSashContainer__Group__6 ;
+    // InternalPerspectiveDsl.g:5015:1: rule__PerspectiveSashContainer__Group__5 : rule__PerspectiveSashContainer__Group__5__Impl rule__PerspectiveSashContainer__Group__6 ;
     public final void rule__PerspectiveSashContainer__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5017:1: ( rule__PerspectiveSashContainer__Group__5__Impl rule__PerspectiveSashContainer__Group__6 )
-            // InternalPerspectiveDsl.g:5018:2: rule__PerspectiveSashContainer__Group__5__Impl rule__PerspectiveSashContainer__Group__6
+            // InternalPerspectiveDsl.g:5019:1: ( rule__PerspectiveSashContainer__Group__5__Impl rule__PerspectiveSashContainer__Group__6 )
+            // InternalPerspectiveDsl.g:5020:2: rule__PerspectiveSashContainer__Group__5__Impl rule__PerspectiveSashContainer__Group__6
             {
             pushFollow(FOLLOW_13);
             rule__PerspectiveSashContainer__Group__5__Impl();
@@ -18109,22 +18109,22 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group__5__Impl"
-    // InternalPerspectiveDsl.g:5025:1: rule__PerspectiveSashContainer__Group__5__Impl : ( ( rule__PerspectiveSashContainer__ElementsAssignment_5 )* ) ;
+    // InternalPerspectiveDsl.g:5027:1: rule__PerspectiveSashContainer__Group__5__Impl : ( ( rule__PerspectiveSashContainer__ElementsAssignment_5 )* ) ;
     public final void rule__PerspectiveSashContainer__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5029:1: ( ( ( rule__PerspectiveSashContainer__ElementsAssignment_5 )* ) )
-            // InternalPerspectiveDsl.g:5030:1: ( ( rule__PerspectiveSashContainer__ElementsAssignment_5 )* )
+            // InternalPerspectiveDsl.g:5031:1: ( ( ( rule__PerspectiveSashContainer__ElementsAssignment_5 )* ) )
+            // InternalPerspectiveDsl.g:5032:1: ( ( rule__PerspectiveSashContainer__ElementsAssignment_5 )* )
             {
-            // InternalPerspectiveDsl.g:5030:1: ( ( rule__PerspectiveSashContainer__ElementsAssignment_5 )* )
-            // InternalPerspectiveDsl.g:5031:2: ( rule__PerspectiveSashContainer__ElementsAssignment_5 )*
+            // InternalPerspectiveDsl.g:5032:1: ( ( rule__PerspectiveSashContainer__ElementsAssignment_5 )* )
+            // InternalPerspectiveDsl.g:5033:2: ( rule__PerspectiveSashContainer__ElementsAssignment_5 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getElementsAssignment_5()); 
             }
-            // InternalPerspectiveDsl.g:5032:2: ( rule__PerspectiveSashContainer__ElementsAssignment_5 )*
+            // InternalPerspectiveDsl.g:5034:2: ( rule__PerspectiveSashContainer__ElementsAssignment_5 )*
             loop56:
             do {
                 int alt56=2;
@@ -18137,7 +18137,7 @@
 
                 switch (alt56) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:5032:3: rule__PerspectiveSashContainer__ElementsAssignment_5
+            	    // InternalPerspectiveDsl.g:5034:3: rule__PerspectiveSashContainer__ElementsAssignment_5
             	    {
             	    pushFollow(FOLLOW_14);
             	    rule__PerspectiveSashContainer__ElementsAssignment_5();
@@ -18178,14 +18178,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group__6"
-    // InternalPerspectiveDsl.g:5040:1: rule__PerspectiveSashContainer__Group__6 : rule__PerspectiveSashContainer__Group__6__Impl ;
+    // InternalPerspectiveDsl.g:5042:1: rule__PerspectiveSashContainer__Group__6 : rule__PerspectiveSashContainer__Group__6__Impl ;
     public final void rule__PerspectiveSashContainer__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5044:1: ( rule__PerspectiveSashContainer__Group__6__Impl )
-            // InternalPerspectiveDsl.g:5045:2: rule__PerspectiveSashContainer__Group__6__Impl
+            // InternalPerspectiveDsl.g:5046:1: ( rule__PerspectiveSashContainer__Group__6__Impl )
+            // InternalPerspectiveDsl.g:5047:2: rule__PerspectiveSashContainer__Group__6__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSashContainer__Group__6__Impl();
@@ -18211,17 +18211,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group__6__Impl"
-    // InternalPerspectiveDsl.g:5051:1: rule__PerspectiveSashContainer__Group__6__Impl : ( '}' ) ;
+    // InternalPerspectiveDsl.g:5053:1: rule__PerspectiveSashContainer__Group__6__Impl : ( '}' ) ;
     public final void rule__PerspectiveSashContainer__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5055:1: ( ( '}' ) )
-            // InternalPerspectiveDsl.g:5056:1: ( '}' )
+            // InternalPerspectiveDsl.g:5057:1: ( ( '}' ) )
+            // InternalPerspectiveDsl.g:5058:1: ( '}' )
             {
-            // InternalPerspectiveDsl.g:5056:1: ( '}' )
-            // InternalPerspectiveDsl.g:5057:2: '}'
+            // InternalPerspectiveDsl.g:5058:1: ( '}' )
+            // InternalPerspectiveDsl.g:5059:2: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getRightCurlyBracketKeyword_6()); 
@@ -18252,14 +18252,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group_3_0__0"
-    // InternalPerspectiveDsl.g:5067:1: rule__PerspectiveSashContainer__Group_3_0__0 : rule__PerspectiveSashContainer__Group_3_0__0__Impl rule__PerspectiveSashContainer__Group_3_0__1 ;
+    // InternalPerspectiveDsl.g:5069:1: rule__PerspectiveSashContainer__Group_3_0__0 : rule__PerspectiveSashContainer__Group_3_0__0__Impl rule__PerspectiveSashContainer__Group_3_0__1 ;
     public final void rule__PerspectiveSashContainer__Group_3_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5071:1: ( rule__PerspectiveSashContainer__Group_3_0__0__Impl rule__PerspectiveSashContainer__Group_3_0__1 )
-            // InternalPerspectiveDsl.g:5072:2: rule__PerspectiveSashContainer__Group_3_0__0__Impl rule__PerspectiveSashContainer__Group_3_0__1
+            // InternalPerspectiveDsl.g:5073:1: ( rule__PerspectiveSashContainer__Group_3_0__0__Impl rule__PerspectiveSashContainer__Group_3_0__1 )
+            // InternalPerspectiveDsl.g:5074:2: rule__PerspectiveSashContainer__Group_3_0__0__Impl rule__PerspectiveSashContainer__Group_3_0__1
             {
             pushFollow(FOLLOW_19);
             rule__PerspectiveSashContainer__Group_3_0__0__Impl();
@@ -18290,17 +18290,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group_3_0__0__Impl"
-    // InternalPerspectiveDsl.g:5079:1: rule__PerspectiveSashContainer__Group_3_0__0__Impl : ( 'orientation' ) ;
+    // InternalPerspectiveDsl.g:5081:1: rule__PerspectiveSashContainer__Group_3_0__0__Impl : ( 'orientation' ) ;
     public final void rule__PerspectiveSashContainer__Group_3_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5083:1: ( ( 'orientation' ) )
-            // InternalPerspectiveDsl.g:5084:1: ( 'orientation' )
+            // InternalPerspectiveDsl.g:5085:1: ( ( 'orientation' ) )
+            // InternalPerspectiveDsl.g:5086:1: ( 'orientation' )
             {
-            // InternalPerspectiveDsl.g:5084:1: ( 'orientation' )
-            // InternalPerspectiveDsl.g:5085:2: 'orientation'
+            // InternalPerspectiveDsl.g:5086:1: ( 'orientation' )
+            // InternalPerspectiveDsl.g:5087:2: 'orientation'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getOrientationKeyword_3_0_0()); 
@@ -18331,14 +18331,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group_3_0__1"
-    // InternalPerspectiveDsl.g:5094:1: rule__PerspectiveSashContainer__Group_3_0__1 : rule__PerspectiveSashContainer__Group_3_0__1__Impl ;
+    // InternalPerspectiveDsl.g:5096:1: rule__PerspectiveSashContainer__Group_3_0__1 : rule__PerspectiveSashContainer__Group_3_0__1__Impl ;
     public final void rule__PerspectiveSashContainer__Group_3_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5098:1: ( rule__PerspectiveSashContainer__Group_3_0__1__Impl )
-            // InternalPerspectiveDsl.g:5099:2: rule__PerspectiveSashContainer__Group_3_0__1__Impl
+            // InternalPerspectiveDsl.g:5100:1: ( rule__PerspectiveSashContainer__Group_3_0__1__Impl )
+            // InternalPerspectiveDsl.g:5101:2: rule__PerspectiveSashContainer__Group_3_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSashContainer__Group_3_0__1__Impl();
@@ -18364,23 +18364,23 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group_3_0__1__Impl"
-    // InternalPerspectiveDsl.g:5105:1: rule__PerspectiveSashContainer__Group_3_0__1__Impl : ( ( rule__PerspectiveSashContainer__OrientationAssignment_3_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:5107:1: rule__PerspectiveSashContainer__Group_3_0__1__Impl : ( ( rule__PerspectiveSashContainer__OrientationAssignment_3_0_1 ) ) ;
     public final void rule__PerspectiveSashContainer__Group_3_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5109:1: ( ( ( rule__PerspectiveSashContainer__OrientationAssignment_3_0_1 ) ) )
-            // InternalPerspectiveDsl.g:5110:1: ( ( rule__PerspectiveSashContainer__OrientationAssignment_3_0_1 ) )
+            // InternalPerspectiveDsl.g:5111:1: ( ( ( rule__PerspectiveSashContainer__OrientationAssignment_3_0_1 ) ) )
+            // InternalPerspectiveDsl.g:5112:1: ( ( rule__PerspectiveSashContainer__OrientationAssignment_3_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:5110:1: ( ( rule__PerspectiveSashContainer__OrientationAssignment_3_0_1 ) )
-            // InternalPerspectiveDsl.g:5111:2: ( rule__PerspectiveSashContainer__OrientationAssignment_3_0_1 )
+            // InternalPerspectiveDsl.g:5112:1: ( ( rule__PerspectiveSashContainer__OrientationAssignment_3_0_1 ) )
+            // InternalPerspectiveDsl.g:5113:2: ( rule__PerspectiveSashContainer__OrientationAssignment_3_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getOrientationAssignment_3_0_1()); 
             }
-            // InternalPerspectiveDsl.g:5112:2: ( rule__PerspectiveSashContainer__OrientationAssignment_3_0_1 )
-            // InternalPerspectiveDsl.g:5112:3: rule__PerspectiveSashContainer__OrientationAssignment_3_0_1
+            // InternalPerspectiveDsl.g:5114:2: ( rule__PerspectiveSashContainer__OrientationAssignment_3_0_1 )
+            // InternalPerspectiveDsl.g:5114:3: rule__PerspectiveSashContainer__OrientationAssignment_3_0_1
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSashContainer__OrientationAssignment_3_0_1();
@@ -18415,14 +18415,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group_3_1__0"
-    // InternalPerspectiveDsl.g:5121:1: rule__PerspectiveSashContainer__Group_3_1__0 : rule__PerspectiveSashContainer__Group_3_1__0__Impl rule__PerspectiveSashContainer__Group_3_1__1 ;
+    // InternalPerspectiveDsl.g:5123:1: rule__PerspectiveSashContainer__Group_3_1__0 : rule__PerspectiveSashContainer__Group_3_1__0__Impl rule__PerspectiveSashContainer__Group_3_1__1 ;
     public final void rule__PerspectiveSashContainer__Group_3_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5125:1: ( rule__PerspectiveSashContainer__Group_3_1__0__Impl rule__PerspectiveSashContainer__Group_3_1__1 )
-            // InternalPerspectiveDsl.g:5126:2: rule__PerspectiveSashContainer__Group_3_1__0__Impl rule__PerspectiveSashContainer__Group_3_1__1
+            // InternalPerspectiveDsl.g:5127:1: ( rule__PerspectiveSashContainer__Group_3_1__0__Impl rule__PerspectiveSashContainer__Group_3_1__1 )
+            // InternalPerspectiveDsl.g:5128:2: rule__PerspectiveSashContainer__Group_3_1__0__Impl rule__PerspectiveSashContainer__Group_3_1__1
             {
             pushFollow(FOLLOW_7);
             rule__PerspectiveSashContainer__Group_3_1__0__Impl();
@@ -18453,17 +18453,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group_3_1__0__Impl"
-    // InternalPerspectiveDsl.g:5133:1: rule__PerspectiveSashContainer__Group_3_1__0__Impl : ( 'selectedElement' ) ;
+    // InternalPerspectiveDsl.g:5135:1: rule__PerspectiveSashContainer__Group_3_1__0__Impl : ( 'selectedElement' ) ;
     public final void rule__PerspectiveSashContainer__Group_3_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5137:1: ( ( 'selectedElement' ) )
-            // InternalPerspectiveDsl.g:5138:1: ( 'selectedElement' )
+            // InternalPerspectiveDsl.g:5139:1: ( ( 'selectedElement' ) )
+            // InternalPerspectiveDsl.g:5140:1: ( 'selectedElement' )
             {
-            // InternalPerspectiveDsl.g:5138:1: ( 'selectedElement' )
-            // InternalPerspectiveDsl.g:5139:2: 'selectedElement'
+            // InternalPerspectiveDsl.g:5140:1: ( 'selectedElement' )
+            // InternalPerspectiveDsl.g:5141:2: 'selectedElement'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getSelectedElementKeyword_3_1_0()); 
@@ -18494,14 +18494,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group_3_1__1"
-    // InternalPerspectiveDsl.g:5148:1: rule__PerspectiveSashContainer__Group_3_1__1 : rule__PerspectiveSashContainer__Group_3_1__1__Impl ;
+    // InternalPerspectiveDsl.g:5150:1: rule__PerspectiveSashContainer__Group_3_1__1 : rule__PerspectiveSashContainer__Group_3_1__1__Impl ;
     public final void rule__PerspectiveSashContainer__Group_3_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5152:1: ( rule__PerspectiveSashContainer__Group_3_1__1__Impl )
-            // InternalPerspectiveDsl.g:5153:2: rule__PerspectiveSashContainer__Group_3_1__1__Impl
+            // InternalPerspectiveDsl.g:5154:1: ( rule__PerspectiveSashContainer__Group_3_1__1__Impl )
+            // InternalPerspectiveDsl.g:5155:2: rule__PerspectiveSashContainer__Group_3_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSashContainer__Group_3_1__1__Impl();
@@ -18527,23 +18527,23 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group_3_1__1__Impl"
-    // InternalPerspectiveDsl.g:5159:1: rule__PerspectiveSashContainer__Group_3_1__1__Impl : ( ( rule__PerspectiveSashContainer__SelectedElementAssignment_3_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:5161:1: rule__PerspectiveSashContainer__Group_3_1__1__Impl : ( ( rule__PerspectiveSashContainer__SelectedElementAssignment_3_1_1 ) ) ;
     public final void rule__PerspectiveSashContainer__Group_3_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5163:1: ( ( ( rule__PerspectiveSashContainer__SelectedElementAssignment_3_1_1 ) ) )
-            // InternalPerspectiveDsl.g:5164:1: ( ( rule__PerspectiveSashContainer__SelectedElementAssignment_3_1_1 ) )
+            // InternalPerspectiveDsl.g:5165:1: ( ( ( rule__PerspectiveSashContainer__SelectedElementAssignment_3_1_1 ) ) )
+            // InternalPerspectiveDsl.g:5166:1: ( ( rule__PerspectiveSashContainer__SelectedElementAssignment_3_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:5164:1: ( ( rule__PerspectiveSashContainer__SelectedElementAssignment_3_1_1 ) )
-            // InternalPerspectiveDsl.g:5165:2: ( rule__PerspectiveSashContainer__SelectedElementAssignment_3_1_1 )
+            // InternalPerspectiveDsl.g:5166:1: ( ( rule__PerspectiveSashContainer__SelectedElementAssignment_3_1_1 ) )
+            // InternalPerspectiveDsl.g:5167:2: ( rule__PerspectiveSashContainer__SelectedElementAssignment_3_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getSelectedElementAssignment_3_1_1()); 
             }
-            // InternalPerspectiveDsl.g:5166:2: ( rule__PerspectiveSashContainer__SelectedElementAssignment_3_1_1 )
-            // InternalPerspectiveDsl.g:5166:3: rule__PerspectiveSashContainer__SelectedElementAssignment_3_1_1
+            // InternalPerspectiveDsl.g:5168:2: ( rule__PerspectiveSashContainer__SelectedElementAssignment_3_1_1 )
+            // InternalPerspectiveDsl.g:5168:3: rule__PerspectiveSashContainer__SelectedElementAssignment_3_1_1
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSashContainer__SelectedElementAssignment_3_1_1();
@@ -18578,14 +18578,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group_3_2__0"
-    // InternalPerspectiveDsl.g:5175:1: rule__PerspectiveSashContainer__Group_3_2__0 : rule__PerspectiveSashContainer__Group_3_2__0__Impl rule__PerspectiveSashContainer__Group_3_2__1 ;
+    // InternalPerspectiveDsl.g:5177:1: rule__PerspectiveSashContainer__Group_3_2__0 : rule__PerspectiveSashContainer__Group_3_2__0__Impl rule__PerspectiveSashContainer__Group_3_2__1 ;
     public final void rule__PerspectiveSashContainer__Group_3_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5179:1: ( rule__PerspectiveSashContainer__Group_3_2__0__Impl rule__PerspectiveSashContainer__Group_3_2__1 )
-            // InternalPerspectiveDsl.g:5180:2: rule__PerspectiveSashContainer__Group_3_2__0__Impl rule__PerspectiveSashContainer__Group_3_2__1
+            // InternalPerspectiveDsl.g:5181:1: ( rule__PerspectiveSashContainer__Group_3_2__0__Impl rule__PerspectiveSashContainer__Group_3_2__1 )
+            // InternalPerspectiveDsl.g:5182:2: rule__PerspectiveSashContainer__Group_3_2__0__Impl rule__PerspectiveSashContainer__Group_3_2__1
             {
             pushFollow(FOLLOW_15);
             rule__PerspectiveSashContainer__Group_3_2__0__Impl();
@@ -18616,17 +18616,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group_3_2__0__Impl"
-    // InternalPerspectiveDsl.g:5187:1: rule__PerspectiveSashContainer__Group_3_2__0__Impl : ( 'spaceVolume' ) ;
+    // InternalPerspectiveDsl.g:5189:1: rule__PerspectiveSashContainer__Group_3_2__0__Impl : ( 'spaceVolume' ) ;
     public final void rule__PerspectiveSashContainer__Group_3_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5191:1: ( ( 'spaceVolume' ) )
-            // InternalPerspectiveDsl.g:5192:1: ( 'spaceVolume' )
+            // InternalPerspectiveDsl.g:5193:1: ( ( 'spaceVolume' ) )
+            // InternalPerspectiveDsl.g:5194:1: ( 'spaceVolume' )
             {
-            // InternalPerspectiveDsl.g:5192:1: ( 'spaceVolume' )
-            // InternalPerspectiveDsl.g:5193:2: 'spaceVolume'
+            // InternalPerspectiveDsl.g:5194:1: ( 'spaceVolume' )
+            // InternalPerspectiveDsl.g:5195:2: 'spaceVolume'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getSpaceVolumeKeyword_3_2_0()); 
@@ -18657,14 +18657,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group_3_2__1"
-    // InternalPerspectiveDsl.g:5202:1: rule__PerspectiveSashContainer__Group_3_2__1 : rule__PerspectiveSashContainer__Group_3_2__1__Impl ;
+    // InternalPerspectiveDsl.g:5204:1: rule__PerspectiveSashContainer__Group_3_2__1 : rule__PerspectiveSashContainer__Group_3_2__1__Impl ;
     public final void rule__PerspectiveSashContainer__Group_3_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5206:1: ( rule__PerspectiveSashContainer__Group_3_2__1__Impl )
-            // InternalPerspectiveDsl.g:5207:2: rule__PerspectiveSashContainer__Group_3_2__1__Impl
+            // InternalPerspectiveDsl.g:5208:1: ( rule__PerspectiveSashContainer__Group_3_2__1__Impl )
+            // InternalPerspectiveDsl.g:5209:2: rule__PerspectiveSashContainer__Group_3_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSashContainer__Group_3_2__1__Impl();
@@ -18690,23 +18690,23 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group_3_2__1__Impl"
-    // InternalPerspectiveDsl.g:5213:1: rule__PerspectiveSashContainer__Group_3_2__1__Impl : ( ( rule__PerspectiveSashContainer__ContainerDataAssignment_3_2_1 ) ) ;
+    // InternalPerspectiveDsl.g:5215:1: rule__PerspectiveSashContainer__Group_3_2__1__Impl : ( ( rule__PerspectiveSashContainer__ContainerDataAssignment_3_2_1 ) ) ;
     public final void rule__PerspectiveSashContainer__Group_3_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5217:1: ( ( ( rule__PerspectiveSashContainer__ContainerDataAssignment_3_2_1 ) ) )
-            // InternalPerspectiveDsl.g:5218:1: ( ( rule__PerspectiveSashContainer__ContainerDataAssignment_3_2_1 ) )
+            // InternalPerspectiveDsl.g:5219:1: ( ( ( rule__PerspectiveSashContainer__ContainerDataAssignment_3_2_1 ) ) )
+            // InternalPerspectiveDsl.g:5220:1: ( ( rule__PerspectiveSashContainer__ContainerDataAssignment_3_2_1 ) )
             {
-            // InternalPerspectiveDsl.g:5218:1: ( ( rule__PerspectiveSashContainer__ContainerDataAssignment_3_2_1 ) )
-            // InternalPerspectiveDsl.g:5219:2: ( rule__PerspectiveSashContainer__ContainerDataAssignment_3_2_1 )
+            // InternalPerspectiveDsl.g:5220:1: ( ( rule__PerspectiveSashContainer__ContainerDataAssignment_3_2_1 ) )
+            // InternalPerspectiveDsl.g:5221:2: ( rule__PerspectiveSashContainer__ContainerDataAssignment_3_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getContainerDataAssignment_3_2_1()); 
             }
-            // InternalPerspectiveDsl.g:5220:2: ( rule__PerspectiveSashContainer__ContainerDataAssignment_3_2_1 )
-            // InternalPerspectiveDsl.g:5220:3: rule__PerspectiveSashContainer__ContainerDataAssignment_3_2_1
+            // InternalPerspectiveDsl.g:5222:2: ( rule__PerspectiveSashContainer__ContainerDataAssignment_3_2_1 )
+            // InternalPerspectiveDsl.g:5222:3: rule__PerspectiveSashContainer__ContainerDataAssignment_3_2_1
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSashContainer__ContainerDataAssignment_3_2_1();
@@ -18741,14 +18741,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group_3_3__0"
-    // InternalPerspectiveDsl.g:5229:1: rule__PerspectiveSashContainer__Group_3_3__0 : rule__PerspectiveSashContainer__Group_3_3__0__Impl rule__PerspectiveSashContainer__Group_3_3__1 ;
+    // InternalPerspectiveDsl.g:5231:1: rule__PerspectiveSashContainer__Group_3_3__0 : rule__PerspectiveSashContainer__Group_3_3__0__Impl rule__PerspectiveSashContainer__Group_3_3__1 ;
     public final void rule__PerspectiveSashContainer__Group_3_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5233:1: ( rule__PerspectiveSashContainer__Group_3_3__0__Impl rule__PerspectiveSashContainer__Group_3_3__1 )
-            // InternalPerspectiveDsl.g:5234:2: rule__PerspectiveSashContainer__Group_3_3__0__Impl rule__PerspectiveSashContainer__Group_3_3__1
+            // InternalPerspectiveDsl.g:5235:1: ( rule__PerspectiveSashContainer__Group_3_3__0__Impl rule__PerspectiveSashContainer__Group_3_3__1 )
+            // InternalPerspectiveDsl.g:5236:2: rule__PerspectiveSashContainer__Group_3_3__0__Impl rule__PerspectiveSashContainer__Group_3_3__1
             {
             pushFollow(FOLLOW_15);
             rule__PerspectiveSashContainer__Group_3_3__0__Impl();
@@ -18779,17 +18779,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group_3_3__0__Impl"
-    // InternalPerspectiveDsl.g:5241:1: rule__PerspectiveSashContainer__Group_3_3__0__Impl : ( 'accessibility' ) ;
+    // InternalPerspectiveDsl.g:5243:1: rule__PerspectiveSashContainer__Group_3_3__0__Impl : ( 'accessibility' ) ;
     public final void rule__PerspectiveSashContainer__Group_3_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5245:1: ( ( 'accessibility' ) )
-            // InternalPerspectiveDsl.g:5246:1: ( 'accessibility' )
+            // InternalPerspectiveDsl.g:5247:1: ( ( 'accessibility' ) )
+            // InternalPerspectiveDsl.g:5248:1: ( 'accessibility' )
             {
-            // InternalPerspectiveDsl.g:5246:1: ( 'accessibility' )
-            // InternalPerspectiveDsl.g:5247:2: 'accessibility'
+            // InternalPerspectiveDsl.g:5248:1: ( 'accessibility' )
+            // InternalPerspectiveDsl.g:5249:2: 'accessibility'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getAccessibilityKeyword_3_3_0()); 
@@ -18820,14 +18820,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group_3_3__1"
-    // InternalPerspectiveDsl.g:5256:1: rule__PerspectiveSashContainer__Group_3_3__1 : rule__PerspectiveSashContainer__Group_3_3__1__Impl ;
+    // InternalPerspectiveDsl.g:5258:1: rule__PerspectiveSashContainer__Group_3_3__1 : rule__PerspectiveSashContainer__Group_3_3__1__Impl ;
     public final void rule__PerspectiveSashContainer__Group_3_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5260:1: ( rule__PerspectiveSashContainer__Group_3_3__1__Impl )
-            // InternalPerspectiveDsl.g:5261:2: rule__PerspectiveSashContainer__Group_3_3__1__Impl
+            // InternalPerspectiveDsl.g:5262:1: ( rule__PerspectiveSashContainer__Group_3_3__1__Impl )
+            // InternalPerspectiveDsl.g:5263:2: rule__PerspectiveSashContainer__Group_3_3__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSashContainer__Group_3_3__1__Impl();
@@ -18853,23 +18853,23 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__Group_3_3__1__Impl"
-    // InternalPerspectiveDsl.g:5267:1: rule__PerspectiveSashContainer__Group_3_3__1__Impl : ( ( rule__PerspectiveSashContainer__AccessibilityPhraseAssignment_3_3_1 ) ) ;
+    // InternalPerspectiveDsl.g:5269:1: rule__PerspectiveSashContainer__Group_3_3__1__Impl : ( ( rule__PerspectiveSashContainer__AccessibilityPhraseAssignment_3_3_1 ) ) ;
     public final void rule__PerspectiveSashContainer__Group_3_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5271:1: ( ( ( rule__PerspectiveSashContainer__AccessibilityPhraseAssignment_3_3_1 ) ) )
-            // InternalPerspectiveDsl.g:5272:1: ( ( rule__PerspectiveSashContainer__AccessibilityPhraseAssignment_3_3_1 ) )
+            // InternalPerspectiveDsl.g:5273:1: ( ( ( rule__PerspectiveSashContainer__AccessibilityPhraseAssignment_3_3_1 ) ) )
+            // InternalPerspectiveDsl.g:5274:1: ( ( rule__PerspectiveSashContainer__AccessibilityPhraseAssignment_3_3_1 ) )
             {
-            // InternalPerspectiveDsl.g:5272:1: ( ( rule__PerspectiveSashContainer__AccessibilityPhraseAssignment_3_3_1 ) )
-            // InternalPerspectiveDsl.g:5273:2: ( rule__PerspectiveSashContainer__AccessibilityPhraseAssignment_3_3_1 )
+            // InternalPerspectiveDsl.g:5274:1: ( ( rule__PerspectiveSashContainer__AccessibilityPhraseAssignment_3_3_1 ) )
+            // InternalPerspectiveDsl.g:5275:2: ( rule__PerspectiveSashContainer__AccessibilityPhraseAssignment_3_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getAccessibilityPhraseAssignment_3_3_1()); 
             }
-            // InternalPerspectiveDsl.g:5274:2: ( rule__PerspectiveSashContainer__AccessibilityPhraseAssignment_3_3_1 )
-            // InternalPerspectiveDsl.g:5274:3: rule__PerspectiveSashContainer__AccessibilityPhraseAssignment_3_3_1
+            // InternalPerspectiveDsl.g:5276:2: ( rule__PerspectiveSashContainer__AccessibilityPhraseAssignment_3_3_1 )
+            // InternalPerspectiveDsl.g:5276:3: rule__PerspectiveSashContainer__AccessibilityPhraseAssignment_3_3_1
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSashContainer__AccessibilityPhraseAssignment_3_3_1();
@@ -18904,14 +18904,14 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group__0"
-    // InternalPerspectiveDsl.g:5283:1: rule__PerspectivePartStack__Group__0 : rule__PerspectivePartStack__Group__0__Impl rule__PerspectivePartStack__Group__1 ;
+    // InternalPerspectiveDsl.g:5285:1: rule__PerspectivePartStack__Group__0 : rule__PerspectivePartStack__Group__0__Impl rule__PerspectivePartStack__Group__1 ;
     public final void rule__PerspectivePartStack__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5287:1: ( rule__PerspectivePartStack__Group__0__Impl rule__PerspectivePartStack__Group__1 )
-            // InternalPerspectiveDsl.g:5288:2: rule__PerspectivePartStack__Group__0__Impl rule__PerspectivePartStack__Group__1
+            // InternalPerspectiveDsl.g:5289:1: ( rule__PerspectivePartStack__Group__0__Impl rule__PerspectivePartStack__Group__1 )
+            // InternalPerspectiveDsl.g:5290:2: rule__PerspectivePartStack__Group__0__Impl rule__PerspectivePartStack__Group__1
             {
             pushFollow(FOLLOW_20);
             rule__PerspectivePartStack__Group__0__Impl();
@@ -18942,23 +18942,23 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group__0__Impl"
-    // InternalPerspectiveDsl.g:5295:1: rule__PerspectivePartStack__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:5297:1: rule__PerspectivePartStack__Group__0__Impl : ( () ) ;
     public final void rule__PerspectivePartStack__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5299:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:5300:1: ( () )
+            // InternalPerspectiveDsl.g:5301:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:5302:1: ( () )
             {
-            // InternalPerspectiveDsl.g:5300:1: ( () )
-            // InternalPerspectiveDsl.g:5301:2: ()
+            // InternalPerspectiveDsl.g:5302:1: ( () )
+            // InternalPerspectiveDsl.g:5303:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getPerspectivePartStackAction_0()); 
             }
-            // InternalPerspectiveDsl.g:5302:2: ()
-            // InternalPerspectiveDsl.g:5302:3: 
+            // InternalPerspectiveDsl.g:5304:2: ()
+            // InternalPerspectiveDsl.g:5304:3: 
             {
             }
 
@@ -18983,14 +18983,14 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group__1"
-    // InternalPerspectiveDsl.g:5310:1: rule__PerspectivePartStack__Group__1 : rule__PerspectivePartStack__Group__1__Impl rule__PerspectivePartStack__Group__2 ;
+    // InternalPerspectiveDsl.g:5312:1: rule__PerspectivePartStack__Group__1 : rule__PerspectivePartStack__Group__1__Impl rule__PerspectivePartStack__Group__2 ;
     public final void rule__PerspectivePartStack__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5314:1: ( rule__PerspectivePartStack__Group__1__Impl rule__PerspectivePartStack__Group__2 )
-            // InternalPerspectiveDsl.g:5315:2: rule__PerspectivePartStack__Group__1__Impl rule__PerspectivePartStack__Group__2
+            // InternalPerspectiveDsl.g:5316:1: ( rule__PerspectivePartStack__Group__1__Impl rule__PerspectivePartStack__Group__2 )
+            // InternalPerspectiveDsl.g:5317:2: rule__PerspectivePartStack__Group__1__Impl rule__PerspectivePartStack__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__PerspectivePartStack__Group__1__Impl();
@@ -19021,17 +19021,17 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group__1__Impl"
-    // InternalPerspectiveDsl.g:5322:1: rule__PerspectivePartStack__Group__1__Impl : ( 'partStack' ) ;
+    // InternalPerspectiveDsl.g:5324:1: rule__PerspectivePartStack__Group__1__Impl : ( 'partStack' ) ;
     public final void rule__PerspectivePartStack__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5326:1: ( ( 'partStack' ) )
-            // InternalPerspectiveDsl.g:5327:1: ( 'partStack' )
+            // InternalPerspectiveDsl.g:5328:1: ( ( 'partStack' ) )
+            // InternalPerspectiveDsl.g:5329:1: ( 'partStack' )
             {
-            // InternalPerspectiveDsl.g:5327:1: ( 'partStack' )
-            // InternalPerspectiveDsl.g:5328:2: 'partStack'
+            // InternalPerspectiveDsl.g:5329:1: ( 'partStack' )
+            // InternalPerspectiveDsl.g:5330:2: 'partStack'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getPartStackKeyword_1()); 
@@ -19062,14 +19062,14 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group__2"
-    // InternalPerspectiveDsl.g:5337:1: rule__PerspectivePartStack__Group__2 : rule__PerspectivePartStack__Group__2__Impl rule__PerspectivePartStack__Group__3 ;
+    // InternalPerspectiveDsl.g:5339:1: rule__PerspectivePartStack__Group__2 : rule__PerspectivePartStack__Group__2__Impl rule__PerspectivePartStack__Group__3 ;
     public final void rule__PerspectivePartStack__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5341:1: ( rule__PerspectivePartStack__Group__2__Impl rule__PerspectivePartStack__Group__3 )
-            // InternalPerspectiveDsl.g:5342:2: rule__PerspectivePartStack__Group__2__Impl rule__PerspectivePartStack__Group__3
+            // InternalPerspectiveDsl.g:5343:1: ( rule__PerspectivePartStack__Group__2__Impl rule__PerspectivePartStack__Group__3 )
+            // InternalPerspectiveDsl.g:5344:2: rule__PerspectivePartStack__Group__2__Impl rule__PerspectivePartStack__Group__3
             {
             pushFollow(FOLLOW_21);
             rule__PerspectivePartStack__Group__2__Impl();
@@ -19100,23 +19100,23 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group__2__Impl"
-    // InternalPerspectiveDsl.g:5349:1: rule__PerspectivePartStack__Group__2__Impl : ( ( rule__PerspectivePartStack__ElementIdAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:5351:1: rule__PerspectivePartStack__Group__2__Impl : ( ( rule__PerspectivePartStack__ElementIdAssignment_2 ) ) ;
     public final void rule__PerspectivePartStack__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5353:1: ( ( ( rule__PerspectivePartStack__ElementIdAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:5354:1: ( ( rule__PerspectivePartStack__ElementIdAssignment_2 ) )
+            // InternalPerspectiveDsl.g:5355:1: ( ( ( rule__PerspectivePartStack__ElementIdAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:5356:1: ( ( rule__PerspectivePartStack__ElementIdAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:5354:1: ( ( rule__PerspectivePartStack__ElementIdAssignment_2 ) )
-            // InternalPerspectiveDsl.g:5355:2: ( rule__PerspectivePartStack__ElementIdAssignment_2 )
+            // InternalPerspectiveDsl.g:5356:1: ( ( rule__PerspectivePartStack__ElementIdAssignment_2 ) )
+            // InternalPerspectiveDsl.g:5357:2: ( rule__PerspectivePartStack__ElementIdAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getElementIdAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:5356:2: ( rule__PerspectivePartStack__ElementIdAssignment_2 )
-            // InternalPerspectiveDsl.g:5356:3: rule__PerspectivePartStack__ElementIdAssignment_2
+            // InternalPerspectiveDsl.g:5358:2: ( rule__PerspectivePartStack__ElementIdAssignment_2 )
+            // InternalPerspectiveDsl.g:5358:3: rule__PerspectivePartStack__ElementIdAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePartStack__ElementIdAssignment_2();
@@ -19151,14 +19151,14 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group__3"
-    // InternalPerspectiveDsl.g:5364:1: rule__PerspectivePartStack__Group__3 : rule__PerspectivePartStack__Group__3__Impl rule__PerspectivePartStack__Group__4 ;
+    // InternalPerspectiveDsl.g:5366:1: rule__PerspectivePartStack__Group__3 : rule__PerspectivePartStack__Group__3__Impl rule__PerspectivePartStack__Group__4 ;
     public final void rule__PerspectivePartStack__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5368:1: ( rule__PerspectivePartStack__Group__3__Impl rule__PerspectivePartStack__Group__4 )
-            // InternalPerspectiveDsl.g:5369:2: rule__PerspectivePartStack__Group__3__Impl rule__PerspectivePartStack__Group__4
+            // InternalPerspectiveDsl.g:5370:1: ( rule__PerspectivePartStack__Group__3__Impl rule__PerspectivePartStack__Group__4 )
+            // InternalPerspectiveDsl.g:5371:2: rule__PerspectivePartStack__Group__3__Impl rule__PerspectivePartStack__Group__4
             {
             pushFollow(FOLLOW_8);
             rule__PerspectivePartStack__Group__3__Impl();
@@ -19189,23 +19189,23 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group__3__Impl"
-    // InternalPerspectiveDsl.g:5376:1: rule__PerspectivePartStack__Group__3__Impl : ( ( rule__PerspectivePartStack__UnorderedGroup_3 ) ) ;
+    // InternalPerspectiveDsl.g:5378:1: rule__PerspectivePartStack__Group__3__Impl : ( ( rule__PerspectivePartStack__UnorderedGroup_3 ) ) ;
     public final void rule__PerspectivePartStack__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5380:1: ( ( ( rule__PerspectivePartStack__UnorderedGroup_3 ) ) )
-            // InternalPerspectiveDsl.g:5381:1: ( ( rule__PerspectivePartStack__UnorderedGroup_3 ) )
+            // InternalPerspectiveDsl.g:5382:1: ( ( ( rule__PerspectivePartStack__UnorderedGroup_3 ) ) )
+            // InternalPerspectiveDsl.g:5383:1: ( ( rule__PerspectivePartStack__UnorderedGroup_3 ) )
             {
-            // InternalPerspectiveDsl.g:5381:1: ( ( rule__PerspectivePartStack__UnorderedGroup_3 ) )
-            // InternalPerspectiveDsl.g:5382:2: ( rule__PerspectivePartStack__UnorderedGroup_3 )
+            // InternalPerspectiveDsl.g:5383:1: ( ( rule__PerspectivePartStack__UnorderedGroup_3 ) )
+            // InternalPerspectiveDsl.g:5384:2: ( rule__PerspectivePartStack__UnorderedGroup_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3()); 
             }
-            // InternalPerspectiveDsl.g:5383:2: ( rule__PerspectivePartStack__UnorderedGroup_3 )
-            // InternalPerspectiveDsl.g:5383:3: rule__PerspectivePartStack__UnorderedGroup_3
+            // InternalPerspectiveDsl.g:5385:2: ( rule__PerspectivePartStack__UnorderedGroup_3 )
+            // InternalPerspectiveDsl.g:5385:3: rule__PerspectivePartStack__UnorderedGroup_3
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePartStack__UnorderedGroup_3();
@@ -19240,14 +19240,14 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group__4"
-    // InternalPerspectiveDsl.g:5391:1: rule__PerspectivePartStack__Group__4 : rule__PerspectivePartStack__Group__4__Impl rule__PerspectivePartStack__Group__5 ;
+    // InternalPerspectiveDsl.g:5393:1: rule__PerspectivePartStack__Group__4 : rule__PerspectivePartStack__Group__4__Impl rule__PerspectivePartStack__Group__5 ;
     public final void rule__PerspectivePartStack__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5395:1: ( rule__PerspectivePartStack__Group__4__Impl rule__PerspectivePartStack__Group__5 )
-            // InternalPerspectiveDsl.g:5396:2: rule__PerspectivePartStack__Group__4__Impl rule__PerspectivePartStack__Group__5
+            // InternalPerspectiveDsl.g:5397:1: ( rule__PerspectivePartStack__Group__4__Impl rule__PerspectivePartStack__Group__5 )
+            // InternalPerspectiveDsl.g:5398:2: rule__PerspectivePartStack__Group__4__Impl rule__PerspectivePartStack__Group__5
             {
             pushFollow(FOLLOW_13);
             rule__PerspectivePartStack__Group__4__Impl();
@@ -19278,17 +19278,17 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group__4__Impl"
-    // InternalPerspectiveDsl.g:5403:1: rule__PerspectivePartStack__Group__4__Impl : ( '{' ) ;
+    // InternalPerspectiveDsl.g:5405:1: rule__PerspectivePartStack__Group__4__Impl : ( '{' ) ;
     public final void rule__PerspectivePartStack__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5407:1: ( ( '{' ) )
-            // InternalPerspectiveDsl.g:5408:1: ( '{' )
+            // InternalPerspectiveDsl.g:5409:1: ( ( '{' ) )
+            // InternalPerspectiveDsl.g:5410:1: ( '{' )
             {
-            // InternalPerspectiveDsl.g:5408:1: ( '{' )
-            // InternalPerspectiveDsl.g:5409:2: '{'
+            // InternalPerspectiveDsl.g:5410:1: ( '{' )
+            // InternalPerspectiveDsl.g:5411:2: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getLeftCurlyBracketKeyword_4()); 
@@ -19319,14 +19319,14 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group__5"
-    // InternalPerspectiveDsl.g:5418:1: rule__PerspectivePartStack__Group__5 : rule__PerspectivePartStack__Group__5__Impl rule__PerspectivePartStack__Group__6 ;
+    // InternalPerspectiveDsl.g:5420:1: rule__PerspectivePartStack__Group__5 : rule__PerspectivePartStack__Group__5__Impl rule__PerspectivePartStack__Group__6 ;
     public final void rule__PerspectivePartStack__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5422:1: ( rule__PerspectivePartStack__Group__5__Impl rule__PerspectivePartStack__Group__6 )
-            // InternalPerspectiveDsl.g:5423:2: rule__PerspectivePartStack__Group__5__Impl rule__PerspectivePartStack__Group__6
+            // InternalPerspectiveDsl.g:5424:1: ( rule__PerspectivePartStack__Group__5__Impl rule__PerspectivePartStack__Group__6 )
+            // InternalPerspectiveDsl.g:5425:2: rule__PerspectivePartStack__Group__5__Impl rule__PerspectivePartStack__Group__6
             {
             pushFollow(FOLLOW_13);
             rule__PerspectivePartStack__Group__5__Impl();
@@ -19357,22 +19357,22 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group__5__Impl"
-    // InternalPerspectiveDsl.g:5430:1: rule__PerspectivePartStack__Group__5__Impl : ( ( rule__PerspectivePartStack__ElementsAssignment_5 )* ) ;
+    // InternalPerspectiveDsl.g:5432:1: rule__PerspectivePartStack__Group__5__Impl : ( ( rule__PerspectivePartStack__ElementsAssignment_5 )* ) ;
     public final void rule__PerspectivePartStack__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5434:1: ( ( ( rule__PerspectivePartStack__ElementsAssignment_5 )* ) )
-            // InternalPerspectiveDsl.g:5435:1: ( ( rule__PerspectivePartStack__ElementsAssignment_5 )* )
+            // InternalPerspectiveDsl.g:5436:1: ( ( ( rule__PerspectivePartStack__ElementsAssignment_5 )* ) )
+            // InternalPerspectiveDsl.g:5437:1: ( ( rule__PerspectivePartStack__ElementsAssignment_5 )* )
             {
-            // InternalPerspectiveDsl.g:5435:1: ( ( rule__PerspectivePartStack__ElementsAssignment_5 )* )
-            // InternalPerspectiveDsl.g:5436:2: ( rule__PerspectivePartStack__ElementsAssignment_5 )*
+            // InternalPerspectiveDsl.g:5437:1: ( ( rule__PerspectivePartStack__ElementsAssignment_5 )* )
+            // InternalPerspectiveDsl.g:5438:2: ( rule__PerspectivePartStack__ElementsAssignment_5 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getElementsAssignment_5()); 
             }
-            // InternalPerspectiveDsl.g:5437:2: ( rule__PerspectivePartStack__ElementsAssignment_5 )*
+            // InternalPerspectiveDsl.g:5439:2: ( rule__PerspectivePartStack__ElementsAssignment_5 )*
             loop57:
             do {
                 int alt57=2;
@@ -19385,7 +19385,7 @@
 
                 switch (alt57) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:5437:3: rule__PerspectivePartStack__ElementsAssignment_5
+            	    // InternalPerspectiveDsl.g:5439:3: rule__PerspectivePartStack__ElementsAssignment_5
             	    {
             	    pushFollow(FOLLOW_14);
             	    rule__PerspectivePartStack__ElementsAssignment_5();
@@ -19426,14 +19426,14 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group__6"
-    // InternalPerspectiveDsl.g:5445:1: rule__PerspectivePartStack__Group__6 : rule__PerspectivePartStack__Group__6__Impl ;
+    // InternalPerspectiveDsl.g:5447:1: rule__PerspectivePartStack__Group__6 : rule__PerspectivePartStack__Group__6__Impl ;
     public final void rule__PerspectivePartStack__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5449:1: ( rule__PerspectivePartStack__Group__6__Impl )
-            // InternalPerspectiveDsl.g:5450:2: rule__PerspectivePartStack__Group__6__Impl
+            // InternalPerspectiveDsl.g:5451:1: ( rule__PerspectivePartStack__Group__6__Impl )
+            // InternalPerspectiveDsl.g:5452:2: rule__PerspectivePartStack__Group__6__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePartStack__Group__6__Impl();
@@ -19459,17 +19459,17 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group__6__Impl"
-    // InternalPerspectiveDsl.g:5456:1: rule__PerspectivePartStack__Group__6__Impl : ( '}' ) ;
+    // InternalPerspectiveDsl.g:5458:1: rule__PerspectivePartStack__Group__6__Impl : ( '}' ) ;
     public final void rule__PerspectivePartStack__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5460:1: ( ( '}' ) )
-            // InternalPerspectiveDsl.g:5461:1: ( '}' )
+            // InternalPerspectiveDsl.g:5462:1: ( ( '}' ) )
+            // InternalPerspectiveDsl.g:5463:1: ( '}' )
             {
-            // InternalPerspectiveDsl.g:5461:1: ( '}' )
-            // InternalPerspectiveDsl.g:5462:2: '}'
+            // InternalPerspectiveDsl.g:5463:1: ( '}' )
+            // InternalPerspectiveDsl.g:5464:2: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getRightCurlyBracketKeyword_6()); 
@@ -19500,14 +19500,14 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group_3_0__0"
-    // InternalPerspectiveDsl.g:5472:1: rule__PerspectivePartStack__Group_3_0__0 : rule__PerspectivePartStack__Group_3_0__0__Impl rule__PerspectivePartStack__Group_3_0__1 ;
+    // InternalPerspectiveDsl.g:5474:1: rule__PerspectivePartStack__Group_3_0__0 : rule__PerspectivePartStack__Group_3_0__0__Impl rule__PerspectivePartStack__Group_3_0__1 ;
     public final void rule__PerspectivePartStack__Group_3_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5476:1: ( rule__PerspectivePartStack__Group_3_0__0__Impl rule__PerspectivePartStack__Group_3_0__1 )
-            // InternalPerspectiveDsl.g:5477:2: rule__PerspectivePartStack__Group_3_0__0__Impl rule__PerspectivePartStack__Group_3_0__1
+            // InternalPerspectiveDsl.g:5478:1: ( rule__PerspectivePartStack__Group_3_0__0__Impl rule__PerspectivePartStack__Group_3_0__1 )
+            // InternalPerspectiveDsl.g:5479:2: rule__PerspectivePartStack__Group_3_0__0__Impl rule__PerspectivePartStack__Group_3_0__1
             {
             pushFollow(FOLLOW_7);
             rule__PerspectivePartStack__Group_3_0__0__Impl();
@@ -19538,17 +19538,17 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group_3_0__0__Impl"
-    // InternalPerspectiveDsl.g:5484:1: rule__PerspectivePartStack__Group_3_0__0__Impl : ( 'selectedElement' ) ;
+    // InternalPerspectiveDsl.g:5486:1: rule__PerspectivePartStack__Group_3_0__0__Impl : ( 'selectedElement' ) ;
     public final void rule__PerspectivePartStack__Group_3_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5488:1: ( ( 'selectedElement' ) )
-            // InternalPerspectiveDsl.g:5489:1: ( 'selectedElement' )
+            // InternalPerspectiveDsl.g:5490:1: ( ( 'selectedElement' ) )
+            // InternalPerspectiveDsl.g:5491:1: ( 'selectedElement' )
             {
-            // InternalPerspectiveDsl.g:5489:1: ( 'selectedElement' )
-            // InternalPerspectiveDsl.g:5490:2: 'selectedElement'
+            // InternalPerspectiveDsl.g:5491:1: ( 'selectedElement' )
+            // InternalPerspectiveDsl.g:5492:2: 'selectedElement'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getSelectedElementKeyword_3_0_0()); 
@@ -19579,14 +19579,14 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group_3_0__1"
-    // InternalPerspectiveDsl.g:5499:1: rule__PerspectivePartStack__Group_3_0__1 : rule__PerspectivePartStack__Group_3_0__1__Impl ;
+    // InternalPerspectiveDsl.g:5501:1: rule__PerspectivePartStack__Group_3_0__1 : rule__PerspectivePartStack__Group_3_0__1__Impl ;
     public final void rule__PerspectivePartStack__Group_3_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5503:1: ( rule__PerspectivePartStack__Group_3_0__1__Impl )
-            // InternalPerspectiveDsl.g:5504:2: rule__PerspectivePartStack__Group_3_0__1__Impl
+            // InternalPerspectiveDsl.g:5505:1: ( rule__PerspectivePartStack__Group_3_0__1__Impl )
+            // InternalPerspectiveDsl.g:5506:2: rule__PerspectivePartStack__Group_3_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePartStack__Group_3_0__1__Impl();
@@ -19612,23 +19612,23 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group_3_0__1__Impl"
-    // InternalPerspectiveDsl.g:5510:1: rule__PerspectivePartStack__Group_3_0__1__Impl : ( ( rule__PerspectivePartStack__SelectedElementAssignment_3_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:5512:1: rule__PerspectivePartStack__Group_3_0__1__Impl : ( ( rule__PerspectivePartStack__SelectedElementAssignment_3_0_1 ) ) ;
     public final void rule__PerspectivePartStack__Group_3_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5514:1: ( ( ( rule__PerspectivePartStack__SelectedElementAssignment_3_0_1 ) ) )
-            // InternalPerspectiveDsl.g:5515:1: ( ( rule__PerspectivePartStack__SelectedElementAssignment_3_0_1 ) )
+            // InternalPerspectiveDsl.g:5516:1: ( ( ( rule__PerspectivePartStack__SelectedElementAssignment_3_0_1 ) ) )
+            // InternalPerspectiveDsl.g:5517:1: ( ( rule__PerspectivePartStack__SelectedElementAssignment_3_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:5515:1: ( ( rule__PerspectivePartStack__SelectedElementAssignment_3_0_1 ) )
-            // InternalPerspectiveDsl.g:5516:2: ( rule__PerspectivePartStack__SelectedElementAssignment_3_0_1 )
+            // InternalPerspectiveDsl.g:5517:1: ( ( rule__PerspectivePartStack__SelectedElementAssignment_3_0_1 ) )
+            // InternalPerspectiveDsl.g:5518:2: ( rule__PerspectivePartStack__SelectedElementAssignment_3_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getSelectedElementAssignment_3_0_1()); 
             }
-            // InternalPerspectiveDsl.g:5517:2: ( rule__PerspectivePartStack__SelectedElementAssignment_3_0_1 )
-            // InternalPerspectiveDsl.g:5517:3: rule__PerspectivePartStack__SelectedElementAssignment_3_0_1
+            // InternalPerspectiveDsl.g:5519:2: ( rule__PerspectivePartStack__SelectedElementAssignment_3_0_1 )
+            // InternalPerspectiveDsl.g:5519:3: rule__PerspectivePartStack__SelectedElementAssignment_3_0_1
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePartStack__SelectedElementAssignment_3_0_1();
@@ -19663,14 +19663,14 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group_3_1__0"
-    // InternalPerspectiveDsl.g:5526:1: rule__PerspectivePartStack__Group_3_1__0 : rule__PerspectivePartStack__Group_3_1__0__Impl rule__PerspectivePartStack__Group_3_1__1 ;
+    // InternalPerspectiveDsl.g:5528:1: rule__PerspectivePartStack__Group_3_1__0 : rule__PerspectivePartStack__Group_3_1__0__Impl rule__PerspectivePartStack__Group_3_1__1 ;
     public final void rule__PerspectivePartStack__Group_3_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5530:1: ( rule__PerspectivePartStack__Group_3_1__0__Impl rule__PerspectivePartStack__Group_3_1__1 )
-            // InternalPerspectiveDsl.g:5531:2: rule__PerspectivePartStack__Group_3_1__0__Impl rule__PerspectivePartStack__Group_3_1__1
+            // InternalPerspectiveDsl.g:5532:1: ( rule__PerspectivePartStack__Group_3_1__0__Impl rule__PerspectivePartStack__Group_3_1__1 )
+            // InternalPerspectiveDsl.g:5533:2: rule__PerspectivePartStack__Group_3_1__0__Impl rule__PerspectivePartStack__Group_3_1__1
             {
             pushFollow(FOLLOW_15);
             rule__PerspectivePartStack__Group_3_1__0__Impl();
@@ -19701,17 +19701,17 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group_3_1__0__Impl"
-    // InternalPerspectiveDsl.g:5538:1: rule__PerspectivePartStack__Group_3_1__0__Impl : ( 'spaceVolume' ) ;
+    // InternalPerspectiveDsl.g:5540:1: rule__PerspectivePartStack__Group_3_1__0__Impl : ( 'spaceVolume' ) ;
     public final void rule__PerspectivePartStack__Group_3_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5542:1: ( ( 'spaceVolume' ) )
-            // InternalPerspectiveDsl.g:5543:1: ( 'spaceVolume' )
+            // InternalPerspectiveDsl.g:5544:1: ( ( 'spaceVolume' ) )
+            // InternalPerspectiveDsl.g:5545:1: ( 'spaceVolume' )
             {
-            // InternalPerspectiveDsl.g:5543:1: ( 'spaceVolume' )
-            // InternalPerspectiveDsl.g:5544:2: 'spaceVolume'
+            // InternalPerspectiveDsl.g:5545:1: ( 'spaceVolume' )
+            // InternalPerspectiveDsl.g:5546:2: 'spaceVolume'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getSpaceVolumeKeyword_3_1_0()); 
@@ -19742,14 +19742,14 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group_3_1__1"
-    // InternalPerspectiveDsl.g:5553:1: rule__PerspectivePartStack__Group_3_1__1 : rule__PerspectivePartStack__Group_3_1__1__Impl ;
+    // InternalPerspectiveDsl.g:5555:1: rule__PerspectivePartStack__Group_3_1__1 : rule__PerspectivePartStack__Group_3_1__1__Impl ;
     public final void rule__PerspectivePartStack__Group_3_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5557:1: ( rule__PerspectivePartStack__Group_3_1__1__Impl )
-            // InternalPerspectiveDsl.g:5558:2: rule__PerspectivePartStack__Group_3_1__1__Impl
+            // InternalPerspectiveDsl.g:5559:1: ( rule__PerspectivePartStack__Group_3_1__1__Impl )
+            // InternalPerspectiveDsl.g:5560:2: rule__PerspectivePartStack__Group_3_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePartStack__Group_3_1__1__Impl();
@@ -19775,23 +19775,23 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group_3_1__1__Impl"
-    // InternalPerspectiveDsl.g:5564:1: rule__PerspectivePartStack__Group_3_1__1__Impl : ( ( rule__PerspectivePartStack__ContainerDataAssignment_3_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:5566:1: rule__PerspectivePartStack__Group_3_1__1__Impl : ( ( rule__PerspectivePartStack__ContainerDataAssignment_3_1_1 ) ) ;
     public final void rule__PerspectivePartStack__Group_3_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5568:1: ( ( ( rule__PerspectivePartStack__ContainerDataAssignment_3_1_1 ) ) )
-            // InternalPerspectiveDsl.g:5569:1: ( ( rule__PerspectivePartStack__ContainerDataAssignment_3_1_1 ) )
+            // InternalPerspectiveDsl.g:5570:1: ( ( ( rule__PerspectivePartStack__ContainerDataAssignment_3_1_1 ) ) )
+            // InternalPerspectiveDsl.g:5571:1: ( ( rule__PerspectivePartStack__ContainerDataAssignment_3_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:5569:1: ( ( rule__PerspectivePartStack__ContainerDataAssignment_3_1_1 ) )
-            // InternalPerspectiveDsl.g:5570:2: ( rule__PerspectivePartStack__ContainerDataAssignment_3_1_1 )
+            // InternalPerspectiveDsl.g:5571:1: ( ( rule__PerspectivePartStack__ContainerDataAssignment_3_1_1 ) )
+            // InternalPerspectiveDsl.g:5572:2: ( rule__PerspectivePartStack__ContainerDataAssignment_3_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getContainerDataAssignment_3_1_1()); 
             }
-            // InternalPerspectiveDsl.g:5571:2: ( rule__PerspectivePartStack__ContainerDataAssignment_3_1_1 )
-            // InternalPerspectiveDsl.g:5571:3: rule__PerspectivePartStack__ContainerDataAssignment_3_1_1
+            // InternalPerspectiveDsl.g:5573:2: ( rule__PerspectivePartStack__ContainerDataAssignment_3_1_1 )
+            // InternalPerspectiveDsl.g:5573:3: rule__PerspectivePartStack__ContainerDataAssignment_3_1_1
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePartStack__ContainerDataAssignment_3_1_1();
@@ -19826,14 +19826,14 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group_3_2__0"
-    // InternalPerspectiveDsl.g:5580:1: rule__PerspectivePartStack__Group_3_2__0 : rule__PerspectivePartStack__Group_3_2__0__Impl rule__PerspectivePartStack__Group_3_2__1 ;
+    // InternalPerspectiveDsl.g:5582:1: rule__PerspectivePartStack__Group_3_2__0 : rule__PerspectivePartStack__Group_3_2__0__Impl rule__PerspectivePartStack__Group_3_2__1 ;
     public final void rule__PerspectivePartStack__Group_3_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5584:1: ( rule__PerspectivePartStack__Group_3_2__0__Impl rule__PerspectivePartStack__Group_3_2__1 )
-            // InternalPerspectiveDsl.g:5585:2: rule__PerspectivePartStack__Group_3_2__0__Impl rule__PerspectivePartStack__Group_3_2__1
+            // InternalPerspectiveDsl.g:5586:1: ( rule__PerspectivePartStack__Group_3_2__0__Impl rule__PerspectivePartStack__Group_3_2__1 )
+            // InternalPerspectiveDsl.g:5587:2: rule__PerspectivePartStack__Group_3_2__0__Impl rule__PerspectivePartStack__Group_3_2__1
             {
             pushFollow(FOLLOW_15);
             rule__PerspectivePartStack__Group_3_2__0__Impl();
@@ -19864,17 +19864,17 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group_3_2__0__Impl"
-    // InternalPerspectiveDsl.g:5592:1: rule__PerspectivePartStack__Group_3_2__0__Impl : ( 'accessibility' ) ;
+    // InternalPerspectiveDsl.g:5594:1: rule__PerspectivePartStack__Group_3_2__0__Impl : ( 'accessibility' ) ;
     public final void rule__PerspectivePartStack__Group_3_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5596:1: ( ( 'accessibility' ) )
-            // InternalPerspectiveDsl.g:5597:1: ( 'accessibility' )
+            // InternalPerspectiveDsl.g:5598:1: ( ( 'accessibility' ) )
+            // InternalPerspectiveDsl.g:5599:1: ( 'accessibility' )
             {
-            // InternalPerspectiveDsl.g:5597:1: ( 'accessibility' )
-            // InternalPerspectiveDsl.g:5598:2: 'accessibility'
+            // InternalPerspectiveDsl.g:5599:1: ( 'accessibility' )
+            // InternalPerspectiveDsl.g:5600:2: 'accessibility'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getAccessibilityKeyword_3_2_0()); 
@@ -19905,14 +19905,14 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group_3_2__1"
-    // InternalPerspectiveDsl.g:5607:1: rule__PerspectivePartStack__Group_3_2__1 : rule__PerspectivePartStack__Group_3_2__1__Impl ;
+    // InternalPerspectiveDsl.g:5609:1: rule__PerspectivePartStack__Group_3_2__1 : rule__PerspectivePartStack__Group_3_2__1__Impl ;
     public final void rule__PerspectivePartStack__Group_3_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5611:1: ( rule__PerspectivePartStack__Group_3_2__1__Impl )
-            // InternalPerspectiveDsl.g:5612:2: rule__PerspectivePartStack__Group_3_2__1__Impl
+            // InternalPerspectiveDsl.g:5613:1: ( rule__PerspectivePartStack__Group_3_2__1__Impl )
+            // InternalPerspectiveDsl.g:5614:2: rule__PerspectivePartStack__Group_3_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePartStack__Group_3_2__1__Impl();
@@ -19938,23 +19938,23 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__Group_3_2__1__Impl"
-    // InternalPerspectiveDsl.g:5618:1: rule__PerspectivePartStack__Group_3_2__1__Impl : ( ( rule__PerspectivePartStack__AccessibilityPhraseAssignment_3_2_1 ) ) ;
+    // InternalPerspectiveDsl.g:5620:1: rule__PerspectivePartStack__Group_3_2__1__Impl : ( ( rule__PerspectivePartStack__AccessibilityPhraseAssignment_3_2_1 ) ) ;
     public final void rule__PerspectivePartStack__Group_3_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5622:1: ( ( ( rule__PerspectivePartStack__AccessibilityPhraseAssignment_3_2_1 ) ) )
-            // InternalPerspectiveDsl.g:5623:1: ( ( rule__PerspectivePartStack__AccessibilityPhraseAssignment_3_2_1 ) )
+            // InternalPerspectiveDsl.g:5624:1: ( ( ( rule__PerspectivePartStack__AccessibilityPhraseAssignment_3_2_1 ) ) )
+            // InternalPerspectiveDsl.g:5625:1: ( ( rule__PerspectivePartStack__AccessibilityPhraseAssignment_3_2_1 ) )
             {
-            // InternalPerspectiveDsl.g:5623:1: ( ( rule__PerspectivePartStack__AccessibilityPhraseAssignment_3_2_1 ) )
-            // InternalPerspectiveDsl.g:5624:2: ( rule__PerspectivePartStack__AccessibilityPhraseAssignment_3_2_1 )
+            // InternalPerspectiveDsl.g:5625:1: ( ( rule__PerspectivePartStack__AccessibilityPhraseAssignment_3_2_1 ) )
+            // InternalPerspectiveDsl.g:5626:2: ( rule__PerspectivePartStack__AccessibilityPhraseAssignment_3_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getAccessibilityPhraseAssignment_3_2_1()); 
             }
-            // InternalPerspectiveDsl.g:5625:2: ( rule__PerspectivePartStack__AccessibilityPhraseAssignment_3_2_1 )
-            // InternalPerspectiveDsl.g:5625:3: rule__PerspectivePartStack__AccessibilityPhraseAssignment_3_2_1
+            // InternalPerspectiveDsl.g:5627:2: ( rule__PerspectivePartStack__AccessibilityPhraseAssignment_3_2_1 )
+            // InternalPerspectiveDsl.g:5627:3: rule__PerspectivePartStack__AccessibilityPhraseAssignment_3_2_1
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePartStack__AccessibilityPhraseAssignment_3_2_1();
@@ -19989,14 +19989,14 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group__0"
-    // InternalPerspectiveDsl.g:5634:1: rule__PerspectivePart__Group__0 : rule__PerspectivePart__Group__0__Impl rule__PerspectivePart__Group__1 ;
+    // InternalPerspectiveDsl.g:5636:1: rule__PerspectivePart__Group__0 : rule__PerspectivePart__Group__0__Impl rule__PerspectivePart__Group__1 ;
     public final void rule__PerspectivePart__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5638:1: ( rule__PerspectivePart__Group__0__Impl rule__PerspectivePart__Group__1 )
-            // InternalPerspectiveDsl.g:5639:2: rule__PerspectivePart__Group__0__Impl rule__PerspectivePart__Group__1
+            // InternalPerspectiveDsl.g:5640:1: ( rule__PerspectivePart__Group__0__Impl rule__PerspectivePart__Group__1 )
+            // InternalPerspectiveDsl.g:5641:2: rule__PerspectivePart__Group__0__Impl rule__PerspectivePart__Group__1
             {
             pushFollow(FOLLOW_22);
             rule__PerspectivePart__Group__0__Impl();
@@ -20027,23 +20027,23 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group__0__Impl"
-    // InternalPerspectiveDsl.g:5646:1: rule__PerspectivePart__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:5648:1: rule__PerspectivePart__Group__0__Impl : ( () ) ;
     public final void rule__PerspectivePart__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5650:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:5651:1: ( () )
+            // InternalPerspectiveDsl.g:5652:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:5653:1: ( () )
             {
-            // InternalPerspectiveDsl.g:5651:1: ( () )
-            // InternalPerspectiveDsl.g:5652:2: ()
+            // InternalPerspectiveDsl.g:5653:1: ( () )
+            // InternalPerspectiveDsl.g:5654:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getPerspectivePartAction_0()); 
             }
-            // InternalPerspectiveDsl.g:5653:2: ()
-            // InternalPerspectiveDsl.g:5653:3: 
+            // InternalPerspectiveDsl.g:5655:2: ()
+            // InternalPerspectiveDsl.g:5655:3: 
             {
             }
 
@@ -20068,14 +20068,14 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group__1"
-    // InternalPerspectiveDsl.g:5661:1: rule__PerspectivePart__Group__1 : rule__PerspectivePart__Group__1__Impl rule__PerspectivePart__Group__2 ;
+    // InternalPerspectiveDsl.g:5663:1: rule__PerspectivePart__Group__1 : rule__PerspectivePart__Group__1__Impl rule__PerspectivePart__Group__2 ;
     public final void rule__PerspectivePart__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5665:1: ( rule__PerspectivePart__Group__1__Impl rule__PerspectivePart__Group__2 )
-            // InternalPerspectiveDsl.g:5666:2: rule__PerspectivePart__Group__1__Impl rule__PerspectivePart__Group__2
+            // InternalPerspectiveDsl.g:5667:1: ( rule__PerspectivePart__Group__1__Impl rule__PerspectivePart__Group__2 )
+            // InternalPerspectiveDsl.g:5668:2: rule__PerspectivePart__Group__1__Impl rule__PerspectivePart__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__PerspectivePart__Group__1__Impl();
@@ -20106,17 +20106,17 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group__1__Impl"
-    // InternalPerspectiveDsl.g:5673:1: rule__PerspectivePart__Group__1__Impl : ( 'part' ) ;
+    // InternalPerspectiveDsl.g:5675:1: rule__PerspectivePart__Group__1__Impl : ( 'part' ) ;
     public final void rule__PerspectivePart__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5677:1: ( ( 'part' ) )
-            // InternalPerspectiveDsl.g:5678:1: ( 'part' )
+            // InternalPerspectiveDsl.g:5679:1: ( ( 'part' ) )
+            // InternalPerspectiveDsl.g:5680:1: ( 'part' )
             {
-            // InternalPerspectiveDsl.g:5678:1: ( 'part' )
-            // InternalPerspectiveDsl.g:5679:2: 'part'
+            // InternalPerspectiveDsl.g:5680:1: ( 'part' )
+            // InternalPerspectiveDsl.g:5681:2: 'part'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getPartKeyword_1()); 
@@ -20147,14 +20147,14 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group__2"
-    // InternalPerspectiveDsl.g:5688:1: rule__PerspectivePart__Group__2 : rule__PerspectivePart__Group__2__Impl rule__PerspectivePart__Group__3 ;
+    // InternalPerspectiveDsl.g:5690:1: rule__PerspectivePart__Group__2 : rule__PerspectivePart__Group__2__Impl rule__PerspectivePart__Group__3 ;
     public final void rule__PerspectivePart__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5692:1: ( rule__PerspectivePart__Group__2__Impl rule__PerspectivePart__Group__3 )
-            // InternalPerspectiveDsl.g:5693:2: rule__PerspectivePart__Group__2__Impl rule__PerspectivePart__Group__3
+            // InternalPerspectiveDsl.g:5694:1: ( rule__PerspectivePart__Group__2__Impl rule__PerspectivePart__Group__3 )
+            // InternalPerspectiveDsl.g:5695:2: rule__PerspectivePart__Group__2__Impl rule__PerspectivePart__Group__3
             {
             pushFollow(FOLLOW_23);
             rule__PerspectivePart__Group__2__Impl();
@@ -20185,23 +20185,23 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group__2__Impl"
-    // InternalPerspectiveDsl.g:5700:1: rule__PerspectivePart__Group__2__Impl : ( ( rule__PerspectivePart__ElementIdAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:5702:1: rule__PerspectivePart__Group__2__Impl : ( ( rule__PerspectivePart__ElementIdAssignment_2 ) ) ;
     public final void rule__PerspectivePart__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5704:1: ( ( ( rule__PerspectivePart__ElementIdAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:5705:1: ( ( rule__PerspectivePart__ElementIdAssignment_2 ) )
+            // InternalPerspectiveDsl.g:5706:1: ( ( ( rule__PerspectivePart__ElementIdAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:5707:1: ( ( rule__PerspectivePart__ElementIdAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:5705:1: ( ( rule__PerspectivePart__ElementIdAssignment_2 ) )
-            // InternalPerspectiveDsl.g:5706:2: ( rule__PerspectivePart__ElementIdAssignment_2 )
+            // InternalPerspectiveDsl.g:5707:1: ( ( rule__PerspectivePart__ElementIdAssignment_2 ) )
+            // InternalPerspectiveDsl.g:5708:2: ( rule__PerspectivePart__ElementIdAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getElementIdAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:5707:2: ( rule__PerspectivePart__ElementIdAssignment_2 )
-            // InternalPerspectiveDsl.g:5707:3: rule__PerspectivePart__ElementIdAssignment_2
+            // InternalPerspectiveDsl.g:5709:2: ( rule__PerspectivePart__ElementIdAssignment_2 )
+            // InternalPerspectiveDsl.g:5709:3: rule__PerspectivePart__ElementIdAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePart__ElementIdAssignment_2();
@@ -20236,14 +20236,14 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group__3"
-    // InternalPerspectiveDsl.g:5715:1: rule__PerspectivePart__Group__3 : rule__PerspectivePart__Group__3__Impl ;
+    // InternalPerspectiveDsl.g:5717:1: rule__PerspectivePart__Group__3 : rule__PerspectivePart__Group__3__Impl ;
     public final void rule__PerspectivePart__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5719:1: ( rule__PerspectivePart__Group__3__Impl )
-            // InternalPerspectiveDsl.g:5720:2: rule__PerspectivePart__Group__3__Impl
+            // InternalPerspectiveDsl.g:5721:1: ( rule__PerspectivePart__Group__3__Impl )
+            // InternalPerspectiveDsl.g:5722:2: rule__PerspectivePart__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePart__Group__3__Impl();
@@ -20269,23 +20269,23 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group__3__Impl"
-    // InternalPerspectiveDsl.g:5726:1: rule__PerspectivePart__Group__3__Impl : ( ( rule__PerspectivePart__UnorderedGroup_3 ) ) ;
+    // InternalPerspectiveDsl.g:5728:1: rule__PerspectivePart__Group__3__Impl : ( ( rule__PerspectivePart__UnorderedGroup_3 ) ) ;
     public final void rule__PerspectivePart__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5730:1: ( ( ( rule__PerspectivePart__UnorderedGroup_3 ) ) )
-            // InternalPerspectiveDsl.g:5731:1: ( ( rule__PerspectivePart__UnorderedGroup_3 ) )
+            // InternalPerspectiveDsl.g:5732:1: ( ( ( rule__PerspectivePart__UnorderedGroup_3 ) ) )
+            // InternalPerspectiveDsl.g:5733:1: ( ( rule__PerspectivePart__UnorderedGroup_3 ) )
             {
-            // InternalPerspectiveDsl.g:5731:1: ( ( rule__PerspectivePart__UnorderedGroup_3 ) )
-            // InternalPerspectiveDsl.g:5732:2: ( rule__PerspectivePart__UnorderedGroup_3 )
+            // InternalPerspectiveDsl.g:5733:1: ( ( rule__PerspectivePart__UnorderedGroup_3 ) )
+            // InternalPerspectiveDsl.g:5734:2: ( rule__PerspectivePart__UnorderedGroup_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3()); 
             }
-            // InternalPerspectiveDsl.g:5733:2: ( rule__PerspectivePart__UnorderedGroup_3 )
-            // InternalPerspectiveDsl.g:5733:3: rule__PerspectivePart__UnorderedGroup_3
+            // InternalPerspectiveDsl.g:5735:2: ( rule__PerspectivePart__UnorderedGroup_3 )
+            // InternalPerspectiveDsl.g:5735:3: rule__PerspectivePart__UnorderedGroup_3
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePart__UnorderedGroup_3();
@@ -20320,14 +20320,14 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group_3_0__0"
-    // InternalPerspectiveDsl.g:5742:1: rule__PerspectivePart__Group_3_0__0 : rule__PerspectivePart__Group_3_0__0__Impl rule__PerspectivePart__Group_3_0__1 ;
+    // InternalPerspectiveDsl.g:5744:1: rule__PerspectivePart__Group_3_0__0 : rule__PerspectivePart__Group_3_0__0__Impl rule__PerspectivePart__Group_3_0__1 ;
     public final void rule__PerspectivePart__Group_3_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5746:1: ( rule__PerspectivePart__Group_3_0__0__Impl rule__PerspectivePart__Group_3_0__1 )
-            // InternalPerspectiveDsl.g:5747:2: rule__PerspectivePart__Group_3_0__0__Impl rule__PerspectivePart__Group_3_0__1
+            // InternalPerspectiveDsl.g:5748:1: ( rule__PerspectivePart__Group_3_0__0__Impl rule__PerspectivePart__Group_3_0__1 )
+            // InternalPerspectiveDsl.g:5749:2: rule__PerspectivePart__Group_3_0__0__Impl rule__PerspectivePart__Group_3_0__1
             {
             pushFollow(FOLLOW_15);
             rule__PerspectivePart__Group_3_0__0__Impl();
@@ -20358,17 +20358,17 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group_3_0__0__Impl"
-    // InternalPerspectiveDsl.g:5754:1: rule__PerspectivePart__Group_3_0__0__Impl : ( 'spaceVolume' ) ;
+    // InternalPerspectiveDsl.g:5756:1: rule__PerspectivePart__Group_3_0__0__Impl : ( 'spaceVolume' ) ;
     public final void rule__PerspectivePart__Group_3_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5758:1: ( ( 'spaceVolume' ) )
-            // InternalPerspectiveDsl.g:5759:1: ( 'spaceVolume' )
+            // InternalPerspectiveDsl.g:5760:1: ( ( 'spaceVolume' ) )
+            // InternalPerspectiveDsl.g:5761:1: ( 'spaceVolume' )
             {
-            // InternalPerspectiveDsl.g:5759:1: ( 'spaceVolume' )
-            // InternalPerspectiveDsl.g:5760:2: 'spaceVolume'
+            // InternalPerspectiveDsl.g:5761:1: ( 'spaceVolume' )
+            // InternalPerspectiveDsl.g:5762:2: 'spaceVolume'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getSpaceVolumeKeyword_3_0_0()); 
@@ -20399,14 +20399,14 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group_3_0__1"
-    // InternalPerspectiveDsl.g:5769:1: rule__PerspectivePart__Group_3_0__1 : rule__PerspectivePart__Group_3_0__1__Impl ;
+    // InternalPerspectiveDsl.g:5771:1: rule__PerspectivePart__Group_3_0__1 : rule__PerspectivePart__Group_3_0__1__Impl ;
     public final void rule__PerspectivePart__Group_3_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5773:1: ( rule__PerspectivePart__Group_3_0__1__Impl )
-            // InternalPerspectiveDsl.g:5774:2: rule__PerspectivePart__Group_3_0__1__Impl
+            // InternalPerspectiveDsl.g:5775:1: ( rule__PerspectivePart__Group_3_0__1__Impl )
+            // InternalPerspectiveDsl.g:5776:2: rule__PerspectivePart__Group_3_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePart__Group_3_0__1__Impl();
@@ -20432,23 +20432,23 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group_3_0__1__Impl"
-    // InternalPerspectiveDsl.g:5780:1: rule__PerspectivePart__Group_3_0__1__Impl : ( ( rule__PerspectivePart__ContainerDataAssignment_3_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:5782:1: rule__PerspectivePart__Group_3_0__1__Impl : ( ( rule__PerspectivePart__ContainerDataAssignment_3_0_1 ) ) ;
     public final void rule__PerspectivePart__Group_3_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5784:1: ( ( ( rule__PerspectivePart__ContainerDataAssignment_3_0_1 ) ) )
-            // InternalPerspectiveDsl.g:5785:1: ( ( rule__PerspectivePart__ContainerDataAssignment_3_0_1 ) )
+            // InternalPerspectiveDsl.g:5786:1: ( ( ( rule__PerspectivePart__ContainerDataAssignment_3_0_1 ) ) )
+            // InternalPerspectiveDsl.g:5787:1: ( ( rule__PerspectivePart__ContainerDataAssignment_3_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:5785:1: ( ( rule__PerspectivePart__ContainerDataAssignment_3_0_1 ) )
-            // InternalPerspectiveDsl.g:5786:2: ( rule__PerspectivePart__ContainerDataAssignment_3_0_1 )
+            // InternalPerspectiveDsl.g:5787:1: ( ( rule__PerspectivePart__ContainerDataAssignment_3_0_1 ) )
+            // InternalPerspectiveDsl.g:5788:2: ( rule__PerspectivePart__ContainerDataAssignment_3_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getContainerDataAssignment_3_0_1()); 
             }
-            // InternalPerspectiveDsl.g:5787:2: ( rule__PerspectivePart__ContainerDataAssignment_3_0_1 )
-            // InternalPerspectiveDsl.g:5787:3: rule__PerspectivePart__ContainerDataAssignment_3_0_1
+            // InternalPerspectiveDsl.g:5789:2: ( rule__PerspectivePart__ContainerDataAssignment_3_0_1 )
+            // InternalPerspectiveDsl.g:5789:3: rule__PerspectivePart__ContainerDataAssignment_3_0_1
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePart__ContainerDataAssignment_3_0_1();
@@ -20483,14 +20483,14 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group_3_1__0"
-    // InternalPerspectiveDsl.g:5796:1: rule__PerspectivePart__Group_3_1__0 : rule__PerspectivePart__Group_3_1__0__Impl rule__PerspectivePart__Group_3_1__1 ;
+    // InternalPerspectiveDsl.g:5798:1: rule__PerspectivePart__Group_3_1__0 : rule__PerspectivePart__Group_3_1__0__Impl rule__PerspectivePart__Group_3_1__1 ;
     public final void rule__PerspectivePart__Group_3_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5800:1: ( rule__PerspectivePart__Group_3_1__0__Impl rule__PerspectivePart__Group_3_1__1 )
-            // InternalPerspectiveDsl.g:5801:2: rule__PerspectivePart__Group_3_1__0__Impl rule__PerspectivePart__Group_3_1__1
+            // InternalPerspectiveDsl.g:5802:1: ( rule__PerspectivePart__Group_3_1__0__Impl rule__PerspectivePart__Group_3_1__1 )
+            // InternalPerspectiveDsl.g:5803:2: rule__PerspectivePart__Group_3_1__0__Impl rule__PerspectivePart__Group_3_1__1
             {
             pushFollow(FOLLOW_15);
             rule__PerspectivePart__Group_3_1__0__Impl();
@@ -20521,17 +20521,17 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group_3_1__0__Impl"
-    // InternalPerspectiveDsl.g:5808:1: rule__PerspectivePart__Group_3_1__0__Impl : ( 'accessibility' ) ;
+    // InternalPerspectiveDsl.g:5810:1: rule__PerspectivePart__Group_3_1__0__Impl : ( 'accessibility' ) ;
     public final void rule__PerspectivePart__Group_3_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5812:1: ( ( 'accessibility' ) )
-            // InternalPerspectiveDsl.g:5813:1: ( 'accessibility' )
+            // InternalPerspectiveDsl.g:5814:1: ( ( 'accessibility' ) )
+            // InternalPerspectiveDsl.g:5815:1: ( 'accessibility' )
             {
-            // InternalPerspectiveDsl.g:5813:1: ( 'accessibility' )
-            // InternalPerspectiveDsl.g:5814:2: 'accessibility'
+            // InternalPerspectiveDsl.g:5815:1: ( 'accessibility' )
+            // InternalPerspectiveDsl.g:5816:2: 'accessibility'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getAccessibilityKeyword_3_1_0()); 
@@ -20562,14 +20562,14 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group_3_1__1"
-    // InternalPerspectiveDsl.g:5823:1: rule__PerspectivePart__Group_3_1__1 : rule__PerspectivePart__Group_3_1__1__Impl ;
+    // InternalPerspectiveDsl.g:5825:1: rule__PerspectivePart__Group_3_1__1 : rule__PerspectivePart__Group_3_1__1__Impl ;
     public final void rule__PerspectivePart__Group_3_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5827:1: ( rule__PerspectivePart__Group_3_1__1__Impl )
-            // InternalPerspectiveDsl.g:5828:2: rule__PerspectivePart__Group_3_1__1__Impl
+            // InternalPerspectiveDsl.g:5829:1: ( rule__PerspectivePart__Group_3_1__1__Impl )
+            // InternalPerspectiveDsl.g:5830:2: rule__PerspectivePart__Group_3_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePart__Group_3_1__1__Impl();
@@ -20595,23 +20595,23 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group_3_1__1__Impl"
-    // InternalPerspectiveDsl.g:5834:1: rule__PerspectivePart__Group_3_1__1__Impl : ( ( rule__PerspectivePart__AccessibilityPhraseAssignment_3_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:5836:1: rule__PerspectivePart__Group_3_1__1__Impl : ( ( rule__PerspectivePart__AccessibilityPhraseAssignment_3_1_1 ) ) ;
     public final void rule__PerspectivePart__Group_3_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5838:1: ( ( ( rule__PerspectivePart__AccessibilityPhraseAssignment_3_1_1 ) ) )
-            // InternalPerspectiveDsl.g:5839:1: ( ( rule__PerspectivePart__AccessibilityPhraseAssignment_3_1_1 ) )
+            // InternalPerspectiveDsl.g:5840:1: ( ( ( rule__PerspectivePart__AccessibilityPhraseAssignment_3_1_1 ) ) )
+            // InternalPerspectiveDsl.g:5841:1: ( ( rule__PerspectivePart__AccessibilityPhraseAssignment_3_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:5839:1: ( ( rule__PerspectivePart__AccessibilityPhraseAssignment_3_1_1 ) )
-            // InternalPerspectiveDsl.g:5840:2: ( rule__PerspectivePart__AccessibilityPhraseAssignment_3_1_1 )
+            // InternalPerspectiveDsl.g:5841:1: ( ( rule__PerspectivePart__AccessibilityPhraseAssignment_3_1_1 ) )
+            // InternalPerspectiveDsl.g:5842:2: ( rule__PerspectivePart__AccessibilityPhraseAssignment_3_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getAccessibilityPhraseAssignment_3_1_1()); 
             }
-            // InternalPerspectiveDsl.g:5841:2: ( rule__PerspectivePart__AccessibilityPhraseAssignment_3_1_1 )
-            // InternalPerspectiveDsl.g:5841:3: rule__PerspectivePart__AccessibilityPhraseAssignment_3_1_1
+            // InternalPerspectiveDsl.g:5843:2: ( rule__PerspectivePart__AccessibilityPhraseAssignment_3_1_1 )
+            // InternalPerspectiveDsl.g:5843:3: rule__PerspectivePart__AccessibilityPhraseAssignment_3_1_1
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePart__AccessibilityPhraseAssignment_3_1_1();
@@ -20646,14 +20646,14 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group_3_2__0"
-    // InternalPerspectiveDsl.g:5850:1: rule__PerspectivePart__Group_3_2__0 : rule__PerspectivePart__Group_3_2__0__Impl rule__PerspectivePart__Group_3_2__1 ;
+    // InternalPerspectiveDsl.g:5852:1: rule__PerspectivePart__Group_3_2__0 : rule__PerspectivePart__Group_3_2__0__Impl rule__PerspectivePart__Group_3_2__1 ;
     public final void rule__PerspectivePart__Group_3_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5854:1: ( rule__PerspectivePart__Group_3_2__0__Impl rule__PerspectivePart__Group_3_2__1 )
-            // InternalPerspectiveDsl.g:5855:2: rule__PerspectivePart__Group_3_2__0__Impl rule__PerspectivePart__Group_3_2__1
+            // InternalPerspectiveDsl.g:5856:1: ( rule__PerspectivePart__Group_3_2__0__Impl rule__PerspectivePart__Group_3_2__1 )
+            // InternalPerspectiveDsl.g:5857:2: rule__PerspectivePart__Group_3_2__0__Impl rule__PerspectivePart__Group_3_2__1
             {
             pushFollow(FOLLOW_15);
             rule__PerspectivePart__Group_3_2__0__Impl();
@@ -20684,17 +20684,17 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group_3_2__0__Impl"
-    // InternalPerspectiveDsl.g:5862:1: rule__PerspectivePart__Group_3_2__0__Impl : ( 'iconURI' ) ;
+    // InternalPerspectiveDsl.g:5864:1: rule__PerspectivePart__Group_3_2__0__Impl : ( 'iconURI' ) ;
     public final void rule__PerspectivePart__Group_3_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5866:1: ( ( 'iconURI' ) )
-            // InternalPerspectiveDsl.g:5867:1: ( 'iconURI' )
+            // InternalPerspectiveDsl.g:5868:1: ( ( 'iconURI' ) )
+            // InternalPerspectiveDsl.g:5869:1: ( 'iconURI' )
             {
-            // InternalPerspectiveDsl.g:5867:1: ( 'iconURI' )
-            // InternalPerspectiveDsl.g:5868:2: 'iconURI'
+            // InternalPerspectiveDsl.g:5869:1: ( 'iconURI' )
+            // InternalPerspectiveDsl.g:5870:2: 'iconURI'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getIconURIKeyword_3_2_0()); 
@@ -20725,14 +20725,14 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group_3_2__1"
-    // InternalPerspectiveDsl.g:5877:1: rule__PerspectivePart__Group_3_2__1 : rule__PerspectivePart__Group_3_2__1__Impl ;
+    // InternalPerspectiveDsl.g:5879:1: rule__PerspectivePart__Group_3_2__1 : rule__PerspectivePart__Group_3_2__1__Impl ;
     public final void rule__PerspectivePart__Group_3_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5881:1: ( rule__PerspectivePart__Group_3_2__1__Impl )
-            // InternalPerspectiveDsl.g:5882:2: rule__PerspectivePart__Group_3_2__1__Impl
+            // InternalPerspectiveDsl.g:5883:1: ( rule__PerspectivePart__Group_3_2__1__Impl )
+            // InternalPerspectiveDsl.g:5884:2: rule__PerspectivePart__Group_3_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePart__Group_3_2__1__Impl();
@@ -20758,23 +20758,23 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group_3_2__1__Impl"
-    // InternalPerspectiveDsl.g:5888:1: rule__PerspectivePart__Group_3_2__1__Impl : ( ( rule__PerspectivePart__IconURIAssignment_3_2_1 ) ) ;
+    // InternalPerspectiveDsl.g:5890:1: rule__PerspectivePart__Group_3_2__1__Impl : ( ( rule__PerspectivePart__IconURIAssignment_3_2_1 ) ) ;
     public final void rule__PerspectivePart__Group_3_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5892:1: ( ( ( rule__PerspectivePart__IconURIAssignment_3_2_1 ) ) )
-            // InternalPerspectiveDsl.g:5893:1: ( ( rule__PerspectivePart__IconURIAssignment_3_2_1 ) )
+            // InternalPerspectiveDsl.g:5894:1: ( ( ( rule__PerspectivePart__IconURIAssignment_3_2_1 ) ) )
+            // InternalPerspectiveDsl.g:5895:1: ( ( rule__PerspectivePart__IconURIAssignment_3_2_1 ) )
             {
-            // InternalPerspectiveDsl.g:5893:1: ( ( rule__PerspectivePart__IconURIAssignment_3_2_1 ) )
-            // InternalPerspectiveDsl.g:5894:2: ( rule__PerspectivePart__IconURIAssignment_3_2_1 )
+            // InternalPerspectiveDsl.g:5895:1: ( ( rule__PerspectivePart__IconURIAssignment_3_2_1 ) )
+            // InternalPerspectiveDsl.g:5896:2: ( rule__PerspectivePart__IconURIAssignment_3_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getIconURIAssignment_3_2_1()); 
             }
-            // InternalPerspectiveDsl.g:5895:2: ( rule__PerspectivePart__IconURIAssignment_3_2_1 )
-            // InternalPerspectiveDsl.g:5895:3: rule__PerspectivePart__IconURIAssignment_3_2_1
+            // InternalPerspectiveDsl.g:5897:2: ( rule__PerspectivePart__IconURIAssignment_3_2_1 )
+            // InternalPerspectiveDsl.g:5897:3: rule__PerspectivePart__IconURIAssignment_3_2_1
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePart__IconURIAssignment_3_2_1();
@@ -20809,14 +20809,14 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group_3_3__0"
-    // InternalPerspectiveDsl.g:5904:1: rule__PerspectivePart__Group_3_3__0 : rule__PerspectivePart__Group_3_3__0__Impl rule__PerspectivePart__Group_3_3__1 ;
+    // InternalPerspectiveDsl.g:5906:1: rule__PerspectivePart__Group_3_3__0 : rule__PerspectivePart__Group_3_3__0__Impl rule__PerspectivePart__Group_3_3__1 ;
     public final void rule__PerspectivePart__Group_3_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5908:1: ( rule__PerspectivePart__Group_3_3__0__Impl rule__PerspectivePart__Group_3_3__1 )
-            // InternalPerspectiveDsl.g:5909:2: rule__PerspectivePart__Group_3_3__0__Impl rule__PerspectivePart__Group_3_3__1
+            // InternalPerspectiveDsl.g:5910:1: ( rule__PerspectivePart__Group_3_3__0__Impl rule__PerspectivePart__Group_3_3__1 )
+            // InternalPerspectiveDsl.g:5911:2: rule__PerspectivePart__Group_3_3__0__Impl rule__PerspectivePart__Group_3_3__1
             {
             pushFollow(FOLLOW_24);
             rule__PerspectivePart__Group_3_3__0__Impl();
@@ -20847,17 +20847,17 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group_3_3__0__Impl"
-    // InternalPerspectiveDsl.g:5916:1: rule__PerspectivePart__Group_3_3__0__Impl : ( 'view' ) ;
+    // InternalPerspectiveDsl.g:5918:1: rule__PerspectivePart__Group_3_3__0__Impl : ( 'view' ) ;
     public final void rule__PerspectivePart__Group_3_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5920:1: ( ( 'view' ) )
-            // InternalPerspectiveDsl.g:5921:1: ( 'view' )
+            // InternalPerspectiveDsl.g:5922:1: ( ( 'view' ) )
+            // InternalPerspectiveDsl.g:5923:1: ( 'view' )
             {
-            // InternalPerspectiveDsl.g:5921:1: ( 'view' )
-            // InternalPerspectiveDsl.g:5922:2: 'view'
+            // InternalPerspectiveDsl.g:5923:1: ( 'view' )
+            // InternalPerspectiveDsl.g:5924:2: 'view'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getViewKeyword_3_3_0()); 
@@ -20888,14 +20888,14 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group_3_3__1"
-    // InternalPerspectiveDsl.g:5931:1: rule__PerspectivePart__Group_3_3__1 : rule__PerspectivePart__Group_3_3__1__Impl ;
+    // InternalPerspectiveDsl.g:5933:1: rule__PerspectivePart__Group_3_3__1 : rule__PerspectivePart__Group_3_3__1__Impl ;
     public final void rule__PerspectivePart__Group_3_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5935:1: ( rule__PerspectivePart__Group_3_3__1__Impl )
-            // InternalPerspectiveDsl.g:5936:2: rule__PerspectivePart__Group_3_3__1__Impl
+            // InternalPerspectiveDsl.g:5937:1: ( rule__PerspectivePart__Group_3_3__1__Impl )
+            // InternalPerspectiveDsl.g:5938:2: rule__PerspectivePart__Group_3_3__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePart__Group_3_3__1__Impl();
@@ -20921,23 +20921,23 @@
 
 
     // $ANTLR start "rule__PerspectivePart__Group_3_3__1__Impl"
-    // InternalPerspectiveDsl.g:5942:1: rule__PerspectivePart__Group_3_3__1__Impl : ( ( rule__PerspectivePart__ViewAssignment_3_3_1 ) ) ;
+    // InternalPerspectiveDsl.g:5944:1: rule__PerspectivePart__Group_3_3__1__Impl : ( ( rule__PerspectivePart__ViewAssignment_3_3_1 ) ) ;
     public final void rule__PerspectivePart__Group_3_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5946:1: ( ( ( rule__PerspectivePart__ViewAssignment_3_3_1 ) ) )
-            // InternalPerspectiveDsl.g:5947:1: ( ( rule__PerspectivePart__ViewAssignment_3_3_1 ) )
+            // InternalPerspectiveDsl.g:5948:1: ( ( ( rule__PerspectivePart__ViewAssignment_3_3_1 ) ) )
+            // InternalPerspectiveDsl.g:5949:1: ( ( rule__PerspectivePart__ViewAssignment_3_3_1 ) )
             {
-            // InternalPerspectiveDsl.g:5947:1: ( ( rule__PerspectivePart__ViewAssignment_3_3_1 ) )
-            // InternalPerspectiveDsl.g:5948:2: ( rule__PerspectivePart__ViewAssignment_3_3_1 )
+            // InternalPerspectiveDsl.g:5949:1: ( ( rule__PerspectivePart__ViewAssignment_3_3_1 ) )
+            // InternalPerspectiveDsl.g:5950:2: ( rule__PerspectivePart__ViewAssignment_3_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getViewAssignment_3_3_1()); 
             }
-            // InternalPerspectiveDsl.g:5949:2: ( rule__PerspectivePart__ViewAssignment_3_3_1 )
-            // InternalPerspectiveDsl.g:5949:3: rule__PerspectivePart__ViewAssignment_3_3_1
+            // InternalPerspectiveDsl.g:5951:2: ( rule__PerspectivePart__ViewAssignment_3_3_1 )
+            // InternalPerspectiveDsl.g:5951:3: rule__PerspectivePart__ViewAssignment_3_3_1
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePart__ViewAssignment_3_3_1();
@@ -20972,14 +20972,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSelection__Group__0"
-    // InternalPerspectiveDsl.g:5958:1: rule__PerspectiveSelection__Group__0 : rule__PerspectiveSelection__Group__0__Impl rule__PerspectiveSelection__Group__1 ;
+    // InternalPerspectiveDsl.g:5960:1: rule__PerspectiveSelection__Group__0 : rule__PerspectiveSelection__Group__0__Impl rule__PerspectiveSelection__Group__1 ;
     public final void rule__PerspectiveSelection__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5962:1: ( rule__PerspectiveSelection__Group__0__Impl rule__PerspectiveSelection__Group__1 )
-            // InternalPerspectiveDsl.g:5963:2: rule__PerspectiveSelection__Group__0__Impl rule__PerspectiveSelection__Group__1
+            // InternalPerspectiveDsl.g:5964:1: ( rule__PerspectiveSelection__Group__0__Impl rule__PerspectiveSelection__Group__1 )
+            // InternalPerspectiveDsl.g:5965:2: rule__PerspectiveSelection__Group__0__Impl rule__PerspectiveSelection__Group__1
             {
             pushFollow(FOLLOW_25);
             rule__PerspectiveSelection__Group__0__Impl();
@@ -21010,23 +21010,23 @@
 
 
     // $ANTLR start "rule__PerspectiveSelection__Group__0__Impl"
-    // InternalPerspectiveDsl.g:5970:1: rule__PerspectiveSelection__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:5972:1: rule__PerspectiveSelection__Group__0__Impl : ( () ) ;
     public final void rule__PerspectiveSelection__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5974:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:5975:1: ( () )
+            // InternalPerspectiveDsl.g:5976:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:5977:1: ( () )
             {
-            // InternalPerspectiveDsl.g:5975:1: ( () )
-            // InternalPerspectiveDsl.g:5976:2: ()
+            // InternalPerspectiveDsl.g:5977:1: ( () )
+            // InternalPerspectiveDsl.g:5978:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSelectionAccess().getPerspectiveSelectionAction_0()); 
             }
-            // InternalPerspectiveDsl.g:5977:2: ()
-            // InternalPerspectiveDsl.g:5977:3: 
+            // InternalPerspectiveDsl.g:5979:2: ()
+            // InternalPerspectiveDsl.g:5979:3: 
             {
             }
 
@@ -21051,14 +21051,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSelection__Group__1"
-    // InternalPerspectiveDsl.g:5985:1: rule__PerspectiveSelection__Group__1 : rule__PerspectiveSelection__Group__1__Impl rule__PerspectiveSelection__Group__2 ;
+    // InternalPerspectiveDsl.g:5987:1: rule__PerspectiveSelection__Group__1 : rule__PerspectiveSelection__Group__1__Impl rule__PerspectiveSelection__Group__2 ;
     public final void rule__PerspectiveSelection__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:5989:1: ( rule__PerspectiveSelection__Group__1__Impl rule__PerspectiveSelection__Group__2 )
-            // InternalPerspectiveDsl.g:5990:2: rule__PerspectiveSelection__Group__1__Impl rule__PerspectiveSelection__Group__2
+            // InternalPerspectiveDsl.g:5991:1: ( rule__PerspectiveSelection__Group__1__Impl rule__PerspectiveSelection__Group__2 )
+            // InternalPerspectiveDsl.g:5992:2: rule__PerspectiveSelection__Group__1__Impl rule__PerspectiveSelection__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__PerspectiveSelection__Group__1__Impl();
@@ -21089,17 +21089,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSelection__Group__1__Impl"
-    // InternalPerspectiveDsl.g:5997:1: rule__PerspectiveSelection__Group__1__Impl : ( 'select' ) ;
+    // InternalPerspectiveDsl.g:5999:1: rule__PerspectiveSelection__Group__1__Impl : ( 'select' ) ;
     public final void rule__PerspectiveSelection__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6001:1: ( ( 'select' ) )
-            // InternalPerspectiveDsl.g:6002:1: ( 'select' )
+            // InternalPerspectiveDsl.g:6003:1: ( ( 'select' ) )
+            // InternalPerspectiveDsl.g:6004:1: ( 'select' )
             {
-            // InternalPerspectiveDsl.g:6002:1: ( 'select' )
-            // InternalPerspectiveDsl.g:6003:2: 'select'
+            // InternalPerspectiveDsl.g:6004:1: ( 'select' )
+            // InternalPerspectiveDsl.g:6005:2: 'select'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSelectionAccess().getSelectKeyword_1()); 
@@ -21130,14 +21130,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSelection__Group__2"
-    // InternalPerspectiveDsl.g:6012:1: rule__PerspectiveSelection__Group__2 : rule__PerspectiveSelection__Group__2__Impl ;
+    // InternalPerspectiveDsl.g:6014:1: rule__PerspectiveSelection__Group__2 : rule__PerspectiveSelection__Group__2__Impl ;
     public final void rule__PerspectiveSelection__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6016:1: ( rule__PerspectiveSelection__Group__2__Impl )
-            // InternalPerspectiveDsl.g:6017:2: rule__PerspectiveSelection__Group__2__Impl
+            // InternalPerspectiveDsl.g:6018:1: ( rule__PerspectiveSelection__Group__2__Impl )
+            // InternalPerspectiveDsl.g:6019:2: rule__PerspectiveSelection__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSelection__Group__2__Impl();
@@ -21163,23 +21163,23 @@
 
 
     // $ANTLR start "rule__PerspectiveSelection__Group__2__Impl"
-    // InternalPerspectiveDsl.g:6023:1: rule__PerspectiveSelection__Group__2__Impl : ( ( rule__PerspectiveSelection__RefAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:6025:1: rule__PerspectiveSelection__Group__2__Impl : ( ( rule__PerspectiveSelection__RefAssignment_2 ) ) ;
     public final void rule__PerspectiveSelection__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6027:1: ( ( ( rule__PerspectiveSelection__RefAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:6028:1: ( ( rule__PerspectiveSelection__RefAssignment_2 ) )
+            // InternalPerspectiveDsl.g:6029:1: ( ( ( rule__PerspectiveSelection__RefAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:6030:1: ( ( rule__PerspectiveSelection__RefAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:6028:1: ( ( rule__PerspectiveSelection__RefAssignment_2 ) )
-            // InternalPerspectiveDsl.g:6029:2: ( rule__PerspectiveSelection__RefAssignment_2 )
+            // InternalPerspectiveDsl.g:6030:1: ( ( rule__PerspectiveSelection__RefAssignment_2 ) )
+            // InternalPerspectiveDsl.g:6031:2: ( rule__PerspectiveSelection__RefAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSelectionAccess().getRefAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:6030:2: ( rule__PerspectiveSelection__RefAssignment_2 )
-            // InternalPerspectiveDsl.g:6030:3: rule__PerspectiveSelection__RefAssignment_2
+            // InternalPerspectiveDsl.g:6032:2: ( rule__PerspectiveSelection__RefAssignment_2 )
+            // InternalPerspectiveDsl.g:6032:3: rule__PerspectiveSelection__RefAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSelection__RefAssignment_2();
@@ -21214,14 +21214,14 @@
 
 
     // $ANTLR start "rule__PerspectiveTable__Group__0"
-    // InternalPerspectiveDsl.g:6039:1: rule__PerspectiveTable__Group__0 : rule__PerspectiveTable__Group__0__Impl rule__PerspectiveTable__Group__1 ;
+    // InternalPerspectiveDsl.g:6041:1: rule__PerspectiveTable__Group__0 : rule__PerspectiveTable__Group__0__Impl rule__PerspectiveTable__Group__1 ;
     public final void rule__PerspectiveTable__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6043:1: ( rule__PerspectiveTable__Group__0__Impl rule__PerspectiveTable__Group__1 )
-            // InternalPerspectiveDsl.g:6044:2: rule__PerspectiveTable__Group__0__Impl rule__PerspectiveTable__Group__1
+            // InternalPerspectiveDsl.g:6045:1: ( rule__PerspectiveTable__Group__0__Impl rule__PerspectiveTable__Group__1 )
+            // InternalPerspectiveDsl.g:6046:2: rule__PerspectiveTable__Group__0__Impl rule__PerspectiveTable__Group__1
             {
             pushFollow(FOLLOW_26);
             rule__PerspectiveTable__Group__0__Impl();
@@ -21252,23 +21252,23 @@
 
 
     // $ANTLR start "rule__PerspectiveTable__Group__0__Impl"
-    // InternalPerspectiveDsl.g:6051:1: rule__PerspectiveTable__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:6053:1: rule__PerspectiveTable__Group__0__Impl : ( () ) ;
     public final void rule__PerspectiveTable__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6055:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:6056:1: ( () )
+            // InternalPerspectiveDsl.g:6057:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:6058:1: ( () )
             {
-            // InternalPerspectiveDsl.g:6056:1: ( () )
-            // InternalPerspectiveDsl.g:6057:2: ()
+            // InternalPerspectiveDsl.g:6058:1: ( () )
+            // InternalPerspectiveDsl.g:6059:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTableAccess().getPerspectiveTableAction_0()); 
             }
-            // InternalPerspectiveDsl.g:6058:2: ()
-            // InternalPerspectiveDsl.g:6058:3: 
+            // InternalPerspectiveDsl.g:6060:2: ()
+            // InternalPerspectiveDsl.g:6060:3: 
             {
             }
 
@@ -21293,14 +21293,14 @@
 
 
     // $ANTLR start "rule__PerspectiveTable__Group__1"
-    // InternalPerspectiveDsl.g:6066:1: rule__PerspectiveTable__Group__1 : rule__PerspectiveTable__Group__1__Impl rule__PerspectiveTable__Group__2 ;
+    // InternalPerspectiveDsl.g:6068:1: rule__PerspectiveTable__Group__1 : rule__PerspectiveTable__Group__1__Impl rule__PerspectiveTable__Group__2 ;
     public final void rule__PerspectiveTable__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6070:1: ( rule__PerspectiveTable__Group__1__Impl rule__PerspectiveTable__Group__2 )
-            // InternalPerspectiveDsl.g:6071:2: rule__PerspectiveTable__Group__1__Impl rule__PerspectiveTable__Group__2
+            // InternalPerspectiveDsl.g:6072:1: ( rule__PerspectiveTable__Group__1__Impl rule__PerspectiveTable__Group__2 )
+            // InternalPerspectiveDsl.g:6073:2: rule__PerspectiveTable__Group__1__Impl rule__PerspectiveTable__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__PerspectiveTable__Group__1__Impl();
@@ -21331,17 +21331,17 @@
 
 
     // $ANTLR start "rule__PerspectiveTable__Group__1__Impl"
-    // InternalPerspectiveDsl.g:6078:1: rule__PerspectiveTable__Group__1__Impl : ( 'readOnlyTable' ) ;
+    // InternalPerspectiveDsl.g:6080:1: rule__PerspectiveTable__Group__1__Impl : ( 'readOnlyTable' ) ;
     public final void rule__PerspectiveTable__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6082:1: ( ( 'readOnlyTable' ) )
-            // InternalPerspectiveDsl.g:6083:1: ( 'readOnlyTable' )
+            // InternalPerspectiveDsl.g:6084:1: ( ( 'readOnlyTable' ) )
+            // InternalPerspectiveDsl.g:6085:1: ( 'readOnlyTable' )
             {
-            // InternalPerspectiveDsl.g:6083:1: ( 'readOnlyTable' )
-            // InternalPerspectiveDsl.g:6084:2: 'readOnlyTable'
+            // InternalPerspectiveDsl.g:6085:1: ( 'readOnlyTable' )
+            // InternalPerspectiveDsl.g:6086:2: 'readOnlyTable'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTableAccess().getReadOnlyTableKeyword_1()); 
@@ -21372,14 +21372,14 @@
 
 
     // $ANTLR start "rule__PerspectiveTable__Group__2"
-    // InternalPerspectiveDsl.g:6093:1: rule__PerspectiveTable__Group__2 : rule__PerspectiveTable__Group__2__Impl ;
+    // InternalPerspectiveDsl.g:6095:1: rule__PerspectiveTable__Group__2 : rule__PerspectiveTable__Group__2__Impl ;
     public final void rule__PerspectiveTable__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6097:1: ( rule__PerspectiveTable__Group__2__Impl )
-            // InternalPerspectiveDsl.g:6098:2: rule__PerspectiveTable__Group__2__Impl
+            // InternalPerspectiveDsl.g:6099:1: ( rule__PerspectiveTable__Group__2__Impl )
+            // InternalPerspectiveDsl.g:6100:2: rule__PerspectiveTable__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveTable__Group__2__Impl();
@@ -21405,23 +21405,23 @@
 
 
     // $ANTLR start "rule__PerspectiveTable__Group__2__Impl"
-    // InternalPerspectiveDsl.g:6104:1: rule__PerspectiveTable__Group__2__Impl : ( ( rule__PerspectiveTable__RefAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:6106:1: rule__PerspectiveTable__Group__2__Impl : ( ( rule__PerspectiveTable__RefAssignment_2 ) ) ;
     public final void rule__PerspectiveTable__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6108:1: ( ( ( rule__PerspectiveTable__RefAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:6109:1: ( ( rule__PerspectiveTable__RefAssignment_2 ) )
+            // InternalPerspectiveDsl.g:6110:1: ( ( ( rule__PerspectiveTable__RefAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:6111:1: ( ( rule__PerspectiveTable__RefAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:6109:1: ( ( rule__PerspectiveTable__RefAssignment_2 ) )
-            // InternalPerspectiveDsl.g:6110:2: ( rule__PerspectiveTable__RefAssignment_2 )
+            // InternalPerspectiveDsl.g:6111:1: ( ( rule__PerspectiveTable__RefAssignment_2 ) )
+            // InternalPerspectiveDsl.g:6112:2: ( rule__PerspectiveTable__RefAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTableAccess().getRefAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:6111:2: ( rule__PerspectiveTable__RefAssignment_2 )
-            // InternalPerspectiveDsl.g:6111:3: rule__PerspectiveTable__RefAssignment_2
+            // InternalPerspectiveDsl.g:6113:2: ( rule__PerspectiveTable__RefAssignment_2 )
+            // InternalPerspectiveDsl.g:6113:3: rule__PerspectiveTable__RefAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveTable__RefAssignment_2();
@@ -21456,14 +21456,14 @@
 
 
     // $ANTLR start "rule__PerspectiveGrid__Group__0"
-    // InternalPerspectiveDsl.g:6120:1: rule__PerspectiveGrid__Group__0 : rule__PerspectiveGrid__Group__0__Impl rule__PerspectiveGrid__Group__1 ;
+    // InternalPerspectiveDsl.g:6122:1: rule__PerspectiveGrid__Group__0 : rule__PerspectiveGrid__Group__0__Impl rule__PerspectiveGrid__Group__1 ;
     public final void rule__PerspectiveGrid__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6124:1: ( rule__PerspectiveGrid__Group__0__Impl rule__PerspectiveGrid__Group__1 )
-            // InternalPerspectiveDsl.g:6125:2: rule__PerspectiveGrid__Group__0__Impl rule__PerspectiveGrid__Group__1
+            // InternalPerspectiveDsl.g:6126:1: ( rule__PerspectiveGrid__Group__0__Impl rule__PerspectiveGrid__Group__1 )
+            // InternalPerspectiveDsl.g:6127:2: rule__PerspectiveGrid__Group__0__Impl rule__PerspectiveGrid__Group__1
             {
             pushFollow(FOLLOW_27);
             rule__PerspectiveGrid__Group__0__Impl();
@@ -21494,23 +21494,23 @@
 
 
     // $ANTLR start "rule__PerspectiveGrid__Group__0__Impl"
-    // InternalPerspectiveDsl.g:6132:1: rule__PerspectiveGrid__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:6134:1: rule__PerspectiveGrid__Group__0__Impl : ( () ) ;
     public final void rule__PerspectiveGrid__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6136:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:6137:1: ( () )
+            // InternalPerspectiveDsl.g:6138:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:6139:1: ( () )
             {
-            // InternalPerspectiveDsl.g:6137:1: ( () )
-            // InternalPerspectiveDsl.g:6138:2: ()
+            // InternalPerspectiveDsl.g:6139:1: ( () )
+            // InternalPerspectiveDsl.g:6140:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveGridAccess().getPerspectiveGridAction_0()); 
             }
-            // InternalPerspectiveDsl.g:6139:2: ()
-            // InternalPerspectiveDsl.g:6139:3: 
+            // InternalPerspectiveDsl.g:6141:2: ()
+            // InternalPerspectiveDsl.g:6141:3: 
             {
             }
 
@@ -21535,14 +21535,14 @@
 
 
     // $ANTLR start "rule__PerspectiveGrid__Group__1"
-    // InternalPerspectiveDsl.g:6147:1: rule__PerspectiveGrid__Group__1 : rule__PerspectiveGrid__Group__1__Impl rule__PerspectiveGrid__Group__2 ;
+    // InternalPerspectiveDsl.g:6149:1: rule__PerspectiveGrid__Group__1 : rule__PerspectiveGrid__Group__1__Impl rule__PerspectiveGrid__Group__2 ;
     public final void rule__PerspectiveGrid__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6151:1: ( rule__PerspectiveGrid__Group__1__Impl rule__PerspectiveGrid__Group__2 )
-            // InternalPerspectiveDsl.g:6152:2: rule__PerspectiveGrid__Group__1__Impl rule__PerspectiveGrid__Group__2
+            // InternalPerspectiveDsl.g:6153:1: ( rule__PerspectiveGrid__Group__1__Impl rule__PerspectiveGrid__Group__2 )
+            // InternalPerspectiveDsl.g:6154:2: rule__PerspectiveGrid__Group__1__Impl rule__PerspectiveGrid__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__PerspectiveGrid__Group__1__Impl();
@@ -21573,17 +21573,17 @@
 
 
     // $ANTLR start "rule__PerspectiveGrid__Group__1__Impl"
-    // InternalPerspectiveDsl.g:6159:1: rule__PerspectiveGrid__Group__1__Impl : ( 'editableTable' ) ;
+    // InternalPerspectiveDsl.g:6161:1: rule__PerspectiveGrid__Group__1__Impl : ( 'editableTable' ) ;
     public final void rule__PerspectiveGrid__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6163:1: ( ( 'editableTable' ) )
-            // InternalPerspectiveDsl.g:6164:1: ( 'editableTable' )
+            // InternalPerspectiveDsl.g:6165:1: ( ( 'editableTable' ) )
+            // InternalPerspectiveDsl.g:6166:1: ( 'editableTable' )
             {
-            // InternalPerspectiveDsl.g:6164:1: ( 'editableTable' )
-            // InternalPerspectiveDsl.g:6165:2: 'editableTable'
+            // InternalPerspectiveDsl.g:6166:1: ( 'editableTable' )
+            // InternalPerspectiveDsl.g:6167:2: 'editableTable'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveGridAccess().getEditableTableKeyword_1()); 
@@ -21614,14 +21614,14 @@
 
 
     // $ANTLR start "rule__PerspectiveGrid__Group__2"
-    // InternalPerspectiveDsl.g:6174:1: rule__PerspectiveGrid__Group__2 : rule__PerspectiveGrid__Group__2__Impl ;
+    // InternalPerspectiveDsl.g:6176:1: rule__PerspectiveGrid__Group__2 : rule__PerspectiveGrid__Group__2__Impl ;
     public final void rule__PerspectiveGrid__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6178:1: ( rule__PerspectiveGrid__Group__2__Impl )
-            // InternalPerspectiveDsl.g:6179:2: rule__PerspectiveGrid__Group__2__Impl
+            // InternalPerspectiveDsl.g:6180:1: ( rule__PerspectiveGrid__Group__2__Impl )
+            // InternalPerspectiveDsl.g:6181:2: rule__PerspectiveGrid__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveGrid__Group__2__Impl();
@@ -21647,23 +21647,23 @@
 
 
     // $ANTLR start "rule__PerspectiveGrid__Group__2__Impl"
-    // InternalPerspectiveDsl.g:6185:1: rule__PerspectiveGrid__Group__2__Impl : ( ( rule__PerspectiveGrid__RefAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:6187:1: rule__PerspectiveGrid__Group__2__Impl : ( ( rule__PerspectiveGrid__RefAssignment_2 ) ) ;
     public final void rule__PerspectiveGrid__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6189:1: ( ( ( rule__PerspectiveGrid__RefAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:6190:1: ( ( rule__PerspectiveGrid__RefAssignment_2 ) )
+            // InternalPerspectiveDsl.g:6191:1: ( ( ( rule__PerspectiveGrid__RefAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:6192:1: ( ( rule__PerspectiveGrid__RefAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:6190:1: ( ( rule__PerspectiveGrid__RefAssignment_2 ) )
-            // InternalPerspectiveDsl.g:6191:2: ( rule__PerspectiveGrid__RefAssignment_2 )
+            // InternalPerspectiveDsl.g:6192:1: ( ( rule__PerspectiveGrid__RefAssignment_2 ) )
+            // InternalPerspectiveDsl.g:6193:2: ( rule__PerspectiveGrid__RefAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveGridAccess().getRefAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:6192:2: ( rule__PerspectiveGrid__RefAssignment_2 )
-            // InternalPerspectiveDsl.g:6192:3: rule__PerspectiveGrid__RefAssignment_2
+            // InternalPerspectiveDsl.g:6194:2: ( rule__PerspectiveGrid__RefAssignment_2 )
+            // InternalPerspectiveDsl.g:6194:3: rule__PerspectiveGrid__RefAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveGrid__RefAssignment_2();
@@ -21698,14 +21698,14 @@
 
 
     // $ANTLR start "rule__PerspectiveChart__Group__0"
-    // InternalPerspectiveDsl.g:6201:1: rule__PerspectiveChart__Group__0 : rule__PerspectiveChart__Group__0__Impl rule__PerspectiveChart__Group__1 ;
+    // InternalPerspectiveDsl.g:6203:1: rule__PerspectiveChart__Group__0 : rule__PerspectiveChart__Group__0__Impl rule__PerspectiveChart__Group__1 ;
     public final void rule__PerspectiveChart__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6205:1: ( rule__PerspectiveChart__Group__0__Impl rule__PerspectiveChart__Group__1 )
-            // InternalPerspectiveDsl.g:6206:2: rule__PerspectiveChart__Group__0__Impl rule__PerspectiveChart__Group__1
+            // InternalPerspectiveDsl.g:6207:1: ( rule__PerspectiveChart__Group__0__Impl rule__PerspectiveChart__Group__1 )
+            // InternalPerspectiveDsl.g:6208:2: rule__PerspectiveChart__Group__0__Impl rule__PerspectiveChart__Group__1
             {
             pushFollow(FOLLOW_28);
             rule__PerspectiveChart__Group__0__Impl();
@@ -21736,23 +21736,23 @@
 
 
     // $ANTLR start "rule__PerspectiveChart__Group__0__Impl"
-    // InternalPerspectiveDsl.g:6213:1: rule__PerspectiveChart__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:6215:1: rule__PerspectiveChart__Group__0__Impl : ( () ) ;
     public final void rule__PerspectiveChart__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6217:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:6218:1: ( () )
+            // InternalPerspectiveDsl.g:6219:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:6220:1: ( () )
             {
-            // InternalPerspectiveDsl.g:6218:1: ( () )
-            // InternalPerspectiveDsl.g:6219:2: ()
+            // InternalPerspectiveDsl.g:6220:1: ( () )
+            // InternalPerspectiveDsl.g:6221:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveChartAccess().getPerspectiveChartAction_0()); 
             }
-            // InternalPerspectiveDsl.g:6220:2: ()
-            // InternalPerspectiveDsl.g:6220:3: 
+            // InternalPerspectiveDsl.g:6222:2: ()
+            // InternalPerspectiveDsl.g:6222:3: 
             {
             }
 
@@ -21777,14 +21777,14 @@
 
 
     // $ANTLR start "rule__PerspectiveChart__Group__1"
-    // InternalPerspectiveDsl.g:6228:1: rule__PerspectiveChart__Group__1 : rule__PerspectiveChart__Group__1__Impl rule__PerspectiveChart__Group__2 ;
+    // InternalPerspectiveDsl.g:6230:1: rule__PerspectiveChart__Group__1 : rule__PerspectiveChart__Group__1__Impl rule__PerspectiveChart__Group__2 ;
     public final void rule__PerspectiveChart__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6232:1: ( rule__PerspectiveChart__Group__1__Impl rule__PerspectiveChart__Group__2 )
-            // InternalPerspectiveDsl.g:6233:2: rule__PerspectiveChart__Group__1__Impl rule__PerspectiveChart__Group__2
+            // InternalPerspectiveDsl.g:6234:1: ( rule__PerspectiveChart__Group__1__Impl rule__PerspectiveChart__Group__2 )
+            // InternalPerspectiveDsl.g:6235:2: rule__PerspectiveChart__Group__1__Impl rule__PerspectiveChart__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__PerspectiveChart__Group__1__Impl();
@@ -21815,17 +21815,17 @@
 
 
     // $ANTLR start "rule__PerspectiveChart__Group__1__Impl"
-    // InternalPerspectiveDsl.g:6240:1: rule__PerspectiveChart__Group__1__Impl : ( 'chart' ) ;
+    // InternalPerspectiveDsl.g:6242:1: rule__PerspectiveChart__Group__1__Impl : ( 'chart' ) ;
     public final void rule__PerspectiveChart__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6244:1: ( ( 'chart' ) )
-            // InternalPerspectiveDsl.g:6245:1: ( 'chart' )
+            // InternalPerspectiveDsl.g:6246:1: ( ( 'chart' ) )
+            // InternalPerspectiveDsl.g:6247:1: ( 'chart' )
             {
-            // InternalPerspectiveDsl.g:6245:1: ( 'chart' )
-            // InternalPerspectiveDsl.g:6246:2: 'chart'
+            // InternalPerspectiveDsl.g:6247:1: ( 'chart' )
+            // InternalPerspectiveDsl.g:6248:2: 'chart'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveChartAccess().getChartKeyword_1()); 
@@ -21856,14 +21856,14 @@
 
 
     // $ANTLR start "rule__PerspectiveChart__Group__2"
-    // InternalPerspectiveDsl.g:6255:1: rule__PerspectiveChart__Group__2 : rule__PerspectiveChart__Group__2__Impl ;
+    // InternalPerspectiveDsl.g:6257:1: rule__PerspectiveChart__Group__2 : rule__PerspectiveChart__Group__2__Impl ;
     public final void rule__PerspectiveChart__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6259:1: ( rule__PerspectiveChart__Group__2__Impl )
-            // InternalPerspectiveDsl.g:6260:2: rule__PerspectiveChart__Group__2__Impl
+            // InternalPerspectiveDsl.g:6261:1: ( rule__PerspectiveChart__Group__2__Impl )
+            // InternalPerspectiveDsl.g:6262:2: rule__PerspectiveChart__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveChart__Group__2__Impl();
@@ -21889,23 +21889,23 @@
 
 
     // $ANTLR start "rule__PerspectiveChart__Group__2__Impl"
-    // InternalPerspectiveDsl.g:6266:1: rule__PerspectiveChart__Group__2__Impl : ( ( rule__PerspectiveChart__RefAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:6268:1: rule__PerspectiveChart__Group__2__Impl : ( ( rule__PerspectiveChart__RefAssignment_2 ) ) ;
     public final void rule__PerspectiveChart__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6270:1: ( ( ( rule__PerspectiveChart__RefAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:6271:1: ( ( rule__PerspectiveChart__RefAssignment_2 ) )
+            // InternalPerspectiveDsl.g:6272:1: ( ( ( rule__PerspectiveChart__RefAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:6273:1: ( ( rule__PerspectiveChart__RefAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:6271:1: ( ( rule__PerspectiveChart__RefAssignment_2 ) )
-            // InternalPerspectiveDsl.g:6272:2: ( rule__PerspectiveChart__RefAssignment_2 )
+            // InternalPerspectiveDsl.g:6273:1: ( ( rule__PerspectiveChart__RefAssignment_2 ) )
+            // InternalPerspectiveDsl.g:6274:2: ( rule__PerspectiveChart__RefAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveChartAccess().getRefAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:6273:2: ( rule__PerspectiveChart__RefAssignment_2 )
-            // InternalPerspectiveDsl.g:6273:3: rule__PerspectiveChart__RefAssignment_2
+            // InternalPerspectiveDsl.g:6275:2: ( rule__PerspectiveChart__RefAssignment_2 )
+            // InternalPerspectiveDsl.g:6275:3: rule__PerspectiveChart__RefAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveChart__RefAssignment_2();
@@ -21940,14 +21940,14 @@
 
 
     // $ANTLR start "rule__PerspectiveReport__Group__0"
-    // InternalPerspectiveDsl.g:6282:1: rule__PerspectiveReport__Group__0 : rule__PerspectiveReport__Group__0__Impl rule__PerspectiveReport__Group__1 ;
+    // InternalPerspectiveDsl.g:6284:1: rule__PerspectiveReport__Group__0 : rule__PerspectiveReport__Group__0__Impl rule__PerspectiveReport__Group__1 ;
     public final void rule__PerspectiveReport__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6286:1: ( rule__PerspectiveReport__Group__0__Impl rule__PerspectiveReport__Group__1 )
-            // InternalPerspectiveDsl.g:6287:2: rule__PerspectiveReport__Group__0__Impl rule__PerspectiveReport__Group__1
+            // InternalPerspectiveDsl.g:6288:1: ( rule__PerspectiveReport__Group__0__Impl rule__PerspectiveReport__Group__1 )
+            // InternalPerspectiveDsl.g:6289:2: rule__PerspectiveReport__Group__0__Impl rule__PerspectiveReport__Group__1
             {
             pushFollow(FOLLOW_29);
             rule__PerspectiveReport__Group__0__Impl();
@@ -21978,23 +21978,23 @@
 
 
     // $ANTLR start "rule__PerspectiveReport__Group__0__Impl"
-    // InternalPerspectiveDsl.g:6294:1: rule__PerspectiveReport__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:6296:1: rule__PerspectiveReport__Group__0__Impl : ( () ) ;
     public final void rule__PerspectiveReport__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6298:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:6299:1: ( () )
+            // InternalPerspectiveDsl.g:6300:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:6301:1: ( () )
             {
-            // InternalPerspectiveDsl.g:6299:1: ( () )
-            // InternalPerspectiveDsl.g:6300:2: ()
+            // InternalPerspectiveDsl.g:6301:1: ( () )
+            // InternalPerspectiveDsl.g:6302:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveReportAccess().getPerspectiveReportAction_0()); 
             }
-            // InternalPerspectiveDsl.g:6301:2: ()
-            // InternalPerspectiveDsl.g:6301:3: 
+            // InternalPerspectiveDsl.g:6303:2: ()
+            // InternalPerspectiveDsl.g:6303:3: 
             {
             }
 
@@ -22019,14 +22019,14 @@
 
 
     // $ANTLR start "rule__PerspectiveReport__Group__1"
-    // InternalPerspectiveDsl.g:6309:1: rule__PerspectiveReport__Group__1 : rule__PerspectiveReport__Group__1__Impl rule__PerspectiveReport__Group__2 ;
+    // InternalPerspectiveDsl.g:6311:1: rule__PerspectiveReport__Group__1 : rule__PerspectiveReport__Group__1__Impl rule__PerspectiveReport__Group__2 ;
     public final void rule__PerspectiveReport__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6313:1: ( rule__PerspectiveReport__Group__1__Impl rule__PerspectiveReport__Group__2 )
-            // InternalPerspectiveDsl.g:6314:2: rule__PerspectiveReport__Group__1__Impl rule__PerspectiveReport__Group__2
+            // InternalPerspectiveDsl.g:6315:1: ( rule__PerspectiveReport__Group__1__Impl rule__PerspectiveReport__Group__2 )
+            // InternalPerspectiveDsl.g:6316:2: rule__PerspectiveReport__Group__1__Impl rule__PerspectiveReport__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__PerspectiveReport__Group__1__Impl();
@@ -22057,17 +22057,17 @@
 
 
     // $ANTLR start "rule__PerspectiveReport__Group__1__Impl"
-    // InternalPerspectiveDsl.g:6321:1: rule__PerspectiveReport__Group__1__Impl : ( 'report' ) ;
+    // InternalPerspectiveDsl.g:6323:1: rule__PerspectiveReport__Group__1__Impl : ( 'report' ) ;
     public final void rule__PerspectiveReport__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6325:1: ( ( 'report' ) )
-            // InternalPerspectiveDsl.g:6326:1: ( 'report' )
+            // InternalPerspectiveDsl.g:6327:1: ( ( 'report' ) )
+            // InternalPerspectiveDsl.g:6328:1: ( 'report' )
             {
-            // InternalPerspectiveDsl.g:6326:1: ( 'report' )
-            // InternalPerspectiveDsl.g:6327:2: 'report'
+            // InternalPerspectiveDsl.g:6328:1: ( 'report' )
+            // InternalPerspectiveDsl.g:6329:2: 'report'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveReportAccess().getReportKeyword_1()); 
@@ -22098,14 +22098,14 @@
 
 
     // $ANTLR start "rule__PerspectiveReport__Group__2"
-    // InternalPerspectiveDsl.g:6336:1: rule__PerspectiveReport__Group__2 : rule__PerspectiveReport__Group__2__Impl ;
+    // InternalPerspectiveDsl.g:6338:1: rule__PerspectiveReport__Group__2 : rule__PerspectiveReport__Group__2__Impl ;
     public final void rule__PerspectiveReport__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6340:1: ( rule__PerspectiveReport__Group__2__Impl )
-            // InternalPerspectiveDsl.g:6341:2: rule__PerspectiveReport__Group__2__Impl
+            // InternalPerspectiveDsl.g:6342:1: ( rule__PerspectiveReport__Group__2__Impl )
+            // InternalPerspectiveDsl.g:6343:2: rule__PerspectiveReport__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveReport__Group__2__Impl();
@@ -22131,23 +22131,23 @@
 
 
     // $ANTLR start "rule__PerspectiveReport__Group__2__Impl"
-    // InternalPerspectiveDsl.g:6347:1: rule__PerspectiveReport__Group__2__Impl : ( ( rule__PerspectiveReport__RefAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:6349:1: rule__PerspectiveReport__Group__2__Impl : ( ( rule__PerspectiveReport__RefAssignment_2 ) ) ;
     public final void rule__PerspectiveReport__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6351:1: ( ( ( rule__PerspectiveReport__RefAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:6352:1: ( ( rule__PerspectiveReport__RefAssignment_2 ) )
+            // InternalPerspectiveDsl.g:6353:1: ( ( ( rule__PerspectiveReport__RefAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:6354:1: ( ( rule__PerspectiveReport__RefAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:6352:1: ( ( rule__PerspectiveReport__RefAssignment_2 ) )
-            // InternalPerspectiveDsl.g:6353:2: ( rule__PerspectiveReport__RefAssignment_2 )
+            // InternalPerspectiveDsl.g:6354:1: ( ( rule__PerspectiveReport__RefAssignment_2 ) )
+            // InternalPerspectiveDsl.g:6355:2: ( rule__PerspectiveReport__RefAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveReportAccess().getRefAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:6354:2: ( rule__PerspectiveReport__RefAssignment_2 )
-            // InternalPerspectiveDsl.g:6354:3: rule__PerspectiveReport__RefAssignment_2
+            // InternalPerspectiveDsl.g:6356:2: ( rule__PerspectiveReport__RefAssignment_2 )
+            // InternalPerspectiveDsl.g:6356:3: rule__PerspectiveReport__RefAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveReport__RefAssignment_2();
@@ -22182,14 +22182,14 @@
 
 
     // $ANTLR start "rule__PerspectiveOrganization__Group__0"
-    // InternalPerspectiveDsl.g:6363:1: rule__PerspectiveOrganization__Group__0 : rule__PerspectiveOrganization__Group__0__Impl rule__PerspectiveOrganization__Group__1 ;
+    // InternalPerspectiveDsl.g:6365:1: rule__PerspectiveOrganization__Group__0 : rule__PerspectiveOrganization__Group__0__Impl rule__PerspectiveOrganization__Group__1 ;
     public final void rule__PerspectiveOrganization__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6367:1: ( rule__PerspectiveOrganization__Group__0__Impl rule__PerspectiveOrganization__Group__1 )
-            // InternalPerspectiveDsl.g:6368:2: rule__PerspectiveOrganization__Group__0__Impl rule__PerspectiveOrganization__Group__1
+            // InternalPerspectiveDsl.g:6369:1: ( rule__PerspectiveOrganization__Group__0__Impl rule__PerspectiveOrganization__Group__1 )
+            // InternalPerspectiveDsl.g:6370:2: rule__PerspectiveOrganization__Group__0__Impl rule__PerspectiveOrganization__Group__1
             {
             pushFollow(FOLLOW_30);
             rule__PerspectiveOrganization__Group__0__Impl();
@@ -22220,23 +22220,23 @@
 
 
     // $ANTLR start "rule__PerspectiveOrganization__Group__0__Impl"
-    // InternalPerspectiveDsl.g:6375:1: rule__PerspectiveOrganization__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:6377:1: rule__PerspectiveOrganization__Group__0__Impl : ( () ) ;
     public final void rule__PerspectiveOrganization__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6379:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:6380:1: ( () )
+            // InternalPerspectiveDsl.g:6381:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:6382:1: ( () )
             {
-            // InternalPerspectiveDsl.g:6380:1: ( () )
-            // InternalPerspectiveDsl.g:6381:2: ()
+            // InternalPerspectiveDsl.g:6382:1: ( () )
+            // InternalPerspectiveDsl.g:6383:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveOrganizationAccess().getPerspectiveOrganizationAction_0()); 
             }
-            // InternalPerspectiveDsl.g:6382:2: ()
-            // InternalPerspectiveDsl.g:6382:3: 
+            // InternalPerspectiveDsl.g:6384:2: ()
+            // InternalPerspectiveDsl.g:6384:3: 
             {
             }
 
@@ -22261,14 +22261,14 @@
 
 
     // $ANTLR start "rule__PerspectiveOrganization__Group__1"
-    // InternalPerspectiveDsl.g:6390:1: rule__PerspectiveOrganization__Group__1 : rule__PerspectiveOrganization__Group__1__Impl rule__PerspectiveOrganization__Group__2 ;
+    // InternalPerspectiveDsl.g:6392:1: rule__PerspectiveOrganization__Group__1 : rule__PerspectiveOrganization__Group__1__Impl rule__PerspectiveOrganization__Group__2 ;
     public final void rule__PerspectiveOrganization__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6394:1: ( rule__PerspectiveOrganization__Group__1__Impl rule__PerspectiveOrganization__Group__2 )
-            // InternalPerspectiveDsl.g:6395:2: rule__PerspectiveOrganization__Group__1__Impl rule__PerspectiveOrganization__Group__2
+            // InternalPerspectiveDsl.g:6396:1: ( rule__PerspectiveOrganization__Group__1__Impl rule__PerspectiveOrganization__Group__2 )
+            // InternalPerspectiveDsl.g:6397:2: rule__PerspectiveOrganization__Group__1__Impl rule__PerspectiveOrganization__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__PerspectiveOrganization__Group__1__Impl();
@@ -22299,17 +22299,17 @@
 
 
     // $ANTLR start "rule__PerspectiveOrganization__Group__1__Impl"
-    // InternalPerspectiveDsl.g:6402:1: rule__PerspectiveOrganization__Group__1__Impl : ( 'organigram' ) ;
+    // InternalPerspectiveDsl.g:6404:1: rule__PerspectiveOrganization__Group__1__Impl : ( 'organigram' ) ;
     public final void rule__PerspectiveOrganization__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6406:1: ( ( 'organigram' ) )
-            // InternalPerspectiveDsl.g:6407:1: ( 'organigram' )
+            // InternalPerspectiveDsl.g:6408:1: ( ( 'organigram' ) )
+            // InternalPerspectiveDsl.g:6409:1: ( 'organigram' )
             {
-            // InternalPerspectiveDsl.g:6407:1: ( 'organigram' )
-            // InternalPerspectiveDsl.g:6408:2: 'organigram'
+            // InternalPerspectiveDsl.g:6409:1: ( 'organigram' )
+            // InternalPerspectiveDsl.g:6410:2: 'organigram'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveOrganizationAccess().getOrganigramKeyword_1()); 
@@ -22340,14 +22340,14 @@
 
 
     // $ANTLR start "rule__PerspectiveOrganization__Group__2"
-    // InternalPerspectiveDsl.g:6417:1: rule__PerspectiveOrganization__Group__2 : rule__PerspectiveOrganization__Group__2__Impl ;
+    // InternalPerspectiveDsl.g:6419:1: rule__PerspectiveOrganization__Group__2 : rule__PerspectiveOrganization__Group__2__Impl ;
     public final void rule__PerspectiveOrganization__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6421:1: ( rule__PerspectiveOrganization__Group__2__Impl )
-            // InternalPerspectiveDsl.g:6422:2: rule__PerspectiveOrganization__Group__2__Impl
+            // InternalPerspectiveDsl.g:6423:1: ( rule__PerspectiveOrganization__Group__2__Impl )
+            // InternalPerspectiveDsl.g:6424:2: rule__PerspectiveOrganization__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveOrganization__Group__2__Impl();
@@ -22373,23 +22373,23 @@
 
 
     // $ANTLR start "rule__PerspectiveOrganization__Group__2__Impl"
-    // InternalPerspectiveDsl.g:6428:1: rule__PerspectiveOrganization__Group__2__Impl : ( ( rule__PerspectiveOrganization__RefAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:6430:1: rule__PerspectiveOrganization__Group__2__Impl : ( ( rule__PerspectiveOrganization__RefAssignment_2 ) ) ;
     public final void rule__PerspectiveOrganization__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6432:1: ( ( ( rule__PerspectiveOrganization__RefAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:6433:1: ( ( rule__PerspectiveOrganization__RefAssignment_2 ) )
+            // InternalPerspectiveDsl.g:6434:1: ( ( ( rule__PerspectiveOrganization__RefAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:6435:1: ( ( rule__PerspectiveOrganization__RefAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:6433:1: ( ( rule__PerspectiveOrganization__RefAssignment_2 ) )
-            // InternalPerspectiveDsl.g:6434:2: ( rule__PerspectiveOrganization__RefAssignment_2 )
+            // InternalPerspectiveDsl.g:6435:1: ( ( rule__PerspectiveOrganization__RefAssignment_2 ) )
+            // InternalPerspectiveDsl.g:6436:2: ( rule__PerspectiveOrganization__RefAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveOrganizationAccess().getRefAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:6435:2: ( rule__PerspectiveOrganization__RefAssignment_2 )
-            // InternalPerspectiveDsl.g:6435:3: rule__PerspectiveOrganization__RefAssignment_2
+            // InternalPerspectiveDsl.g:6437:2: ( rule__PerspectiveOrganization__RefAssignment_2 )
+            // InternalPerspectiveDsl.g:6437:3: rule__PerspectiveOrganization__RefAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveOrganization__RefAssignment_2();
@@ -22424,14 +22424,14 @@
 
 
     // $ANTLR start "rule__PerspectiveTopology__Group__0"
-    // InternalPerspectiveDsl.g:6444:1: rule__PerspectiveTopology__Group__0 : rule__PerspectiveTopology__Group__0__Impl rule__PerspectiveTopology__Group__1 ;
+    // InternalPerspectiveDsl.g:6446:1: rule__PerspectiveTopology__Group__0 : rule__PerspectiveTopology__Group__0__Impl rule__PerspectiveTopology__Group__1 ;
     public final void rule__PerspectiveTopology__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6448:1: ( rule__PerspectiveTopology__Group__0__Impl rule__PerspectiveTopology__Group__1 )
-            // InternalPerspectiveDsl.g:6449:2: rule__PerspectiveTopology__Group__0__Impl rule__PerspectiveTopology__Group__1
+            // InternalPerspectiveDsl.g:6450:1: ( rule__PerspectiveTopology__Group__0__Impl rule__PerspectiveTopology__Group__1 )
+            // InternalPerspectiveDsl.g:6451:2: rule__PerspectiveTopology__Group__0__Impl rule__PerspectiveTopology__Group__1
             {
             pushFollow(FOLLOW_31);
             rule__PerspectiveTopology__Group__0__Impl();
@@ -22462,23 +22462,23 @@
 
 
     // $ANTLR start "rule__PerspectiveTopology__Group__0__Impl"
-    // InternalPerspectiveDsl.g:6456:1: rule__PerspectiveTopology__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:6458:1: rule__PerspectiveTopology__Group__0__Impl : ( () ) ;
     public final void rule__PerspectiveTopology__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6460:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:6461:1: ( () )
+            // InternalPerspectiveDsl.g:6462:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:6463:1: ( () )
             {
-            // InternalPerspectiveDsl.g:6461:1: ( () )
-            // InternalPerspectiveDsl.g:6462:2: ()
+            // InternalPerspectiveDsl.g:6463:1: ( () )
+            // InternalPerspectiveDsl.g:6464:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTopologyAccess().getPerspectiveTopologyAction_0()); 
             }
-            // InternalPerspectiveDsl.g:6463:2: ()
-            // InternalPerspectiveDsl.g:6463:3: 
+            // InternalPerspectiveDsl.g:6465:2: ()
+            // InternalPerspectiveDsl.g:6465:3: 
             {
             }
 
@@ -22503,14 +22503,14 @@
 
 
     // $ANTLR start "rule__PerspectiveTopology__Group__1"
-    // InternalPerspectiveDsl.g:6471:1: rule__PerspectiveTopology__Group__1 : rule__PerspectiveTopology__Group__1__Impl rule__PerspectiveTopology__Group__2 ;
+    // InternalPerspectiveDsl.g:6473:1: rule__PerspectiveTopology__Group__1 : rule__PerspectiveTopology__Group__1__Impl rule__PerspectiveTopology__Group__2 ;
     public final void rule__PerspectiveTopology__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6475:1: ( rule__PerspectiveTopology__Group__1__Impl rule__PerspectiveTopology__Group__2 )
-            // InternalPerspectiveDsl.g:6476:2: rule__PerspectiveTopology__Group__1__Impl rule__PerspectiveTopology__Group__2
+            // InternalPerspectiveDsl.g:6477:1: ( rule__PerspectiveTopology__Group__1__Impl rule__PerspectiveTopology__Group__2 )
+            // InternalPerspectiveDsl.g:6478:2: rule__PerspectiveTopology__Group__1__Impl rule__PerspectiveTopology__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__PerspectiveTopology__Group__1__Impl();
@@ -22541,17 +22541,17 @@
 
 
     // $ANTLR start "rule__PerspectiveTopology__Group__1__Impl"
-    // InternalPerspectiveDsl.g:6483:1: rule__PerspectiveTopology__Group__1__Impl : ( 'topology' ) ;
+    // InternalPerspectiveDsl.g:6485:1: rule__PerspectiveTopology__Group__1__Impl : ( 'topology' ) ;
     public final void rule__PerspectiveTopology__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6487:1: ( ( 'topology' ) )
-            // InternalPerspectiveDsl.g:6488:1: ( 'topology' )
+            // InternalPerspectiveDsl.g:6489:1: ( ( 'topology' ) )
+            // InternalPerspectiveDsl.g:6490:1: ( 'topology' )
             {
-            // InternalPerspectiveDsl.g:6488:1: ( 'topology' )
-            // InternalPerspectiveDsl.g:6489:2: 'topology'
+            // InternalPerspectiveDsl.g:6490:1: ( 'topology' )
+            // InternalPerspectiveDsl.g:6491:2: 'topology'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTopologyAccess().getTopologyKeyword_1()); 
@@ -22582,14 +22582,14 @@
 
 
     // $ANTLR start "rule__PerspectiveTopology__Group__2"
-    // InternalPerspectiveDsl.g:6498:1: rule__PerspectiveTopology__Group__2 : rule__PerspectiveTopology__Group__2__Impl ;
+    // InternalPerspectiveDsl.g:6500:1: rule__PerspectiveTopology__Group__2 : rule__PerspectiveTopology__Group__2__Impl ;
     public final void rule__PerspectiveTopology__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6502:1: ( rule__PerspectiveTopology__Group__2__Impl )
-            // InternalPerspectiveDsl.g:6503:2: rule__PerspectiveTopology__Group__2__Impl
+            // InternalPerspectiveDsl.g:6504:1: ( rule__PerspectiveTopology__Group__2__Impl )
+            // InternalPerspectiveDsl.g:6505:2: rule__PerspectiveTopology__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveTopology__Group__2__Impl();
@@ -22615,23 +22615,23 @@
 
 
     // $ANTLR start "rule__PerspectiveTopology__Group__2__Impl"
-    // InternalPerspectiveDsl.g:6509:1: rule__PerspectiveTopology__Group__2__Impl : ( ( rule__PerspectiveTopology__RefAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:6511:1: rule__PerspectiveTopology__Group__2__Impl : ( ( rule__PerspectiveTopology__RefAssignment_2 ) ) ;
     public final void rule__PerspectiveTopology__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6513:1: ( ( ( rule__PerspectiveTopology__RefAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:6514:1: ( ( rule__PerspectiveTopology__RefAssignment_2 ) )
+            // InternalPerspectiveDsl.g:6515:1: ( ( ( rule__PerspectiveTopology__RefAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:6516:1: ( ( rule__PerspectiveTopology__RefAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:6514:1: ( ( rule__PerspectiveTopology__RefAssignment_2 ) )
-            // InternalPerspectiveDsl.g:6515:2: ( rule__PerspectiveTopology__RefAssignment_2 )
+            // InternalPerspectiveDsl.g:6516:1: ( ( rule__PerspectiveTopology__RefAssignment_2 ) )
+            // InternalPerspectiveDsl.g:6517:2: ( rule__PerspectiveTopology__RefAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTopologyAccess().getRefAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:6516:2: ( rule__PerspectiveTopology__RefAssignment_2 )
-            // InternalPerspectiveDsl.g:6516:3: rule__PerspectiveTopology__RefAssignment_2
+            // InternalPerspectiveDsl.g:6518:2: ( rule__PerspectiveTopology__RefAssignment_2 )
+            // InternalPerspectiveDsl.g:6518:3: rule__PerspectiveTopology__RefAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveTopology__RefAssignment_2();
@@ -22666,14 +22666,14 @@
 
 
     // $ANTLR start "rule__PerspectiveDialog__Group__0"
-    // InternalPerspectiveDsl.g:6525:1: rule__PerspectiveDialog__Group__0 : rule__PerspectiveDialog__Group__0__Impl rule__PerspectiveDialog__Group__1 ;
+    // InternalPerspectiveDsl.g:6527:1: rule__PerspectiveDialog__Group__0 : rule__PerspectiveDialog__Group__0__Impl rule__PerspectiveDialog__Group__1 ;
     public final void rule__PerspectiveDialog__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6529:1: ( rule__PerspectiveDialog__Group__0__Impl rule__PerspectiveDialog__Group__1 )
-            // InternalPerspectiveDsl.g:6530:2: rule__PerspectiveDialog__Group__0__Impl rule__PerspectiveDialog__Group__1
+            // InternalPerspectiveDsl.g:6531:1: ( rule__PerspectiveDialog__Group__0__Impl rule__PerspectiveDialog__Group__1 )
+            // InternalPerspectiveDsl.g:6532:2: rule__PerspectiveDialog__Group__0__Impl rule__PerspectiveDialog__Group__1
             {
             pushFollow(FOLLOW_32);
             rule__PerspectiveDialog__Group__0__Impl();
@@ -22704,23 +22704,23 @@
 
 
     // $ANTLR start "rule__PerspectiveDialog__Group__0__Impl"
-    // InternalPerspectiveDsl.g:6537:1: rule__PerspectiveDialog__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:6539:1: rule__PerspectiveDialog__Group__0__Impl : ( () ) ;
     public final void rule__PerspectiveDialog__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6541:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:6542:1: ( () )
+            // InternalPerspectiveDsl.g:6543:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:6544:1: ( () )
             {
-            // InternalPerspectiveDsl.g:6542:1: ( () )
-            // InternalPerspectiveDsl.g:6543:2: ()
+            // InternalPerspectiveDsl.g:6544:1: ( () )
+            // InternalPerspectiveDsl.g:6545:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveDialogAccess().getPerspectiveDialogAction_0()); 
             }
-            // InternalPerspectiveDsl.g:6544:2: ()
-            // InternalPerspectiveDsl.g:6544:3: 
+            // InternalPerspectiveDsl.g:6546:2: ()
+            // InternalPerspectiveDsl.g:6546:3: 
             {
             }
 
@@ -22745,14 +22745,14 @@
 
 
     // $ANTLR start "rule__PerspectiveDialog__Group__1"
-    // InternalPerspectiveDsl.g:6552:1: rule__PerspectiveDialog__Group__1 : rule__PerspectiveDialog__Group__1__Impl rule__PerspectiveDialog__Group__2 ;
+    // InternalPerspectiveDsl.g:6554:1: rule__PerspectiveDialog__Group__1 : rule__PerspectiveDialog__Group__1__Impl rule__PerspectiveDialog__Group__2 ;
     public final void rule__PerspectiveDialog__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6556:1: ( rule__PerspectiveDialog__Group__1__Impl rule__PerspectiveDialog__Group__2 )
-            // InternalPerspectiveDsl.g:6557:2: rule__PerspectiveDialog__Group__1__Impl rule__PerspectiveDialog__Group__2
+            // InternalPerspectiveDsl.g:6558:1: ( rule__PerspectiveDialog__Group__1__Impl rule__PerspectiveDialog__Group__2 )
+            // InternalPerspectiveDsl.g:6559:2: rule__PerspectiveDialog__Group__1__Impl rule__PerspectiveDialog__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__PerspectiveDialog__Group__1__Impl();
@@ -22783,17 +22783,17 @@
 
 
     // $ANTLR start "rule__PerspectiveDialog__Group__1__Impl"
-    // InternalPerspectiveDsl.g:6564:1: rule__PerspectiveDialog__Group__1__Impl : ( 'dialog' ) ;
+    // InternalPerspectiveDsl.g:6566:1: rule__PerspectiveDialog__Group__1__Impl : ( 'dialog' ) ;
     public final void rule__PerspectiveDialog__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6568:1: ( ( 'dialog' ) )
-            // InternalPerspectiveDsl.g:6569:1: ( 'dialog' )
+            // InternalPerspectiveDsl.g:6570:1: ( ( 'dialog' ) )
+            // InternalPerspectiveDsl.g:6571:1: ( 'dialog' )
             {
-            // InternalPerspectiveDsl.g:6569:1: ( 'dialog' )
-            // InternalPerspectiveDsl.g:6570:2: 'dialog'
+            // InternalPerspectiveDsl.g:6571:1: ( 'dialog' )
+            // InternalPerspectiveDsl.g:6572:2: 'dialog'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveDialogAccess().getDialogKeyword_1()); 
@@ -22824,14 +22824,14 @@
 
 
     // $ANTLR start "rule__PerspectiveDialog__Group__2"
-    // InternalPerspectiveDsl.g:6579:1: rule__PerspectiveDialog__Group__2 : rule__PerspectiveDialog__Group__2__Impl ;
+    // InternalPerspectiveDsl.g:6581:1: rule__PerspectiveDialog__Group__2 : rule__PerspectiveDialog__Group__2__Impl ;
     public final void rule__PerspectiveDialog__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6583:1: ( rule__PerspectiveDialog__Group__2__Impl )
-            // InternalPerspectiveDsl.g:6584:2: rule__PerspectiveDialog__Group__2__Impl
+            // InternalPerspectiveDsl.g:6585:1: ( rule__PerspectiveDialog__Group__2__Impl )
+            // InternalPerspectiveDsl.g:6586:2: rule__PerspectiveDialog__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveDialog__Group__2__Impl();
@@ -22857,23 +22857,23 @@
 
 
     // $ANTLR start "rule__PerspectiveDialog__Group__2__Impl"
-    // InternalPerspectiveDsl.g:6590:1: rule__PerspectiveDialog__Group__2__Impl : ( ( rule__PerspectiveDialog__RefAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:6592:1: rule__PerspectiveDialog__Group__2__Impl : ( ( rule__PerspectiveDialog__RefAssignment_2 ) ) ;
     public final void rule__PerspectiveDialog__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6594:1: ( ( ( rule__PerspectiveDialog__RefAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:6595:1: ( ( rule__PerspectiveDialog__RefAssignment_2 ) )
+            // InternalPerspectiveDsl.g:6596:1: ( ( ( rule__PerspectiveDialog__RefAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:6597:1: ( ( rule__PerspectiveDialog__RefAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:6595:1: ( ( rule__PerspectiveDialog__RefAssignment_2 ) )
-            // InternalPerspectiveDsl.g:6596:2: ( rule__PerspectiveDialog__RefAssignment_2 )
+            // InternalPerspectiveDsl.g:6597:1: ( ( rule__PerspectiveDialog__RefAssignment_2 ) )
+            // InternalPerspectiveDsl.g:6598:2: ( rule__PerspectiveDialog__RefAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveDialogAccess().getRefAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:6597:2: ( rule__PerspectiveDialog__RefAssignment_2 )
-            // InternalPerspectiveDsl.g:6597:3: rule__PerspectiveDialog__RefAssignment_2
+            // InternalPerspectiveDsl.g:6599:2: ( rule__PerspectiveDialog__RefAssignment_2 )
+            // InternalPerspectiveDsl.g:6599:3: rule__PerspectiveDialog__RefAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveDialog__RefAssignment_2();
@@ -22908,14 +22908,14 @@
 
 
     // $ANTLR start "rule__PerspectiveBPMN__Group__0"
-    // InternalPerspectiveDsl.g:6606:1: rule__PerspectiveBPMN__Group__0 : rule__PerspectiveBPMN__Group__0__Impl rule__PerspectiveBPMN__Group__1 ;
+    // InternalPerspectiveDsl.g:6608:1: rule__PerspectiveBPMN__Group__0 : rule__PerspectiveBPMN__Group__0__Impl rule__PerspectiveBPMN__Group__1 ;
     public final void rule__PerspectiveBPMN__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6610:1: ( rule__PerspectiveBPMN__Group__0__Impl rule__PerspectiveBPMN__Group__1 )
-            // InternalPerspectiveDsl.g:6611:2: rule__PerspectiveBPMN__Group__0__Impl rule__PerspectiveBPMN__Group__1
+            // InternalPerspectiveDsl.g:6612:1: ( rule__PerspectiveBPMN__Group__0__Impl rule__PerspectiveBPMN__Group__1 )
+            // InternalPerspectiveDsl.g:6613:2: rule__PerspectiveBPMN__Group__0__Impl rule__PerspectiveBPMN__Group__1
             {
             pushFollow(FOLLOW_33);
             rule__PerspectiveBPMN__Group__0__Impl();
@@ -22946,23 +22946,23 @@
 
 
     // $ANTLR start "rule__PerspectiveBPMN__Group__0__Impl"
-    // InternalPerspectiveDsl.g:6618:1: rule__PerspectiveBPMN__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:6620:1: rule__PerspectiveBPMN__Group__0__Impl : ( () ) ;
     public final void rule__PerspectiveBPMN__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6622:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:6623:1: ( () )
+            // InternalPerspectiveDsl.g:6624:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:6625:1: ( () )
             {
-            // InternalPerspectiveDsl.g:6623:1: ( () )
-            // InternalPerspectiveDsl.g:6624:2: ()
+            // InternalPerspectiveDsl.g:6625:1: ( () )
+            // InternalPerspectiveDsl.g:6626:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveBPMNAccess().getPerspectiveBPMNAction_0()); 
             }
-            // InternalPerspectiveDsl.g:6625:2: ()
-            // InternalPerspectiveDsl.g:6625:3: 
+            // InternalPerspectiveDsl.g:6627:2: ()
+            // InternalPerspectiveDsl.g:6627:3: 
             {
             }
 
@@ -22987,14 +22987,14 @@
 
 
     // $ANTLR start "rule__PerspectiveBPMN__Group__1"
-    // InternalPerspectiveDsl.g:6633:1: rule__PerspectiveBPMN__Group__1 : rule__PerspectiveBPMN__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:6635:1: rule__PerspectiveBPMN__Group__1 : rule__PerspectiveBPMN__Group__1__Impl ;
     public final void rule__PerspectiveBPMN__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6637:1: ( rule__PerspectiveBPMN__Group__1__Impl )
-            // InternalPerspectiveDsl.g:6638:2: rule__PerspectiveBPMN__Group__1__Impl
+            // InternalPerspectiveDsl.g:6639:1: ( rule__PerspectiveBPMN__Group__1__Impl )
+            // InternalPerspectiveDsl.g:6640:2: rule__PerspectiveBPMN__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveBPMN__Group__1__Impl();
@@ -23020,17 +23020,17 @@
 
 
     // $ANTLR start "rule__PerspectiveBPMN__Group__1__Impl"
-    // InternalPerspectiveDsl.g:6644:1: rule__PerspectiveBPMN__Group__1__Impl : ( 'bpmn' ) ;
+    // InternalPerspectiveDsl.g:6646:1: rule__PerspectiveBPMN__Group__1__Impl : ( 'bpmn' ) ;
     public final void rule__PerspectiveBPMN__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6648:1: ( ( 'bpmn' ) )
-            // InternalPerspectiveDsl.g:6649:1: ( 'bpmn' )
+            // InternalPerspectiveDsl.g:6650:1: ( ( 'bpmn' ) )
+            // InternalPerspectiveDsl.g:6651:1: ( 'bpmn' )
             {
-            // InternalPerspectiveDsl.g:6649:1: ( 'bpmn' )
-            // InternalPerspectiveDsl.g:6650:2: 'bpmn'
+            // InternalPerspectiveDsl.g:6651:1: ( 'bpmn' )
+            // InternalPerspectiveDsl.g:6652:2: 'bpmn'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveBPMNAccess().getBpmnKeyword_1()); 
@@ -23061,14 +23061,14 @@
 
 
     // $ANTLR start "rule__PerspectiveKanban__Group__0"
-    // InternalPerspectiveDsl.g:6660:1: rule__PerspectiveKanban__Group__0 : rule__PerspectiveKanban__Group__0__Impl rule__PerspectiveKanban__Group__1 ;
+    // InternalPerspectiveDsl.g:6662:1: rule__PerspectiveKanban__Group__0 : rule__PerspectiveKanban__Group__0__Impl rule__PerspectiveKanban__Group__1 ;
     public final void rule__PerspectiveKanban__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6664:1: ( rule__PerspectiveKanban__Group__0__Impl rule__PerspectiveKanban__Group__1 )
-            // InternalPerspectiveDsl.g:6665:2: rule__PerspectiveKanban__Group__0__Impl rule__PerspectiveKanban__Group__1
+            // InternalPerspectiveDsl.g:6666:1: ( rule__PerspectiveKanban__Group__0__Impl rule__PerspectiveKanban__Group__1 )
+            // InternalPerspectiveDsl.g:6667:2: rule__PerspectiveKanban__Group__0__Impl rule__PerspectiveKanban__Group__1
             {
             pushFollow(FOLLOW_34);
             rule__PerspectiveKanban__Group__0__Impl();
@@ -23099,23 +23099,23 @@
 
 
     // $ANTLR start "rule__PerspectiveKanban__Group__0__Impl"
-    // InternalPerspectiveDsl.g:6672:1: rule__PerspectiveKanban__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:6674:1: rule__PerspectiveKanban__Group__0__Impl : ( () ) ;
     public final void rule__PerspectiveKanban__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6676:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:6677:1: ( () )
+            // InternalPerspectiveDsl.g:6678:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:6679:1: ( () )
             {
-            // InternalPerspectiveDsl.g:6677:1: ( () )
-            // InternalPerspectiveDsl.g:6678:2: ()
+            // InternalPerspectiveDsl.g:6679:1: ( () )
+            // InternalPerspectiveDsl.g:6680:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveKanbanAccess().getPerspectiveKanbanAction_0()); 
             }
-            // InternalPerspectiveDsl.g:6679:2: ()
-            // InternalPerspectiveDsl.g:6679:3: 
+            // InternalPerspectiveDsl.g:6681:2: ()
+            // InternalPerspectiveDsl.g:6681:3: 
             {
             }
 
@@ -23140,14 +23140,14 @@
 
 
     // $ANTLR start "rule__PerspectiveKanban__Group__1"
-    // InternalPerspectiveDsl.g:6687:1: rule__PerspectiveKanban__Group__1 : rule__PerspectiveKanban__Group__1__Impl rule__PerspectiveKanban__Group__2 ;
+    // InternalPerspectiveDsl.g:6689:1: rule__PerspectiveKanban__Group__1 : rule__PerspectiveKanban__Group__1__Impl rule__PerspectiveKanban__Group__2 ;
     public final void rule__PerspectiveKanban__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6691:1: ( rule__PerspectiveKanban__Group__1__Impl rule__PerspectiveKanban__Group__2 )
-            // InternalPerspectiveDsl.g:6692:2: rule__PerspectiveKanban__Group__1__Impl rule__PerspectiveKanban__Group__2
+            // InternalPerspectiveDsl.g:6693:1: ( rule__PerspectiveKanban__Group__1__Impl rule__PerspectiveKanban__Group__2 )
+            // InternalPerspectiveDsl.g:6694:2: rule__PerspectiveKanban__Group__1__Impl rule__PerspectiveKanban__Group__2
             {
             pushFollow(FOLLOW_35);
             rule__PerspectiveKanban__Group__1__Impl();
@@ -23178,17 +23178,17 @@
 
 
     // $ANTLR start "rule__PerspectiveKanban__Group__1__Impl"
-    // InternalPerspectiveDsl.g:6699:1: rule__PerspectiveKanban__Group__1__Impl : ( 'kanban' ) ;
+    // InternalPerspectiveDsl.g:6701:1: rule__PerspectiveKanban__Group__1__Impl : ( 'kanban' ) ;
     public final void rule__PerspectiveKanban__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6703:1: ( ( 'kanban' ) )
-            // InternalPerspectiveDsl.g:6704:1: ( 'kanban' )
+            // InternalPerspectiveDsl.g:6705:1: ( ( 'kanban' ) )
+            // InternalPerspectiveDsl.g:6706:1: ( 'kanban' )
             {
-            // InternalPerspectiveDsl.g:6704:1: ( 'kanban' )
-            // InternalPerspectiveDsl.g:6705:2: 'kanban'
+            // InternalPerspectiveDsl.g:6706:1: ( 'kanban' )
+            // InternalPerspectiveDsl.g:6707:2: 'kanban'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveKanbanAccess().getKanbanKeyword_1()); 
@@ -23219,14 +23219,14 @@
 
 
     // $ANTLR start "rule__PerspectiveKanban__Group__2"
-    // InternalPerspectiveDsl.g:6714:1: rule__PerspectiveKanban__Group__2 : rule__PerspectiveKanban__Group__2__Impl rule__PerspectiveKanban__Group__3 ;
+    // InternalPerspectiveDsl.g:6716:1: rule__PerspectiveKanban__Group__2 : rule__PerspectiveKanban__Group__2__Impl rule__PerspectiveKanban__Group__3 ;
     public final void rule__PerspectiveKanban__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6718:1: ( rule__PerspectiveKanban__Group__2__Impl rule__PerspectiveKanban__Group__3 )
-            // InternalPerspectiveDsl.g:6719:2: rule__PerspectiveKanban__Group__2__Impl rule__PerspectiveKanban__Group__3
+            // InternalPerspectiveDsl.g:6720:1: ( rule__PerspectiveKanban__Group__2__Impl rule__PerspectiveKanban__Group__3 )
+            // InternalPerspectiveDsl.g:6721:2: rule__PerspectiveKanban__Group__2__Impl rule__PerspectiveKanban__Group__3
             {
             pushFollow(FOLLOW_7);
             rule__PerspectiveKanban__Group__2__Impl();
@@ -23257,17 +23257,17 @@
 
 
     // $ANTLR start "rule__PerspectiveKanban__Group__2__Impl"
-    // InternalPerspectiveDsl.g:6726:1: rule__PerspectiveKanban__Group__2__Impl : ( 'of' ) ;
+    // InternalPerspectiveDsl.g:6728:1: rule__PerspectiveKanban__Group__2__Impl : ( 'of' ) ;
     public final void rule__PerspectiveKanban__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6730:1: ( ( 'of' ) )
-            // InternalPerspectiveDsl.g:6731:1: ( 'of' )
+            // InternalPerspectiveDsl.g:6732:1: ( ( 'of' ) )
+            // InternalPerspectiveDsl.g:6733:1: ( 'of' )
             {
-            // InternalPerspectiveDsl.g:6731:1: ( 'of' )
-            // InternalPerspectiveDsl.g:6732:2: 'of'
+            // InternalPerspectiveDsl.g:6733:1: ( 'of' )
+            // InternalPerspectiveDsl.g:6734:2: 'of'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveKanbanAccess().getOfKeyword_2()); 
@@ -23298,14 +23298,14 @@
 
 
     // $ANTLR start "rule__PerspectiveKanban__Group__3"
-    // InternalPerspectiveDsl.g:6741:1: rule__PerspectiveKanban__Group__3 : rule__PerspectiveKanban__Group__3__Impl rule__PerspectiveKanban__Group__4 ;
+    // InternalPerspectiveDsl.g:6743:1: rule__PerspectiveKanban__Group__3 : rule__PerspectiveKanban__Group__3__Impl rule__PerspectiveKanban__Group__4 ;
     public final void rule__PerspectiveKanban__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6745:1: ( rule__PerspectiveKanban__Group__3__Impl rule__PerspectiveKanban__Group__4 )
-            // InternalPerspectiveDsl.g:6746:2: rule__PerspectiveKanban__Group__3__Impl rule__PerspectiveKanban__Group__4
+            // InternalPerspectiveDsl.g:6747:1: ( rule__PerspectiveKanban__Group__3__Impl rule__PerspectiveKanban__Group__4 )
+            // InternalPerspectiveDsl.g:6748:2: rule__PerspectiveKanban__Group__3__Impl rule__PerspectiveKanban__Group__4
             {
             pushFollow(FOLLOW_36);
             rule__PerspectiveKanban__Group__3__Impl();
@@ -23336,23 +23336,23 @@
 
 
     // $ANTLR start "rule__PerspectiveKanban__Group__3__Impl"
-    // InternalPerspectiveDsl.g:6753:1: rule__PerspectiveKanban__Group__3__Impl : ( ( rule__PerspectiveKanban__DtoRefAssignment_3 ) ) ;
+    // InternalPerspectiveDsl.g:6755:1: rule__PerspectiveKanban__Group__3__Impl : ( ( rule__PerspectiveKanban__DtoRefAssignment_3 ) ) ;
     public final void rule__PerspectiveKanban__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6757:1: ( ( ( rule__PerspectiveKanban__DtoRefAssignment_3 ) ) )
-            // InternalPerspectiveDsl.g:6758:1: ( ( rule__PerspectiveKanban__DtoRefAssignment_3 ) )
+            // InternalPerspectiveDsl.g:6759:1: ( ( ( rule__PerspectiveKanban__DtoRefAssignment_3 ) ) )
+            // InternalPerspectiveDsl.g:6760:1: ( ( rule__PerspectiveKanban__DtoRefAssignment_3 ) )
             {
-            // InternalPerspectiveDsl.g:6758:1: ( ( rule__PerspectiveKanban__DtoRefAssignment_3 ) )
-            // InternalPerspectiveDsl.g:6759:2: ( rule__PerspectiveKanban__DtoRefAssignment_3 )
+            // InternalPerspectiveDsl.g:6760:1: ( ( rule__PerspectiveKanban__DtoRefAssignment_3 ) )
+            // InternalPerspectiveDsl.g:6761:2: ( rule__PerspectiveKanban__DtoRefAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveKanbanAccess().getDtoRefAssignment_3()); 
             }
-            // InternalPerspectiveDsl.g:6760:2: ( rule__PerspectiveKanban__DtoRefAssignment_3 )
-            // InternalPerspectiveDsl.g:6760:3: rule__PerspectiveKanban__DtoRefAssignment_3
+            // InternalPerspectiveDsl.g:6762:2: ( rule__PerspectiveKanban__DtoRefAssignment_3 )
+            // InternalPerspectiveDsl.g:6762:3: rule__PerspectiveKanban__DtoRefAssignment_3
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveKanban__DtoRefAssignment_3();
@@ -23387,14 +23387,14 @@
 
 
     // $ANTLR start "rule__PerspectiveKanban__Group__4"
-    // InternalPerspectiveDsl.g:6768:1: rule__PerspectiveKanban__Group__4 : rule__PerspectiveKanban__Group__4__Impl rule__PerspectiveKanban__Group__5 ;
+    // InternalPerspectiveDsl.g:6770:1: rule__PerspectiveKanban__Group__4 : rule__PerspectiveKanban__Group__4__Impl rule__PerspectiveKanban__Group__5 ;
     public final void rule__PerspectiveKanban__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6772:1: ( rule__PerspectiveKanban__Group__4__Impl rule__PerspectiveKanban__Group__5 )
-            // InternalPerspectiveDsl.g:6773:2: rule__PerspectiveKanban__Group__4__Impl rule__PerspectiveKanban__Group__5
+            // InternalPerspectiveDsl.g:6774:1: ( rule__PerspectiveKanban__Group__4__Impl rule__PerspectiveKanban__Group__5 )
+            // InternalPerspectiveDsl.g:6775:2: rule__PerspectiveKanban__Group__4__Impl rule__PerspectiveKanban__Group__5
             {
             pushFollow(FOLLOW_7);
             rule__PerspectiveKanban__Group__4__Impl();
@@ -23425,17 +23425,17 @@
 
 
     // $ANTLR start "rule__PerspectiveKanban__Group__4__Impl"
-    // InternalPerspectiveDsl.g:6780:1: rule__PerspectiveKanban__Group__4__Impl : ( 'card' ) ;
+    // InternalPerspectiveDsl.g:6782:1: rule__PerspectiveKanban__Group__4__Impl : ( 'card' ) ;
     public final void rule__PerspectiveKanban__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6784:1: ( ( 'card' ) )
-            // InternalPerspectiveDsl.g:6785:1: ( 'card' )
+            // InternalPerspectiveDsl.g:6786:1: ( ( 'card' ) )
+            // InternalPerspectiveDsl.g:6787:1: ( 'card' )
             {
-            // InternalPerspectiveDsl.g:6785:1: ( 'card' )
-            // InternalPerspectiveDsl.g:6786:2: 'card'
+            // InternalPerspectiveDsl.g:6787:1: ( 'card' )
+            // InternalPerspectiveDsl.g:6788:2: 'card'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveKanbanAccess().getCardKeyword_4()); 
@@ -23466,14 +23466,14 @@
 
 
     // $ANTLR start "rule__PerspectiveKanban__Group__5"
-    // InternalPerspectiveDsl.g:6795:1: rule__PerspectiveKanban__Group__5 : rule__PerspectiveKanban__Group__5__Impl rule__PerspectiveKanban__Group__6 ;
+    // InternalPerspectiveDsl.g:6797:1: rule__PerspectiveKanban__Group__5 : rule__PerspectiveKanban__Group__5__Impl rule__PerspectiveKanban__Group__6 ;
     public final void rule__PerspectiveKanban__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6799:1: ( rule__PerspectiveKanban__Group__5__Impl rule__PerspectiveKanban__Group__6 )
-            // InternalPerspectiveDsl.g:6800:2: rule__PerspectiveKanban__Group__5__Impl rule__PerspectiveKanban__Group__6
+            // InternalPerspectiveDsl.g:6801:1: ( rule__PerspectiveKanban__Group__5__Impl rule__PerspectiveKanban__Group__6 )
+            // InternalPerspectiveDsl.g:6802:2: rule__PerspectiveKanban__Group__5__Impl rule__PerspectiveKanban__Group__6
             {
             pushFollow(FOLLOW_32);
             rule__PerspectiveKanban__Group__5__Impl();
@@ -23504,23 +23504,23 @@
 
 
     // $ANTLR start "rule__PerspectiveKanban__Group__5__Impl"
-    // InternalPerspectiveDsl.g:6807:1: rule__PerspectiveKanban__Group__5__Impl : ( ( rule__PerspectiveKanban__CardRefAssignment_5 ) ) ;
+    // InternalPerspectiveDsl.g:6809:1: rule__PerspectiveKanban__Group__5__Impl : ( ( rule__PerspectiveKanban__CardRefAssignment_5 ) ) ;
     public final void rule__PerspectiveKanban__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6811:1: ( ( ( rule__PerspectiveKanban__CardRefAssignment_5 ) ) )
-            // InternalPerspectiveDsl.g:6812:1: ( ( rule__PerspectiveKanban__CardRefAssignment_5 ) )
+            // InternalPerspectiveDsl.g:6813:1: ( ( ( rule__PerspectiveKanban__CardRefAssignment_5 ) ) )
+            // InternalPerspectiveDsl.g:6814:1: ( ( rule__PerspectiveKanban__CardRefAssignment_5 ) )
             {
-            // InternalPerspectiveDsl.g:6812:1: ( ( rule__PerspectiveKanban__CardRefAssignment_5 ) )
-            // InternalPerspectiveDsl.g:6813:2: ( rule__PerspectiveKanban__CardRefAssignment_5 )
+            // InternalPerspectiveDsl.g:6814:1: ( ( rule__PerspectiveKanban__CardRefAssignment_5 ) )
+            // InternalPerspectiveDsl.g:6815:2: ( rule__PerspectiveKanban__CardRefAssignment_5 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveKanbanAccess().getCardRefAssignment_5()); 
             }
-            // InternalPerspectiveDsl.g:6814:2: ( rule__PerspectiveKanban__CardRefAssignment_5 )
-            // InternalPerspectiveDsl.g:6814:3: rule__PerspectiveKanban__CardRefAssignment_5
+            // InternalPerspectiveDsl.g:6816:2: ( rule__PerspectiveKanban__CardRefAssignment_5 )
+            // InternalPerspectiveDsl.g:6816:3: rule__PerspectiveKanban__CardRefAssignment_5
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveKanban__CardRefAssignment_5();
@@ -23555,14 +23555,14 @@
 
 
     // $ANTLR start "rule__PerspectiveKanban__Group__6"
-    // InternalPerspectiveDsl.g:6822:1: rule__PerspectiveKanban__Group__6 : rule__PerspectiveKanban__Group__6__Impl rule__PerspectiveKanban__Group__7 ;
+    // InternalPerspectiveDsl.g:6824:1: rule__PerspectiveKanban__Group__6 : rule__PerspectiveKanban__Group__6__Impl rule__PerspectiveKanban__Group__7 ;
     public final void rule__PerspectiveKanban__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6826:1: ( rule__PerspectiveKanban__Group__6__Impl rule__PerspectiveKanban__Group__7 )
-            // InternalPerspectiveDsl.g:6827:2: rule__PerspectiveKanban__Group__6__Impl rule__PerspectiveKanban__Group__7
+            // InternalPerspectiveDsl.g:6828:1: ( rule__PerspectiveKanban__Group__6__Impl rule__PerspectiveKanban__Group__7 )
+            // InternalPerspectiveDsl.g:6829:2: rule__PerspectiveKanban__Group__6__Impl rule__PerspectiveKanban__Group__7
             {
             pushFollow(FOLLOW_7);
             rule__PerspectiveKanban__Group__6__Impl();
@@ -23593,17 +23593,17 @@
 
 
     // $ANTLR start "rule__PerspectiveKanban__Group__6__Impl"
-    // InternalPerspectiveDsl.g:6834:1: rule__PerspectiveKanban__Group__6__Impl : ( 'dialog' ) ;
+    // InternalPerspectiveDsl.g:6836:1: rule__PerspectiveKanban__Group__6__Impl : ( 'dialog' ) ;
     public final void rule__PerspectiveKanban__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6838:1: ( ( 'dialog' ) )
-            // InternalPerspectiveDsl.g:6839:1: ( 'dialog' )
+            // InternalPerspectiveDsl.g:6840:1: ( ( 'dialog' ) )
+            // InternalPerspectiveDsl.g:6841:1: ( 'dialog' )
             {
-            // InternalPerspectiveDsl.g:6839:1: ( 'dialog' )
-            // InternalPerspectiveDsl.g:6840:2: 'dialog'
+            // InternalPerspectiveDsl.g:6841:1: ( 'dialog' )
+            // InternalPerspectiveDsl.g:6842:2: 'dialog'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveKanbanAccess().getDialogKeyword_6()); 
@@ -23634,14 +23634,14 @@
 
 
     // $ANTLR start "rule__PerspectiveKanban__Group__7"
-    // InternalPerspectiveDsl.g:6849:1: rule__PerspectiveKanban__Group__7 : rule__PerspectiveKanban__Group__7__Impl ;
+    // InternalPerspectiveDsl.g:6851:1: rule__PerspectiveKanban__Group__7 : rule__PerspectiveKanban__Group__7__Impl ;
     public final void rule__PerspectiveKanban__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6853:1: ( rule__PerspectiveKanban__Group__7__Impl )
-            // InternalPerspectiveDsl.g:6854:2: rule__PerspectiveKanban__Group__7__Impl
+            // InternalPerspectiveDsl.g:6855:1: ( rule__PerspectiveKanban__Group__7__Impl )
+            // InternalPerspectiveDsl.g:6856:2: rule__PerspectiveKanban__Group__7__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveKanban__Group__7__Impl();
@@ -23667,23 +23667,23 @@
 
 
     // $ANTLR start "rule__PerspectiveKanban__Group__7__Impl"
-    // InternalPerspectiveDsl.g:6860:1: rule__PerspectiveKanban__Group__7__Impl : ( ( rule__PerspectiveKanban__DialogRefAssignment_7 ) ) ;
+    // InternalPerspectiveDsl.g:6862:1: rule__PerspectiveKanban__Group__7__Impl : ( ( rule__PerspectiveKanban__DialogRefAssignment_7 ) ) ;
     public final void rule__PerspectiveKanban__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6864:1: ( ( ( rule__PerspectiveKanban__DialogRefAssignment_7 ) ) )
-            // InternalPerspectiveDsl.g:6865:1: ( ( rule__PerspectiveKanban__DialogRefAssignment_7 ) )
+            // InternalPerspectiveDsl.g:6866:1: ( ( ( rule__PerspectiveKanban__DialogRefAssignment_7 ) ) )
+            // InternalPerspectiveDsl.g:6867:1: ( ( rule__PerspectiveKanban__DialogRefAssignment_7 ) )
             {
-            // InternalPerspectiveDsl.g:6865:1: ( ( rule__PerspectiveKanban__DialogRefAssignment_7 ) )
-            // InternalPerspectiveDsl.g:6866:2: ( rule__PerspectiveKanban__DialogRefAssignment_7 )
+            // InternalPerspectiveDsl.g:6867:1: ( ( rule__PerspectiveKanban__DialogRefAssignment_7 ) )
+            // InternalPerspectiveDsl.g:6868:2: ( rule__PerspectiveKanban__DialogRefAssignment_7 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveKanbanAccess().getDialogRefAssignment_7()); 
             }
-            // InternalPerspectiveDsl.g:6867:2: ( rule__PerspectiveKanban__DialogRefAssignment_7 )
-            // InternalPerspectiveDsl.g:6867:3: rule__PerspectiveKanban__DialogRefAssignment_7
+            // InternalPerspectiveDsl.g:6869:2: ( rule__PerspectiveKanban__DialogRefAssignment_7 )
+            // InternalPerspectiveDsl.g:6869:3: rule__PerspectiveKanban__DialogRefAssignment_7
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveKanban__DialogRefAssignment_7();
@@ -23718,14 +23718,14 @@
 
 
     // $ANTLR start "rule__PerspectiveWelcome__Group__0"
-    // InternalPerspectiveDsl.g:6876:1: rule__PerspectiveWelcome__Group__0 : rule__PerspectiveWelcome__Group__0__Impl rule__PerspectiveWelcome__Group__1 ;
+    // InternalPerspectiveDsl.g:6878:1: rule__PerspectiveWelcome__Group__0 : rule__PerspectiveWelcome__Group__0__Impl rule__PerspectiveWelcome__Group__1 ;
     public final void rule__PerspectiveWelcome__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6880:1: ( rule__PerspectiveWelcome__Group__0__Impl rule__PerspectiveWelcome__Group__1 )
-            // InternalPerspectiveDsl.g:6881:2: rule__PerspectiveWelcome__Group__0__Impl rule__PerspectiveWelcome__Group__1
+            // InternalPerspectiveDsl.g:6882:1: ( rule__PerspectiveWelcome__Group__0__Impl rule__PerspectiveWelcome__Group__1 )
+            // InternalPerspectiveDsl.g:6883:2: rule__PerspectiveWelcome__Group__0__Impl rule__PerspectiveWelcome__Group__1
             {
             pushFollow(FOLLOW_37);
             rule__PerspectiveWelcome__Group__0__Impl();
@@ -23756,23 +23756,23 @@
 
 
     // $ANTLR start "rule__PerspectiveWelcome__Group__0__Impl"
-    // InternalPerspectiveDsl.g:6888:1: rule__PerspectiveWelcome__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:6890:1: rule__PerspectiveWelcome__Group__0__Impl : ( () ) ;
     public final void rule__PerspectiveWelcome__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6892:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:6893:1: ( () )
+            // InternalPerspectiveDsl.g:6894:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:6895:1: ( () )
             {
-            // InternalPerspectiveDsl.g:6893:1: ( () )
-            // InternalPerspectiveDsl.g:6894:2: ()
+            // InternalPerspectiveDsl.g:6895:1: ( () )
+            // InternalPerspectiveDsl.g:6896:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveWelcomeAccess().getPerspectiveWelcomeAction_0()); 
             }
-            // InternalPerspectiveDsl.g:6895:2: ()
-            // InternalPerspectiveDsl.g:6895:3: 
+            // InternalPerspectiveDsl.g:6897:2: ()
+            // InternalPerspectiveDsl.g:6897:3: 
             {
             }
 
@@ -23797,14 +23797,14 @@
 
 
     // $ANTLR start "rule__PerspectiveWelcome__Group__1"
-    // InternalPerspectiveDsl.g:6903:1: rule__PerspectiveWelcome__Group__1 : rule__PerspectiveWelcome__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:6905:1: rule__PerspectiveWelcome__Group__1 : rule__PerspectiveWelcome__Group__1__Impl ;
     public final void rule__PerspectiveWelcome__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6907:1: ( rule__PerspectiveWelcome__Group__1__Impl )
-            // InternalPerspectiveDsl.g:6908:2: rule__PerspectiveWelcome__Group__1__Impl
+            // InternalPerspectiveDsl.g:6909:1: ( rule__PerspectiveWelcome__Group__1__Impl )
+            // InternalPerspectiveDsl.g:6910:2: rule__PerspectiveWelcome__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveWelcome__Group__1__Impl();
@@ -23830,17 +23830,17 @@
 
 
     // $ANTLR start "rule__PerspectiveWelcome__Group__1__Impl"
-    // InternalPerspectiveDsl.g:6914:1: rule__PerspectiveWelcome__Group__1__Impl : ( 'welcome' ) ;
+    // InternalPerspectiveDsl.g:6916:1: rule__PerspectiveWelcome__Group__1__Impl : ( 'welcome' ) ;
     public final void rule__PerspectiveWelcome__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6918:1: ( ( 'welcome' ) )
-            // InternalPerspectiveDsl.g:6919:1: ( 'welcome' )
+            // InternalPerspectiveDsl.g:6920:1: ( ( 'welcome' ) )
+            // InternalPerspectiveDsl.g:6921:1: ( 'welcome' )
             {
-            // InternalPerspectiveDsl.g:6919:1: ( 'welcome' )
-            // InternalPerspectiveDsl.g:6920:2: 'welcome'
+            // InternalPerspectiveDsl.g:6921:1: ( 'welcome' )
+            // InternalPerspectiveDsl.g:6922:2: 'welcome'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveWelcomeAccess().getWelcomeKeyword_1()); 
@@ -23871,14 +23871,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__Group__0"
-    // InternalPerspectiveDsl.g:6930:1: rule__PerspectiveSearch__Group__0 : rule__PerspectiveSearch__Group__0__Impl rule__PerspectiveSearch__Group__1 ;
+    // InternalPerspectiveDsl.g:6932:1: rule__PerspectiveSearch__Group__0 : rule__PerspectiveSearch__Group__0__Impl rule__PerspectiveSearch__Group__1 ;
     public final void rule__PerspectiveSearch__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6934:1: ( rule__PerspectiveSearch__Group__0__Impl rule__PerspectiveSearch__Group__1 )
-            // InternalPerspectiveDsl.g:6935:2: rule__PerspectiveSearch__Group__0__Impl rule__PerspectiveSearch__Group__1
+            // InternalPerspectiveDsl.g:6936:1: ( rule__PerspectiveSearch__Group__0__Impl rule__PerspectiveSearch__Group__1 )
+            // InternalPerspectiveDsl.g:6937:2: rule__PerspectiveSearch__Group__0__Impl rule__PerspectiveSearch__Group__1
             {
             pushFollow(FOLLOW_38);
             rule__PerspectiveSearch__Group__0__Impl();
@@ -23909,23 +23909,23 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__Group__0__Impl"
-    // InternalPerspectiveDsl.g:6942:1: rule__PerspectiveSearch__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:6944:1: rule__PerspectiveSearch__Group__0__Impl : ( () ) ;
     public final void rule__PerspectiveSearch__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6946:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:6947:1: ( () )
+            // InternalPerspectiveDsl.g:6948:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:6949:1: ( () )
             {
-            // InternalPerspectiveDsl.g:6947:1: ( () )
-            // InternalPerspectiveDsl.g:6948:2: ()
+            // InternalPerspectiveDsl.g:6949:1: ( () )
+            // InternalPerspectiveDsl.g:6950:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSearchAccess().getPerspectiveSearchAction_0()); 
             }
-            // InternalPerspectiveDsl.g:6949:2: ()
-            // InternalPerspectiveDsl.g:6949:3: 
+            // InternalPerspectiveDsl.g:6951:2: ()
+            // InternalPerspectiveDsl.g:6951:3: 
             {
             }
 
@@ -23950,14 +23950,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__Group__1"
-    // InternalPerspectiveDsl.g:6957:1: rule__PerspectiveSearch__Group__1 : rule__PerspectiveSearch__Group__1__Impl rule__PerspectiveSearch__Group__2 ;
+    // InternalPerspectiveDsl.g:6959:1: rule__PerspectiveSearch__Group__1 : rule__PerspectiveSearch__Group__1__Impl rule__PerspectiveSearch__Group__2 ;
     public final void rule__PerspectiveSearch__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6961:1: ( rule__PerspectiveSearch__Group__1__Impl rule__PerspectiveSearch__Group__2 )
-            // InternalPerspectiveDsl.g:6962:2: rule__PerspectiveSearch__Group__1__Impl rule__PerspectiveSearch__Group__2
+            // InternalPerspectiveDsl.g:6963:1: ( rule__PerspectiveSearch__Group__1__Impl rule__PerspectiveSearch__Group__2 )
+            // InternalPerspectiveDsl.g:6964:2: rule__PerspectiveSearch__Group__1__Impl rule__PerspectiveSearch__Group__2
             {
             pushFollow(FOLLOW_39);
             rule__PerspectiveSearch__Group__1__Impl();
@@ -23988,17 +23988,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__Group__1__Impl"
-    // InternalPerspectiveDsl.g:6969:1: rule__PerspectiveSearch__Group__1__Impl : ( 'search' ) ;
+    // InternalPerspectiveDsl.g:6971:1: rule__PerspectiveSearch__Group__1__Impl : ( 'search' ) ;
     public final void rule__PerspectiveSearch__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6973:1: ( ( 'search' ) )
-            // InternalPerspectiveDsl.g:6974:1: ( 'search' )
+            // InternalPerspectiveDsl.g:6975:1: ( ( 'search' ) )
+            // InternalPerspectiveDsl.g:6976:1: ( 'search' )
             {
-            // InternalPerspectiveDsl.g:6974:1: ( 'search' )
-            // InternalPerspectiveDsl.g:6975:2: 'search'
+            // InternalPerspectiveDsl.g:6976:1: ( 'search' )
+            // InternalPerspectiveDsl.g:6977:2: 'search'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSearchAccess().getSearchKeyword_1()); 
@@ -24029,14 +24029,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__Group__2"
-    // InternalPerspectiveDsl.g:6984:1: rule__PerspectiveSearch__Group__2 : rule__PerspectiveSearch__Group__2__Impl rule__PerspectiveSearch__Group__3 ;
+    // InternalPerspectiveDsl.g:6986:1: rule__PerspectiveSearch__Group__2 : rule__PerspectiveSearch__Group__2__Impl rule__PerspectiveSearch__Group__3 ;
     public final void rule__PerspectiveSearch__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:6988:1: ( rule__PerspectiveSearch__Group__2__Impl rule__PerspectiveSearch__Group__3 )
-            // InternalPerspectiveDsl.g:6989:2: rule__PerspectiveSearch__Group__2__Impl rule__PerspectiveSearch__Group__3
+            // InternalPerspectiveDsl.g:6990:1: ( rule__PerspectiveSearch__Group__2__Impl rule__PerspectiveSearch__Group__3 )
+            // InternalPerspectiveDsl.g:6991:2: rule__PerspectiveSearch__Group__2__Impl rule__PerspectiveSearch__Group__3
             {
             pushFollow(FOLLOW_7);
             rule__PerspectiveSearch__Group__2__Impl();
@@ -24067,17 +24067,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__Group__2__Impl"
-    // InternalPerspectiveDsl.g:6996:1: rule__PerspectiveSearch__Group__2__Impl : ( 'in' ) ;
+    // InternalPerspectiveDsl.g:6998:1: rule__PerspectiveSearch__Group__2__Impl : ( 'in' ) ;
     public final void rule__PerspectiveSearch__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7000:1: ( ( 'in' ) )
-            // InternalPerspectiveDsl.g:7001:1: ( 'in' )
+            // InternalPerspectiveDsl.g:7002:1: ( ( 'in' ) )
+            // InternalPerspectiveDsl.g:7003:1: ( 'in' )
             {
-            // InternalPerspectiveDsl.g:7001:1: ( 'in' )
-            // InternalPerspectiveDsl.g:7002:2: 'in'
+            // InternalPerspectiveDsl.g:7003:1: ( 'in' )
+            // InternalPerspectiveDsl.g:7004:2: 'in'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSearchAccess().getInKeyword_2()); 
@@ -24108,14 +24108,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__Group__3"
-    // InternalPerspectiveDsl.g:7011:1: rule__PerspectiveSearch__Group__3 : rule__PerspectiveSearch__Group__3__Impl rule__PerspectiveSearch__Group__4 ;
+    // InternalPerspectiveDsl.g:7013:1: rule__PerspectiveSearch__Group__3 : rule__PerspectiveSearch__Group__3__Impl rule__PerspectiveSearch__Group__4 ;
     public final void rule__PerspectiveSearch__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7015:1: ( rule__PerspectiveSearch__Group__3__Impl rule__PerspectiveSearch__Group__4 )
-            // InternalPerspectiveDsl.g:7016:2: rule__PerspectiveSearch__Group__3__Impl rule__PerspectiveSearch__Group__4
+            // InternalPerspectiveDsl.g:7017:1: ( rule__PerspectiveSearch__Group__3__Impl rule__PerspectiveSearch__Group__4 )
+            // InternalPerspectiveDsl.g:7018:2: rule__PerspectiveSearch__Group__3__Impl rule__PerspectiveSearch__Group__4
             {
             pushFollow(FOLLOW_40);
             rule__PerspectiveSearch__Group__3__Impl();
@@ -24146,23 +24146,23 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__Group__3__Impl"
-    // InternalPerspectiveDsl.g:7023:1: rule__PerspectiveSearch__Group__3__Impl : ( ( rule__PerspectiveSearch__DtoRefAssignment_3 ) ) ;
+    // InternalPerspectiveDsl.g:7025:1: rule__PerspectiveSearch__Group__3__Impl : ( ( rule__PerspectiveSearch__DtoRefAssignment_3 ) ) ;
     public final void rule__PerspectiveSearch__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7027:1: ( ( ( rule__PerspectiveSearch__DtoRefAssignment_3 ) ) )
-            // InternalPerspectiveDsl.g:7028:1: ( ( rule__PerspectiveSearch__DtoRefAssignment_3 ) )
+            // InternalPerspectiveDsl.g:7029:1: ( ( ( rule__PerspectiveSearch__DtoRefAssignment_3 ) ) )
+            // InternalPerspectiveDsl.g:7030:1: ( ( rule__PerspectiveSearch__DtoRefAssignment_3 ) )
             {
-            // InternalPerspectiveDsl.g:7028:1: ( ( rule__PerspectiveSearch__DtoRefAssignment_3 ) )
-            // InternalPerspectiveDsl.g:7029:2: ( rule__PerspectiveSearch__DtoRefAssignment_3 )
+            // InternalPerspectiveDsl.g:7030:1: ( ( rule__PerspectiveSearch__DtoRefAssignment_3 ) )
+            // InternalPerspectiveDsl.g:7031:2: ( rule__PerspectiveSearch__DtoRefAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSearchAccess().getDtoRefAssignment_3()); 
             }
-            // InternalPerspectiveDsl.g:7030:2: ( rule__PerspectiveSearch__DtoRefAssignment_3 )
-            // InternalPerspectiveDsl.g:7030:3: rule__PerspectiveSearch__DtoRefAssignment_3
+            // InternalPerspectiveDsl.g:7032:2: ( rule__PerspectiveSearch__DtoRefAssignment_3 )
+            // InternalPerspectiveDsl.g:7032:3: rule__PerspectiveSearch__DtoRefAssignment_3
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSearch__DtoRefAssignment_3();
@@ -24197,14 +24197,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__Group__4"
-    // InternalPerspectiveDsl.g:7038:1: rule__PerspectiveSearch__Group__4 : rule__PerspectiveSearch__Group__4__Impl ;
+    // InternalPerspectiveDsl.g:7040:1: rule__PerspectiveSearch__Group__4 : rule__PerspectiveSearch__Group__4__Impl ;
     public final void rule__PerspectiveSearch__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7042:1: ( rule__PerspectiveSearch__Group__4__Impl )
-            // InternalPerspectiveDsl.g:7043:2: rule__PerspectiveSearch__Group__4__Impl
+            // InternalPerspectiveDsl.g:7044:1: ( rule__PerspectiveSearch__Group__4__Impl )
+            // InternalPerspectiveDsl.g:7045:2: rule__PerspectiveSearch__Group__4__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSearch__Group__4__Impl();
@@ -24230,23 +24230,23 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__Group__4__Impl"
-    // InternalPerspectiveDsl.g:7049:1: rule__PerspectiveSearch__Group__4__Impl : ( ( rule__PerspectiveSearch__UnorderedGroup_4 ) ) ;
+    // InternalPerspectiveDsl.g:7051:1: rule__PerspectiveSearch__Group__4__Impl : ( ( rule__PerspectiveSearch__UnorderedGroup_4 ) ) ;
     public final void rule__PerspectiveSearch__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7053:1: ( ( ( rule__PerspectiveSearch__UnorderedGroup_4 ) ) )
-            // InternalPerspectiveDsl.g:7054:1: ( ( rule__PerspectiveSearch__UnorderedGroup_4 ) )
+            // InternalPerspectiveDsl.g:7055:1: ( ( ( rule__PerspectiveSearch__UnorderedGroup_4 ) ) )
+            // InternalPerspectiveDsl.g:7056:1: ( ( rule__PerspectiveSearch__UnorderedGroup_4 ) )
             {
-            // InternalPerspectiveDsl.g:7054:1: ( ( rule__PerspectiveSearch__UnorderedGroup_4 ) )
-            // InternalPerspectiveDsl.g:7055:2: ( rule__PerspectiveSearch__UnorderedGroup_4 )
+            // InternalPerspectiveDsl.g:7056:1: ( ( rule__PerspectiveSearch__UnorderedGroup_4 ) )
+            // InternalPerspectiveDsl.g:7057:2: ( rule__PerspectiveSearch__UnorderedGroup_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSearchAccess().getUnorderedGroup_4()); 
             }
-            // InternalPerspectiveDsl.g:7056:2: ( rule__PerspectiveSearch__UnorderedGroup_4 )
-            // InternalPerspectiveDsl.g:7056:3: rule__PerspectiveSearch__UnorderedGroup_4
+            // InternalPerspectiveDsl.g:7058:2: ( rule__PerspectiveSearch__UnorderedGroup_4 )
+            // InternalPerspectiveDsl.g:7058:3: rule__PerspectiveSearch__UnorderedGroup_4
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSearch__UnorderedGroup_4();
@@ -24281,14 +24281,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__Group_4_0__0"
-    // InternalPerspectiveDsl.g:7065:1: rule__PerspectiveSearch__Group_4_0__0 : rule__PerspectiveSearch__Group_4_0__0__Impl rule__PerspectiveSearch__Group_4_0__1 ;
+    // InternalPerspectiveDsl.g:7067:1: rule__PerspectiveSearch__Group_4_0__0 : rule__PerspectiveSearch__Group_4_0__0__Impl rule__PerspectiveSearch__Group_4_0__1 ;
     public final void rule__PerspectiveSearch__Group_4_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7069:1: ( rule__PerspectiveSearch__Group_4_0__0__Impl rule__PerspectiveSearch__Group_4_0__1 )
-            // InternalPerspectiveDsl.g:7070:2: rule__PerspectiveSearch__Group_4_0__0__Impl rule__PerspectiveSearch__Group_4_0__1
+            // InternalPerspectiveDsl.g:7071:1: ( rule__PerspectiveSearch__Group_4_0__0__Impl rule__PerspectiveSearch__Group_4_0__1 )
+            // InternalPerspectiveDsl.g:7072:2: rule__PerspectiveSearch__Group_4_0__0__Impl rule__PerspectiveSearch__Group_4_0__1
             {
             pushFollow(FOLLOW_41);
             rule__PerspectiveSearch__Group_4_0__0__Impl();
@@ -24319,17 +24319,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__Group_4_0__0__Impl"
-    // InternalPerspectiveDsl.g:7077:1: rule__PerspectiveSearch__Group_4_0__0__Impl : ( 'depth' ) ;
+    // InternalPerspectiveDsl.g:7079:1: rule__PerspectiveSearch__Group_4_0__0__Impl : ( 'depth' ) ;
     public final void rule__PerspectiveSearch__Group_4_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7081:1: ( ( 'depth' ) )
-            // InternalPerspectiveDsl.g:7082:1: ( 'depth' )
+            // InternalPerspectiveDsl.g:7083:1: ( ( 'depth' ) )
+            // InternalPerspectiveDsl.g:7084:1: ( 'depth' )
             {
-            // InternalPerspectiveDsl.g:7082:1: ( 'depth' )
-            // InternalPerspectiveDsl.g:7083:2: 'depth'
+            // InternalPerspectiveDsl.g:7084:1: ( 'depth' )
+            // InternalPerspectiveDsl.g:7085:2: 'depth'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSearchAccess().getDepthKeyword_4_0_0()); 
@@ -24360,14 +24360,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__Group_4_0__1"
-    // InternalPerspectiveDsl.g:7092:1: rule__PerspectiveSearch__Group_4_0__1 : rule__PerspectiveSearch__Group_4_0__1__Impl ;
+    // InternalPerspectiveDsl.g:7094:1: rule__PerspectiveSearch__Group_4_0__1 : rule__PerspectiveSearch__Group_4_0__1__Impl ;
     public final void rule__PerspectiveSearch__Group_4_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7096:1: ( rule__PerspectiveSearch__Group_4_0__1__Impl )
-            // InternalPerspectiveDsl.g:7097:2: rule__PerspectiveSearch__Group_4_0__1__Impl
+            // InternalPerspectiveDsl.g:7098:1: ( rule__PerspectiveSearch__Group_4_0__1__Impl )
+            // InternalPerspectiveDsl.g:7099:2: rule__PerspectiveSearch__Group_4_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSearch__Group_4_0__1__Impl();
@@ -24393,23 +24393,23 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__Group_4_0__1__Impl"
-    // InternalPerspectiveDsl.g:7103:1: rule__PerspectiveSearch__Group_4_0__1__Impl : ( ( rule__PerspectiveSearch__DepthAssignment_4_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:7105:1: rule__PerspectiveSearch__Group_4_0__1__Impl : ( ( rule__PerspectiveSearch__DepthAssignment_4_0_1 ) ) ;
     public final void rule__PerspectiveSearch__Group_4_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7107:1: ( ( ( rule__PerspectiveSearch__DepthAssignment_4_0_1 ) ) )
-            // InternalPerspectiveDsl.g:7108:1: ( ( rule__PerspectiveSearch__DepthAssignment_4_0_1 ) )
+            // InternalPerspectiveDsl.g:7109:1: ( ( ( rule__PerspectiveSearch__DepthAssignment_4_0_1 ) ) )
+            // InternalPerspectiveDsl.g:7110:1: ( ( rule__PerspectiveSearch__DepthAssignment_4_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:7108:1: ( ( rule__PerspectiveSearch__DepthAssignment_4_0_1 ) )
-            // InternalPerspectiveDsl.g:7109:2: ( rule__PerspectiveSearch__DepthAssignment_4_0_1 )
+            // InternalPerspectiveDsl.g:7110:1: ( ( rule__PerspectiveSearch__DepthAssignment_4_0_1 ) )
+            // InternalPerspectiveDsl.g:7111:2: ( rule__PerspectiveSearch__DepthAssignment_4_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSearchAccess().getDepthAssignment_4_0_1()); 
             }
-            // InternalPerspectiveDsl.g:7110:2: ( rule__PerspectiveSearch__DepthAssignment_4_0_1 )
-            // InternalPerspectiveDsl.g:7110:3: rule__PerspectiveSearch__DepthAssignment_4_0_1
+            // InternalPerspectiveDsl.g:7112:2: ( rule__PerspectiveSearch__DepthAssignment_4_0_1 )
+            // InternalPerspectiveDsl.g:7112:3: rule__PerspectiveSearch__DepthAssignment_4_0_1
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSearch__DepthAssignment_4_0_1();
@@ -24444,14 +24444,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__Group_4_1__0"
-    // InternalPerspectiveDsl.g:7119:1: rule__PerspectiveSearch__Group_4_1__0 : rule__PerspectiveSearch__Group_4_1__0__Impl rule__PerspectiveSearch__Group_4_1__1 ;
+    // InternalPerspectiveDsl.g:7121:1: rule__PerspectiveSearch__Group_4_1__0 : rule__PerspectiveSearch__Group_4_1__0__Impl rule__PerspectiveSearch__Group_4_1__1 ;
     public final void rule__PerspectiveSearch__Group_4_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7123:1: ( rule__PerspectiveSearch__Group_4_1__0__Impl rule__PerspectiveSearch__Group_4_1__1 )
-            // InternalPerspectiveDsl.g:7124:2: rule__PerspectiveSearch__Group_4_1__0__Impl rule__PerspectiveSearch__Group_4_1__1
+            // InternalPerspectiveDsl.g:7125:1: ( rule__PerspectiveSearch__Group_4_1__0__Impl rule__PerspectiveSearch__Group_4_1__1 )
+            // InternalPerspectiveDsl.g:7126:2: rule__PerspectiveSearch__Group_4_1__0__Impl rule__PerspectiveSearch__Group_4_1__1
             {
             pushFollow(FOLLOW_41);
             rule__PerspectiveSearch__Group_4_1__0__Impl();
@@ -24482,17 +24482,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__Group_4_1__0__Impl"
-    // InternalPerspectiveDsl.g:7131:1: rule__PerspectiveSearch__Group_4_1__0__Impl : ( 'filterColumns' ) ;
+    // InternalPerspectiveDsl.g:7133:1: rule__PerspectiveSearch__Group_4_1__0__Impl : ( 'filterColumns' ) ;
     public final void rule__PerspectiveSearch__Group_4_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7135:1: ( ( 'filterColumns' ) )
-            // InternalPerspectiveDsl.g:7136:1: ( 'filterColumns' )
+            // InternalPerspectiveDsl.g:7137:1: ( ( 'filterColumns' ) )
+            // InternalPerspectiveDsl.g:7138:1: ( 'filterColumns' )
             {
-            // InternalPerspectiveDsl.g:7136:1: ( 'filterColumns' )
-            // InternalPerspectiveDsl.g:7137:2: 'filterColumns'
+            // InternalPerspectiveDsl.g:7138:1: ( 'filterColumns' )
+            // InternalPerspectiveDsl.g:7139:2: 'filterColumns'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSearchAccess().getFilterColumnsKeyword_4_1_0()); 
@@ -24523,14 +24523,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__Group_4_1__1"
-    // InternalPerspectiveDsl.g:7146:1: rule__PerspectiveSearch__Group_4_1__1 : rule__PerspectiveSearch__Group_4_1__1__Impl ;
+    // InternalPerspectiveDsl.g:7148:1: rule__PerspectiveSearch__Group_4_1__1 : rule__PerspectiveSearch__Group_4_1__1__Impl ;
     public final void rule__PerspectiveSearch__Group_4_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7150:1: ( rule__PerspectiveSearch__Group_4_1__1__Impl )
-            // InternalPerspectiveDsl.g:7151:2: rule__PerspectiveSearch__Group_4_1__1__Impl
+            // InternalPerspectiveDsl.g:7152:1: ( rule__PerspectiveSearch__Group_4_1__1__Impl )
+            // InternalPerspectiveDsl.g:7153:2: rule__PerspectiveSearch__Group_4_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSearch__Group_4_1__1__Impl();
@@ -24556,23 +24556,23 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__Group_4_1__1__Impl"
-    // InternalPerspectiveDsl.g:7157:1: rule__PerspectiveSearch__Group_4_1__1__Impl : ( ( rule__PerspectiveSearch__FilterColsAssignment_4_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:7159:1: rule__PerspectiveSearch__Group_4_1__1__Impl : ( ( rule__PerspectiveSearch__FilterColsAssignment_4_1_1 ) ) ;
     public final void rule__PerspectiveSearch__Group_4_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7161:1: ( ( ( rule__PerspectiveSearch__FilterColsAssignment_4_1_1 ) ) )
-            // InternalPerspectiveDsl.g:7162:1: ( ( rule__PerspectiveSearch__FilterColsAssignment_4_1_1 ) )
+            // InternalPerspectiveDsl.g:7163:1: ( ( ( rule__PerspectiveSearch__FilterColsAssignment_4_1_1 ) ) )
+            // InternalPerspectiveDsl.g:7164:1: ( ( rule__PerspectiveSearch__FilterColsAssignment_4_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:7162:1: ( ( rule__PerspectiveSearch__FilterColsAssignment_4_1_1 ) )
-            // InternalPerspectiveDsl.g:7163:2: ( rule__PerspectiveSearch__FilterColsAssignment_4_1_1 )
+            // InternalPerspectiveDsl.g:7164:1: ( ( rule__PerspectiveSearch__FilterColsAssignment_4_1_1 ) )
+            // InternalPerspectiveDsl.g:7165:2: ( rule__PerspectiveSearch__FilterColsAssignment_4_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSearchAccess().getFilterColsAssignment_4_1_1()); 
             }
-            // InternalPerspectiveDsl.g:7164:2: ( rule__PerspectiveSearch__FilterColsAssignment_4_1_1 )
-            // InternalPerspectiveDsl.g:7164:3: rule__PerspectiveSearch__FilterColsAssignment_4_1_1
+            // InternalPerspectiveDsl.g:7166:2: ( rule__PerspectiveSearch__FilterColsAssignment_4_1_1 )
+            // InternalPerspectiveDsl.g:7166:3: rule__PerspectiveSearch__FilterColsAssignment_4_1_1
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSearch__FilterColsAssignment_4_1_1();
@@ -24607,14 +24607,14 @@
 
 
     // $ANTLR start "rule__PerspectiveDataInterchange__Group__0"
-    // InternalPerspectiveDsl.g:7173:1: rule__PerspectiveDataInterchange__Group__0 : rule__PerspectiveDataInterchange__Group__0__Impl rule__PerspectiveDataInterchange__Group__1 ;
+    // InternalPerspectiveDsl.g:7175:1: rule__PerspectiveDataInterchange__Group__0 : rule__PerspectiveDataInterchange__Group__0__Impl rule__PerspectiveDataInterchange__Group__1 ;
     public final void rule__PerspectiveDataInterchange__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7177:1: ( rule__PerspectiveDataInterchange__Group__0__Impl rule__PerspectiveDataInterchange__Group__1 )
-            // InternalPerspectiveDsl.g:7178:2: rule__PerspectiveDataInterchange__Group__0__Impl rule__PerspectiveDataInterchange__Group__1
+            // InternalPerspectiveDsl.g:7179:1: ( rule__PerspectiveDataInterchange__Group__0__Impl rule__PerspectiveDataInterchange__Group__1 )
+            // InternalPerspectiveDsl.g:7180:2: rule__PerspectiveDataInterchange__Group__0__Impl rule__PerspectiveDataInterchange__Group__1
             {
             pushFollow(FOLLOW_42);
             rule__PerspectiveDataInterchange__Group__0__Impl();
@@ -24645,23 +24645,23 @@
 
 
     // $ANTLR start "rule__PerspectiveDataInterchange__Group__0__Impl"
-    // InternalPerspectiveDsl.g:7185:1: rule__PerspectiveDataInterchange__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:7187:1: rule__PerspectiveDataInterchange__Group__0__Impl : ( () ) ;
     public final void rule__PerspectiveDataInterchange__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7189:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:7190:1: ( () )
+            // InternalPerspectiveDsl.g:7191:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:7192:1: ( () )
             {
-            // InternalPerspectiveDsl.g:7190:1: ( () )
-            // InternalPerspectiveDsl.g:7191:2: ()
+            // InternalPerspectiveDsl.g:7192:1: ( () )
+            // InternalPerspectiveDsl.g:7193:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveDataInterchangeAccess().getPerspectiveDataInterchangeAction_0()); 
             }
-            // InternalPerspectiveDsl.g:7192:2: ()
-            // InternalPerspectiveDsl.g:7192:3: 
+            // InternalPerspectiveDsl.g:7194:2: ()
+            // InternalPerspectiveDsl.g:7194:3: 
             {
             }
 
@@ -24686,14 +24686,14 @@
 
 
     // $ANTLR start "rule__PerspectiveDataInterchange__Group__1"
-    // InternalPerspectiveDsl.g:7200:1: rule__PerspectiveDataInterchange__Group__1 : rule__PerspectiveDataInterchange__Group__1__Impl rule__PerspectiveDataInterchange__Group__2 ;
+    // InternalPerspectiveDsl.g:7202:1: rule__PerspectiveDataInterchange__Group__1 : rule__PerspectiveDataInterchange__Group__1__Impl rule__PerspectiveDataInterchange__Group__2 ;
     public final void rule__PerspectiveDataInterchange__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7204:1: ( rule__PerspectiveDataInterchange__Group__1__Impl rule__PerspectiveDataInterchange__Group__2 )
-            // InternalPerspectiveDsl.g:7205:2: rule__PerspectiveDataInterchange__Group__1__Impl rule__PerspectiveDataInterchange__Group__2
+            // InternalPerspectiveDsl.g:7206:1: ( rule__PerspectiveDataInterchange__Group__1__Impl rule__PerspectiveDataInterchange__Group__2 )
+            // InternalPerspectiveDsl.g:7207:2: rule__PerspectiveDataInterchange__Group__1__Impl rule__PerspectiveDataInterchange__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__PerspectiveDataInterchange__Group__1__Impl();
@@ -24724,17 +24724,17 @@
 
 
     // $ANTLR start "rule__PerspectiveDataInterchange__Group__1__Impl"
-    // InternalPerspectiveDsl.g:7212:1: rule__PerspectiveDataInterchange__Group__1__Impl : ( 'dataInterchange' ) ;
+    // InternalPerspectiveDsl.g:7214:1: rule__PerspectiveDataInterchange__Group__1__Impl : ( 'dataInterchange' ) ;
     public final void rule__PerspectiveDataInterchange__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7216:1: ( ( 'dataInterchange' ) )
-            // InternalPerspectiveDsl.g:7217:1: ( 'dataInterchange' )
+            // InternalPerspectiveDsl.g:7218:1: ( ( 'dataInterchange' ) )
+            // InternalPerspectiveDsl.g:7219:1: ( 'dataInterchange' )
             {
-            // InternalPerspectiveDsl.g:7217:1: ( 'dataInterchange' )
-            // InternalPerspectiveDsl.g:7218:2: 'dataInterchange'
+            // InternalPerspectiveDsl.g:7219:1: ( 'dataInterchange' )
+            // InternalPerspectiveDsl.g:7220:2: 'dataInterchange'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveDataInterchangeAccess().getDataInterchangeKeyword_1()); 
@@ -24765,14 +24765,14 @@
 
 
     // $ANTLR start "rule__PerspectiveDataInterchange__Group__2"
-    // InternalPerspectiveDsl.g:7227:1: rule__PerspectiveDataInterchange__Group__2 : rule__PerspectiveDataInterchange__Group__2__Impl ;
+    // InternalPerspectiveDsl.g:7229:1: rule__PerspectiveDataInterchange__Group__2 : rule__PerspectiveDataInterchange__Group__2__Impl ;
     public final void rule__PerspectiveDataInterchange__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7231:1: ( rule__PerspectiveDataInterchange__Group__2__Impl )
-            // InternalPerspectiveDsl.g:7232:2: rule__PerspectiveDataInterchange__Group__2__Impl
+            // InternalPerspectiveDsl.g:7233:1: ( rule__PerspectiveDataInterchange__Group__2__Impl )
+            // InternalPerspectiveDsl.g:7234:2: rule__PerspectiveDataInterchange__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveDataInterchange__Group__2__Impl();
@@ -24798,23 +24798,23 @@
 
 
     // $ANTLR start "rule__PerspectiveDataInterchange__Group__2__Impl"
-    // InternalPerspectiveDsl.g:7238:1: rule__PerspectiveDataInterchange__Group__2__Impl : ( ( rule__PerspectiveDataInterchange__RefAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:7240:1: rule__PerspectiveDataInterchange__Group__2__Impl : ( ( rule__PerspectiveDataInterchange__RefAssignment_2 ) ) ;
     public final void rule__PerspectiveDataInterchange__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7242:1: ( ( ( rule__PerspectiveDataInterchange__RefAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:7243:1: ( ( rule__PerspectiveDataInterchange__RefAssignment_2 ) )
+            // InternalPerspectiveDsl.g:7244:1: ( ( ( rule__PerspectiveDataInterchange__RefAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:7245:1: ( ( rule__PerspectiveDataInterchange__RefAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:7243:1: ( ( rule__PerspectiveDataInterchange__RefAssignment_2 ) )
-            // InternalPerspectiveDsl.g:7244:2: ( rule__PerspectiveDataInterchange__RefAssignment_2 )
+            // InternalPerspectiveDsl.g:7245:1: ( ( rule__PerspectiveDataInterchange__RefAssignment_2 ) )
+            // InternalPerspectiveDsl.g:7246:2: ( rule__PerspectiveDataInterchange__RefAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveDataInterchangeAccess().getRefAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:7245:2: ( rule__PerspectiveDataInterchange__RefAssignment_2 )
-            // InternalPerspectiveDsl.g:7245:3: rule__PerspectiveDataInterchange__RefAssignment_2
+            // InternalPerspectiveDsl.g:7247:2: ( rule__PerspectiveDataInterchange__RefAssignment_2 )
+            // InternalPerspectiveDsl.g:7247:3: rule__PerspectiveDataInterchange__RefAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveDataInterchange__RefAssignment_2();
@@ -24849,14 +24849,14 @@
 
 
     // $ANTLR start "rule__PerspectiveTitle__Group__0"
-    // InternalPerspectiveDsl.g:7254:1: rule__PerspectiveTitle__Group__0 : rule__PerspectiveTitle__Group__0__Impl rule__PerspectiveTitle__Group__1 ;
+    // InternalPerspectiveDsl.g:7256:1: rule__PerspectiveTitle__Group__0 : rule__PerspectiveTitle__Group__0__Impl rule__PerspectiveTitle__Group__1 ;
     public final void rule__PerspectiveTitle__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7258:1: ( rule__PerspectiveTitle__Group__0__Impl rule__PerspectiveTitle__Group__1 )
-            // InternalPerspectiveDsl.g:7259:2: rule__PerspectiveTitle__Group__0__Impl rule__PerspectiveTitle__Group__1
+            // InternalPerspectiveDsl.g:7260:1: ( rule__PerspectiveTitle__Group__0__Impl rule__PerspectiveTitle__Group__1 )
+            // InternalPerspectiveDsl.g:7261:2: rule__PerspectiveTitle__Group__0__Impl rule__PerspectiveTitle__Group__1
             {
             pushFollow(FOLLOW_43);
             rule__PerspectiveTitle__Group__0__Impl();
@@ -24887,23 +24887,23 @@
 
 
     // $ANTLR start "rule__PerspectiveTitle__Group__0__Impl"
-    // InternalPerspectiveDsl.g:7266:1: rule__PerspectiveTitle__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:7268:1: rule__PerspectiveTitle__Group__0__Impl : ( () ) ;
     public final void rule__PerspectiveTitle__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7270:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:7271:1: ( () )
+            // InternalPerspectiveDsl.g:7272:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:7273:1: ( () )
             {
-            // InternalPerspectiveDsl.g:7271:1: ( () )
-            // InternalPerspectiveDsl.g:7272:2: ()
+            // InternalPerspectiveDsl.g:7273:1: ( () )
+            // InternalPerspectiveDsl.g:7274:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTitleAccess().getPerspectiveTitleAction_0()); 
             }
-            // InternalPerspectiveDsl.g:7273:2: ()
-            // InternalPerspectiveDsl.g:7273:3: 
+            // InternalPerspectiveDsl.g:7275:2: ()
+            // InternalPerspectiveDsl.g:7275:3: 
             {
             }
 
@@ -24928,14 +24928,14 @@
 
 
     // $ANTLR start "rule__PerspectiveTitle__Group__1"
-    // InternalPerspectiveDsl.g:7281:1: rule__PerspectiveTitle__Group__1 : rule__PerspectiveTitle__Group__1__Impl rule__PerspectiveTitle__Group__2 ;
+    // InternalPerspectiveDsl.g:7283:1: rule__PerspectiveTitle__Group__1 : rule__PerspectiveTitle__Group__1__Impl rule__PerspectiveTitle__Group__2 ;
     public final void rule__PerspectiveTitle__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7285:1: ( rule__PerspectiveTitle__Group__1__Impl rule__PerspectiveTitle__Group__2 )
-            // InternalPerspectiveDsl.g:7286:2: rule__PerspectiveTitle__Group__1__Impl rule__PerspectiveTitle__Group__2
+            // InternalPerspectiveDsl.g:7287:1: ( rule__PerspectiveTitle__Group__1__Impl rule__PerspectiveTitle__Group__2 )
+            // InternalPerspectiveDsl.g:7288:2: rule__PerspectiveTitle__Group__1__Impl rule__PerspectiveTitle__Group__2
             {
             pushFollow(FOLLOW_15);
             rule__PerspectiveTitle__Group__1__Impl();
@@ -24966,17 +24966,17 @@
 
 
     // $ANTLR start "rule__PerspectiveTitle__Group__1__Impl"
-    // InternalPerspectiveDsl.g:7293:1: rule__PerspectiveTitle__Group__1__Impl : ( 'title' ) ;
+    // InternalPerspectiveDsl.g:7295:1: rule__PerspectiveTitle__Group__1__Impl : ( 'title' ) ;
     public final void rule__PerspectiveTitle__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7297:1: ( ( 'title' ) )
-            // InternalPerspectiveDsl.g:7298:1: ( 'title' )
+            // InternalPerspectiveDsl.g:7299:1: ( ( 'title' ) )
+            // InternalPerspectiveDsl.g:7300:1: ( 'title' )
             {
-            // InternalPerspectiveDsl.g:7298:1: ( 'title' )
-            // InternalPerspectiveDsl.g:7299:2: 'title'
+            // InternalPerspectiveDsl.g:7300:1: ( 'title' )
+            // InternalPerspectiveDsl.g:7301:2: 'title'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTitleAccess().getTitleKeyword_1()); 
@@ -25007,14 +25007,14 @@
 
 
     // $ANTLR start "rule__PerspectiveTitle__Group__2"
-    // InternalPerspectiveDsl.g:7308:1: rule__PerspectiveTitle__Group__2 : rule__PerspectiveTitle__Group__2__Impl ;
+    // InternalPerspectiveDsl.g:7310:1: rule__PerspectiveTitle__Group__2 : rule__PerspectiveTitle__Group__2__Impl ;
     public final void rule__PerspectiveTitle__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7312:1: ( rule__PerspectiveTitle__Group__2__Impl )
-            // InternalPerspectiveDsl.g:7313:2: rule__PerspectiveTitle__Group__2__Impl
+            // InternalPerspectiveDsl.g:7314:1: ( rule__PerspectiveTitle__Group__2__Impl )
+            // InternalPerspectiveDsl.g:7315:2: rule__PerspectiveTitle__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveTitle__Group__2__Impl();
@@ -25040,23 +25040,23 @@
 
 
     // $ANTLR start "rule__PerspectiveTitle__Group__2__Impl"
-    // InternalPerspectiveDsl.g:7319:1: rule__PerspectiveTitle__Group__2__Impl : ( ( rule__PerspectiveTitle__HtmlNameAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:7321:1: rule__PerspectiveTitle__Group__2__Impl : ( ( rule__PerspectiveTitle__HtmlNameAssignment_2 ) ) ;
     public final void rule__PerspectiveTitle__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7323:1: ( ( ( rule__PerspectiveTitle__HtmlNameAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:7324:1: ( ( rule__PerspectiveTitle__HtmlNameAssignment_2 ) )
+            // InternalPerspectiveDsl.g:7325:1: ( ( ( rule__PerspectiveTitle__HtmlNameAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:7326:1: ( ( rule__PerspectiveTitle__HtmlNameAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:7324:1: ( ( rule__PerspectiveTitle__HtmlNameAssignment_2 ) )
-            // InternalPerspectiveDsl.g:7325:2: ( rule__PerspectiveTitle__HtmlNameAssignment_2 )
+            // InternalPerspectiveDsl.g:7326:1: ( ( rule__PerspectiveTitle__HtmlNameAssignment_2 ) )
+            // InternalPerspectiveDsl.g:7327:2: ( rule__PerspectiveTitle__HtmlNameAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTitleAccess().getHtmlNameAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:7326:2: ( rule__PerspectiveTitle__HtmlNameAssignment_2 )
-            // InternalPerspectiveDsl.g:7326:3: rule__PerspectiveTitle__HtmlNameAssignment_2
+            // InternalPerspectiveDsl.g:7328:2: ( rule__PerspectiveTitle__HtmlNameAssignment_2 )
+            // InternalPerspectiveDsl.g:7328:3: rule__PerspectiveTitle__HtmlNameAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveTitle__HtmlNameAssignment_2();
@@ -25091,14 +25091,14 @@
 
 
     // $ANTLR start "rule__PerspectiveDashboard__Group__0"
-    // InternalPerspectiveDsl.g:7335:1: rule__PerspectiveDashboard__Group__0 : rule__PerspectiveDashboard__Group__0__Impl rule__PerspectiveDashboard__Group__1 ;
+    // InternalPerspectiveDsl.g:7337:1: rule__PerspectiveDashboard__Group__0 : rule__PerspectiveDashboard__Group__0__Impl rule__PerspectiveDashboard__Group__1 ;
     public final void rule__PerspectiveDashboard__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7339:1: ( rule__PerspectiveDashboard__Group__0__Impl rule__PerspectiveDashboard__Group__1 )
-            // InternalPerspectiveDsl.g:7340:2: rule__PerspectiveDashboard__Group__0__Impl rule__PerspectiveDashboard__Group__1
+            // InternalPerspectiveDsl.g:7341:1: ( rule__PerspectiveDashboard__Group__0__Impl rule__PerspectiveDashboard__Group__1 )
+            // InternalPerspectiveDsl.g:7342:2: rule__PerspectiveDashboard__Group__0__Impl rule__PerspectiveDashboard__Group__1
             {
             pushFollow(FOLLOW_24);
             rule__PerspectiveDashboard__Group__0__Impl();
@@ -25129,23 +25129,23 @@
 
 
     // $ANTLR start "rule__PerspectiveDashboard__Group__0__Impl"
-    // InternalPerspectiveDsl.g:7347:1: rule__PerspectiveDashboard__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:7349:1: rule__PerspectiveDashboard__Group__0__Impl : ( () ) ;
     public final void rule__PerspectiveDashboard__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7351:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:7352:1: ( () )
+            // InternalPerspectiveDsl.g:7353:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:7354:1: ( () )
             {
-            // InternalPerspectiveDsl.g:7352:1: ( () )
-            // InternalPerspectiveDsl.g:7353:2: ()
+            // InternalPerspectiveDsl.g:7354:1: ( () )
+            // InternalPerspectiveDsl.g:7355:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveDashboardAccess().getPerspectiveDashboardAction_0()); 
             }
-            // InternalPerspectiveDsl.g:7354:2: ()
-            // InternalPerspectiveDsl.g:7354:3: 
+            // InternalPerspectiveDsl.g:7356:2: ()
+            // InternalPerspectiveDsl.g:7356:3: 
             {
             }
 
@@ -25170,14 +25170,14 @@
 
 
     // $ANTLR start "rule__PerspectiveDashboard__Group__1"
-    // InternalPerspectiveDsl.g:7362:1: rule__PerspectiveDashboard__Group__1 : rule__PerspectiveDashboard__Group__1__Impl rule__PerspectiveDashboard__Group__2 ;
+    // InternalPerspectiveDsl.g:7364:1: rule__PerspectiveDashboard__Group__1 : rule__PerspectiveDashboard__Group__1__Impl rule__PerspectiveDashboard__Group__2 ;
     public final void rule__PerspectiveDashboard__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7366:1: ( rule__PerspectiveDashboard__Group__1__Impl rule__PerspectiveDashboard__Group__2 )
-            // InternalPerspectiveDsl.g:7367:2: rule__PerspectiveDashboard__Group__1__Impl rule__PerspectiveDashboard__Group__2
+            // InternalPerspectiveDsl.g:7368:1: ( rule__PerspectiveDashboard__Group__1__Impl rule__PerspectiveDashboard__Group__2 )
+            // InternalPerspectiveDsl.g:7369:2: rule__PerspectiveDashboard__Group__1__Impl rule__PerspectiveDashboard__Group__2
             {
             pushFollow(FOLLOW_15);
             rule__PerspectiveDashboard__Group__1__Impl();
@@ -25208,17 +25208,17 @@
 
 
     // $ANTLR start "rule__PerspectiveDashboard__Group__1__Impl"
-    // InternalPerspectiveDsl.g:7374:1: rule__PerspectiveDashboard__Group__1__Impl : ( 'name' ) ;
+    // InternalPerspectiveDsl.g:7376:1: rule__PerspectiveDashboard__Group__1__Impl : ( 'name' ) ;
     public final void rule__PerspectiveDashboard__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7378:1: ( ( 'name' ) )
-            // InternalPerspectiveDsl.g:7379:1: ( 'name' )
+            // InternalPerspectiveDsl.g:7380:1: ( ( 'name' ) )
+            // InternalPerspectiveDsl.g:7381:1: ( 'name' )
             {
-            // InternalPerspectiveDsl.g:7379:1: ( 'name' )
-            // InternalPerspectiveDsl.g:7380:2: 'name'
+            // InternalPerspectiveDsl.g:7381:1: ( 'name' )
+            // InternalPerspectiveDsl.g:7382:2: 'name'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveDashboardAccess().getNameKeyword_1()); 
@@ -25249,14 +25249,14 @@
 
 
     // $ANTLR start "rule__PerspectiveDashboard__Group__2"
-    // InternalPerspectiveDsl.g:7389:1: rule__PerspectiveDashboard__Group__2 : rule__PerspectiveDashboard__Group__2__Impl ;
+    // InternalPerspectiveDsl.g:7391:1: rule__PerspectiveDashboard__Group__2 : rule__PerspectiveDashboard__Group__2__Impl ;
     public final void rule__PerspectiveDashboard__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7393:1: ( rule__PerspectiveDashboard__Group__2__Impl )
-            // InternalPerspectiveDsl.g:7394:2: rule__PerspectiveDashboard__Group__2__Impl
+            // InternalPerspectiveDsl.g:7395:1: ( rule__PerspectiveDashboard__Group__2__Impl )
+            // InternalPerspectiveDsl.g:7396:2: rule__PerspectiveDashboard__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveDashboard__Group__2__Impl();
@@ -25282,23 +25282,23 @@
 
 
     // $ANTLR start "rule__PerspectiveDashboard__Group__2__Impl"
-    // InternalPerspectiveDsl.g:7400:1: rule__PerspectiveDashboard__Group__2__Impl : ( ( rule__PerspectiveDashboard__NameAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:7402:1: rule__PerspectiveDashboard__Group__2__Impl : ( ( rule__PerspectiveDashboard__NameAssignment_2 ) ) ;
     public final void rule__PerspectiveDashboard__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7404:1: ( ( ( rule__PerspectiveDashboard__NameAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:7405:1: ( ( rule__PerspectiveDashboard__NameAssignment_2 ) )
+            // InternalPerspectiveDsl.g:7406:1: ( ( ( rule__PerspectiveDashboard__NameAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:7407:1: ( ( rule__PerspectiveDashboard__NameAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:7405:1: ( ( rule__PerspectiveDashboard__NameAssignment_2 ) )
-            // InternalPerspectiveDsl.g:7406:2: ( rule__PerspectiveDashboard__NameAssignment_2 )
+            // InternalPerspectiveDsl.g:7407:1: ( ( rule__PerspectiveDashboard__NameAssignment_2 ) )
+            // InternalPerspectiveDsl.g:7408:2: ( rule__PerspectiveDashboard__NameAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveDashboardAccess().getNameAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:7407:2: ( rule__PerspectiveDashboard__NameAssignment_2 )
-            // InternalPerspectiveDsl.g:7407:3: rule__PerspectiveDashboard__NameAssignment_2
+            // InternalPerspectiveDsl.g:7409:2: ( rule__PerspectiveDashboard__NameAssignment_2 )
+            // InternalPerspectiveDsl.g:7409:3: rule__PerspectiveDashboard__NameAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveDashboard__NameAssignment_2();
@@ -25333,14 +25333,14 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group__0"
-    // InternalPerspectiveDsl.g:7416:1: rule__XImportDeclaration__Group__0 : rule__XImportDeclaration__Group__0__Impl rule__XImportDeclaration__Group__1 ;
+    // InternalPerspectiveDsl.g:7418:1: rule__XImportDeclaration__Group__0 : rule__XImportDeclaration__Group__0__Impl rule__XImportDeclaration__Group__1 ;
     public final void rule__XImportDeclaration__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7420:1: ( rule__XImportDeclaration__Group__0__Impl rule__XImportDeclaration__Group__1 )
-            // InternalPerspectiveDsl.g:7421:2: rule__XImportDeclaration__Group__0__Impl rule__XImportDeclaration__Group__1
+            // InternalPerspectiveDsl.g:7422:1: ( rule__XImportDeclaration__Group__0__Impl rule__XImportDeclaration__Group__1 )
+            // InternalPerspectiveDsl.g:7423:2: rule__XImportDeclaration__Group__0__Impl rule__XImportDeclaration__Group__1
             {
             pushFollow(FOLLOW_44);
             rule__XImportDeclaration__Group__0__Impl();
@@ -25371,23 +25371,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group__0__Impl"
-    // InternalPerspectiveDsl.g:7428:1: rule__XImportDeclaration__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:7430:1: rule__XImportDeclaration__Group__0__Impl : ( () ) ;
     public final void rule__XImportDeclaration__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7432:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:7433:1: ( () )
+            // InternalPerspectiveDsl.g:7434:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:7435:1: ( () )
             {
-            // InternalPerspectiveDsl.g:7433:1: ( () )
-            // InternalPerspectiveDsl.g:7434:2: ()
+            // InternalPerspectiveDsl.g:7435:1: ( () )
+            // InternalPerspectiveDsl.g:7436:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getOXImportDeclarationAction_0()); 
             }
-            // InternalPerspectiveDsl.g:7435:2: ()
-            // InternalPerspectiveDsl.g:7435:3: 
+            // InternalPerspectiveDsl.g:7437:2: ()
+            // InternalPerspectiveDsl.g:7437:3: 
             {
             }
 
@@ -25412,14 +25412,14 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group__1"
-    // InternalPerspectiveDsl.g:7443:1: rule__XImportDeclaration__Group__1 : rule__XImportDeclaration__Group__1__Impl rule__XImportDeclaration__Group__2 ;
+    // InternalPerspectiveDsl.g:7445:1: rule__XImportDeclaration__Group__1 : rule__XImportDeclaration__Group__1__Impl rule__XImportDeclaration__Group__2 ;
     public final void rule__XImportDeclaration__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7447:1: ( rule__XImportDeclaration__Group__1__Impl rule__XImportDeclaration__Group__2 )
-            // InternalPerspectiveDsl.g:7448:2: rule__XImportDeclaration__Group__1__Impl rule__XImportDeclaration__Group__2
+            // InternalPerspectiveDsl.g:7449:1: ( rule__XImportDeclaration__Group__1__Impl rule__XImportDeclaration__Group__2 )
+            // InternalPerspectiveDsl.g:7450:2: rule__XImportDeclaration__Group__1__Impl rule__XImportDeclaration__Group__2
             {
             pushFollow(FOLLOW_45);
             rule__XImportDeclaration__Group__1__Impl();
@@ -25450,17 +25450,17 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group__1__Impl"
-    // InternalPerspectiveDsl.g:7455:1: rule__XImportDeclaration__Group__1__Impl : ( 'import' ) ;
+    // InternalPerspectiveDsl.g:7457:1: rule__XImportDeclaration__Group__1__Impl : ( 'import' ) ;
     public final void rule__XImportDeclaration__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7459:1: ( ( 'import' ) )
-            // InternalPerspectiveDsl.g:7460:1: ( 'import' )
+            // InternalPerspectiveDsl.g:7461:1: ( ( 'import' ) )
+            // InternalPerspectiveDsl.g:7462:1: ( 'import' )
             {
-            // InternalPerspectiveDsl.g:7460:1: ( 'import' )
-            // InternalPerspectiveDsl.g:7461:2: 'import'
+            // InternalPerspectiveDsl.g:7462:1: ( 'import' )
+            // InternalPerspectiveDsl.g:7463:2: 'import'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getImportKeyword_1()); 
@@ -25491,14 +25491,14 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group__2"
-    // InternalPerspectiveDsl.g:7470:1: rule__XImportDeclaration__Group__2 : rule__XImportDeclaration__Group__2__Impl rule__XImportDeclaration__Group__3 ;
+    // InternalPerspectiveDsl.g:7472:1: rule__XImportDeclaration__Group__2 : rule__XImportDeclaration__Group__2__Impl rule__XImportDeclaration__Group__3 ;
     public final void rule__XImportDeclaration__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7474:1: ( rule__XImportDeclaration__Group__2__Impl rule__XImportDeclaration__Group__3 )
-            // InternalPerspectiveDsl.g:7475:2: rule__XImportDeclaration__Group__2__Impl rule__XImportDeclaration__Group__3
+            // InternalPerspectiveDsl.g:7476:1: ( rule__XImportDeclaration__Group__2__Impl rule__XImportDeclaration__Group__3 )
+            // InternalPerspectiveDsl.g:7477:2: rule__XImportDeclaration__Group__2__Impl rule__XImportDeclaration__Group__3
             {
             pushFollow(FOLLOW_46);
             rule__XImportDeclaration__Group__2__Impl();
@@ -25529,23 +25529,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group__2__Impl"
-    // InternalPerspectiveDsl.g:7482:1: rule__XImportDeclaration__Group__2__Impl : ( ( rule__XImportDeclaration__Alternatives_2 ) ) ;
+    // InternalPerspectiveDsl.g:7484:1: rule__XImportDeclaration__Group__2__Impl : ( ( rule__XImportDeclaration__Alternatives_2 ) ) ;
     public final void rule__XImportDeclaration__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7486:1: ( ( ( rule__XImportDeclaration__Alternatives_2 ) ) )
-            // InternalPerspectiveDsl.g:7487:1: ( ( rule__XImportDeclaration__Alternatives_2 ) )
+            // InternalPerspectiveDsl.g:7488:1: ( ( ( rule__XImportDeclaration__Alternatives_2 ) ) )
+            // InternalPerspectiveDsl.g:7489:1: ( ( rule__XImportDeclaration__Alternatives_2 ) )
             {
-            // InternalPerspectiveDsl.g:7487:1: ( ( rule__XImportDeclaration__Alternatives_2 ) )
-            // InternalPerspectiveDsl.g:7488:2: ( rule__XImportDeclaration__Alternatives_2 )
+            // InternalPerspectiveDsl.g:7489:1: ( ( rule__XImportDeclaration__Alternatives_2 ) )
+            // InternalPerspectiveDsl.g:7490:2: ( rule__XImportDeclaration__Alternatives_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getAlternatives_2()); 
             }
-            // InternalPerspectiveDsl.g:7489:2: ( rule__XImportDeclaration__Alternatives_2 )
-            // InternalPerspectiveDsl.g:7489:3: rule__XImportDeclaration__Alternatives_2
+            // InternalPerspectiveDsl.g:7491:2: ( rule__XImportDeclaration__Alternatives_2 )
+            // InternalPerspectiveDsl.g:7491:3: rule__XImportDeclaration__Alternatives_2
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__Alternatives_2();
@@ -25580,14 +25580,14 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group__3"
-    // InternalPerspectiveDsl.g:7497:1: rule__XImportDeclaration__Group__3 : rule__XImportDeclaration__Group__3__Impl ;
+    // InternalPerspectiveDsl.g:7499:1: rule__XImportDeclaration__Group__3 : rule__XImportDeclaration__Group__3__Impl ;
     public final void rule__XImportDeclaration__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7501:1: ( rule__XImportDeclaration__Group__3__Impl )
-            // InternalPerspectiveDsl.g:7502:2: rule__XImportDeclaration__Group__3__Impl
+            // InternalPerspectiveDsl.g:7503:1: ( rule__XImportDeclaration__Group__3__Impl )
+            // InternalPerspectiveDsl.g:7504:2: rule__XImportDeclaration__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__Group__3__Impl();
@@ -25613,22 +25613,22 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group__3__Impl"
-    // InternalPerspectiveDsl.g:7508:1: rule__XImportDeclaration__Group__3__Impl : ( ( ';' )? ) ;
+    // InternalPerspectiveDsl.g:7510:1: rule__XImportDeclaration__Group__3__Impl : ( ( ';' )? ) ;
     public final void rule__XImportDeclaration__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7512:1: ( ( ( ';' )? ) )
-            // InternalPerspectiveDsl.g:7513:1: ( ( ';' )? )
+            // InternalPerspectiveDsl.g:7514:1: ( ( ( ';' )? ) )
+            // InternalPerspectiveDsl.g:7515:1: ( ( ';' )? )
             {
-            // InternalPerspectiveDsl.g:7513:1: ( ( ';' )? )
-            // InternalPerspectiveDsl.g:7514:2: ( ';' )?
+            // InternalPerspectiveDsl.g:7515:1: ( ( ';' )? )
+            // InternalPerspectiveDsl.g:7516:2: ( ';' )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_3()); 
             }
-            // InternalPerspectiveDsl.g:7515:2: ( ';' )?
+            // InternalPerspectiveDsl.g:7517:2: ( ';' )?
             int alt58=2;
             int LA58_0 = input.LA(1);
 
@@ -25637,7 +25637,7 @@
             }
             switch (alt58) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:7515:3: ';'
+                    // InternalPerspectiveDsl.g:7517:3: ';'
                     {
                     match(input,89,FOLLOW_2); if (state.failed) return ;
 
@@ -25671,14 +25671,14 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_0__0"
-    // InternalPerspectiveDsl.g:7524:1: rule__XImportDeclaration__Group_2_0__0 : rule__XImportDeclaration__Group_2_0__0__Impl rule__XImportDeclaration__Group_2_0__1 ;
+    // InternalPerspectiveDsl.g:7526:1: rule__XImportDeclaration__Group_2_0__0 : rule__XImportDeclaration__Group_2_0__0__Impl rule__XImportDeclaration__Group_2_0__1 ;
     public final void rule__XImportDeclaration__Group_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7528:1: ( rule__XImportDeclaration__Group_2_0__0__Impl rule__XImportDeclaration__Group_2_0__1 )
-            // InternalPerspectiveDsl.g:7529:2: rule__XImportDeclaration__Group_2_0__0__Impl rule__XImportDeclaration__Group_2_0__1
+            // InternalPerspectiveDsl.g:7530:1: ( rule__XImportDeclaration__Group_2_0__0__Impl rule__XImportDeclaration__Group_2_0__1 )
+            // InternalPerspectiveDsl.g:7531:2: rule__XImportDeclaration__Group_2_0__0__Impl rule__XImportDeclaration__Group_2_0__1
             {
             pushFollow(FOLLOW_47);
             rule__XImportDeclaration__Group_2_0__0__Impl();
@@ -25709,23 +25709,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_0__0__Impl"
-    // InternalPerspectiveDsl.g:7536:1: rule__XImportDeclaration__Group_2_0__0__Impl : ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) ) ;
+    // InternalPerspectiveDsl.g:7538:1: rule__XImportDeclaration__Group_2_0__0__Impl : ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) ) ;
     public final void rule__XImportDeclaration__Group_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7540:1: ( ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) ) )
-            // InternalPerspectiveDsl.g:7541:1: ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) )
+            // InternalPerspectiveDsl.g:7542:1: ( ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) ) )
+            // InternalPerspectiveDsl.g:7543:1: ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) )
             {
-            // InternalPerspectiveDsl.g:7541:1: ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) )
-            // InternalPerspectiveDsl.g:7542:2: ( rule__XImportDeclaration__StaticAssignment_2_0_0 )
+            // InternalPerspectiveDsl.g:7543:1: ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) )
+            // InternalPerspectiveDsl.g:7544:2: ( rule__XImportDeclaration__StaticAssignment_2_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getStaticAssignment_2_0_0()); 
             }
-            // InternalPerspectiveDsl.g:7543:2: ( rule__XImportDeclaration__StaticAssignment_2_0_0 )
-            // InternalPerspectiveDsl.g:7543:3: rule__XImportDeclaration__StaticAssignment_2_0_0
+            // InternalPerspectiveDsl.g:7545:2: ( rule__XImportDeclaration__StaticAssignment_2_0_0 )
+            // InternalPerspectiveDsl.g:7545:3: rule__XImportDeclaration__StaticAssignment_2_0_0
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__StaticAssignment_2_0_0();
@@ -25760,14 +25760,14 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_0__1"
-    // InternalPerspectiveDsl.g:7551:1: rule__XImportDeclaration__Group_2_0__1 : rule__XImportDeclaration__Group_2_0__1__Impl rule__XImportDeclaration__Group_2_0__2 ;
+    // InternalPerspectiveDsl.g:7553:1: rule__XImportDeclaration__Group_2_0__1 : rule__XImportDeclaration__Group_2_0__1__Impl rule__XImportDeclaration__Group_2_0__2 ;
     public final void rule__XImportDeclaration__Group_2_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7555:1: ( rule__XImportDeclaration__Group_2_0__1__Impl rule__XImportDeclaration__Group_2_0__2 )
-            // InternalPerspectiveDsl.g:7556:2: rule__XImportDeclaration__Group_2_0__1__Impl rule__XImportDeclaration__Group_2_0__2
+            // InternalPerspectiveDsl.g:7557:1: ( rule__XImportDeclaration__Group_2_0__1__Impl rule__XImportDeclaration__Group_2_0__2 )
+            // InternalPerspectiveDsl.g:7558:2: rule__XImportDeclaration__Group_2_0__1__Impl rule__XImportDeclaration__Group_2_0__2
             {
             pushFollow(FOLLOW_47);
             rule__XImportDeclaration__Group_2_0__1__Impl();
@@ -25798,22 +25798,22 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_0__1__Impl"
-    // InternalPerspectiveDsl.g:7563:1: rule__XImportDeclaration__Group_2_0__1__Impl : ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? ) ;
+    // InternalPerspectiveDsl.g:7565:1: rule__XImportDeclaration__Group_2_0__1__Impl : ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? ) ;
     public final void rule__XImportDeclaration__Group_2_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7567:1: ( ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? ) )
-            // InternalPerspectiveDsl.g:7568:1: ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? )
+            // InternalPerspectiveDsl.g:7569:1: ( ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? ) )
+            // InternalPerspectiveDsl.g:7570:1: ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? )
             {
-            // InternalPerspectiveDsl.g:7568:1: ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? )
-            // InternalPerspectiveDsl.g:7569:2: ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )?
+            // InternalPerspectiveDsl.g:7570:1: ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? )
+            // InternalPerspectiveDsl.g:7571:2: ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getExtensionAssignment_2_0_1()); 
             }
-            // InternalPerspectiveDsl.g:7570:2: ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )?
+            // InternalPerspectiveDsl.g:7572:2: ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )?
             int alt59=2;
             int LA59_0 = input.LA(1);
 
@@ -25822,7 +25822,7 @@
             }
             switch (alt59) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:7570:3: rule__XImportDeclaration__ExtensionAssignment_2_0_1
+                    // InternalPerspectiveDsl.g:7572:3: rule__XImportDeclaration__ExtensionAssignment_2_0_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XImportDeclaration__ExtensionAssignment_2_0_1();
@@ -25860,14 +25860,14 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_0__2"
-    // InternalPerspectiveDsl.g:7578:1: rule__XImportDeclaration__Group_2_0__2 : rule__XImportDeclaration__Group_2_0__2__Impl rule__XImportDeclaration__Group_2_0__3 ;
+    // InternalPerspectiveDsl.g:7580:1: rule__XImportDeclaration__Group_2_0__2 : rule__XImportDeclaration__Group_2_0__2__Impl rule__XImportDeclaration__Group_2_0__3 ;
     public final void rule__XImportDeclaration__Group_2_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7582:1: ( rule__XImportDeclaration__Group_2_0__2__Impl rule__XImportDeclaration__Group_2_0__3 )
-            // InternalPerspectiveDsl.g:7583:2: rule__XImportDeclaration__Group_2_0__2__Impl rule__XImportDeclaration__Group_2_0__3
+            // InternalPerspectiveDsl.g:7584:1: ( rule__XImportDeclaration__Group_2_0__2__Impl rule__XImportDeclaration__Group_2_0__3 )
+            // InternalPerspectiveDsl.g:7585:2: rule__XImportDeclaration__Group_2_0__2__Impl rule__XImportDeclaration__Group_2_0__3
             {
             pushFollow(FOLLOW_48);
             rule__XImportDeclaration__Group_2_0__2__Impl();
@@ -25898,23 +25898,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_0__2__Impl"
-    // InternalPerspectiveDsl.g:7590:1: rule__XImportDeclaration__Group_2_0__2__Impl : ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) ) ;
+    // InternalPerspectiveDsl.g:7592:1: rule__XImportDeclaration__Group_2_0__2__Impl : ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) ) ;
     public final void rule__XImportDeclaration__Group_2_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7594:1: ( ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) ) )
-            // InternalPerspectiveDsl.g:7595:1: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) )
+            // InternalPerspectiveDsl.g:7596:1: ( ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) ) )
+            // InternalPerspectiveDsl.g:7597:1: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) )
             {
-            // InternalPerspectiveDsl.g:7595:1: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) )
-            // InternalPerspectiveDsl.g:7596:2: ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 )
+            // InternalPerspectiveDsl.g:7597:1: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) )
+            // InternalPerspectiveDsl.g:7598:2: ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_2_0_2()); 
             }
-            // InternalPerspectiveDsl.g:7597:2: ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 )
-            // InternalPerspectiveDsl.g:7597:3: rule__XImportDeclaration__ImportedTypeAssignment_2_0_2
+            // InternalPerspectiveDsl.g:7599:2: ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 )
+            // InternalPerspectiveDsl.g:7599:3: rule__XImportDeclaration__ImportedTypeAssignment_2_0_2
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__ImportedTypeAssignment_2_0_2();
@@ -25949,14 +25949,14 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_0__3"
-    // InternalPerspectiveDsl.g:7605:1: rule__XImportDeclaration__Group_2_0__3 : rule__XImportDeclaration__Group_2_0__3__Impl ;
+    // InternalPerspectiveDsl.g:7607:1: rule__XImportDeclaration__Group_2_0__3 : rule__XImportDeclaration__Group_2_0__3__Impl ;
     public final void rule__XImportDeclaration__Group_2_0__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7609:1: ( rule__XImportDeclaration__Group_2_0__3__Impl )
-            // InternalPerspectiveDsl.g:7610:2: rule__XImportDeclaration__Group_2_0__3__Impl
+            // InternalPerspectiveDsl.g:7611:1: ( rule__XImportDeclaration__Group_2_0__3__Impl )
+            // InternalPerspectiveDsl.g:7612:2: rule__XImportDeclaration__Group_2_0__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__Group_2_0__3__Impl();
@@ -25982,23 +25982,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_0__3__Impl"
-    // InternalPerspectiveDsl.g:7616:1: rule__XImportDeclaration__Group_2_0__3__Impl : ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) ) ;
+    // InternalPerspectiveDsl.g:7618:1: rule__XImportDeclaration__Group_2_0__3__Impl : ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) ) ;
     public final void rule__XImportDeclaration__Group_2_0__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7620:1: ( ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) ) )
-            // InternalPerspectiveDsl.g:7621:1: ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) )
+            // InternalPerspectiveDsl.g:7622:1: ( ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) ) )
+            // InternalPerspectiveDsl.g:7623:1: ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) )
             {
-            // InternalPerspectiveDsl.g:7621:1: ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) )
-            // InternalPerspectiveDsl.g:7622:2: ( rule__XImportDeclaration__Alternatives_2_0_3 )
+            // InternalPerspectiveDsl.g:7623:1: ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) )
+            // InternalPerspectiveDsl.g:7624:2: ( rule__XImportDeclaration__Alternatives_2_0_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getAlternatives_2_0_3()); 
             }
-            // InternalPerspectiveDsl.g:7623:2: ( rule__XImportDeclaration__Alternatives_2_0_3 )
-            // InternalPerspectiveDsl.g:7623:3: rule__XImportDeclaration__Alternatives_2_0_3
+            // InternalPerspectiveDsl.g:7625:2: ( rule__XImportDeclaration__Alternatives_2_0_3 )
+            // InternalPerspectiveDsl.g:7625:3: rule__XImportDeclaration__Alternatives_2_0_3
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__Alternatives_2_0_3();
@@ -26033,14 +26033,14 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_3__0"
-    // InternalPerspectiveDsl.g:7632:1: rule__XImportDeclaration__Group_2_3__0 : rule__XImportDeclaration__Group_2_3__0__Impl rule__XImportDeclaration__Group_2_3__1 ;
+    // InternalPerspectiveDsl.g:7634:1: rule__XImportDeclaration__Group_2_3__0 : rule__XImportDeclaration__Group_2_3__0__Impl rule__XImportDeclaration__Group_2_3__1 ;
     public final void rule__XImportDeclaration__Group_2_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7636:1: ( rule__XImportDeclaration__Group_2_3__0__Impl rule__XImportDeclaration__Group_2_3__1 )
-            // InternalPerspectiveDsl.g:7637:2: rule__XImportDeclaration__Group_2_3__0__Impl rule__XImportDeclaration__Group_2_3__1
+            // InternalPerspectiveDsl.g:7638:1: ( rule__XImportDeclaration__Group_2_3__0__Impl rule__XImportDeclaration__Group_2_3__1 )
+            // InternalPerspectiveDsl.g:7639:2: rule__XImportDeclaration__Group_2_3__0__Impl rule__XImportDeclaration__Group_2_3__1
             {
             pushFollow(FOLLOW_7);
             rule__XImportDeclaration__Group_2_3__0__Impl();
@@ -26071,23 +26071,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_3__0__Impl"
-    // InternalPerspectiveDsl.g:7644:1: rule__XImportDeclaration__Group_2_3__0__Impl : ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) ) ;
+    // InternalPerspectiveDsl.g:7646:1: rule__XImportDeclaration__Group_2_3__0__Impl : ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) ) ;
     public final void rule__XImportDeclaration__Group_2_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7648:1: ( ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) ) )
-            // InternalPerspectiveDsl.g:7649:1: ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) )
+            // InternalPerspectiveDsl.g:7650:1: ( ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) ) )
+            // InternalPerspectiveDsl.g:7651:1: ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) )
             {
-            // InternalPerspectiveDsl.g:7649:1: ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) )
-            // InternalPerspectiveDsl.g:7650:2: ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 )
+            // InternalPerspectiveDsl.g:7651:1: ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) )
+            // InternalPerspectiveDsl.g:7652:2: ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getFqnImportAssignment_2_3_0()); 
             }
-            // InternalPerspectiveDsl.g:7651:2: ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 )
-            // InternalPerspectiveDsl.g:7651:3: rule__XImportDeclaration__FqnImportAssignment_2_3_0
+            // InternalPerspectiveDsl.g:7653:2: ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 )
+            // InternalPerspectiveDsl.g:7653:3: rule__XImportDeclaration__FqnImportAssignment_2_3_0
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__FqnImportAssignment_2_3_0();
@@ -26122,14 +26122,14 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_3__1"
-    // InternalPerspectiveDsl.g:7659:1: rule__XImportDeclaration__Group_2_3__1 : rule__XImportDeclaration__Group_2_3__1__Impl ;
+    // InternalPerspectiveDsl.g:7661:1: rule__XImportDeclaration__Group_2_3__1 : rule__XImportDeclaration__Group_2_3__1__Impl ;
     public final void rule__XImportDeclaration__Group_2_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7663:1: ( rule__XImportDeclaration__Group_2_3__1__Impl )
-            // InternalPerspectiveDsl.g:7664:2: rule__XImportDeclaration__Group_2_3__1__Impl
+            // InternalPerspectiveDsl.g:7665:1: ( rule__XImportDeclaration__Group_2_3__1__Impl )
+            // InternalPerspectiveDsl.g:7666:2: rule__XImportDeclaration__Group_2_3__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__Group_2_3__1__Impl();
@@ -26155,23 +26155,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_3__1__Impl"
-    // InternalPerspectiveDsl.g:7670:1: rule__XImportDeclaration__Group_2_3__1__Impl : ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) ) ;
+    // InternalPerspectiveDsl.g:7672:1: rule__XImportDeclaration__Group_2_3__1__Impl : ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) ) ;
     public final void rule__XImportDeclaration__Group_2_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7674:1: ( ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) ) )
-            // InternalPerspectiveDsl.g:7675:1: ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) )
+            // InternalPerspectiveDsl.g:7676:1: ( ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) ) )
+            // InternalPerspectiveDsl.g:7677:1: ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) )
             {
-            // InternalPerspectiveDsl.g:7675:1: ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) )
-            // InternalPerspectiveDsl.g:7676:2: ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 )
+            // InternalPerspectiveDsl.g:7677:1: ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) )
+            // InternalPerspectiveDsl.g:7678:2: ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameAssignment_2_3_1()); 
             }
-            // InternalPerspectiveDsl.g:7677:2: ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 )
-            // InternalPerspectiveDsl.g:7677:3: rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1
+            // InternalPerspectiveDsl.g:7679:2: ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 )
+            // InternalPerspectiveDsl.g:7679:3: rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1();
@@ -26206,14 +26206,14 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group__0"
-    // InternalPerspectiveDsl.g:7686:1: rule__XAnnotation__Group__0 : rule__XAnnotation__Group__0__Impl rule__XAnnotation__Group__1 ;
+    // InternalPerspectiveDsl.g:7688:1: rule__XAnnotation__Group__0 : rule__XAnnotation__Group__0__Impl rule__XAnnotation__Group__1 ;
     public final void rule__XAnnotation__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7690:1: ( rule__XAnnotation__Group__0__Impl rule__XAnnotation__Group__1 )
-            // InternalPerspectiveDsl.g:7691:2: rule__XAnnotation__Group__0__Impl rule__XAnnotation__Group__1
+            // InternalPerspectiveDsl.g:7692:1: ( rule__XAnnotation__Group__0__Impl rule__XAnnotation__Group__1 )
+            // InternalPerspectiveDsl.g:7693:2: rule__XAnnotation__Group__0__Impl rule__XAnnotation__Group__1
             {
             pushFollow(FOLLOW_49);
             rule__XAnnotation__Group__0__Impl();
@@ -26244,23 +26244,23 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group__0__Impl"
-    // InternalPerspectiveDsl.g:7698:1: rule__XAnnotation__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:7700:1: rule__XAnnotation__Group__0__Impl : ( () ) ;
     public final void rule__XAnnotation__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7702:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:7703:1: ( () )
+            // InternalPerspectiveDsl.g:7704:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:7705:1: ( () )
             {
-            // InternalPerspectiveDsl.g:7703:1: ( () )
-            // InternalPerspectiveDsl.g:7704:2: ()
+            // InternalPerspectiveDsl.g:7705:1: ( () )
+            // InternalPerspectiveDsl.g:7706:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getXAnnotationAction_0()); 
             }
-            // InternalPerspectiveDsl.g:7705:2: ()
-            // InternalPerspectiveDsl.g:7705:3: 
+            // InternalPerspectiveDsl.g:7707:2: ()
+            // InternalPerspectiveDsl.g:7707:3: 
             {
             }
 
@@ -26285,14 +26285,14 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group__1"
-    // InternalPerspectiveDsl.g:7713:1: rule__XAnnotation__Group__1 : rule__XAnnotation__Group__1__Impl rule__XAnnotation__Group__2 ;
+    // InternalPerspectiveDsl.g:7715:1: rule__XAnnotation__Group__1 : rule__XAnnotation__Group__1__Impl rule__XAnnotation__Group__2 ;
     public final void rule__XAnnotation__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7717:1: ( rule__XAnnotation__Group__1__Impl rule__XAnnotation__Group__2 )
-            // InternalPerspectiveDsl.g:7718:2: rule__XAnnotation__Group__1__Impl rule__XAnnotation__Group__2
+            // InternalPerspectiveDsl.g:7719:1: ( rule__XAnnotation__Group__1__Impl rule__XAnnotation__Group__2 )
+            // InternalPerspectiveDsl.g:7720:2: rule__XAnnotation__Group__1__Impl rule__XAnnotation__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__XAnnotation__Group__1__Impl();
@@ -26323,17 +26323,17 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group__1__Impl"
-    // InternalPerspectiveDsl.g:7725:1: rule__XAnnotation__Group__1__Impl : ( '@' ) ;
+    // InternalPerspectiveDsl.g:7727:1: rule__XAnnotation__Group__1__Impl : ( '@' ) ;
     public final void rule__XAnnotation__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7729:1: ( ( '@' ) )
-            // InternalPerspectiveDsl.g:7730:1: ( '@' )
+            // InternalPerspectiveDsl.g:7731:1: ( ( '@' ) )
+            // InternalPerspectiveDsl.g:7732:1: ( '@' )
             {
-            // InternalPerspectiveDsl.g:7730:1: ( '@' )
-            // InternalPerspectiveDsl.g:7731:2: '@'
+            // InternalPerspectiveDsl.g:7732:1: ( '@' )
+            // InternalPerspectiveDsl.g:7733:2: '@'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1()); 
@@ -26364,14 +26364,14 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group__2"
-    // InternalPerspectiveDsl.g:7740:1: rule__XAnnotation__Group__2 : rule__XAnnotation__Group__2__Impl rule__XAnnotation__Group__3 ;
+    // InternalPerspectiveDsl.g:7742:1: rule__XAnnotation__Group__2 : rule__XAnnotation__Group__2__Impl rule__XAnnotation__Group__3 ;
     public final void rule__XAnnotation__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7744:1: ( rule__XAnnotation__Group__2__Impl rule__XAnnotation__Group__3 )
-            // InternalPerspectiveDsl.g:7745:2: rule__XAnnotation__Group__2__Impl rule__XAnnotation__Group__3
+            // InternalPerspectiveDsl.g:7746:1: ( rule__XAnnotation__Group__2__Impl rule__XAnnotation__Group__3 )
+            // InternalPerspectiveDsl.g:7747:2: rule__XAnnotation__Group__2__Impl rule__XAnnotation__Group__3
             {
             pushFollow(FOLLOW_50);
             rule__XAnnotation__Group__2__Impl();
@@ -26402,23 +26402,23 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group__2__Impl"
-    // InternalPerspectiveDsl.g:7752:1: rule__XAnnotation__Group__2__Impl : ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:7754:1: rule__XAnnotation__Group__2__Impl : ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) ) ;
     public final void rule__XAnnotation__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7756:1: ( ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:7757:1: ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) )
+            // InternalPerspectiveDsl.g:7758:1: ( ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:7759:1: ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:7757:1: ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) )
-            // InternalPerspectiveDsl.g:7758:2: ( rule__XAnnotation__AnnotationTypeAssignment_2 )
+            // InternalPerspectiveDsl.g:7759:1: ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) )
+            // InternalPerspectiveDsl.g:7760:2: ( rule__XAnnotation__AnnotationTypeAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getAnnotationTypeAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:7759:2: ( rule__XAnnotation__AnnotationTypeAssignment_2 )
-            // InternalPerspectiveDsl.g:7759:3: rule__XAnnotation__AnnotationTypeAssignment_2
+            // InternalPerspectiveDsl.g:7761:2: ( rule__XAnnotation__AnnotationTypeAssignment_2 )
+            // InternalPerspectiveDsl.g:7761:3: rule__XAnnotation__AnnotationTypeAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotation__AnnotationTypeAssignment_2();
@@ -26453,14 +26453,14 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group__3"
-    // InternalPerspectiveDsl.g:7767:1: rule__XAnnotation__Group__3 : rule__XAnnotation__Group__3__Impl ;
+    // InternalPerspectiveDsl.g:7769:1: rule__XAnnotation__Group__3 : rule__XAnnotation__Group__3__Impl ;
     public final void rule__XAnnotation__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7771:1: ( rule__XAnnotation__Group__3__Impl )
-            // InternalPerspectiveDsl.g:7772:2: rule__XAnnotation__Group__3__Impl
+            // InternalPerspectiveDsl.g:7773:1: ( rule__XAnnotation__Group__3__Impl )
+            // InternalPerspectiveDsl.g:7774:2: rule__XAnnotation__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotation__Group__3__Impl();
@@ -26486,22 +26486,22 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group__3__Impl"
-    // InternalPerspectiveDsl.g:7778:1: rule__XAnnotation__Group__3__Impl : ( ( rule__XAnnotation__Group_3__0 )? ) ;
+    // InternalPerspectiveDsl.g:7780:1: rule__XAnnotation__Group__3__Impl : ( ( rule__XAnnotation__Group_3__0 )? ) ;
     public final void rule__XAnnotation__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7782:1: ( ( ( rule__XAnnotation__Group_3__0 )? ) )
-            // InternalPerspectiveDsl.g:7783:1: ( ( rule__XAnnotation__Group_3__0 )? )
+            // InternalPerspectiveDsl.g:7784:1: ( ( ( rule__XAnnotation__Group_3__0 )? ) )
+            // InternalPerspectiveDsl.g:7785:1: ( ( rule__XAnnotation__Group_3__0 )? )
             {
-            // InternalPerspectiveDsl.g:7783:1: ( ( rule__XAnnotation__Group_3__0 )? )
-            // InternalPerspectiveDsl.g:7784:2: ( rule__XAnnotation__Group_3__0 )?
+            // InternalPerspectiveDsl.g:7785:1: ( ( rule__XAnnotation__Group_3__0 )? )
+            // InternalPerspectiveDsl.g:7786:2: ( rule__XAnnotation__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getGroup_3()); 
             }
-            // InternalPerspectiveDsl.g:7785:2: ( rule__XAnnotation__Group_3__0 )?
+            // InternalPerspectiveDsl.g:7787:2: ( rule__XAnnotation__Group_3__0 )?
             int alt60=2;
             int LA60_0 = input.LA(1);
 
@@ -26510,7 +26510,7 @@
             }
             switch (alt60) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:7785:3: rule__XAnnotation__Group_3__0
+                    // InternalPerspectiveDsl.g:7787:3: rule__XAnnotation__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotation__Group_3__0();
@@ -26548,14 +26548,14 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3__0"
-    // InternalPerspectiveDsl.g:7794:1: rule__XAnnotation__Group_3__0 : rule__XAnnotation__Group_3__0__Impl rule__XAnnotation__Group_3__1 ;
+    // InternalPerspectiveDsl.g:7796:1: rule__XAnnotation__Group_3__0 : rule__XAnnotation__Group_3__0__Impl rule__XAnnotation__Group_3__1 ;
     public final void rule__XAnnotation__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7798:1: ( rule__XAnnotation__Group_3__0__Impl rule__XAnnotation__Group_3__1 )
-            // InternalPerspectiveDsl.g:7799:2: rule__XAnnotation__Group_3__0__Impl rule__XAnnotation__Group_3__1
+            // InternalPerspectiveDsl.g:7800:1: ( rule__XAnnotation__Group_3__0__Impl rule__XAnnotation__Group_3__1 )
+            // InternalPerspectiveDsl.g:7801:2: rule__XAnnotation__Group_3__0__Impl rule__XAnnotation__Group_3__1
             {
             pushFollow(FOLLOW_51);
             rule__XAnnotation__Group_3__0__Impl();
@@ -26586,23 +26586,23 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3__0__Impl"
-    // InternalPerspectiveDsl.g:7806:1: rule__XAnnotation__Group_3__0__Impl : ( ( '(' ) ) ;
+    // InternalPerspectiveDsl.g:7808:1: rule__XAnnotation__Group_3__0__Impl : ( ( '(' ) ) ;
     public final void rule__XAnnotation__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7810:1: ( ( ( '(' ) ) )
-            // InternalPerspectiveDsl.g:7811:1: ( ( '(' ) )
+            // InternalPerspectiveDsl.g:7812:1: ( ( ( '(' ) ) )
+            // InternalPerspectiveDsl.g:7813:1: ( ( '(' ) )
             {
-            // InternalPerspectiveDsl.g:7811:1: ( ( '(' ) )
-            // InternalPerspectiveDsl.g:7812:2: ( '(' )
+            // InternalPerspectiveDsl.g:7813:1: ( ( '(' ) )
+            // InternalPerspectiveDsl.g:7814:2: ( '(' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0()); 
             }
-            // InternalPerspectiveDsl.g:7813:2: ( '(' )
-            // InternalPerspectiveDsl.g:7813:3: '('
+            // InternalPerspectiveDsl.g:7815:2: ( '(' )
+            // InternalPerspectiveDsl.g:7815:3: '('
             {
             match(input,91,FOLLOW_2); if (state.failed) return ;
 
@@ -26633,14 +26633,14 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3__1"
-    // InternalPerspectiveDsl.g:7821:1: rule__XAnnotation__Group_3__1 : rule__XAnnotation__Group_3__1__Impl rule__XAnnotation__Group_3__2 ;
+    // InternalPerspectiveDsl.g:7823:1: rule__XAnnotation__Group_3__1 : rule__XAnnotation__Group_3__1__Impl rule__XAnnotation__Group_3__2 ;
     public final void rule__XAnnotation__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7825:1: ( rule__XAnnotation__Group_3__1__Impl rule__XAnnotation__Group_3__2 )
-            // InternalPerspectiveDsl.g:7826:2: rule__XAnnotation__Group_3__1__Impl rule__XAnnotation__Group_3__2
+            // InternalPerspectiveDsl.g:7827:1: ( rule__XAnnotation__Group_3__1__Impl rule__XAnnotation__Group_3__2 )
+            // InternalPerspectiveDsl.g:7828:2: rule__XAnnotation__Group_3__1__Impl rule__XAnnotation__Group_3__2
             {
             pushFollow(FOLLOW_51);
             rule__XAnnotation__Group_3__1__Impl();
@@ -26671,22 +26671,22 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3__1__Impl"
-    // InternalPerspectiveDsl.g:7833:1: rule__XAnnotation__Group_3__1__Impl : ( ( rule__XAnnotation__Alternatives_3_1 )? ) ;
+    // InternalPerspectiveDsl.g:7835:1: rule__XAnnotation__Group_3__1__Impl : ( ( rule__XAnnotation__Alternatives_3_1 )? ) ;
     public final void rule__XAnnotation__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7837:1: ( ( ( rule__XAnnotation__Alternatives_3_1 )? ) )
-            // InternalPerspectiveDsl.g:7838:1: ( ( rule__XAnnotation__Alternatives_3_1 )? )
+            // InternalPerspectiveDsl.g:7839:1: ( ( ( rule__XAnnotation__Alternatives_3_1 )? ) )
+            // InternalPerspectiveDsl.g:7840:1: ( ( rule__XAnnotation__Alternatives_3_1 )? )
             {
-            // InternalPerspectiveDsl.g:7838:1: ( ( rule__XAnnotation__Alternatives_3_1 )? )
-            // InternalPerspectiveDsl.g:7839:2: ( rule__XAnnotation__Alternatives_3_1 )?
+            // InternalPerspectiveDsl.g:7840:1: ( ( rule__XAnnotation__Alternatives_3_1 )? )
+            // InternalPerspectiveDsl.g:7841:2: ( rule__XAnnotation__Alternatives_3_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getAlternatives_3_1()); 
             }
-            // InternalPerspectiveDsl.g:7840:2: ( rule__XAnnotation__Alternatives_3_1 )?
+            // InternalPerspectiveDsl.g:7842:2: ( rule__XAnnotation__Alternatives_3_1 )?
             int alt61=2;
             int LA61_0 = input.LA(1);
 
@@ -26695,7 +26695,7 @@
             }
             switch (alt61) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:7840:3: rule__XAnnotation__Alternatives_3_1
+                    // InternalPerspectiveDsl.g:7842:3: rule__XAnnotation__Alternatives_3_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotation__Alternatives_3_1();
@@ -26733,14 +26733,14 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3__2"
-    // InternalPerspectiveDsl.g:7848:1: rule__XAnnotation__Group_3__2 : rule__XAnnotation__Group_3__2__Impl ;
+    // InternalPerspectiveDsl.g:7850:1: rule__XAnnotation__Group_3__2 : rule__XAnnotation__Group_3__2__Impl ;
     public final void rule__XAnnotation__Group_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7852:1: ( rule__XAnnotation__Group_3__2__Impl )
-            // InternalPerspectiveDsl.g:7853:2: rule__XAnnotation__Group_3__2__Impl
+            // InternalPerspectiveDsl.g:7854:1: ( rule__XAnnotation__Group_3__2__Impl )
+            // InternalPerspectiveDsl.g:7855:2: rule__XAnnotation__Group_3__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotation__Group_3__2__Impl();
@@ -26766,17 +26766,17 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3__2__Impl"
-    // InternalPerspectiveDsl.g:7859:1: rule__XAnnotation__Group_3__2__Impl : ( ')' ) ;
+    // InternalPerspectiveDsl.g:7861:1: rule__XAnnotation__Group_3__2__Impl : ( ')' ) ;
     public final void rule__XAnnotation__Group_3__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7863:1: ( ( ')' ) )
-            // InternalPerspectiveDsl.g:7864:1: ( ')' )
+            // InternalPerspectiveDsl.g:7865:1: ( ( ')' ) )
+            // InternalPerspectiveDsl.g:7866:1: ( ')' )
             {
-            // InternalPerspectiveDsl.g:7864:1: ( ')' )
-            // InternalPerspectiveDsl.g:7865:2: ')'
+            // InternalPerspectiveDsl.g:7866:1: ( ')' )
+            // InternalPerspectiveDsl.g:7867:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2()); 
@@ -26807,14 +26807,14 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3_1_0__0"
-    // InternalPerspectiveDsl.g:7875:1: rule__XAnnotation__Group_3_1_0__0 : rule__XAnnotation__Group_3_1_0__0__Impl rule__XAnnotation__Group_3_1_0__1 ;
+    // InternalPerspectiveDsl.g:7877:1: rule__XAnnotation__Group_3_1_0__0 : rule__XAnnotation__Group_3_1_0__0__Impl rule__XAnnotation__Group_3_1_0__1 ;
     public final void rule__XAnnotation__Group_3_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7879:1: ( rule__XAnnotation__Group_3_1_0__0__Impl rule__XAnnotation__Group_3_1_0__1 )
-            // InternalPerspectiveDsl.g:7880:2: rule__XAnnotation__Group_3_1_0__0__Impl rule__XAnnotation__Group_3_1_0__1
+            // InternalPerspectiveDsl.g:7881:1: ( rule__XAnnotation__Group_3_1_0__0__Impl rule__XAnnotation__Group_3_1_0__1 )
+            // InternalPerspectiveDsl.g:7882:2: rule__XAnnotation__Group_3_1_0__0__Impl rule__XAnnotation__Group_3_1_0__1
             {
             pushFollow(FOLLOW_52);
             rule__XAnnotation__Group_3_1_0__0__Impl();
@@ -26845,23 +26845,23 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3_1_0__0__Impl"
-    // InternalPerspectiveDsl.g:7887:1: rule__XAnnotation__Group_3_1_0__0__Impl : ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) ) ;
+    // InternalPerspectiveDsl.g:7889:1: rule__XAnnotation__Group_3_1_0__0__Impl : ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) ) ;
     public final void rule__XAnnotation__Group_3_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7891:1: ( ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) ) )
-            // InternalPerspectiveDsl.g:7892:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) )
+            // InternalPerspectiveDsl.g:7893:1: ( ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) ) )
+            // InternalPerspectiveDsl.g:7894:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) )
             {
-            // InternalPerspectiveDsl.g:7892:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) )
-            // InternalPerspectiveDsl.g:7893:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 )
+            // InternalPerspectiveDsl.g:7894:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) )
+            // InternalPerspectiveDsl.g:7895:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:7894:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 )
-            // InternalPerspectiveDsl.g:7894:3: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0
+            // InternalPerspectiveDsl.g:7896:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 )
+            // InternalPerspectiveDsl.g:7896:3: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0();
@@ -26896,14 +26896,14 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3_1_0__1"
-    // InternalPerspectiveDsl.g:7902:1: rule__XAnnotation__Group_3_1_0__1 : rule__XAnnotation__Group_3_1_0__1__Impl ;
+    // InternalPerspectiveDsl.g:7904:1: rule__XAnnotation__Group_3_1_0__1 : rule__XAnnotation__Group_3_1_0__1__Impl ;
     public final void rule__XAnnotation__Group_3_1_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7906:1: ( rule__XAnnotation__Group_3_1_0__1__Impl )
-            // InternalPerspectiveDsl.g:7907:2: rule__XAnnotation__Group_3_1_0__1__Impl
+            // InternalPerspectiveDsl.g:7908:1: ( rule__XAnnotation__Group_3_1_0__1__Impl )
+            // InternalPerspectiveDsl.g:7909:2: rule__XAnnotation__Group_3_1_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotation__Group_3_1_0__1__Impl();
@@ -26929,22 +26929,22 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3_1_0__1__Impl"
-    // InternalPerspectiveDsl.g:7913:1: rule__XAnnotation__Group_3_1_0__1__Impl : ( ( rule__XAnnotation__Group_3_1_0_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:7915:1: rule__XAnnotation__Group_3_1_0__1__Impl : ( ( rule__XAnnotation__Group_3_1_0_1__0 )* ) ;
     public final void rule__XAnnotation__Group_3_1_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7917:1: ( ( ( rule__XAnnotation__Group_3_1_0_1__0 )* ) )
-            // InternalPerspectiveDsl.g:7918:1: ( ( rule__XAnnotation__Group_3_1_0_1__0 )* )
+            // InternalPerspectiveDsl.g:7919:1: ( ( ( rule__XAnnotation__Group_3_1_0_1__0 )* ) )
+            // InternalPerspectiveDsl.g:7920:1: ( ( rule__XAnnotation__Group_3_1_0_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:7918:1: ( ( rule__XAnnotation__Group_3_1_0_1__0 )* )
-            // InternalPerspectiveDsl.g:7919:2: ( rule__XAnnotation__Group_3_1_0_1__0 )*
+            // InternalPerspectiveDsl.g:7920:1: ( ( rule__XAnnotation__Group_3_1_0_1__0 )* )
+            // InternalPerspectiveDsl.g:7921:2: ( rule__XAnnotation__Group_3_1_0_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0_1()); 
             }
-            // InternalPerspectiveDsl.g:7920:2: ( rule__XAnnotation__Group_3_1_0_1__0 )*
+            // InternalPerspectiveDsl.g:7922:2: ( rule__XAnnotation__Group_3_1_0_1__0 )*
             loop62:
             do {
                 int alt62=2;
@@ -26957,7 +26957,7 @@
 
                 switch (alt62) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:7920:3: rule__XAnnotation__Group_3_1_0_1__0
+            	    // InternalPerspectiveDsl.g:7922:3: rule__XAnnotation__Group_3_1_0_1__0
             	    {
             	    pushFollow(FOLLOW_53);
             	    rule__XAnnotation__Group_3_1_0_1__0();
@@ -26998,14 +26998,14 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3_1_0_1__0"
-    // InternalPerspectiveDsl.g:7929:1: rule__XAnnotation__Group_3_1_0_1__0 : rule__XAnnotation__Group_3_1_0_1__0__Impl rule__XAnnotation__Group_3_1_0_1__1 ;
+    // InternalPerspectiveDsl.g:7931:1: rule__XAnnotation__Group_3_1_0_1__0 : rule__XAnnotation__Group_3_1_0_1__0__Impl rule__XAnnotation__Group_3_1_0_1__1 ;
     public final void rule__XAnnotation__Group_3_1_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7933:1: ( rule__XAnnotation__Group_3_1_0_1__0__Impl rule__XAnnotation__Group_3_1_0_1__1 )
-            // InternalPerspectiveDsl.g:7934:2: rule__XAnnotation__Group_3_1_0_1__0__Impl rule__XAnnotation__Group_3_1_0_1__1
+            // InternalPerspectiveDsl.g:7935:1: ( rule__XAnnotation__Group_3_1_0_1__0__Impl rule__XAnnotation__Group_3_1_0_1__1 )
+            // InternalPerspectiveDsl.g:7936:2: rule__XAnnotation__Group_3_1_0_1__0__Impl rule__XAnnotation__Group_3_1_0_1__1
             {
             pushFollow(FOLLOW_7);
             rule__XAnnotation__Group_3_1_0_1__0__Impl();
@@ -27036,17 +27036,17 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3_1_0_1__0__Impl"
-    // InternalPerspectiveDsl.g:7941:1: rule__XAnnotation__Group_3_1_0_1__0__Impl : ( ',' ) ;
+    // InternalPerspectiveDsl.g:7943:1: rule__XAnnotation__Group_3_1_0_1__0__Impl : ( ',' ) ;
     public final void rule__XAnnotation__Group_3_1_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7945:1: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:7946:1: ( ',' )
+            // InternalPerspectiveDsl.g:7947:1: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:7948:1: ( ',' )
             {
-            // InternalPerspectiveDsl.g:7946:1: ( ',' )
-            // InternalPerspectiveDsl.g:7947:2: ','
+            // InternalPerspectiveDsl.g:7948:1: ( ',' )
+            // InternalPerspectiveDsl.g:7949:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0()); 
@@ -27077,14 +27077,14 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3_1_0_1__1"
-    // InternalPerspectiveDsl.g:7956:1: rule__XAnnotation__Group_3_1_0_1__1 : rule__XAnnotation__Group_3_1_0_1__1__Impl ;
+    // InternalPerspectiveDsl.g:7958:1: rule__XAnnotation__Group_3_1_0_1__1 : rule__XAnnotation__Group_3_1_0_1__1__Impl ;
     public final void rule__XAnnotation__Group_3_1_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7960:1: ( rule__XAnnotation__Group_3_1_0_1__1__Impl )
-            // InternalPerspectiveDsl.g:7961:2: rule__XAnnotation__Group_3_1_0_1__1__Impl
+            // InternalPerspectiveDsl.g:7962:1: ( rule__XAnnotation__Group_3_1_0_1__1__Impl )
+            // InternalPerspectiveDsl.g:7963:2: rule__XAnnotation__Group_3_1_0_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotation__Group_3_1_0_1__1__Impl();
@@ -27110,23 +27110,23 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3_1_0_1__1__Impl"
-    // InternalPerspectiveDsl.g:7967:1: rule__XAnnotation__Group_3_1_0_1__1__Impl : ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:7969:1: rule__XAnnotation__Group_3_1_0_1__1__Impl : ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) ) ;
     public final void rule__XAnnotation__Group_3_1_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7971:1: ( ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) ) )
-            // InternalPerspectiveDsl.g:7972:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) )
+            // InternalPerspectiveDsl.g:7973:1: ( ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) ) )
+            // InternalPerspectiveDsl.g:7974:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:7972:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) )
-            // InternalPerspectiveDsl.g:7973:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 )
+            // InternalPerspectiveDsl.g:7974:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) )
+            // InternalPerspectiveDsl.g:7975:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_1_1()); 
             }
-            // InternalPerspectiveDsl.g:7974:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 )
-            // InternalPerspectiveDsl.g:7974:3: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1
+            // InternalPerspectiveDsl.g:7976:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 )
+            // InternalPerspectiveDsl.g:7976:3: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1();
@@ -27161,14 +27161,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group__0"
-    // InternalPerspectiveDsl.g:7983:1: rule__XAnnotationElementValuePair__Group__0 : rule__XAnnotationElementValuePair__Group__0__Impl rule__XAnnotationElementValuePair__Group__1 ;
+    // InternalPerspectiveDsl.g:7985:1: rule__XAnnotationElementValuePair__Group__0 : rule__XAnnotationElementValuePair__Group__0__Impl rule__XAnnotationElementValuePair__Group__1 ;
     public final void rule__XAnnotationElementValuePair__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7987:1: ( rule__XAnnotationElementValuePair__Group__0__Impl rule__XAnnotationElementValuePair__Group__1 )
-            // InternalPerspectiveDsl.g:7988:2: rule__XAnnotationElementValuePair__Group__0__Impl rule__XAnnotationElementValuePair__Group__1
+            // InternalPerspectiveDsl.g:7989:1: ( rule__XAnnotationElementValuePair__Group__0__Impl rule__XAnnotationElementValuePair__Group__1 )
+            // InternalPerspectiveDsl.g:7990:2: rule__XAnnotationElementValuePair__Group__0__Impl rule__XAnnotationElementValuePair__Group__1
             {
             pushFollow(FOLLOW_54);
             rule__XAnnotationElementValuePair__Group__0__Impl();
@@ -27199,23 +27199,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group__0__Impl"
-    // InternalPerspectiveDsl.g:7995:1: rule__XAnnotationElementValuePair__Group__0__Impl : ( ( rule__XAnnotationElementValuePair__Group_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:7997:1: rule__XAnnotationElementValuePair__Group__0__Impl : ( ( rule__XAnnotationElementValuePair__Group_0__0 ) ) ;
     public final void rule__XAnnotationElementValuePair__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:7999:1: ( ( ( rule__XAnnotationElementValuePair__Group_0__0 ) ) )
-            // InternalPerspectiveDsl.g:8000:1: ( ( rule__XAnnotationElementValuePair__Group_0__0 ) )
+            // InternalPerspectiveDsl.g:8001:1: ( ( ( rule__XAnnotationElementValuePair__Group_0__0 ) ) )
+            // InternalPerspectiveDsl.g:8002:1: ( ( rule__XAnnotationElementValuePair__Group_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:8000:1: ( ( rule__XAnnotationElementValuePair__Group_0__0 ) )
-            // InternalPerspectiveDsl.g:8001:2: ( rule__XAnnotationElementValuePair__Group_0__0 )
+            // InternalPerspectiveDsl.g:8002:1: ( ( rule__XAnnotationElementValuePair__Group_0__0 ) )
+            // InternalPerspectiveDsl.g:8003:2: ( rule__XAnnotationElementValuePair__Group_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0()); 
             }
-            // InternalPerspectiveDsl.g:8002:2: ( rule__XAnnotationElementValuePair__Group_0__0 )
-            // InternalPerspectiveDsl.g:8002:3: rule__XAnnotationElementValuePair__Group_0__0
+            // InternalPerspectiveDsl.g:8004:2: ( rule__XAnnotationElementValuePair__Group_0__0 )
+            // InternalPerspectiveDsl.g:8004:3: rule__XAnnotationElementValuePair__Group_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValuePair__Group_0__0();
@@ -27250,14 +27250,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group__1"
-    // InternalPerspectiveDsl.g:8010:1: rule__XAnnotationElementValuePair__Group__1 : rule__XAnnotationElementValuePair__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:8012:1: rule__XAnnotationElementValuePair__Group__1 : rule__XAnnotationElementValuePair__Group__1__Impl ;
     public final void rule__XAnnotationElementValuePair__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8014:1: ( rule__XAnnotationElementValuePair__Group__1__Impl )
-            // InternalPerspectiveDsl.g:8015:2: rule__XAnnotationElementValuePair__Group__1__Impl
+            // InternalPerspectiveDsl.g:8016:1: ( rule__XAnnotationElementValuePair__Group__1__Impl )
+            // InternalPerspectiveDsl.g:8017:2: rule__XAnnotationElementValuePair__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValuePair__Group__1__Impl();
@@ -27283,23 +27283,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group__1__Impl"
-    // InternalPerspectiveDsl.g:8021:1: rule__XAnnotationElementValuePair__Group__1__Impl : ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) ) ;
+    // InternalPerspectiveDsl.g:8023:1: rule__XAnnotationElementValuePair__Group__1__Impl : ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) ) ;
     public final void rule__XAnnotationElementValuePair__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8025:1: ( ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) ) )
-            // InternalPerspectiveDsl.g:8026:1: ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) )
+            // InternalPerspectiveDsl.g:8027:1: ( ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) ) )
+            // InternalPerspectiveDsl.g:8028:1: ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) )
             {
-            // InternalPerspectiveDsl.g:8026:1: ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) )
-            // InternalPerspectiveDsl.g:8027:2: ( rule__XAnnotationElementValuePair__ValueAssignment_1 )
+            // InternalPerspectiveDsl.g:8028:1: ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) )
+            // InternalPerspectiveDsl.g:8029:2: ( rule__XAnnotationElementValuePair__ValueAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairAccess().getValueAssignment_1()); 
             }
-            // InternalPerspectiveDsl.g:8028:2: ( rule__XAnnotationElementValuePair__ValueAssignment_1 )
-            // InternalPerspectiveDsl.g:8028:3: rule__XAnnotationElementValuePair__ValueAssignment_1
+            // InternalPerspectiveDsl.g:8030:2: ( rule__XAnnotationElementValuePair__ValueAssignment_1 )
+            // InternalPerspectiveDsl.g:8030:3: rule__XAnnotationElementValuePair__ValueAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValuePair__ValueAssignment_1();
@@ -27334,14 +27334,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group_0__0"
-    // InternalPerspectiveDsl.g:8037:1: rule__XAnnotationElementValuePair__Group_0__0 : rule__XAnnotationElementValuePair__Group_0__0__Impl ;
+    // InternalPerspectiveDsl.g:8039:1: rule__XAnnotationElementValuePair__Group_0__0 : rule__XAnnotationElementValuePair__Group_0__0__Impl ;
     public final void rule__XAnnotationElementValuePair__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8041:1: ( rule__XAnnotationElementValuePair__Group_0__0__Impl )
-            // InternalPerspectiveDsl.g:8042:2: rule__XAnnotationElementValuePair__Group_0__0__Impl
+            // InternalPerspectiveDsl.g:8043:1: ( rule__XAnnotationElementValuePair__Group_0__0__Impl )
+            // InternalPerspectiveDsl.g:8044:2: rule__XAnnotationElementValuePair__Group_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValuePair__Group_0__0__Impl();
@@ -27367,23 +27367,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group_0__0__Impl"
-    // InternalPerspectiveDsl.g:8048:1: rule__XAnnotationElementValuePair__Group_0__0__Impl : ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:8050:1: rule__XAnnotationElementValuePair__Group_0__0__Impl : ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) ) ;
     public final void rule__XAnnotationElementValuePair__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8052:1: ( ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:8053:1: ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) )
+            // InternalPerspectiveDsl.g:8054:1: ( ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:8055:1: ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:8053:1: ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) )
-            // InternalPerspectiveDsl.g:8054:2: ( rule__XAnnotationElementValuePair__Group_0_0__0 )
+            // InternalPerspectiveDsl.g:8055:1: ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) )
+            // InternalPerspectiveDsl.g:8056:2: ( rule__XAnnotationElementValuePair__Group_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0_0()); 
             }
-            // InternalPerspectiveDsl.g:8055:2: ( rule__XAnnotationElementValuePair__Group_0_0__0 )
-            // InternalPerspectiveDsl.g:8055:3: rule__XAnnotationElementValuePair__Group_0_0__0
+            // InternalPerspectiveDsl.g:8057:2: ( rule__XAnnotationElementValuePair__Group_0_0__0 )
+            // InternalPerspectiveDsl.g:8057:3: rule__XAnnotationElementValuePair__Group_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValuePair__Group_0_0__0();
@@ -27418,14 +27418,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group_0_0__0"
-    // InternalPerspectiveDsl.g:8064:1: rule__XAnnotationElementValuePair__Group_0_0__0 : rule__XAnnotationElementValuePair__Group_0_0__0__Impl rule__XAnnotationElementValuePair__Group_0_0__1 ;
+    // InternalPerspectiveDsl.g:8066:1: rule__XAnnotationElementValuePair__Group_0_0__0 : rule__XAnnotationElementValuePair__Group_0_0__0__Impl rule__XAnnotationElementValuePair__Group_0_0__1 ;
     public final void rule__XAnnotationElementValuePair__Group_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8068:1: ( rule__XAnnotationElementValuePair__Group_0_0__0__Impl rule__XAnnotationElementValuePair__Group_0_0__1 )
-            // InternalPerspectiveDsl.g:8069:2: rule__XAnnotationElementValuePair__Group_0_0__0__Impl rule__XAnnotationElementValuePair__Group_0_0__1
+            // InternalPerspectiveDsl.g:8070:1: ( rule__XAnnotationElementValuePair__Group_0_0__0__Impl rule__XAnnotationElementValuePair__Group_0_0__1 )
+            // InternalPerspectiveDsl.g:8071:2: rule__XAnnotationElementValuePair__Group_0_0__0__Impl rule__XAnnotationElementValuePair__Group_0_0__1
             {
             pushFollow(FOLLOW_55);
             rule__XAnnotationElementValuePair__Group_0_0__0__Impl();
@@ -27456,23 +27456,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:8076:1: rule__XAnnotationElementValuePair__Group_0_0__0__Impl : ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) ) ;
+    // InternalPerspectiveDsl.g:8078:1: rule__XAnnotationElementValuePair__Group_0_0__0__Impl : ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) ) ;
     public final void rule__XAnnotationElementValuePair__Group_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8080:1: ( ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) ) )
-            // InternalPerspectiveDsl.g:8081:1: ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) )
+            // InternalPerspectiveDsl.g:8082:1: ( ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) ) )
+            // InternalPerspectiveDsl.g:8083:1: ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) )
             {
-            // InternalPerspectiveDsl.g:8081:1: ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) )
-            // InternalPerspectiveDsl.g:8082:2: ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 )
+            // InternalPerspectiveDsl.g:8083:1: ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) )
+            // InternalPerspectiveDsl.g:8084:2: ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairAccess().getElementAssignment_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:8083:2: ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 )
-            // InternalPerspectiveDsl.g:8083:3: rule__XAnnotationElementValuePair__ElementAssignment_0_0_0
+            // InternalPerspectiveDsl.g:8085:2: ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 )
+            // InternalPerspectiveDsl.g:8085:3: rule__XAnnotationElementValuePair__ElementAssignment_0_0_0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValuePair__ElementAssignment_0_0_0();
@@ -27507,14 +27507,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group_0_0__1"
-    // InternalPerspectiveDsl.g:8091:1: rule__XAnnotationElementValuePair__Group_0_0__1 : rule__XAnnotationElementValuePair__Group_0_0__1__Impl ;
+    // InternalPerspectiveDsl.g:8093:1: rule__XAnnotationElementValuePair__Group_0_0__1 : rule__XAnnotationElementValuePair__Group_0_0__1__Impl ;
     public final void rule__XAnnotationElementValuePair__Group_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8095:1: ( rule__XAnnotationElementValuePair__Group_0_0__1__Impl )
-            // InternalPerspectiveDsl.g:8096:2: rule__XAnnotationElementValuePair__Group_0_0__1__Impl
+            // InternalPerspectiveDsl.g:8097:1: ( rule__XAnnotationElementValuePair__Group_0_0__1__Impl )
+            // InternalPerspectiveDsl.g:8098:2: rule__XAnnotationElementValuePair__Group_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValuePair__Group_0_0__1__Impl();
@@ -27540,17 +27540,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:8102:1: rule__XAnnotationElementValuePair__Group_0_0__1__Impl : ( '=' ) ;
+    // InternalPerspectiveDsl.g:8104:1: rule__XAnnotationElementValuePair__Group_0_0__1__Impl : ( '=' ) ;
     public final void rule__XAnnotationElementValuePair__Group_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8106:1: ( ( '=' ) )
-            // InternalPerspectiveDsl.g:8107:1: ( '=' )
+            // InternalPerspectiveDsl.g:8108:1: ( ( '=' ) )
+            // InternalPerspectiveDsl.g:8109:1: ( '=' )
             {
-            // InternalPerspectiveDsl.g:8107:1: ( '=' )
-            // InternalPerspectiveDsl.g:8108:2: '='
+            // InternalPerspectiveDsl.g:8109:1: ( '=' )
+            // InternalPerspectiveDsl.g:8110:2: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1()); 
@@ -27581,14 +27581,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0__0"
-    // InternalPerspectiveDsl.g:8118:1: rule__XAnnotationElementValueOrCommaList__Group_0__0 : rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0__1 ;
+    // InternalPerspectiveDsl.g:8120:1: rule__XAnnotationElementValueOrCommaList__Group_0__0 : rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0__1 ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8122:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0__1 )
-            // InternalPerspectiveDsl.g:8123:2: rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0__1
+            // InternalPerspectiveDsl.g:8124:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0__1 )
+            // InternalPerspectiveDsl.g:8125:2: rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0__1
             {
             pushFollow(FOLLOW_56);
             rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl();
@@ -27619,23 +27619,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl"
-    // InternalPerspectiveDsl.g:8130:1: rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:8132:1: rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8134:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:8135:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) )
+            // InternalPerspectiveDsl.g:8136:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:8137:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:8135:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) )
-            // InternalPerspectiveDsl.g:8136:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 )
+            // InternalPerspectiveDsl.g:8137:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) )
+            // InternalPerspectiveDsl.g:8138:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0()); 
             }
-            // InternalPerspectiveDsl.g:8137:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 )
-            // InternalPerspectiveDsl.g:8137:3: rule__XAnnotationElementValueOrCommaList__Group_0_0__0
+            // InternalPerspectiveDsl.g:8139:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 )
+            // InternalPerspectiveDsl.g:8139:3: rule__XAnnotationElementValueOrCommaList__Group_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_0_0__0();
@@ -27670,14 +27670,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0__1"
-    // InternalPerspectiveDsl.g:8145:1: rule__XAnnotationElementValueOrCommaList__Group_0__1 : rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0__2 ;
+    // InternalPerspectiveDsl.g:8147:1: rule__XAnnotationElementValueOrCommaList__Group_0__1 : rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0__2 ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8149:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0__2 )
-            // InternalPerspectiveDsl.g:8150:2: rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0__2
+            // InternalPerspectiveDsl.g:8151:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0__2 )
+            // InternalPerspectiveDsl.g:8152:2: rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0__2
             {
             pushFollow(FOLLOW_56);
             rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl();
@@ -27708,22 +27708,22 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl"
-    // InternalPerspectiveDsl.g:8157:1: rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? ) ;
+    // InternalPerspectiveDsl.g:8159:1: rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8161:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? ) )
-            // InternalPerspectiveDsl.g:8162:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? )
+            // InternalPerspectiveDsl.g:8163:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? ) )
+            // InternalPerspectiveDsl.g:8164:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? )
             {
-            // InternalPerspectiveDsl.g:8162:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? )
-            // InternalPerspectiveDsl.g:8163:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )?
+            // InternalPerspectiveDsl.g:8164:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? )
+            // InternalPerspectiveDsl.g:8165:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1()); 
             }
-            // InternalPerspectiveDsl.g:8164:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )?
+            // InternalPerspectiveDsl.g:8166:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )?
             int alt63=2;
             int LA63_0 = input.LA(1);
 
@@ -27732,7 +27732,7 @@
             }
             switch (alt63) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:8164:3: rule__XAnnotationElementValueOrCommaList__Group_0_1__0
+                    // InternalPerspectiveDsl.g:8166:3: rule__XAnnotationElementValueOrCommaList__Group_0_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotationElementValueOrCommaList__Group_0_1__0();
@@ -27770,14 +27770,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0__2"
-    // InternalPerspectiveDsl.g:8172:1: rule__XAnnotationElementValueOrCommaList__Group_0__2 : rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl ;
+    // InternalPerspectiveDsl.g:8174:1: rule__XAnnotationElementValueOrCommaList__Group_0__2 : rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8176:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl )
-            // InternalPerspectiveDsl.g:8177:2: rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl
+            // InternalPerspectiveDsl.g:8178:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl )
+            // InternalPerspectiveDsl.g:8179:2: rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl();
@@ -27803,17 +27803,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl"
-    // InternalPerspectiveDsl.g:8183:1: rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl : ( ']' ) ;
+    // InternalPerspectiveDsl.g:8185:1: rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl : ( ']' ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8187:1: ( ( ']' ) )
-            // InternalPerspectiveDsl.g:8188:1: ( ']' )
+            // InternalPerspectiveDsl.g:8189:1: ( ( ']' ) )
+            // InternalPerspectiveDsl.g:8190:1: ( ']' )
             {
-            // InternalPerspectiveDsl.g:8188:1: ( ']' )
-            // InternalPerspectiveDsl.g:8189:2: ']'
+            // InternalPerspectiveDsl.g:8190:1: ( ']' )
+            // InternalPerspectiveDsl.g:8191:2: ']'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2()); 
@@ -27844,14 +27844,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0__0"
-    // InternalPerspectiveDsl.g:8199:1: rule__XAnnotationElementValueOrCommaList__Group_0_0__0 : rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl ;
+    // InternalPerspectiveDsl.g:8201:1: rule__XAnnotationElementValueOrCommaList__Group_0_0__0 : rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8203:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl )
-            // InternalPerspectiveDsl.g:8204:2: rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl
+            // InternalPerspectiveDsl.g:8205:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl )
+            // InternalPerspectiveDsl.g:8206:2: rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl();
@@ -27877,23 +27877,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:8210:1: rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:8212:1: rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8214:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:8215:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) )
+            // InternalPerspectiveDsl.g:8216:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:8217:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:8215:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) )
-            // InternalPerspectiveDsl.g:8216:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 )
+            // InternalPerspectiveDsl.g:8217:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) )
+            // InternalPerspectiveDsl.g:8218:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:8217:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 )
-            // InternalPerspectiveDsl.g:8217:3: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0
+            // InternalPerspectiveDsl.g:8219:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 )
+            // InternalPerspectiveDsl.g:8219:3: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0();
@@ -27928,14 +27928,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0"
-    // InternalPerspectiveDsl.g:8226:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 : rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1 ;
+    // InternalPerspectiveDsl.g:8228:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 : rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1 ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8230:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1 )
-            // InternalPerspectiveDsl.g:8231:2: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1
+            // InternalPerspectiveDsl.g:8232:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1 )
+            // InternalPerspectiveDsl.g:8233:2: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1
             {
             pushFollow(FOLLOW_57);
             rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl();
@@ -27966,23 +27966,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:8238:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:8240:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl : ( () ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8242:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:8243:1: ( () )
+            // InternalPerspectiveDsl.g:8244:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:8245:1: ( () )
             {
-            // InternalPerspectiveDsl.g:8243:1: ( () )
-            // InternalPerspectiveDsl.g:8244:2: ()
+            // InternalPerspectiveDsl.g:8245:1: ( () )
+            // InternalPerspectiveDsl.g:8246:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:8245:2: ()
-            // InternalPerspectiveDsl.g:8245:3: 
+            // InternalPerspectiveDsl.g:8247:2: ()
+            // InternalPerspectiveDsl.g:8247:3: 
             {
             }
 
@@ -28007,14 +28007,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1"
-    // InternalPerspectiveDsl.g:8253:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1 : rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2 ;
+    // InternalPerspectiveDsl.g:8255:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1 : rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2 ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8257:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2 )
-            // InternalPerspectiveDsl.g:8258:2: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2
+            // InternalPerspectiveDsl.g:8259:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2 )
+            // InternalPerspectiveDsl.g:8260:2: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2
             {
             pushFollow(FOLLOW_58);
             rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl();
@@ -28045,17 +28045,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:8265:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl : ( '#' ) ;
+    // InternalPerspectiveDsl.g:8267:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl : ( '#' ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8269:1: ( ( '#' ) )
-            // InternalPerspectiveDsl.g:8270:1: ( '#' )
+            // InternalPerspectiveDsl.g:8271:1: ( ( '#' ) )
+            // InternalPerspectiveDsl.g:8272:1: ( '#' )
             {
-            // InternalPerspectiveDsl.g:8270:1: ( '#' )
-            // InternalPerspectiveDsl.g:8271:2: '#'
+            // InternalPerspectiveDsl.g:8272:1: ( '#' )
+            // InternalPerspectiveDsl.g:8273:2: '#'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1()); 
@@ -28086,14 +28086,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2"
-    // InternalPerspectiveDsl.g:8280:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2 : rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl ;
+    // InternalPerspectiveDsl.g:8282:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2 : rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8284:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl )
-            // InternalPerspectiveDsl.g:8285:2: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl
+            // InternalPerspectiveDsl.g:8286:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl )
+            // InternalPerspectiveDsl.g:8287:2: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl();
@@ -28119,17 +28119,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl"
-    // InternalPerspectiveDsl.g:8291:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl : ( '[' ) ;
+    // InternalPerspectiveDsl.g:8293:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl : ( '[' ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8295:1: ( ( '[' ) )
-            // InternalPerspectiveDsl.g:8296:1: ( '[' )
+            // InternalPerspectiveDsl.g:8297:1: ( ( '[' ) )
+            // InternalPerspectiveDsl.g:8298:1: ( '[' )
             {
-            // InternalPerspectiveDsl.g:8296:1: ( '[' )
-            // InternalPerspectiveDsl.g:8297:2: '['
+            // InternalPerspectiveDsl.g:8298:1: ( '[' )
+            // InternalPerspectiveDsl.g:8299:2: '['
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2()); 
@@ -28160,14 +28160,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1__0"
-    // InternalPerspectiveDsl.g:8307:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__0 : rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1__1 ;
+    // InternalPerspectiveDsl.g:8309:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__0 : rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1__1 ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8311:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1__1 )
-            // InternalPerspectiveDsl.g:8312:2: rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1__1
+            // InternalPerspectiveDsl.g:8313:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1__1 )
+            // InternalPerspectiveDsl.g:8314:2: rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1__1
             {
             pushFollow(FOLLOW_52);
             rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl();
@@ -28198,23 +28198,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl"
-    // InternalPerspectiveDsl.g:8319:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl : ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) ) ;
+    // InternalPerspectiveDsl.g:8321:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl : ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8323:1: ( ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) ) )
-            // InternalPerspectiveDsl.g:8324:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) )
+            // InternalPerspectiveDsl.g:8325:1: ( ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) ) )
+            // InternalPerspectiveDsl.g:8326:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) )
             {
-            // InternalPerspectiveDsl.g:8324:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) )
-            // InternalPerspectiveDsl.g:8325:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 )
+            // InternalPerspectiveDsl.g:8326:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) )
+            // InternalPerspectiveDsl.g:8327:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:8326:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 )
-            // InternalPerspectiveDsl.g:8326:3: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0
+            // InternalPerspectiveDsl.g:8328:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 )
+            // InternalPerspectiveDsl.g:8328:3: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0();
@@ -28249,14 +28249,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1__1"
-    // InternalPerspectiveDsl.g:8334:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__1 : rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl ;
+    // InternalPerspectiveDsl.g:8336:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__1 : rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8338:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl )
-            // InternalPerspectiveDsl.g:8339:2: rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl
+            // InternalPerspectiveDsl.g:8340:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl )
+            // InternalPerspectiveDsl.g:8341:2: rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl();
@@ -28282,22 +28282,22 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl"
-    // InternalPerspectiveDsl.g:8345:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:8347:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8349:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* ) )
-            // InternalPerspectiveDsl.g:8350:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* )
+            // InternalPerspectiveDsl.g:8351:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* ) )
+            // InternalPerspectiveDsl.g:8352:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:8350:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* )
-            // InternalPerspectiveDsl.g:8351:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )*
+            // InternalPerspectiveDsl.g:8352:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* )
+            // InternalPerspectiveDsl.g:8353:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1_1()); 
             }
-            // InternalPerspectiveDsl.g:8352:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )*
+            // InternalPerspectiveDsl.g:8354:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )*
             loop64:
             do {
                 int alt64=2;
@@ -28310,7 +28310,7 @@
 
                 switch (alt64) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:8352:3: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0
+            	    // InternalPerspectiveDsl.g:8354:3: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0
             	    {
             	    pushFollow(FOLLOW_53);
             	    rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0();
@@ -28351,14 +28351,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0"
-    // InternalPerspectiveDsl.g:8361:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 : rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1 ;
+    // InternalPerspectiveDsl.g:8363:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 : rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1 ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8365:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1 )
-            // InternalPerspectiveDsl.g:8366:2: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1
+            // InternalPerspectiveDsl.g:8367:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1 )
+            // InternalPerspectiveDsl.g:8368:2: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1
             {
             pushFollow(FOLLOW_54);
             rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl();
@@ -28389,17 +28389,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl"
-    // InternalPerspectiveDsl.g:8373:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl : ( ',' ) ;
+    // InternalPerspectiveDsl.g:8375:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl : ( ',' ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8377:1: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:8378:1: ( ',' )
+            // InternalPerspectiveDsl.g:8379:1: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:8380:1: ( ',' )
             {
-            // InternalPerspectiveDsl.g:8378:1: ( ',' )
-            // InternalPerspectiveDsl.g:8379:2: ','
+            // InternalPerspectiveDsl.g:8380:1: ( ',' )
+            // InternalPerspectiveDsl.g:8381:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0()); 
@@ -28430,14 +28430,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1"
-    // InternalPerspectiveDsl.g:8388:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1 : rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl ;
+    // InternalPerspectiveDsl.g:8390:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1 : rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8392:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl )
-            // InternalPerspectiveDsl.g:8393:2: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl
+            // InternalPerspectiveDsl.g:8394:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl )
+            // InternalPerspectiveDsl.g:8395:2: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl();
@@ -28463,23 +28463,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl"
-    // InternalPerspectiveDsl.g:8399:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:8401:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8403:1: ( ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) ) )
-            // InternalPerspectiveDsl.g:8404:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) )
+            // InternalPerspectiveDsl.g:8405:1: ( ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) ) )
+            // InternalPerspectiveDsl.g:8406:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:8404:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) )
-            // InternalPerspectiveDsl.g:8405:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 )
+            // InternalPerspectiveDsl.g:8406:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) )
+            // InternalPerspectiveDsl.g:8407:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_1_1()); 
             }
-            // InternalPerspectiveDsl.g:8406:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 )
-            // InternalPerspectiveDsl.g:8406:3: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1
+            // InternalPerspectiveDsl.g:8408:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 )
+            // InternalPerspectiveDsl.g:8408:3: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1();
@@ -28514,14 +28514,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1__0"
-    // InternalPerspectiveDsl.g:8415:1: rule__XAnnotationElementValueOrCommaList__Group_1__0 : rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1__1 ;
+    // InternalPerspectiveDsl.g:8417:1: rule__XAnnotationElementValueOrCommaList__Group_1__0 : rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1__1 ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8419:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1__1 )
-            // InternalPerspectiveDsl.g:8420:2: rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1__1
+            // InternalPerspectiveDsl.g:8421:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1__1 )
+            // InternalPerspectiveDsl.g:8422:2: rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1__1
             {
             pushFollow(FOLLOW_52);
             rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl();
@@ -28552,17 +28552,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl"
-    // InternalPerspectiveDsl.g:8427:1: rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl : ( ruleXAnnotationOrExpression ) ;
+    // InternalPerspectiveDsl.g:8429:1: rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl : ( ruleXAnnotationOrExpression ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8431:1: ( ( ruleXAnnotationOrExpression ) )
-            // InternalPerspectiveDsl.g:8432:1: ( ruleXAnnotationOrExpression )
+            // InternalPerspectiveDsl.g:8433:1: ( ( ruleXAnnotationOrExpression ) )
+            // InternalPerspectiveDsl.g:8434:1: ( ruleXAnnotationOrExpression )
             {
-            // InternalPerspectiveDsl.g:8432:1: ( ruleXAnnotationOrExpression )
-            // InternalPerspectiveDsl.g:8433:2: ruleXAnnotationOrExpression
+            // InternalPerspectiveDsl.g:8434:1: ( ruleXAnnotationOrExpression )
+            // InternalPerspectiveDsl.g:8435:2: ruleXAnnotationOrExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0()); 
@@ -28597,14 +28597,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1__1"
-    // InternalPerspectiveDsl.g:8442:1: rule__XAnnotationElementValueOrCommaList__Group_1__1 : rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl ;
+    // InternalPerspectiveDsl.g:8444:1: rule__XAnnotationElementValueOrCommaList__Group_1__1 : rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8446:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl )
-            // InternalPerspectiveDsl.g:8447:2: rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl
+            // InternalPerspectiveDsl.g:8448:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl )
+            // InternalPerspectiveDsl.g:8449:2: rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl();
@@ -28630,22 +28630,22 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl"
-    // InternalPerspectiveDsl.g:8453:1: rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? ) ;
+    // InternalPerspectiveDsl.g:8455:1: rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8457:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? ) )
-            // InternalPerspectiveDsl.g:8458:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? )
+            // InternalPerspectiveDsl.g:8459:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? ) )
+            // InternalPerspectiveDsl.g:8460:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? )
             {
-            // InternalPerspectiveDsl.g:8458:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? )
-            // InternalPerspectiveDsl.g:8459:2: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )?
+            // InternalPerspectiveDsl.g:8460:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? )
+            // InternalPerspectiveDsl.g:8461:2: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1()); 
             }
-            // InternalPerspectiveDsl.g:8460:2: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )?
+            // InternalPerspectiveDsl.g:8462:2: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )?
             int alt65=2;
             int LA65_0 = input.LA(1);
 
@@ -28654,7 +28654,7 @@
             }
             switch (alt65) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:8460:3: rule__XAnnotationElementValueOrCommaList__Group_1_1__0
+                    // InternalPerspectiveDsl.g:8462:3: rule__XAnnotationElementValueOrCommaList__Group_1_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotationElementValueOrCommaList__Group_1_1__0();
@@ -28692,14 +28692,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1__0"
-    // InternalPerspectiveDsl.g:8469:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__0 : rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1__1 ;
+    // InternalPerspectiveDsl.g:8471:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__0 : rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1__1 ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8473:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1__1 )
-            // InternalPerspectiveDsl.g:8474:2: rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1__1
+            // InternalPerspectiveDsl.g:8475:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1__1 )
+            // InternalPerspectiveDsl.g:8476:2: rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1__1
             {
             pushFollow(FOLLOW_52);
             rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl();
@@ -28730,23 +28730,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl"
-    // InternalPerspectiveDsl.g:8481:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:8483:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl : ( () ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8485:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:8486:1: ( () )
+            // InternalPerspectiveDsl.g:8487:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:8488:1: ( () )
             {
-            // InternalPerspectiveDsl.g:8486:1: ( () )
-            // InternalPerspectiveDsl.g:8487:2: ()
+            // InternalPerspectiveDsl.g:8488:1: ( () )
+            // InternalPerspectiveDsl.g:8489:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()); 
             }
-            // InternalPerspectiveDsl.g:8488:2: ()
-            // InternalPerspectiveDsl.g:8488:3: 
+            // InternalPerspectiveDsl.g:8490:2: ()
+            // InternalPerspectiveDsl.g:8490:3: 
             {
             }
 
@@ -28771,14 +28771,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1__1"
-    // InternalPerspectiveDsl.g:8496:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__1 : rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl ;
+    // InternalPerspectiveDsl.g:8498:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__1 : rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8500:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl )
-            // InternalPerspectiveDsl.g:8501:2: rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl
+            // InternalPerspectiveDsl.g:8502:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl )
+            // InternalPerspectiveDsl.g:8503:2: rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl();
@@ -28804,26 +28804,26 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl"
-    // InternalPerspectiveDsl.g:8507:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl : ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) ) ;
+    // InternalPerspectiveDsl.g:8509:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl : ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8511:1: ( ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) ) )
-            // InternalPerspectiveDsl.g:8512:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) )
+            // InternalPerspectiveDsl.g:8513:1: ( ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) ) )
+            // InternalPerspectiveDsl.g:8514:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) )
             {
-            // InternalPerspectiveDsl.g:8512:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) )
-            // InternalPerspectiveDsl.g:8513:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* )
+            // InternalPerspectiveDsl.g:8514:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) )
+            // InternalPerspectiveDsl.g:8515:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:8513:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) )
-            // InternalPerspectiveDsl.g:8514:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )
+            // InternalPerspectiveDsl.g:8515:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) )
+            // InternalPerspectiveDsl.g:8516:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); 
             }
-            // InternalPerspectiveDsl.g:8515:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )
-            // InternalPerspectiveDsl.g:8515:4: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0
+            // InternalPerspectiveDsl.g:8517:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )
+            // InternalPerspectiveDsl.g:8517:4: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0
             {
             pushFollow(FOLLOW_53);
             rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0();
@@ -28839,13 +28839,13 @@
 
             }
 
-            // InternalPerspectiveDsl.g:8518:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* )
-            // InternalPerspectiveDsl.g:8519:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )*
+            // InternalPerspectiveDsl.g:8520:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* )
+            // InternalPerspectiveDsl.g:8521:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); 
             }
-            // InternalPerspectiveDsl.g:8520:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )*
+            // InternalPerspectiveDsl.g:8522:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )*
             loop66:
             do {
                 int alt66=2;
@@ -28858,7 +28858,7 @@
 
                 switch (alt66) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:8520:4: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0
+            	    // InternalPerspectiveDsl.g:8522:4: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0
             	    {
             	    pushFollow(FOLLOW_53);
             	    rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0();
@@ -28902,14 +28902,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0"
-    // InternalPerspectiveDsl.g:8530:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 : rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1 ;
+    // InternalPerspectiveDsl.g:8532:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 : rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1 ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8534:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1 )
-            // InternalPerspectiveDsl.g:8535:2: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1
+            // InternalPerspectiveDsl.g:8536:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1 )
+            // InternalPerspectiveDsl.g:8537:2: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1
             {
             pushFollow(FOLLOW_54);
             rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl();
@@ -28940,17 +28940,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl"
-    // InternalPerspectiveDsl.g:8542:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl : ( ',' ) ;
+    // InternalPerspectiveDsl.g:8544:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl : ( ',' ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8546:1: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:8547:1: ( ',' )
+            // InternalPerspectiveDsl.g:8548:1: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:8549:1: ( ',' )
             {
-            // InternalPerspectiveDsl.g:8547:1: ( ',' )
-            // InternalPerspectiveDsl.g:8548:2: ','
+            // InternalPerspectiveDsl.g:8549:1: ( ',' )
+            // InternalPerspectiveDsl.g:8550:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0()); 
@@ -28981,14 +28981,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1"
-    // InternalPerspectiveDsl.g:8557:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1 : rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl ;
+    // InternalPerspectiveDsl.g:8559:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1 : rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8561:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl )
-            // InternalPerspectiveDsl.g:8562:2: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl
+            // InternalPerspectiveDsl.g:8563:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl )
+            // InternalPerspectiveDsl.g:8564:2: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl();
@@ -29014,23 +29014,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl"
-    // InternalPerspectiveDsl.g:8568:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:8570:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8572:1: ( ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) ) )
-            // InternalPerspectiveDsl.g:8573:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) )
+            // InternalPerspectiveDsl.g:8574:1: ( ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) ) )
+            // InternalPerspectiveDsl.g:8575:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:8573:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) )
-            // InternalPerspectiveDsl.g:8574:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 )
+            // InternalPerspectiveDsl.g:8575:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) )
+            // InternalPerspectiveDsl.g:8576:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_1_1_1_1()); 
             }
-            // InternalPerspectiveDsl.g:8575:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 )
-            // InternalPerspectiveDsl.g:8575:3: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1
+            // InternalPerspectiveDsl.g:8577:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 )
+            // InternalPerspectiveDsl.g:8577:3: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1();
@@ -29065,14 +29065,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0__0"
-    // InternalPerspectiveDsl.g:8584:1: rule__XAnnotationElementValue__Group_0__0 : rule__XAnnotationElementValue__Group_0__0__Impl rule__XAnnotationElementValue__Group_0__1 ;
+    // InternalPerspectiveDsl.g:8586:1: rule__XAnnotationElementValue__Group_0__0 : rule__XAnnotationElementValue__Group_0__0__Impl rule__XAnnotationElementValue__Group_0__1 ;
     public final void rule__XAnnotationElementValue__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8588:1: ( rule__XAnnotationElementValue__Group_0__0__Impl rule__XAnnotationElementValue__Group_0__1 )
-            // InternalPerspectiveDsl.g:8589:2: rule__XAnnotationElementValue__Group_0__0__Impl rule__XAnnotationElementValue__Group_0__1
+            // InternalPerspectiveDsl.g:8590:1: ( rule__XAnnotationElementValue__Group_0__0__Impl rule__XAnnotationElementValue__Group_0__1 )
+            // InternalPerspectiveDsl.g:8591:2: rule__XAnnotationElementValue__Group_0__0__Impl rule__XAnnotationElementValue__Group_0__1
             {
             pushFollow(FOLLOW_56);
             rule__XAnnotationElementValue__Group_0__0__Impl();
@@ -29103,23 +29103,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0__0__Impl"
-    // InternalPerspectiveDsl.g:8596:1: rule__XAnnotationElementValue__Group_0__0__Impl : ( ( rule__XAnnotationElementValue__Group_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:8598:1: rule__XAnnotationElementValue__Group_0__0__Impl : ( ( rule__XAnnotationElementValue__Group_0_0__0 ) ) ;
     public final void rule__XAnnotationElementValue__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8600:1: ( ( ( rule__XAnnotationElementValue__Group_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:8601:1: ( ( rule__XAnnotationElementValue__Group_0_0__0 ) )
+            // InternalPerspectiveDsl.g:8602:1: ( ( ( rule__XAnnotationElementValue__Group_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:8603:1: ( ( rule__XAnnotationElementValue__Group_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:8601:1: ( ( rule__XAnnotationElementValue__Group_0_0__0 ) )
-            // InternalPerspectiveDsl.g:8602:2: ( rule__XAnnotationElementValue__Group_0_0__0 )
+            // InternalPerspectiveDsl.g:8603:1: ( ( rule__XAnnotationElementValue__Group_0_0__0 ) )
+            // InternalPerspectiveDsl.g:8604:2: ( rule__XAnnotationElementValue__Group_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0()); 
             }
-            // InternalPerspectiveDsl.g:8603:2: ( rule__XAnnotationElementValue__Group_0_0__0 )
-            // InternalPerspectiveDsl.g:8603:3: rule__XAnnotationElementValue__Group_0_0__0
+            // InternalPerspectiveDsl.g:8605:2: ( rule__XAnnotationElementValue__Group_0_0__0 )
+            // InternalPerspectiveDsl.g:8605:3: rule__XAnnotationElementValue__Group_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__Group_0_0__0();
@@ -29154,14 +29154,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0__1"
-    // InternalPerspectiveDsl.g:8611:1: rule__XAnnotationElementValue__Group_0__1 : rule__XAnnotationElementValue__Group_0__1__Impl rule__XAnnotationElementValue__Group_0__2 ;
+    // InternalPerspectiveDsl.g:8613:1: rule__XAnnotationElementValue__Group_0__1 : rule__XAnnotationElementValue__Group_0__1__Impl rule__XAnnotationElementValue__Group_0__2 ;
     public final void rule__XAnnotationElementValue__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8615:1: ( rule__XAnnotationElementValue__Group_0__1__Impl rule__XAnnotationElementValue__Group_0__2 )
-            // InternalPerspectiveDsl.g:8616:2: rule__XAnnotationElementValue__Group_0__1__Impl rule__XAnnotationElementValue__Group_0__2
+            // InternalPerspectiveDsl.g:8617:1: ( rule__XAnnotationElementValue__Group_0__1__Impl rule__XAnnotationElementValue__Group_0__2 )
+            // InternalPerspectiveDsl.g:8618:2: rule__XAnnotationElementValue__Group_0__1__Impl rule__XAnnotationElementValue__Group_0__2
             {
             pushFollow(FOLLOW_56);
             rule__XAnnotationElementValue__Group_0__1__Impl();
@@ -29192,22 +29192,22 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0__1__Impl"
-    // InternalPerspectiveDsl.g:8623:1: rule__XAnnotationElementValue__Group_0__1__Impl : ( ( rule__XAnnotationElementValue__Group_0_1__0 )? ) ;
+    // InternalPerspectiveDsl.g:8625:1: rule__XAnnotationElementValue__Group_0__1__Impl : ( ( rule__XAnnotationElementValue__Group_0_1__0 )? ) ;
     public final void rule__XAnnotationElementValue__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8627:1: ( ( ( rule__XAnnotationElementValue__Group_0_1__0 )? ) )
-            // InternalPerspectiveDsl.g:8628:1: ( ( rule__XAnnotationElementValue__Group_0_1__0 )? )
+            // InternalPerspectiveDsl.g:8629:1: ( ( ( rule__XAnnotationElementValue__Group_0_1__0 )? ) )
+            // InternalPerspectiveDsl.g:8630:1: ( ( rule__XAnnotationElementValue__Group_0_1__0 )? )
             {
-            // InternalPerspectiveDsl.g:8628:1: ( ( rule__XAnnotationElementValue__Group_0_1__0 )? )
-            // InternalPerspectiveDsl.g:8629:2: ( rule__XAnnotationElementValue__Group_0_1__0 )?
+            // InternalPerspectiveDsl.g:8630:1: ( ( rule__XAnnotationElementValue__Group_0_1__0 )? )
+            // InternalPerspectiveDsl.g:8631:2: ( rule__XAnnotationElementValue__Group_0_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1()); 
             }
-            // InternalPerspectiveDsl.g:8630:2: ( rule__XAnnotationElementValue__Group_0_1__0 )?
+            // InternalPerspectiveDsl.g:8632:2: ( rule__XAnnotationElementValue__Group_0_1__0 )?
             int alt67=2;
             int LA67_0 = input.LA(1);
 
@@ -29216,7 +29216,7 @@
             }
             switch (alt67) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:8630:3: rule__XAnnotationElementValue__Group_0_1__0
+                    // InternalPerspectiveDsl.g:8632:3: rule__XAnnotationElementValue__Group_0_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotationElementValue__Group_0_1__0();
@@ -29254,14 +29254,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0__2"
-    // InternalPerspectiveDsl.g:8638:1: rule__XAnnotationElementValue__Group_0__2 : rule__XAnnotationElementValue__Group_0__2__Impl ;
+    // InternalPerspectiveDsl.g:8640:1: rule__XAnnotationElementValue__Group_0__2 : rule__XAnnotationElementValue__Group_0__2__Impl ;
     public final void rule__XAnnotationElementValue__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8642:1: ( rule__XAnnotationElementValue__Group_0__2__Impl )
-            // InternalPerspectiveDsl.g:8643:2: rule__XAnnotationElementValue__Group_0__2__Impl
+            // InternalPerspectiveDsl.g:8644:1: ( rule__XAnnotationElementValue__Group_0__2__Impl )
+            // InternalPerspectiveDsl.g:8645:2: rule__XAnnotationElementValue__Group_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__Group_0__2__Impl();
@@ -29287,17 +29287,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0__2__Impl"
-    // InternalPerspectiveDsl.g:8649:1: rule__XAnnotationElementValue__Group_0__2__Impl : ( ']' ) ;
+    // InternalPerspectiveDsl.g:8651:1: rule__XAnnotationElementValue__Group_0__2__Impl : ( ']' ) ;
     public final void rule__XAnnotationElementValue__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8653:1: ( ( ']' ) )
-            // InternalPerspectiveDsl.g:8654:1: ( ']' )
+            // InternalPerspectiveDsl.g:8655:1: ( ( ']' ) )
+            // InternalPerspectiveDsl.g:8656:1: ( ']' )
             {
-            // InternalPerspectiveDsl.g:8654:1: ( ']' )
-            // InternalPerspectiveDsl.g:8655:2: ']'
+            // InternalPerspectiveDsl.g:8656:1: ( ']' )
+            // InternalPerspectiveDsl.g:8657:2: ']'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2()); 
@@ -29328,14 +29328,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_0__0"
-    // InternalPerspectiveDsl.g:8665:1: rule__XAnnotationElementValue__Group_0_0__0 : rule__XAnnotationElementValue__Group_0_0__0__Impl ;
+    // InternalPerspectiveDsl.g:8667:1: rule__XAnnotationElementValue__Group_0_0__0 : rule__XAnnotationElementValue__Group_0_0__0__Impl ;
     public final void rule__XAnnotationElementValue__Group_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8669:1: ( rule__XAnnotationElementValue__Group_0_0__0__Impl )
-            // InternalPerspectiveDsl.g:8670:2: rule__XAnnotationElementValue__Group_0_0__0__Impl
+            // InternalPerspectiveDsl.g:8671:1: ( rule__XAnnotationElementValue__Group_0_0__0__Impl )
+            // InternalPerspectiveDsl.g:8672:2: rule__XAnnotationElementValue__Group_0_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__Group_0_0__0__Impl();
@@ -29361,23 +29361,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:8676:1: rule__XAnnotationElementValue__Group_0_0__0__Impl : ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:8678:1: rule__XAnnotationElementValue__Group_0_0__0__Impl : ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) ) ;
     public final void rule__XAnnotationElementValue__Group_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8680:1: ( ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:8681:1: ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) )
+            // InternalPerspectiveDsl.g:8682:1: ( ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:8683:1: ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:8681:1: ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) )
-            // InternalPerspectiveDsl.g:8682:2: ( rule__XAnnotationElementValue__Group_0_0_0__0 )
+            // InternalPerspectiveDsl.g:8683:1: ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) )
+            // InternalPerspectiveDsl.g:8684:2: ( rule__XAnnotationElementValue__Group_0_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:8683:2: ( rule__XAnnotationElementValue__Group_0_0_0__0 )
-            // InternalPerspectiveDsl.g:8683:3: rule__XAnnotationElementValue__Group_0_0_0__0
+            // InternalPerspectiveDsl.g:8685:2: ( rule__XAnnotationElementValue__Group_0_0_0__0 )
+            // InternalPerspectiveDsl.g:8685:3: rule__XAnnotationElementValue__Group_0_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__Group_0_0_0__0();
@@ -29412,14 +29412,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_0_0__0"
-    // InternalPerspectiveDsl.g:8692:1: rule__XAnnotationElementValue__Group_0_0_0__0 : rule__XAnnotationElementValue__Group_0_0_0__0__Impl rule__XAnnotationElementValue__Group_0_0_0__1 ;
+    // InternalPerspectiveDsl.g:8694:1: rule__XAnnotationElementValue__Group_0_0_0__0 : rule__XAnnotationElementValue__Group_0_0_0__0__Impl rule__XAnnotationElementValue__Group_0_0_0__1 ;
     public final void rule__XAnnotationElementValue__Group_0_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8696:1: ( rule__XAnnotationElementValue__Group_0_0_0__0__Impl rule__XAnnotationElementValue__Group_0_0_0__1 )
-            // InternalPerspectiveDsl.g:8697:2: rule__XAnnotationElementValue__Group_0_0_0__0__Impl rule__XAnnotationElementValue__Group_0_0_0__1
+            // InternalPerspectiveDsl.g:8698:1: ( rule__XAnnotationElementValue__Group_0_0_0__0__Impl rule__XAnnotationElementValue__Group_0_0_0__1 )
+            // InternalPerspectiveDsl.g:8699:2: rule__XAnnotationElementValue__Group_0_0_0__0__Impl rule__XAnnotationElementValue__Group_0_0_0__1
             {
             pushFollow(FOLLOW_57);
             rule__XAnnotationElementValue__Group_0_0_0__0__Impl();
@@ -29450,23 +29450,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:8704:1: rule__XAnnotationElementValue__Group_0_0_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:8706:1: rule__XAnnotationElementValue__Group_0_0_0__0__Impl : ( () ) ;
     public final void rule__XAnnotationElementValue__Group_0_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8708:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:8709:1: ( () )
+            // InternalPerspectiveDsl.g:8710:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:8711:1: ( () )
             {
-            // InternalPerspectiveDsl.g:8709:1: ( () )
-            // InternalPerspectiveDsl.g:8710:2: ()
+            // InternalPerspectiveDsl.g:8711:1: ( () )
+            // InternalPerspectiveDsl.g:8712:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:8711:2: ()
-            // InternalPerspectiveDsl.g:8711:3: 
+            // InternalPerspectiveDsl.g:8713:2: ()
+            // InternalPerspectiveDsl.g:8713:3: 
             {
             }
 
@@ -29491,14 +29491,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_0_0__1"
-    // InternalPerspectiveDsl.g:8719:1: rule__XAnnotationElementValue__Group_0_0_0__1 : rule__XAnnotationElementValue__Group_0_0_0__1__Impl rule__XAnnotationElementValue__Group_0_0_0__2 ;
+    // InternalPerspectiveDsl.g:8721:1: rule__XAnnotationElementValue__Group_0_0_0__1 : rule__XAnnotationElementValue__Group_0_0_0__1__Impl rule__XAnnotationElementValue__Group_0_0_0__2 ;
     public final void rule__XAnnotationElementValue__Group_0_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8723:1: ( rule__XAnnotationElementValue__Group_0_0_0__1__Impl rule__XAnnotationElementValue__Group_0_0_0__2 )
-            // InternalPerspectiveDsl.g:8724:2: rule__XAnnotationElementValue__Group_0_0_0__1__Impl rule__XAnnotationElementValue__Group_0_0_0__2
+            // InternalPerspectiveDsl.g:8725:1: ( rule__XAnnotationElementValue__Group_0_0_0__1__Impl rule__XAnnotationElementValue__Group_0_0_0__2 )
+            // InternalPerspectiveDsl.g:8726:2: rule__XAnnotationElementValue__Group_0_0_0__1__Impl rule__XAnnotationElementValue__Group_0_0_0__2
             {
             pushFollow(FOLLOW_58);
             rule__XAnnotationElementValue__Group_0_0_0__1__Impl();
@@ -29529,17 +29529,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:8731:1: rule__XAnnotationElementValue__Group_0_0_0__1__Impl : ( '#' ) ;
+    // InternalPerspectiveDsl.g:8733:1: rule__XAnnotationElementValue__Group_0_0_0__1__Impl : ( '#' ) ;
     public final void rule__XAnnotationElementValue__Group_0_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8735:1: ( ( '#' ) )
-            // InternalPerspectiveDsl.g:8736:1: ( '#' )
+            // InternalPerspectiveDsl.g:8737:1: ( ( '#' ) )
+            // InternalPerspectiveDsl.g:8738:1: ( '#' )
             {
-            // InternalPerspectiveDsl.g:8736:1: ( '#' )
-            // InternalPerspectiveDsl.g:8737:2: '#'
+            // InternalPerspectiveDsl.g:8738:1: ( '#' )
+            // InternalPerspectiveDsl.g:8739:2: '#'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1()); 
@@ -29570,14 +29570,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_0_0__2"
-    // InternalPerspectiveDsl.g:8746:1: rule__XAnnotationElementValue__Group_0_0_0__2 : rule__XAnnotationElementValue__Group_0_0_0__2__Impl ;
+    // InternalPerspectiveDsl.g:8748:1: rule__XAnnotationElementValue__Group_0_0_0__2 : rule__XAnnotationElementValue__Group_0_0_0__2__Impl ;
     public final void rule__XAnnotationElementValue__Group_0_0_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8750:1: ( rule__XAnnotationElementValue__Group_0_0_0__2__Impl )
-            // InternalPerspectiveDsl.g:8751:2: rule__XAnnotationElementValue__Group_0_0_0__2__Impl
+            // InternalPerspectiveDsl.g:8752:1: ( rule__XAnnotationElementValue__Group_0_0_0__2__Impl )
+            // InternalPerspectiveDsl.g:8753:2: rule__XAnnotationElementValue__Group_0_0_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__Group_0_0_0__2__Impl();
@@ -29603,17 +29603,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_0_0__2__Impl"
-    // InternalPerspectiveDsl.g:8757:1: rule__XAnnotationElementValue__Group_0_0_0__2__Impl : ( '[' ) ;
+    // InternalPerspectiveDsl.g:8759:1: rule__XAnnotationElementValue__Group_0_0_0__2__Impl : ( '[' ) ;
     public final void rule__XAnnotationElementValue__Group_0_0_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8761:1: ( ( '[' ) )
-            // InternalPerspectiveDsl.g:8762:1: ( '[' )
+            // InternalPerspectiveDsl.g:8763:1: ( ( '[' ) )
+            // InternalPerspectiveDsl.g:8764:1: ( '[' )
             {
-            // InternalPerspectiveDsl.g:8762:1: ( '[' )
-            // InternalPerspectiveDsl.g:8763:2: '['
+            // InternalPerspectiveDsl.g:8764:1: ( '[' )
+            // InternalPerspectiveDsl.g:8765:2: '['
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2()); 
@@ -29644,14 +29644,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_1__0"
-    // InternalPerspectiveDsl.g:8773:1: rule__XAnnotationElementValue__Group_0_1__0 : rule__XAnnotationElementValue__Group_0_1__0__Impl rule__XAnnotationElementValue__Group_0_1__1 ;
+    // InternalPerspectiveDsl.g:8775:1: rule__XAnnotationElementValue__Group_0_1__0 : rule__XAnnotationElementValue__Group_0_1__0__Impl rule__XAnnotationElementValue__Group_0_1__1 ;
     public final void rule__XAnnotationElementValue__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8777:1: ( rule__XAnnotationElementValue__Group_0_1__0__Impl rule__XAnnotationElementValue__Group_0_1__1 )
-            // InternalPerspectiveDsl.g:8778:2: rule__XAnnotationElementValue__Group_0_1__0__Impl rule__XAnnotationElementValue__Group_0_1__1
+            // InternalPerspectiveDsl.g:8779:1: ( rule__XAnnotationElementValue__Group_0_1__0__Impl rule__XAnnotationElementValue__Group_0_1__1 )
+            // InternalPerspectiveDsl.g:8780:2: rule__XAnnotationElementValue__Group_0_1__0__Impl rule__XAnnotationElementValue__Group_0_1__1
             {
             pushFollow(FOLLOW_52);
             rule__XAnnotationElementValue__Group_0_1__0__Impl();
@@ -29682,23 +29682,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_1__0__Impl"
-    // InternalPerspectiveDsl.g:8785:1: rule__XAnnotationElementValue__Group_0_1__0__Impl : ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) ) ;
+    // InternalPerspectiveDsl.g:8787:1: rule__XAnnotationElementValue__Group_0_1__0__Impl : ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) ) ;
     public final void rule__XAnnotationElementValue__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8789:1: ( ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) ) )
-            // InternalPerspectiveDsl.g:8790:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) )
+            // InternalPerspectiveDsl.g:8791:1: ( ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) ) )
+            // InternalPerspectiveDsl.g:8792:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) )
             {
-            // InternalPerspectiveDsl.g:8790:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) )
-            // InternalPerspectiveDsl.g:8791:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 )
+            // InternalPerspectiveDsl.g:8792:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) )
+            // InternalPerspectiveDsl.g:8793:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:8792:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 )
-            // InternalPerspectiveDsl.g:8792:3: rule__XAnnotationElementValue__ElementsAssignment_0_1_0
+            // InternalPerspectiveDsl.g:8794:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 )
+            // InternalPerspectiveDsl.g:8794:3: rule__XAnnotationElementValue__ElementsAssignment_0_1_0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__ElementsAssignment_0_1_0();
@@ -29733,14 +29733,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_1__1"
-    // InternalPerspectiveDsl.g:8800:1: rule__XAnnotationElementValue__Group_0_1__1 : rule__XAnnotationElementValue__Group_0_1__1__Impl ;
+    // InternalPerspectiveDsl.g:8802:1: rule__XAnnotationElementValue__Group_0_1__1 : rule__XAnnotationElementValue__Group_0_1__1__Impl ;
     public final void rule__XAnnotationElementValue__Group_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8804:1: ( rule__XAnnotationElementValue__Group_0_1__1__Impl )
-            // InternalPerspectiveDsl.g:8805:2: rule__XAnnotationElementValue__Group_0_1__1__Impl
+            // InternalPerspectiveDsl.g:8806:1: ( rule__XAnnotationElementValue__Group_0_1__1__Impl )
+            // InternalPerspectiveDsl.g:8807:2: rule__XAnnotationElementValue__Group_0_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__Group_0_1__1__Impl();
@@ -29766,22 +29766,22 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_1__1__Impl"
-    // InternalPerspectiveDsl.g:8811:1: rule__XAnnotationElementValue__Group_0_1__1__Impl : ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:8813:1: rule__XAnnotationElementValue__Group_0_1__1__Impl : ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* ) ;
     public final void rule__XAnnotationElementValue__Group_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8815:1: ( ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* ) )
-            // InternalPerspectiveDsl.g:8816:1: ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* )
+            // InternalPerspectiveDsl.g:8817:1: ( ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* ) )
+            // InternalPerspectiveDsl.g:8818:1: ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:8816:1: ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* )
-            // InternalPerspectiveDsl.g:8817:2: ( rule__XAnnotationElementValue__Group_0_1_1__0 )*
+            // InternalPerspectiveDsl.g:8818:1: ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* )
+            // InternalPerspectiveDsl.g:8819:2: ( rule__XAnnotationElementValue__Group_0_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1_1()); 
             }
-            // InternalPerspectiveDsl.g:8818:2: ( rule__XAnnotationElementValue__Group_0_1_1__0 )*
+            // InternalPerspectiveDsl.g:8820:2: ( rule__XAnnotationElementValue__Group_0_1_1__0 )*
             loop68:
             do {
                 int alt68=2;
@@ -29794,7 +29794,7 @@
 
                 switch (alt68) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:8818:3: rule__XAnnotationElementValue__Group_0_1_1__0
+            	    // InternalPerspectiveDsl.g:8820:3: rule__XAnnotationElementValue__Group_0_1_1__0
             	    {
             	    pushFollow(FOLLOW_53);
             	    rule__XAnnotationElementValue__Group_0_1_1__0();
@@ -29835,14 +29835,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_1_1__0"
-    // InternalPerspectiveDsl.g:8827:1: rule__XAnnotationElementValue__Group_0_1_1__0 : rule__XAnnotationElementValue__Group_0_1_1__0__Impl rule__XAnnotationElementValue__Group_0_1_1__1 ;
+    // InternalPerspectiveDsl.g:8829:1: rule__XAnnotationElementValue__Group_0_1_1__0 : rule__XAnnotationElementValue__Group_0_1_1__0__Impl rule__XAnnotationElementValue__Group_0_1_1__1 ;
     public final void rule__XAnnotationElementValue__Group_0_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8831:1: ( rule__XAnnotationElementValue__Group_0_1_1__0__Impl rule__XAnnotationElementValue__Group_0_1_1__1 )
-            // InternalPerspectiveDsl.g:8832:2: rule__XAnnotationElementValue__Group_0_1_1__0__Impl rule__XAnnotationElementValue__Group_0_1_1__1
+            // InternalPerspectiveDsl.g:8833:1: ( rule__XAnnotationElementValue__Group_0_1_1__0__Impl rule__XAnnotationElementValue__Group_0_1_1__1 )
+            // InternalPerspectiveDsl.g:8834:2: rule__XAnnotationElementValue__Group_0_1_1__0__Impl rule__XAnnotationElementValue__Group_0_1_1__1
             {
             pushFollow(FOLLOW_54);
             rule__XAnnotationElementValue__Group_0_1_1__0__Impl();
@@ -29873,17 +29873,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_1_1__0__Impl"
-    // InternalPerspectiveDsl.g:8839:1: rule__XAnnotationElementValue__Group_0_1_1__0__Impl : ( ',' ) ;
+    // InternalPerspectiveDsl.g:8841:1: rule__XAnnotationElementValue__Group_0_1_1__0__Impl : ( ',' ) ;
     public final void rule__XAnnotationElementValue__Group_0_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8843:1: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:8844:1: ( ',' )
+            // InternalPerspectiveDsl.g:8845:1: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:8846:1: ( ',' )
             {
-            // InternalPerspectiveDsl.g:8844:1: ( ',' )
-            // InternalPerspectiveDsl.g:8845:2: ','
+            // InternalPerspectiveDsl.g:8846:1: ( ',' )
+            // InternalPerspectiveDsl.g:8847:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0()); 
@@ -29914,14 +29914,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_1_1__1"
-    // InternalPerspectiveDsl.g:8854:1: rule__XAnnotationElementValue__Group_0_1_1__1 : rule__XAnnotationElementValue__Group_0_1_1__1__Impl ;
+    // InternalPerspectiveDsl.g:8856:1: rule__XAnnotationElementValue__Group_0_1_1__1 : rule__XAnnotationElementValue__Group_0_1_1__1__Impl ;
     public final void rule__XAnnotationElementValue__Group_0_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8858:1: ( rule__XAnnotationElementValue__Group_0_1_1__1__Impl )
-            // InternalPerspectiveDsl.g:8859:2: rule__XAnnotationElementValue__Group_0_1_1__1__Impl
+            // InternalPerspectiveDsl.g:8860:1: ( rule__XAnnotationElementValue__Group_0_1_1__1__Impl )
+            // InternalPerspectiveDsl.g:8861:2: rule__XAnnotationElementValue__Group_0_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__Group_0_1_1__1__Impl();
@@ -29947,23 +29947,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_1_1__1__Impl"
-    // InternalPerspectiveDsl.g:8865:1: rule__XAnnotationElementValue__Group_0_1_1__1__Impl : ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:8867:1: rule__XAnnotationElementValue__Group_0_1_1__1__Impl : ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) ) ;
     public final void rule__XAnnotationElementValue__Group_0_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8869:1: ( ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) ) )
-            // InternalPerspectiveDsl.g:8870:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) )
+            // InternalPerspectiveDsl.g:8871:1: ( ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) ) )
+            // InternalPerspectiveDsl.g:8872:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:8870:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) )
-            // InternalPerspectiveDsl.g:8871:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 )
+            // InternalPerspectiveDsl.g:8872:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) )
+            // InternalPerspectiveDsl.g:8873:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_1_1()); 
             }
-            // InternalPerspectiveDsl.g:8872:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 )
-            // InternalPerspectiveDsl.g:8872:3: rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1
+            // InternalPerspectiveDsl.g:8874:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 )
+            // InternalPerspectiveDsl.g:8874:3: rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1();
@@ -29998,14 +29998,14 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_0__0"
-    // InternalPerspectiveDsl.g:8881:1: rule__XAssignment__Group_0__0 : rule__XAssignment__Group_0__0__Impl rule__XAssignment__Group_0__1 ;
+    // InternalPerspectiveDsl.g:8883:1: rule__XAssignment__Group_0__0 : rule__XAssignment__Group_0__0__Impl rule__XAssignment__Group_0__1 ;
     public final void rule__XAssignment__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8885:1: ( rule__XAssignment__Group_0__0__Impl rule__XAssignment__Group_0__1 )
-            // InternalPerspectiveDsl.g:8886:2: rule__XAssignment__Group_0__0__Impl rule__XAssignment__Group_0__1
+            // InternalPerspectiveDsl.g:8887:1: ( rule__XAssignment__Group_0__0__Impl rule__XAssignment__Group_0__1 )
+            // InternalPerspectiveDsl.g:8888:2: rule__XAssignment__Group_0__0__Impl rule__XAssignment__Group_0__1
             {
             pushFollow(FOLLOW_59);
             rule__XAssignment__Group_0__0__Impl();
@@ -30036,23 +30036,23 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_0__0__Impl"
-    // InternalPerspectiveDsl.g:8893:1: rule__XAssignment__Group_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:8895:1: rule__XAssignment__Group_0__0__Impl : ( () ) ;
     public final void rule__XAssignment__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8897:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:8898:1: ( () )
+            // InternalPerspectiveDsl.g:8899:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:8900:1: ( () )
             {
-            // InternalPerspectiveDsl.g:8898:1: ( () )
-            // InternalPerspectiveDsl.g:8899:2: ()
+            // InternalPerspectiveDsl.g:8900:1: ( () )
+            // InternalPerspectiveDsl.g:8901:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0()); 
             }
-            // InternalPerspectiveDsl.g:8900:2: ()
-            // InternalPerspectiveDsl.g:8900:3: 
+            // InternalPerspectiveDsl.g:8902:2: ()
+            // InternalPerspectiveDsl.g:8902:3: 
             {
             }
 
@@ -30077,14 +30077,14 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_0__1"
-    // InternalPerspectiveDsl.g:8908:1: rule__XAssignment__Group_0__1 : rule__XAssignment__Group_0__1__Impl rule__XAssignment__Group_0__2 ;
+    // InternalPerspectiveDsl.g:8910:1: rule__XAssignment__Group_0__1 : rule__XAssignment__Group_0__1__Impl rule__XAssignment__Group_0__2 ;
     public final void rule__XAssignment__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8912:1: ( rule__XAssignment__Group_0__1__Impl rule__XAssignment__Group_0__2 )
-            // InternalPerspectiveDsl.g:8913:2: rule__XAssignment__Group_0__1__Impl rule__XAssignment__Group_0__2
+            // InternalPerspectiveDsl.g:8914:1: ( rule__XAssignment__Group_0__1__Impl rule__XAssignment__Group_0__2 )
+            // InternalPerspectiveDsl.g:8915:2: rule__XAssignment__Group_0__1__Impl rule__XAssignment__Group_0__2
             {
             pushFollow(FOLLOW_55);
             rule__XAssignment__Group_0__1__Impl();
@@ -30115,23 +30115,23 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_0__1__Impl"
-    // InternalPerspectiveDsl.g:8920:1: rule__XAssignment__Group_0__1__Impl : ( ( rule__XAssignment__FeatureAssignment_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:8922:1: rule__XAssignment__Group_0__1__Impl : ( ( rule__XAssignment__FeatureAssignment_0_1 ) ) ;
     public final void rule__XAssignment__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8924:1: ( ( ( rule__XAssignment__FeatureAssignment_0_1 ) ) )
-            // InternalPerspectiveDsl.g:8925:1: ( ( rule__XAssignment__FeatureAssignment_0_1 ) )
+            // InternalPerspectiveDsl.g:8926:1: ( ( ( rule__XAssignment__FeatureAssignment_0_1 ) ) )
+            // InternalPerspectiveDsl.g:8927:1: ( ( rule__XAssignment__FeatureAssignment_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:8925:1: ( ( rule__XAssignment__FeatureAssignment_0_1 ) )
-            // InternalPerspectiveDsl.g:8926:2: ( rule__XAssignment__FeatureAssignment_0_1 )
+            // InternalPerspectiveDsl.g:8927:1: ( ( rule__XAssignment__FeatureAssignment_0_1 ) )
+            // InternalPerspectiveDsl.g:8928:2: ( rule__XAssignment__FeatureAssignment_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getFeatureAssignment_0_1()); 
             }
-            // InternalPerspectiveDsl.g:8927:2: ( rule__XAssignment__FeatureAssignment_0_1 )
-            // InternalPerspectiveDsl.g:8927:3: rule__XAssignment__FeatureAssignment_0_1
+            // InternalPerspectiveDsl.g:8929:2: ( rule__XAssignment__FeatureAssignment_0_1 )
+            // InternalPerspectiveDsl.g:8929:3: rule__XAssignment__FeatureAssignment_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__FeatureAssignment_0_1();
@@ -30166,14 +30166,14 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_0__2"
-    // InternalPerspectiveDsl.g:8935:1: rule__XAssignment__Group_0__2 : rule__XAssignment__Group_0__2__Impl rule__XAssignment__Group_0__3 ;
+    // InternalPerspectiveDsl.g:8937:1: rule__XAssignment__Group_0__2 : rule__XAssignment__Group_0__2__Impl rule__XAssignment__Group_0__3 ;
     public final void rule__XAssignment__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8939:1: ( rule__XAssignment__Group_0__2__Impl rule__XAssignment__Group_0__3 )
-            // InternalPerspectiveDsl.g:8940:2: rule__XAssignment__Group_0__2__Impl rule__XAssignment__Group_0__3
+            // InternalPerspectiveDsl.g:8941:1: ( rule__XAssignment__Group_0__2__Impl rule__XAssignment__Group_0__3 )
+            // InternalPerspectiveDsl.g:8942:2: rule__XAssignment__Group_0__2__Impl rule__XAssignment__Group_0__3
             {
             pushFollow(FOLLOW_54);
             rule__XAssignment__Group_0__2__Impl();
@@ -30204,17 +30204,17 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_0__2__Impl"
-    // InternalPerspectiveDsl.g:8947:1: rule__XAssignment__Group_0__2__Impl : ( ruleOpSingleAssign ) ;
+    // InternalPerspectiveDsl.g:8949:1: rule__XAssignment__Group_0__2__Impl : ( ruleOpSingleAssign ) ;
     public final void rule__XAssignment__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8951:1: ( ( ruleOpSingleAssign ) )
-            // InternalPerspectiveDsl.g:8952:1: ( ruleOpSingleAssign )
+            // InternalPerspectiveDsl.g:8953:1: ( ( ruleOpSingleAssign ) )
+            // InternalPerspectiveDsl.g:8954:1: ( ruleOpSingleAssign )
             {
-            // InternalPerspectiveDsl.g:8952:1: ( ruleOpSingleAssign )
-            // InternalPerspectiveDsl.g:8953:2: ruleOpSingleAssign
+            // InternalPerspectiveDsl.g:8954:1: ( ruleOpSingleAssign )
+            // InternalPerspectiveDsl.g:8955:2: ruleOpSingleAssign
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2()); 
@@ -30249,14 +30249,14 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_0__3"
-    // InternalPerspectiveDsl.g:8962:1: rule__XAssignment__Group_0__3 : rule__XAssignment__Group_0__3__Impl ;
+    // InternalPerspectiveDsl.g:8964:1: rule__XAssignment__Group_0__3 : rule__XAssignment__Group_0__3__Impl ;
     public final void rule__XAssignment__Group_0__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8966:1: ( rule__XAssignment__Group_0__3__Impl )
-            // InternalPerspectiveDsl.g:8967:2: rule__XAssignment__Group_0__3__Impl
+            // InternalPerspectiveDsl.g:8968:1: ( rule__XAssignment__Group_0__3__Impl )
+            // InternalPerspectiveDsl.g:8969:2: rule__XAssignment__Group_0__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__Group_0__3__Impl();
@@ -30282,23 +30282,23 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_0__3__Impl"
-    // InternalPerspectiveDsl.g:8973:1: rule__XAssignment__Group_0__3__Impl : ( ( rule__XAssignment__ValueAssignment_0_3 ) ) ;
+    // InternalPerspectiveDsl.g:8975:1: rule__XAssignment__Group_0__3__Impl : ( ( rule__XAssignment__ValueAssignment_0_3 ) ) ;
     public final void rule__XAssignment__Group_0__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8977:1: ( ( ( rule__XAssignment__ValueAssignment_0_3 ) ) )
-            // InternalPerspectiveDsl.g:8978:1: ( ( rule__XAssignment__ValueAssignment_0_3 ) )
+            // InternalPerspectiveDsl.g:8979:1: ( ( ( rule__XAssignment__ValueAssignment_0_3 ) ) )
+            // InternalPerspectiveDsl.g:8980:1: ( ( rule__XAssignment__ValueAssignment_0_3 ) )
             {
-            // InternalPerspectiveDsl.g:8978:1: ( ( rule__XAssignment__ValueAssignment_0_3 ) )
-            // InternalPerspectiveDsl.g:8979:2: ( rule__XAssignment__ValueAssignment_0_3 )
+            // InternalPerspectiveDsl.g:8980:1: ( ( rule__XAssignment__ValueAssignment_0_3 ) )
+            // InternalPerspectiveDsl.g:8981:2: ( rule__XAssignment__ValueAssignment_0_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getValueAssignment_0_3()); 
             }
-            // InternalPerspectiveDsl.g:8980:2: ( rule__XAssignment__ValueAssignment_0_3 )
-            // InternalPerspectiveDsl.g:8980:3: rule__XAssignment__ValueAssignment_0_3
+            // InternalPerspectiveDsl.g:8982:2: ( rule__XAssignment__ValueAssignment_0_3 )
+            // InternalPerspectiveDsl.g:8982:3: rule__XAssignment__ValueAssignment_0_3
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__ValueAssignment_0_3();
@@ -30333,14 +30333,14 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1__0"
-    // InternalPerspectiveDsl.g:8989:1: rule__XAssignment__Group_1__0 : rule__XAssignment__Group_1__0__Impl rule__XAssignment__Group_1__1 ;
+    // InternalPerspectiveDsl.g:8991:1: rule__XAssignment__Group_1__0 : rule__XAssignment__Group_1__0__Impl rule__XAssignment__Group_1__1 ;
     public final void rule__XAssignment__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:8993:1: ( rule__XAssignment__Group_1__0__Impl rule__XAssignment__Group_1__1 )
-            // InternalPerspectiveDsl.g:8994:2: rule__XAssignment__Group_1__0__Impl rule__XAssignment__Group_1__1
+            // InternalPerspectiveDsl.g:8995:1: ( rule__XAssignment__Group_1__0__Impl rule__XAssignment__Group_1__1 )
+            // InternalPerspectiveDsl.g:8996:2: rule__XAssignment__Group_1__0__Impl rule__XAssignment__Group_1__1
             {
             pushFollow(FOLLOW_60);
             rule__XAssignment__Group_1__0__Impl();
@@ -30371,17 +30371,17 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1__0__Impl"
-    // InternalPerspectiveDsl.g:9001:1: rule__XAssignment__Group_1__0__Impl : ( ruleXOrExpression ) ;
+    // InternalPerspectiveDsl.g:9003:1: rule__XAssignment__Group_1__0__Impl : ( ruleXOrExpression ) ;
     public final void rule__XAssignment__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9005:1: ( ( ruleXOrExpression ) )
-            // InternalPerspectiveDsl.g:9006:1: ( ruleXOrExpression )
+            // InternalPerspectiveDsl.g:9007:1: ( ( ruleXOrExpression ) )
+            // InternalPerspectiveDsl.g:9008:1: ( ruleXOrExpression )
             {
-            // InternalPerspectiveDsl.g:9006:1: ( ruleXOrExpression )
-            // InternalPerspectiveDsl.g:9007:2: ruleXOrExpression
+            // InternalPerspectiveDsl.g:9008:1: ( ruleXOrExpression )
+            // InternalPerspectiveDsl.g:9009:2: ruleXOrExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0()); 
@@ -30416,14 +30416,14 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1__1"
-    // InternalPerspectiveDsl.g:9016:1: rule__XAssignment__Group_1__1 : rule__XAssignment__Group_1__1__Impl ;
+    // InternalPerspectiveDsl.g:9018:1: rule__XAssignment__Group_1__1 : rule__XAssignment__Group_1__1__Impl ;
     public final void rule__XAssignment__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9020:1: ( rule__XAssignment__Group_1__1__Impl )
-            // InternalPerspectiveDsl.g:9021:2: rule__XAssignment__Group_1__1__Impl
+            // InternalPerspectiveDsl.g:9022:1: ( rule__XAssignment__Group_1__1__Impl )
+            // InternalPerspectiveDsl.g:9023:2: rule__XAssignment__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__Group_1__1__Impl();
@@ -30449,27 +30449,27 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1__1__Impl"
-    // InternalPerspectiveDsl.g:9027:1: rule__XAssignment__Group_1__1__Impl : ( ( rule__XAssignment__Group_1_1__0 )? ) ;
+    // InternalPerspectiveDsl.g:9029:1: rule__XAssignment__Group_1__1__Impl : ( ( rule__XAssignment__Group_1_1__0 )? ) ;
     public final void rule__XAssignment__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9031:1: ( ( ( rule__XAssignment__Group_1_1__0 )? ) )
-            // InternalPerspectiveDsl.g:9032:1: ( ( rule__XAssignment__Group_1_1__0 )? )
+            // InternalPerspectiveDsl.g:9033:1: ( ( ( rule__XAssignment__Group_1_1__0 )? ) )
+            // InternalPerspectiveDsl.g:9034:1: ( ( rule__XAssignment__Group_1_1__0 )? )
             {
-            // InternalPerspectiveDsl.g:9032:1: ( ( rule__XAssignment__Group_1_1__0 )? )
-            // InternalPerspectiveDsl.g:9033:2: ( rule__XAssignment__Group_1_1__0 )?
+            // InternalPerspectiveDsl.g:9034:1: ( ( rule__XAssignment__Group_1_1__0 )? )
+            // InternalPerspectiveDsl.g:9035:2: ( rule__XAssignment__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getGroup_1_1()); 
             }
-            // InternalPerspectiveDsl.g:9034:2: ( rule__XAssignment__Group_1_1__0 )?
+            // InternalPerspectiveDsl.g:9036:2: ( rule__XAssignment__Group_1_1__0 )?
             int alt69=2;
             alt69 = dfa69.predict(input);
             switch (alt69) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:9034:3: rule__XAssignment__Group_1_1__0
+                    // InternalPerspectiveDsl.g:9036:3: rule__XAssignment__Group_1_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAssignment__Group_1_1__0();
@@ -30507,14 +30507,14 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1__0"
-    // InternalPerspectiveDsl.g:9043:1: rule__XAssignment__Group_1_1__0 : rule__XAssignment__Group_1_1__0__Impl rule__XAssignment__Group_1_1__1 ;
+    // InternalPerspectiveDsl.g:9045:1: rule__XAssignment__Group_1_1__0 : rule__XAssignment__Group_1_1__0__Impl rule__XAssignment__Group_1_1__1 ;
     public final void rule__XAssignment__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9047:1: ( rule__XAssignment__Group_1_1__0__Impl rule__XAssignment__Group_1_1__1 )
-            // InternalPerspectiveDsl.g:9048:2: rule__XAssignment__Group_1_1__0__Impl rule__XAssignment__Group_1_1__1
+            // InternalPerspectiveDsl.g:9049:1: ( rule__XAssignment__Group_1_1__0__Impl rule__XAssignment__Group_1_1__1 )
+            // InternalPerspectiveDsl.g:9050:2: rule__XAssignment__Group_1_1__0__Impl rule__XAssignment__Group_1_1__1
             {
             pushFollow(FOLLOW_54);
             rule__XAssignment__Group_1_1__0__Impl();
@@ -30545,23 +30545,23 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1__0__Impl"
-    // InternalPerspectiveDsl.g:9055:1: rule__XAssignment__Group_1_1__0__Impl : ( ( rule__XAssignment__Group_1_1_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:9057:1: rule__XAssignment__Group_1_1__0__Impl : ( ( rule__XAssignment__Group_1_1_0__0 ) ) ;
     public final void rule__XAssignment__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9059:1: ( ( ( rule__XAssignment__Group_1_1_0__0 ) ) )
-            // InternalPerspectiveDsl.g:9060:1: ( ( rule__XAssignment__Group_1_1_0__0 ) )
+            // InternalPerspectiveDsl.g:9061:1: ( ( ( rule__XAssignment__Group_1_1_0__0 ) ) )
+            // InternalPerspectiveDsl.g:9062:1: ( ( rule__XAssignment__Group_1_1_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:9060:1: ( ( rule__XAssignment__Group_1_1_0__0 ) )
-            // InternalPerspectiveDsl.g:9061:2: ( rule__XAssignment__Group_1_1_0__0 )
+            // InternalPerspectiveDsl.g:9062:1: ( ( rule__XAssignment__Group_1_1_0__0 ) )
+            // InternalPerspectiveDsl.g:9063:2: ( rule__XAssignment__Group_1_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getGroup_1_1_0()); 
             }
-            // InternalPerspectiveDsl.g:9062:2: ( rule__XAssignment__Group_1_1_0__0 )
-            // InternalPerspectiveDsl.g:9062:3: rule__XAssignment__Group_1_1_0__0
+            // InternalPerspectiveDsl.g:9064:2: ( rule__XAssignment__Group_1_1_0__0 )
+            // InternalPerspectiveDsl.g:9064:3: rule__XAssignment__Group_1_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__Group_1_1_0__0();
@@ -30596,14 +30596,14 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1__1"
-    // InternalPerspectiveDsl.g:9070:1: rule__XAssignment__Group_1_1__1 : rule__XAssignment__Group_1_1__1__Impl ;
+    // InternalPerspectiveDsl.g:9072:1: rule__XAssignment__Group_1_1__1 : rule__XAssignment__Group_1_1__1__Impl ;
     public final void rule__XAssignment__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9074:1: ( rule__XAssignment__Group_1_1__1__Impl )
-            // InternalPerspectiveDsl.g:9075:2: rule__XAssignment__Group_1_1__1__Impl
+            // InternalPerspectiveDsl.g:9076:1: ( rule__XAssignment__Group_1_1__1__Impl )
+            // InternalPerspectiveDsl.g:9077:2: rule__XAssignment__Group_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__Group_1_1__1__Impl();
@@ -30629,23 +30629,23 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1__1__Impl"
-    // InternalPerspectiveDsl.g:9081:1: rule__XAssignment__Group_1_1__1__Impl : ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:9083:1: rule__XAssignment__Group_1_1__1__Impl : ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) ) ;
     public final void rule__XAssignment__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9085:1: ( ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) ) )
-            // InternalPerspectiveDsl.g:9086:1: ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) )
+            // InternalPerspectiveDsl.g:9087:1: ( ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) ) )
+            // InternalPerspectiveDsl.g:9088:1: ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:9086:1: ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) )
-            // InternalPerspectiveDsl.g:9087:2: ( rule__XAssignment__RightOperandAssignment_1_1_1 )
+            // InternalPerspectiveDsl.g:9088:1: ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) )
+            // InternalPerspectiveDsl.g:9089:2: ( rule__XAssignment__RightOperandAssignment_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getRightOperandAssignment_1_1_1()); 
             }
-            // InternalPerspectiveDsl.g:9088:2: ( rule__XAssignment__RightOperandAssignment_1_1_1 )
-            // InternalPerspectiveDsl.g:9088:3: rule__XAssignment__RightOperandAssignment_1_1_1
+            // InternalPerspectiveDsl.g:9090:2: ( rule__XAssignment__RightOperandAssignment_1_1_1 )
+            // InternalPerspectiveDsl.g:9090:3: rule__XAssignment__RightOperandAssignment_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__RightOperandAssignment_1_1_1();
@@ -30680,14 +30680,14 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1_0__0"
-    // InternalPerspectiveDsl.g:9097:1: rule__XAssignment__Group_1_1_0__0 : rule__XAssignment__Group_1_1_0__0__Impl ;
+    // InternalPerspectiveDsl.g:9099:1: rule__XAssignment__Group_1_1_0__0 : rule__XAssignment__Group_1_1_0__0__Impl ;
     public final void rule__XAssignment__Group_1_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9101:1: ( rule__XAssignment__Group_1_1_0__0__Impl )
-            // InternalPerspectiveDsl.g:9102:2: rule__XAssignment__Group_1_1_0__0__Impl
+            // InternalPerspectiveDsl.g:9103:1: ( rule__XAssignment__Group_1_1_0__0__Impl )
+            // InternalPerspectiveDsl.g:9104:2: rule__XAssignment__Group_1_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__Group_1_1_0__0__Impl();
@@ -30713,23 +30713,23 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1_0__0__Impl"
-    // InternalPerspectiveDsl.g:9108:1: rule__XAssignment__Group_1_1_0__0__Impl : ( ( rule__XAssignment__Group_1_1_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:9110:1: rule__XAssignment__Group_1_1_0__0__Impl : ( ( rule__XAssignment__Group_1_1_0_0__0 ) ) ;
     public final void rule__XAssignment__Group_1_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9112:1: ( ( ( rule__XAssignment__Group_1_1_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:9113:1: ( ( rule__XAssignment__Group_1_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:9114:1: ( ( ( rule__XAssignment__Group_1_1_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:9115:1: ( ( rule__XAssignment__Group_1_1_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:9113:1: ( ( rule__XAssignment__Group_1_1_0_0__0 ) )
-            // InternalPerspectiveDsl.g:9114:2: ( rule__XAssignment__Group_1_1_0_0__0 )
+            // InternalPerspectiveDsl.g:9115:1: ( ( rule__XAssignment__Group_1_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:9116:2: ( rule__XAssignment__Group_1_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getGroup_1_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:9115:2: ( rule__XAssignment__Group_1_1_0_0__0 )
-            // InternalPerspectiveDsl.g:9115:3: rule__XAssignment__Group_1_1_0_0__0
+            // InternalPerspectiveDsl.g:9117:2: ( rule__XAssignment__Group_1_1_0_0__0 )
+            // InternalPerspectiveDsl.g:9117:3: rule__XAssignment__Group_1_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__Group_1_1_0_0__0();
@@ -30764,14 +30764,14 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1_0_0__0"
-    // InternalPerspectiveDsl.g:9124:1: rule__XAssignment__Group_1_1_0_0__0 : rule__XAssignment__Group_1_1_0_0__0__Impl rule__XAssignment__Group_1_1_0_0__1 ;
+    // InternalPerspectiveDsl.g:9126:1: rule__XAssignment__Group_1_1_0_0__0 : rule__XAssignment__Group_1_1_0_0__0__Impl rule__XAssignment__Group_1_1_0_0__1 ;
     public final void rule__XAssignment__Group_1_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9128:1: ( rule__XAssignment__Group_1_1_0_0__0__Impl rule__XAssignment__Group_1_1_0_0__1 )
-            // InternalPerspectiveDsl.g:9129:2: rule__XAssignment__Group_1_1_0_0__0__Impl rule__XAssignment__Group_1_1_0_0__1
+            // InternalPerspectiveDsl.g:9130:1: ( rule__XAssignment__Group_1_1_0_0__0__Impl rule__XAssignment__Group_1_1_0_0__1 )
+            // InternalPerspectiveDsl.g:9131:2: rule__XAssignment__Group_1_1_0_0__0__Impl rule__XAssignment__Group_1_1_0_0__1
             {
             pushFollow(FOLLOW_60);
             rule__XAssignment__Group_1_1_0_0__0__Impl();
@@ -30802,23 +30802,23 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:9136:1: rule__XAssignment__Group_1_1_0_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:9138:1: rule__XAssignment__Group_1_1_0_0__0__Impl : ( () ) ;
     public final void rule__XAssignment__Group_1_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9140:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:9141:1: ( () )
+            // InternalPerspectiveDsl.g:9142:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:9143:1: ( () )
             {
-            // InternalPerspectiveDsl.g:9141:1: ( () )
-            // InternalPerspectiveDsl.g:9142:2: ()
+            // InternalPerspectiveDsl.g:9143:1: ( () )
+            // InternalPerspectiveDsl.g:9144:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:9143:2: ()
-            // InternalPerspectiveDsl.g:9143:3: 
+            // InternalPerspectiveDsl.g:9145:2: ()
+            // InternalPerspectiveDsl.g:9145:3: 
             {
             }
 
@@ -30843,14 +30843,14 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1_0_0__1"
-    // InternalPerspectiveDsl.g:9151:1: rule__XAssignment__Group_1_1_0_0__1 : rule__XAssignment__Group_1_1_0_0__1__Impl ;
+    // InternalPerspectiveDsl.g:9153:1: rule__XAssignment__Group_1_1_0_0__1 : rule__XAssignment__Group_1_1_0_0__1__Impl ;
     public final void rule__XAssignment__Group_1_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9155:1: ( rule__XAssignment__Group_1_1_0_0__1__Impl )
-            // InternalPerspectiveDsl.g:9156:2: rule__XAssignment__Group_1_1_0_0__1__Impl
+            // InternalPerspectiveDsl.g:9157:1: ( rule__XAssignment__Group_1_1_0_0__1__Impl )
+            // InternalPerspectiveDsl.g:9158:2: rule__XAssignment__Group_1_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__Group_1_1_0_0__1__Impl();
@@ -30876,23 +30876,23 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:9162:1: rule__XAssignment__Group_1_1_0_0__1__Impl : ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:9164:1: rule__XAssignment__Group_1_1_0_0__1__Impl : ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) ) ;
     public final void rule__XAssignment__Group_1_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9166:1: ( ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) ) )
-            // InternalPerspectiveDsl.g:9167:1: ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) )
+            // InternalPerspectiveDsl.g:9168:1: ( ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) ) )
+            // InternalPerspectiveDsl.g:9169:1: ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:9167:1: ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) )
-            // InternalPerspectiveDsl.g:9168:2: ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 )
+            // InternalPerspectiveDsl.g:9169:1: ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) )
+            // InternalPerspectiveDsl.g:9170:2: ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getFeatureAssignment_1_1_0_0_1()); 
             }
-            // InternalPerspectiveDsl.g:9169:2: ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 )
-            // InternalPerspectiveDsl.g:9169:3: rule__XAssignment__FeatureAssignment_1_1_0_0_1
+            // InternalPerspectiveDsl.g:9171:2: ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 )
+            // InternalPerspectiveDsl.g:9171:3: rule__XAssignment__FeatureAssignment_1_1_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__FeatureAssignment_1_1_0_0_1();
@@ -30927,14 +30927,14 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_5__0"
-    // InternalPerspectiveDsl.g:9178:1: rule__OpMultiAssign__Group_5__0 : rule__OpMultiAssign__Group_5__0__Impl rule__OpMultiAssign__Group_5__1 ;
+    // InternalPerspectiveDsl.g:9180:1: rule__OpMultiAssign__Group_5__0 : rule__OpMultiAssign__Group_5__0__Impl rule__OpMultiAssign__Group_5__1 ;
     public final void rule__OpMultiAssign__Group_5__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9182:1: ( rule__OpMultiAssign__Group_5__0__Impl rule__OpMultiAssign__Group_5__1 )
-            // InternalPerspectiveDsl.g:9183:2: rule__OpMultiAssign__Group_5__0__Impl rule__OpMultiAssign__Group_5__1
+            // InternalPerspectiveDsl.g:9184:1: ( rule__OpMultiAssign__Group_5__0__Impl rule__OpMultiAssign__Group_5__1 )
+            // InternalPerspectiveDsl.g:9185:2: rule__OpMultiAssign__Group_5__0__Impl rule__OpMultiAssign__Group_5__1
             {
             pushFollow(FOLLOW_61);
             rule__OpMultiAssign__Group_5__0__Impl();
@@ -30965,17 +30965,17 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_5__0__Impl"
-    // InternalPerspectiveDsl.g:9190:1: rule__OpMultiAssign__Group_5__0__Impl : ( '<' ) ;
+    // InternalPerspectiveDsl.g:9192:1: rule__OpMultiAssign__Group_5__0__Impl : ( '<' ) ;
     public final void rule__OpMultiAssign__Group_5__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9194:1: ( ( '<' ) )
-            // InternalPerspectiveDsl.g:9195:1: ( '<' )
+            // InternalPerspectiveDsl.g:9196:1: ( ( '<' ) )
+            // InternalPerspectiveDsl.g:9197:1: ( '<' )
             {
-            // InternalPerspectiveDsl.g:9195:1: ( '<' )
-            // InternalPerspectiveDsl.g:9196:2: '<'
+            // InternalPerspectiveDsl.g:9197:1: ( '<' )
+            // InternalPerspectiveDsl.g:9198:2: '<'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0()); 
@@ -31006,14 +31006,14 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_5__1"
-    // InternalPerspectiveDsl.g:9205:1: rule__OpMultiAssign__Group_5__1 : rule__OpMultiAssign__Group_5__1__Impl rule__OpMultiAssign__Group_5__2 ;
+    // InternalPerspectiveDsl.g:9207:1: rule__OpMultiAssign__Group_5__1 : rule__OpMultiAssign__Group_5__1__Impl rule__OpMultiAssign__Group_5__2 ;
     public final void rule__OpMultiAssign__Group_5__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9209:1: ( rule__OpMultiAssign__Group_5__1__Impl rule__OpMultiAssign__Group_5__2 )
-            // InternalPerspectiveDsl.g:9210:2: rule__OpMultiAssign__Group_5__1__Impl rule__OpMultiAssign__Group_5__2
+            // InternalPerspectiveDsl.g:9211:1: ( rule__OpMultiAssign__Group_5__1__Impl rule__OpMultiAssign__Group_5__2 )
+            // InternalPerspectiveDsl.g:9212:2: rule__OpMultiAssign__Group_5__1__Impl rule__OpMultiAssign__Group_5__2
             {
             pushFollow(FOLLOW_55);
             rule__OpMultiAssign__Group_5__1__Impl();
@@ -31044,17 +31044,17 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_5__1__Impl"
-    // InternalPerspectiveDsl.g:9217:1: rule__OpMultiAssign__Group_5__1__Impl : ( '<' ) ;
+    // InternalPerspectiveDsl.g:9219:1: rule__OpMultiAssign__Group_5__1__Impl : ( '<' ) ;
     public final void rule__OpMultiAssign__Group_5__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9221:1: ( ( '<' ) )
-            // InternalPerspectiveDsl.g:9222:1: ( '<' )
+            // InternalPerspectiveDsl.g:9223:1: ( ( '<' ) )
+            // InternalPerspectiveDsl.g:9224:1: ( '<' )
             {
-            // InternalPerspectiveDsl.g:9222:1: ( '<' )
-            // InternalPerspectiveDsl.g:9223:2: '<'
+            // InternalPerspectiveDsl.g:9224:1: ( '<' )
+            // InternalPerspectiveDsl.g:9225:2: '<'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1()); 
@@ -31085,14 +31085,14 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_5__2"
-    // InternalPerspectiveDsl.g:9232:1: rule__OpMultiAssign__Group_5__2 : rule__OpMultiAssign__Group_5__2__Impl ;
+    // InternalPerspectiveDsl.g:9234:1: rule__OpMultiAssign__Group_5__2 : rule__OpMultiAssign__Group_5__2__Impl ;
     public final void rule__OpMultiAssign__Group_5__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9236:1: ( rule__OpMultiAssign__Group_5__2__Impl )
-            // InternalPerspectiveDsl.g:9237:2: rule__OpMultiAssign__Group_5__2__Impl
+            // InternalPerspectiveDsl.g:9238:1: ( rule__OpMultiAssign__Group_5__2__Impl )
+            // InternalPerspectiveDsl.g:9239:2: rule__OpMultiAssign__Group_5__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpMultiAssign__Group_5__2__Impl();
@@ -31118,17 +31118,17 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_5__2__Impl"
-    // InternalPerspectiveDsl.g:9243:1: rule__OpMultiAssign__Group_5__2__Impl : ( '=' ) ;
+    // InternalPerspectiveDsl.g:9245:1: rule__OpMultiAssign__Group_5__2__Impl : ( '=' ) ;
     public final void rule__OpMultiAssign__Group_5__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9247:1: ( ( '=' ) )
-            // InternalPerspectiveDsl.g:9248:1: ( '=' )
+            // InternalPerspectiveDsl.g:9249:1: ( ( '=' ) )
+            // InternalPerspectiveDsl.g:9250:1: ( '=' )
             {
-            // InternalPerspectiveDsl.g:9248:1: ( '=' )
-            // InternalPerspectiveDsl.g:9249:2: '='
+            // InternalPerspectiveDsl.g:9250:1: ( '=' )
+            // InternalPerspectiveDsl.g:9251:2: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2()); 
@@ -31159,14 +31159,14 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_6__0"
-    // InternalPerspectiveDsl.g:9259:1: rule__OpMultiAssign__Group_6__0 : rule__OpMultiAssign__Group_6__0__Impl rule__OpMultiAssign__Group_6__1 ;
+    // InternalPerspectiveDsl.g:9261:1: rule__OpMultiAssign__Group_6__0 : rule__OpMultiAssign__Group_6__0__Impl rule__OpMultiAssign__Group_6__1 ;
     public final void rule__OpMultiAssign__Group_6__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9263:1: ( rule__OpMultiAssign__Group_6__0__Impl rule__OpMultiAssign__Group_6__1 )
-            // InternalPerspectiveDsl.g:9264:2: rule__OpMultiAssign__Group_6__0__Impl rule__OpMultiAssign__Group_6__1
+            // InternalPerspectiveDsl.g:9265:1: ( rule__OpMultiAssign__Group_6__0__Impl rule__OpMultiAssign__Group_6__1 )
+            // InternalPerspectiveDsl.g:9266:2: rule__OpMultiAssign__Group_6__0__Impl rule__OpMultiAssign__Group_6__1
             {
             pushFollow(FOLLOW_62);
             rule__OpMultiAssign__Group_6__0__Impl();
@@ -31197,17 +31197,17 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_6__0__Impl"
-    // InternalPerspectiveDsl.g:9271:1: rule__OpMultiAssign__Group_6__0__Impl : ( '>' ) ;
+    // InternalPerspectiveDsl.g:9273:1: rule__OpMultiAssign__Group_6__0__Impl : ( '>' ) ;
     public final void rule__OpMultiAssign__Group_6__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9275:1: ( ( '>' ) )
-            // InternalPerspectiveDsl.g:9276:1: ( '>' )
+            // InternalPerspectiveDsl.g:9277:1: ( ( '>' ) )
+            // InternalPerspectiveDsl.g:9278:1: ( '>' )
             {
-            // InternalPerspectiveDsl.g:9276:1: ( '>' )
-            // InternalPerspectiveDsl.g:9277:2: '>'
+            // InternalPerspectiveDsl.g:9278:1: ( '>' )
+            // InternalPerspectiveDsl.g:9279:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0()); 
@@ -31238,14 +31238,14 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_6__1"
-    // InternalPerspectiveDsl.g:9286:1: rule__OpMultiAssign__Group_6__1 : rule__OpMultiAssign__Group_6__1__Impl rule__OpMultiAssign__Group_6__2 ;
+    // InternalPerspectiveDsl.g:9288:1: rule__OpMultiAssign__Group_6__1 : rule__OpMultiAssign__Group_6__1__Impl rule__OpMultiAssign__Group_6__2 ;
     public final void rule__OpMultiAssign__Group_6__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9290:1: ( rule__OpMultiAssign__Group_6__1__Impl rule__OpMultiAssign__Group_6__2 )
-            // InternalPerspectiveDsl.g:9291:2: rule__OpMultiAssign__Group_6__1__Impl rule__OpMultiAssign__Group_6__2
+            // InternalPerspectiveDsl.g:9292:1: ( rule__OpMultiAssign__Group_6__1__Impl rule__OpMultiAssign__Group_6__2 )
+            // InternalPerspectiveDsl.g:9293:2: rule__OpMultiAssign__Group_6__1__Impl rule__OpMultiAssign__Group_6__2
             {
             pushFollow(FOLLOW_62);
             rule__OpMultiAssign__Group_6__1__Impl();
@@ -31276,22 +31276,22 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_6__1__Impl"
-    // InternalPerspectiveDsl.g:9298:1: rule__OpMultiAssign__Group_6__1__Impl : ( ( '>' )? ) ;
+    // InternalPerspectiveDsl.g:9300:1: rule__OpMultiAssign__Group_6__1__Impl : ( ( '>' )? ) ;
     public final void rule__OpMultiAssign__Group_6__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9302:1: ( ( ( '>' )? ) )
-            // InternalPerspectiveDsl.g:9303:1: ( ( '>' )? )
+            // InternalPerspectiveDsl.g:9304:1: ( ( ( '>' )? ) )
+            // InternalPerspectiveDsl.g:9305:1: ( ( '>' )? )
             {
-            // InternalPerspectiveDsl.g:9303:1: ( ( '>' )? )
-            // InternalPerspectiveDsl.g:9304:2: ( '>' )?
+            // InternalPerspectiveDsl.g:9305:1: ( ( '>' )? )
+            // InternalPerspectiveDsl.g:9306:2: ( '>' )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1()); 
             }
-            // InternalPerspectiveDsl.g:9305:2: ( '>' )?
+            // InternalPerspectiveDsl.g:9307:2: ( '>' )?
             int alt70=2;
             int LA70_0 = input.LA(1);
 
@@ -31300,7 +31300,7 @@
             }
             switch (alt70) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:9305:3: '>'
+                    // InternalPerspectiveDsl.g:9307:3: '>'
                     {
                     match(input,26,FOLLOW_2); if (state.failed) return ;
 
@@ -31334,14 +31334,14 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_6__2"
-    // InternalPerspectiveDsl.g:9313:1: rule__OpMultiAssign__Group_6__2 : rule__OpMultiAssign__Group_6__2__Impl ;
+    // InternalPerspectiveDsl.g:9315:1: rule__OpMultiAssign__Group_6__2 : rule__OpMultiAssign__Group_6__2__Impl ;
     public final void rule__OpMultiAssign__Group_6__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9317:1: ( rule__OpMultiAssign__Group_6__2__Impl )
-            // InternalPerspectiveDsl.g:9318:2: rule__OpMultiAssign__Group_6__2__Impl
+            // InternalPerspectiveDsl.g:9319:1: ( rule__OpMultiAssign__Group_6__2__Impl )
+            // InternalPerspectiveDsl.g:9320:2: rule__OpMultiAssign__Group_6__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpMultiAssign__Group_6__2__Impl();
@@ -31367,17 +31367,17 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_6__2__Impl"
-    // InternalPerspectiveDsl.g:9324:1: rule__OpMultiAssign__Group_6__2__Impl : ( '>=' ) ;
+    // InternalPerspectiveDsl.g:9326:1: rule__OpMultiAssign__Group_6__2__Impl : ( '>=' ) ;
     public final void rule__OpMultiAssign__Group_6__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9328:1: ( ( '>=' ) )
-            // InternalPerspectiveDsl.g:9329:1: ( '>=' )
+            // InternalPerspectiveDsl.g:9330:1: ( ( '>=' ) )
+            // InternalPerspectiveDsl.g:9331:1: ( '>=' )
             {
-            // InternalPerspectiveDsl.g:9329:1: ( '>=' )
-            // InternalPerspectiveDsl.g:9330:2: '>='
+            // InternalPerspectiveDsl.g:9331:1: ( '>=' )
+            // InternalPerspectiveDsl.g:9332:2: '>='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2()); 
@@ -31408,14 +31408,14 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group__0"
-    // InternalPerspectiveDsl.g:9340:1: rule__XOrExpression__Group__0 : rule__XOrExpression__Group__0__Impl rule__XOrExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:9342:1: rule__XOrExpression__Group__0 : rule__XOrExpression__Group__0__Impl rule__XOrExpression__Group__1 ;
     public final void rule__XOrExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9344:1: ( rule__XOrExpression__Group__0__Impl rule__XOrExpression__Group__1 )
-            // InternalPerspectiveDsl.g:9345:2: rule__XOrExpression__Group__0__Impl rule__XOrExpression__Group__1
+            // InternalPerspectiveDsl.g:9346:1: ( rule__XOrExpression__Group__0__Impl rule__XOrExpression__Group__1 )
+            // InternalPerspectiveDsl.g:9347:2: rule__XOrExpression__Group__0__Impl rule__XOrExpression__Group__1
             {
             pushFollow(FOLLOW_63);
             rule__XOrExpression__Group__0__Impl();
@@ -31446,17 +31446,17 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:9352:1: rule__XOrExpression__Group__0__Impl : ( ruleXAndExpression ) ;
+    // InternalPerspectiveDsl.g:9354:1: rule__XOrExpression__Group__0__Impl : ( ruleXAndExpression ) ;
     public final void rule__XOrExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9356:1: ( ( ruleXAndExpression ) )
-            // InternalPerspectiveDsl.g:9357:1: ( ruleXAndExpression )
+            // InternalPerspectiveDsl.g:9358:1: ( ( ruleXAndExpression ) )
+            // InternalPerspectiveDsl.g:9359:1: ( ruleXAndExpression )
             {
-            // InternalPerspectiveDsl.g:9357:1: ( ruleXAndExpression )
-            // InternalPerspectiveDsl.g:9358:2: ruleXAndExpression
+            // InternalPerspectiveDsl.g:9359:1: ( ruleXAndExpression )
+            // InternalPerspectiveDsl.g:9360:2: ruleXAndExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0()); 
@@ -31491,14 +31491,14 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group__1"
-    // InternalPerspectiveDsl.g:9367:1: rule__XOrExpression__Group__1 : rule__XOrExpression__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:9369:1: rule__XOrExpression__Group__1 : rule__XOrExpression__Group__1__Impl ;
     public final void rule__XOrExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9371:1: ( rule__XOrExpression__Group__1__Impl )
-            // InternalPerspectiveDsl.g:9372:2: rule__XOrExpression__Group__1__Impl
+            // InternalPerspectiveDsl.g:9373:1: ( rule__XOrExpression__Group__1__Impl )
+            // InternalPerspectiveDsl.g:9374:2: rule__XOrExpression__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XOrExpression__Group__1__Impl();
@@ -31524,22 +31524,22 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:9378:1: rule__XOrExpression__Group__1__Impl : ( ( rule__XOrExpression__Group_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:9380:1: rule__XOrExpression__Group__1__Impl : ( ( rule__XOrExpression__Group_1__0 )* ) ;
     public final void rule__XOrExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9382:1: ( ( ( rule__XOrExpression__Group_1__0 )* ) )
-            // InternalPerspectiveDsl.g:9383:1: ( ( rule__XOrExpression__Group_1__0 )* )
+            // InternalPerspectiveDsl.g:9384:1: ( ( ( rule__XOrExpression__Group_1__0 )* ) )
+            // InternalPerspectiveDsl.g:9385:1: ( ( rule__XOrExpression__Group_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:9383:1: ( ( rule__XOrExpression__Group_1__0 )* )
-            // InternalPerspectiveDsl.g:9384:2: ( rule__XOrExpression__Group_1__0 )*
+            // InternalPerspectiveDsl.g:9385:1: ( ( rule__XOrExpression__Group_1__0 )* )
+            // InternalPerspectiveDsl.g:9386:2: ( rule__XOrExpression__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getGroup_1()); 
             }
-            // InternalPerspectiveDsl.g:9385:2: ( rule__XOrExpression__Group_1__0 )*
+            // InternalPerspectiveDsl.g:9387:2: ( rule__XOrExpression__Group_1__0 )*
             loop71:
             do {
                 int alt71=2;
@@ -31558,7 +31558,7 @@
 
                 switch (alt71) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:9385:3: rule__XOrExpression__Group_1__0
+            	    // InternalPerspectiveDsl.g:9387:3: rule__XOrExpression__Group_1__0
             	    {
             	    pushFollow(FOLLOW_64);
             	    rule__XOrExpression__Group_1__0();
@@ -31599,14 +31599,14 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1__0"
-    // InternalPerspectiveDsl.g:9394:1: rule__XOrExpression__Group_1__0 : rule__XOrExpression__Group_1__0__Impl rule__XOrExpression__Group_1__1 ;
+    // InternalPerspectiveDsl.g:9396:1: rule__XOrExpression__Group_1__0 : rule__XOrExpression__Group_1__0__Impl rule__XOrExpression__Group_1__1 ;
     public final void rule__XOrExpression__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9398:1: ( rule__XOrExpression__Group_1__0__Impl rule__XOrExpression__Group_1__1 )
-            // InternalPerspectiveDsl.g:9399:2: rule__XOrExpression__Group_1__0__Impl rule__XOrExpression__Group_1__1
+            // InternalPerspectiveDsl.g:9400:1: ( rule__XOrExpression__Group_1__0__Impl rule__XOrExpression__Group_1__1 )
+            // InternalPerspectiveDsl.g:9401:2: rule__XOrExpression__Group_1__0__Impl rule__XOrExpression__Group_1__1
             {
             pushFollow(FOLLOW_54);
             rule__XOrExpression__Group_1__0__Impl();
@@ -31637,23 +31637,23 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1__0__Impl"
-    // InternalPerspectiveDsl.g:9406:1: rule__XOrExpression__Group_1__0__Impl : ( ( rule__XOrExpression__Group_1_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:9408:1: rule__XOrExpression__Group_1__0__Impl : ( ( rule__XOrExpression__Group_1_0__0 ) ) ;
     public final void rule__XOrExpression__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9410:1: ( ( ( rule__XOrExpression__Group_1_0__0 ) ) )
-            // InternalPerspectiveDsl.g:9411:1: ( ( rule__XOrExpression__Group_1_0__0 ) )
+            // InternalPerspectiveDsl.g:9412:1: ( ( ( rule__XOrExpression__Group_1_0__0 ) ) )
+            // InternalPerspectiveDsl.g:9413:1: ( ( rule__XOrExpression__Group_1_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:9411:1: ( ( rule__XOrExpression__Group_1_0__0 ) )
-            // InternalPerspectiveDsl.g:9412:2: ( rule__XOrExpression__Group_1_0__0 )
+            // InternalPerspectiveDsl.g:9413:1: ( ( rule__XOrExpression__Group_1_0__0 ) )
+            // InternalPerspectiveDsl.g:9414:2: ( rule__XOrExpression__Group_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getGroup_1_0()); 
             }
-            // InternalPerspectiveDsl.g:9413:2: ( rule__XOrExpression__Group_1_0__0 )
-            // InternalPerspectiveDsl.g:9413:3: rule__XOrExpression__Group_1_0__0
+            // InternalPerspectiveDsl.g:9415:2: ( rule__XOrExpression__Group_1_0__0 )
+            // InternalPerspectiveDsl.g:9415:3: rule__XOrExpression__Group_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XOrExpression__Group_1_0__0();
@@ -31688,14 +31688,14 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1__1"
-    // InternalPerspectiveDsl.g:9421:1: rule__XOrExpression__Group_1__1 : rule__XOrExpression__Group_1__1__Impl ;
+    // InternalPerspectiveDsl.g:9423:1: rule__XOrExpression__Group_1__1 : rule__XOrExpression__Group_1__1__Impl ;
     public final void rule__XOrExpression__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9425:1: ( rule__XOrExpression__Group_1__1__Impl )
-            // InternalPerspectiveDsl.g:9426:2: rule__XOrExpression__Group_1__1__Impl
+            // InternalPerspectiveDsl.g:9427:1: ( rule__XOrExpression__Group_1__1__Impl )
+            // InternalPerspectiveDsl.g:9428:2: rule__XOrExpression__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XOrExpression__Group_1__1__Impl();
@@ -31721,23 +31721,23 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1__1__Impl"
-    // InternalPerspectiveDsl.g:9432:1: rule__XOrExpression__Group_1__1__Impl : ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:9434:1: rule__XOrExpression__Group_1__1__Impl : ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) ) ;
     public final void rule__XOrExpression__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9436:1: ( ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) ) )
-            // InternalPerspectiveDsl.g:9437:1: ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) )
+            // InternalPerspectiveDsl.g:9438:1: ( ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) ) )
+            // InternalPerspectiveDsl.g:9439:1: ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:9437:1: ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) )
-            // InternalPerspectiveDsl.g:9438:2: ( rule__XOrExpression__RightOperandAssignment_1_1 )
+            // InternalPerspectiveDsl.g:9439:1: ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) )
+            // InternalPerspectiveDsl.g:9440:2: ( rule__XOrExpression__RightOperandAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getRightOperandAssignment_1_1()); 
             }
-            // InternalPerspectiveDsl.g:9439:2: ( rule__XOrExpression__RightOperandAssignment_1_1 )
-            // InternalPerspectiveDsl.g:9439:3: rule__XOrExpression__RightOperandAssignment_1_1
+            // InternalPerspectiveDsl.g:9441:2: ( rule__XOrExpression__RightOperandAssignment_1_1 )
+            // InternalPerspectiveDsl.g:9441:3: rule__XOrExpression__RightOperandAssignment_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XOrExpression__RightOperandAssignment_1_1();
@@ -31772,14 +31772,14 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1_0__0"
-    // InternalPerspectiveDsl.g:9448:1: rule__XOrExpression__Group_1_0__0 : rule__XOrExpression__Group_1_0__0__Impl ;
+    // InternalPerspectiveDsl.g:9450:1: rule__XOrExpression__Group_1_0__0 : rule__XOrExpression__Group_1_0__0__Impl ;
     public final void rule__XOrExpression__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9452:1: ( rule__XOrExpression__Group_1_0__0__Impl )
-            // InternalPerspectiveDsl.g:9453:2: rule__XOrExpression__Group_1_0__0__Impl
+            // InternalPerspectiveDsl.g:9454:1: ( rule__XOrExpression__Group_1_0__0__Impl )
+            // InternalPerspectiveDsl.g:9455:2: rule__XOrExpression__Group_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XOrExpression__Group_1_0__0__Impl();
@@ -31805,23 +31805,23 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1_0__0__Impl"
-    // InternalPerspectiveDsl.g:9459:1: rule__XOrExpression__Group_1_0__0__Impl : ( ( rule__XOrExpression__Group_1_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:9461:1: rule__XOrExpression__Group_1_0__0__Impl : ( ( rule__XOrExpression__Group_1_0_0__0 ) ) ;
     public final void rule__XOrExpression__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9463:1: ( ( ( rule__XOrExpression__Group_1_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:9464:1: ( ( rule__XOrExpression__Group_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:9465:1: ( ( ( rule__XOrExpression__Group_1_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:9466:1: ( ( rule__XOrExpression__Group_1_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:9464:1: ( ( rule__XOrExpression__Group_1_0_0__0 ) )
-            // InternalPerspectiveDsl.g:9465:2: ( rule__XOrExpression__Group_1_0_0__0 )
+            // InternalPerspectiveDsl.g:9466:1: ( ( rule__XOrExpression__Group_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:9467:2: ( rule__XOrExpression__Group_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getGroup_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:9466:2: ( rule__XOrExpression__Group_1_0_0__0 )
-            // InternalPerspectiveDsl.g:9466:3: rule__XOrExpression__Group_1_0_0__0
+            // InternalPerspectiveDsl.g:9468:2: ( rule__XOrExpression__Group_1_0_0__0 )
+            // InternalPerspectiveDsl.g:9468:3: rule__XOrExpression__Group_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XOrExpression__Group_1_0_0__0();
@@ -31856,14 +31856,14 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1_0_0__0"
-    // InternalPerspectiveDsl.g:9475:1: rule__XOrExpression__Group_1_0_0__0 : rule__XOrExpression__Group_1_0_0__0__Impl rule__XOrExpression__Group_1_0_0__1 ;
+    // InternalPerspectiveDsl.g:9477:1: rule__XOrExpression__Group_1_0_0__0 : rule__XOrExpression__Group_1_0_0__0__Impl rule__XOrExpression__Group_1_0_0__1 ;
     public final void rule__XOrExpression__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9479:1: ( rule__XOrExpression__Group_1_0_0__0__Impl rule__XOrExpression__Group_1_0_0__1 )
-            // InternalPerspectiveDsl.g:9480:2: rule__XOrExpression__Group_1_0_0__0__Impl rule__XOrExpression__Group_1_0_0__1
+            // InternalPerspectiveDsl.g:9481:1: ( rule__XOrExpression__Group_1_0_0__0__Impl rule__XOrExpression__Group_1_0_0__1 )
+            // InternalPerspectiveDsl.g:9482:2: rule__XOrExpression__Group_1_0_0__0__Impl rule__XOrExpression__Group_1_0_0__1
             {
             pushFollow(FOLLOW_63);
             rule__XOrExpression__Group_1_0_0__0__Impl();
@@ -31894,23 +31894,23 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:9487:1: rule__XOrExpression__Group_1_0_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:9489:1: rule__XOrExpression__Group_1_0_0__0__Impl : ( () ) ;
     public final void rule__XOrExpression__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9491:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:9492:1: ( () )
+            // InternalPerspectiveDsl.g:9493:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:9494:1: ( () )
             {
-            // InternalPerspectiveDsl.g:9492:1: ( () )
-            // InternalPerspectiveDsl.g:9493:2: ()
+            // InternalPerspectiveDsl.g:9494:1: ( () )
+            // InternalPerspectiveDsl.g:9495:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:9494:2: ()
-            // InternalPerspectiveDsl.g:9494:3: 
+            // InternalPerspectiveDsl.g:9496:2: ()
+            // InternalPerspectiveDsl.g:9496:3: 
             {
             }
 
@@ -31935,14 +31935,14 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1_0_0__1"
-    // InternalPerspectiveDsl.g:9502:1: rule__XOrExpression__Group_1_0_0__1 : rule__XOrExpression__Group_1_0_0__1__Impl ;
+    // InternalPerspectiveDsl.g:9504:1: rule__XOrExpression__Group_1_0_0__1 : rule__XOrExpression__Group_1_0_0__1__Impl ;
     public final void rule__XOrExpression__Group_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9506:1: ( rule__XOrExpression__Group_1_0_0__1__Impl )
-            // InternalPerspectiveDsl.g:9507:2: rule__XOrExpression__Group_1_0_0__1__Impl
+            // InternalPerspectiveDsl.g:9508:1: ( rule__XOrExpression__Group_1_0_0__1__Impl )
+            // InternalPerspectiveDsl.g:9509:2: rule__XOrExpression__Group_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XOrExpression__Group_1_0_0__1__Impl();
@@ -31968,23 +31968,23 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:9513:1: rule__XOrExpression__Group_1_0_0__1__Impl : ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:9515:1: rule__XOrExpression__Group_1_0_0__1__Impl : ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) ) ;
     public final void rule__XOrExpression__Group_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9517:1: ( ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) ) )
-            // InternalPerspectiveDsl.g:9518:1: ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalPerspectiveDsl.g:9519:1: ( ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) ) )
+            // InternalPerspectiveDsl.g:9520:1: ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:9518:1: ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) )
-            // InternalPerspectiveDsl.g:9519:2: ( rule__XOrExpression__FeatureAssignment_1_0_0_1 )
+            // InternalPerspectiveDsl.g:9520:1: ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalPerspectiveDsl.g:9521:2: ( rule__XOrExpression__FeatureAssignment_1_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getFeatureAssignment_1_0_0_1()); 
             }
-            // InternalPerspectiveDsl.g:9520:2: ( rule__XOrExpression__FeatureAssignment_1_0_0_1 )
-            // InternalPerspectiveDsl.g:9520:3: rule__XOrExpression__FeatureAssignment_1_0_0_1
+            // InternalPerspectiveDsl.g:9522:2: ( rule__XOrExpression__FeatureAssignment_1_0_0_1 )
+            // InternalPerspectiveDsl.g:9522:3: rule__XOrExpression__FeatureAssignment_1_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XOrExpression__FeatureAssignment_1_0_0_1();
@@ -32019,14 +32019,14 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group__0"
-    // InternalPerspectiveDsl.g:9529:1: rule__XAndExpression__Group__0 : rule__XAndExpression__Group__0__Impl rule__XAndExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:9531:1: rule__XAndExpression__Group__0 : rule__XAndExpression__Group__0__Impl rule__XAndExpression__Group__1 ;
     public final void rule__XAndExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9533:1: ( rule__XAndExpression__Group__0__Impl rule__XAndExpression__Group__1 )
-            // InternalPerspectiveDsl.g:9534:2: rule__XAndExpression__Group__0__Impl rule__XAndExpression__Group__1
+            // InternalPerspectiveDsl.g:9535:1: ( rule__XAndExpression__Group__0__Impl rule__XAndExpression__Group__1 )
+            // InternalPerspectiveDsl.g:9536:2: rule__XAndExpression__Group__0__Impl rule__XAndExpression__Group__1
             {
             pushFollow(FOLLOW_65);
             rule__XAndExpression__Group__0__Impl();
@@ -32057,17 +32057,17 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:9541:1: rule__XAndExpression__Group__0__Impl : ( ruleXEqualityExpression ) ;
+    // InternalPerspectiveDsl.g:9543:1: rule__XAndExpression__Group__0__Impl : ( ruleXEqualityExpression ) ;
     public final void rule__XAndExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9545:1: ( ( ruleXEqualityExpression ) )
-            // InternalPerspectiveDsl.g:9546:1: ( ruleXEqualityExpression )
+            // InternalPerspectiveDsl.g:9547:1: ( ( ruleXEqualityExpression ) )
+            // InternalPerspectiveDsl.g:9548:1: ( ruleXEqualityExpression )
             {
-            // InternalPerspectiveDsl.g:9546:1: ( ruleXEqualityExpression )
-            // InternalPerspectiveDsl.g:9547:2: ruleXEqualityExpression
+            // InternalPerspectiveDsl.g:9548:1: ( ruleXEqualityExpression )
+            // InternalPerspectiveDsl.g:9549:2: ruleXEqualityExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0()); 
@@ -32102,14 +32102,14 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group__1"
-    // InternalPerspectiveDsl.g:9556:1: rule__XAndExpression__Group__1 : rule__XAndExpression__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:9558:1: rule__XAndExpression__Group__1 : rule__XAndExpression__Group__1__Impl ;
     public final void rule__XAndExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9560:1: ( rule__XAndExpression__Group__1__Impl )
-            // InternalPerspectiveDsl.g:9561:2: rule__XAndExpression__Group__1__Impl
+            // InternalPerspectiveDsl.g:9562:1: ( rule__XAndExpression__Group__1__Impl )
+            // InternalPerspectiveDsl.g:9563:2: rule__XAndExpression__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAndExpression__Group__1__Impl();
@@ -32135,22 +32135,22 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:9567:1: rule__XAndExpression__Group__1__Impl : ( ( rule__XAndExpression__Group_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:9569:1: rule__XAndExpression__Group__1__Impl : ( ( rule__XAndExpression__Group_1__0 )* ) ;
     public final void rule__XAndExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9571:1: ( ( ( rule__XAndExpression__Group_1__0 )* ) )
-            // InternalPerspectiveDsl.g:9572:1: ( ( rule__XAndExpression__Group_1__0 )* )
+            // InternalPerspectiveDsl.g:9573:1: ( ( ( rule__XAndExpression__Group_1__0 )* ) )
+            // InternalPerspectiveDsl.g:9574:1: ( ( rule__XAndExpression__Group_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:9572:1: ( ( rule__XAndExpression__Group_1__0 )* )
-            // InternalPerspectiveDsl.g:9573:2: ( rule__XAndExpression__Group_1__0 )*
+            // InternalPerspectiveDsl.g:9574:1: ( ( rule__XAndExpression__Group_1__0 )* )
+            // InternalPerspectiveDsl.g:9575:2: ( rule__XAndExpression__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getGroup_1()); 
             }
-            // InternalPerspectiveDsl.g:9574:2: ( rule__XAndExpression__Group_1__0 )*
+            // InternalPerspectiveDsl.g:9576:2: ( rule__XAndExpression__Group_1__0 )*
             loop72:
             do {
                 int alt72=2;
@@ -32169,7 +32169,7 @@
 
                 switch (alt72) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:9574:3: rule__XAndExpression__Group_1__0
+            	    // InternalPerspectiveDsl.g:9576:3: rule__XAndExpression__Group_1__0
             	    {
             	    pushFollow(FOLLOW_66);
             	    rule__XAndExpression__Group_1__0();
@@ -32210,14 +32210,14 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1__0"
-    // InternalPerspectiveDsl.g:9583:1: rule__XAndExpression__Group_1__0 : rule__XAndExpression__Group_1__0__Impl rule__XAndExpression__Group_1__1 ;
+    // InternalPerspectiveDsl.g:9585:1: rule__XAndExpression__Group_1__0 : rule__XAndExpression__Group_1__0__Impl rule__XAndExpression__Group_1__1 ;
     public final void rule__XAndExpression__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9587:1: ( rule__XAndExpression__Group_1__0__Impl rule__XAndExpression__Group_1__1 )
-            // InternalPerspectiveDsl.g:9588:2: rule__XAndExpression__Group_1__0__Impl rule__XAndExpression__Group_1__1
+            // InternalPerspectiveDsl.g:9589:1: ( rule__XAndExpression__Group_1__0__Impl rule__XAndExpression__Group_1__1 )
+            // InternalPerspectiveDsl.g:9590:2: rule__XAndExpression__Group_1__0__Impl rule__XAndExpression__Group_1__1
             {
             pushFollow(FOLLOW_54);
             rule__XAndExpression__Group_1__0__Impl();
@@ -32248,23 +32248,23 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1__0__Impl"
-    // InternalPerspectiveDsl.g:9595:1: rule__XAndExpression__Group_1__0__Impl : ( ( rule__XAndExpression__Group_1_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:9597:1: rule__XAndExpression__Group_1__0__Impl : ( ( rule__XAndExpression__Group_1_0__0 ) ) ;
     public final void rule__XAndExpression__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9599:1: ( ( ( rule__XAndExpression__Group_1_0__0 ) ) )
-            // InternalPerspectiveDsl.g:9600:1: ( ( rule__XAndExpression__Group_1_0__0 ) )
+            // InternalPerspectiveDsl.g:9601:1: ( ( ( rule__XAndExpression__Group_1_0__0 ) ) )
+            // InternalPerspectiveDsl.g:9602:1: ( ( rule__XAndExpression__Group_1_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:9600:1: ( ( rule__XAndExpression__Group_1_0__0 ) )
-            // InternalPerspectiveDsl.g:9601:2: ( rule__XAndExpression__Group_1_0__0 )
+            // InternalPerspectiveDsl.g:9602:1: ( ( rule__XAndExpression__Group_1_0__0 ) )
+            // InternalPerspectiveDsl.g:9603:2: ( rule__XAndExpression__Group_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getGroup_1_0()); 
             }
-            // InternalPerspectiveDsl.g:9602:2: ( rule__XAndExpression__Group_1_0__0 )
-            // InternalPerspectiveDsl.g:9602:3: rule__XAndExpression__Group_1_0__0
+            // InternalPerspectiveDsl.g:9604:2: ( rule__XAndExpression__Group_1_0__0 )
+            // InternalPerspectiveDsl.g:9604:3: rule__XAndExpression__Group_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAndExpression__Group_1_0__0();
@@ -32299,14 +32299,14 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1__1"
-    // InternalPerspectiveDsl.g:9610:1: rule__XAndExpression__Group_1__1 : rule__XAndExpression__Group_1__1__Impl ;
+    // InternalPerspectiveDsl.g:9612:1: rule__XAndExpression__Group_1__1 : rule__XAndExpression__Group_1__1__Impl ;
     public final void rule__XAndExpression__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9614:1: ( rule__XAndExpression__Group_1__1__Impl )
-            // InternalPerspectiveDsl.g:9615:2: rule__XAndExpression__Group_1__1__Impl
+            // InternalPerspectiveDsl.g:9616:1: ( rule__XAndExpression__Group_1__1__Impl )
+            // InternalPerspectiveDsl.g:9617:2: rule__XAndExpression__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAndExpression__Group_1__1__Impl();
@@ -32332,23 +32332,23 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1__1__Impl"
-    // InternalPerspectiveDsl.g:9621:1: rule__XAndExpression__Group_1__1__Impl : ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:9623:1: rule__XAndExpression__Group_1__1__Impl : ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) ) ;
     public final void rule__XAndExpression__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9625:1: ( ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) ) )
-            // InternalPerspectiveDsl.g:9626:1: ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) )
+            // InternalPerspectiveDsl.g:9627:1: ( ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) ) )
+            // InternalPerspectiveDsl.g:9628:1: ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:9626:1: ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) )
-            // InternalPerspectiveDsl.g:9627:2: ( rule__XAndExpression__RightOperandAssignment_1_1 )
+            // InternalPerspectiveDsl.g:9628:1: ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) )
+            // InternalPerspectiveDsl.g:9629:2: ( rule__XAndExpression__RightOperandAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getRightOperandAssignment_1_1()); 
             }
-            // InternalPerspectiveDsl.g:9628:2: ( rule__XAndExpression__RightOperandAssignment_1_1 )
-            // InternalPerspectiveDsl.g:9628:3: rule__XAndExpression__RightOperandAssignment_1_1
+            // InternalPerspectiveDsl.g:9630:2: ( rule__XAndExpression__RightOperandAssignment_1_1 )
+            // InternalPerspectiveDsl.g:9630:3: rule__XAndExpression__RightOperandAssignment_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XAndExpression__RightOperandAssignment_1_1();
@@ -32383,14 +32383,14 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1_0__0"
-    // InternalPerspectiveDsl.g:9637:1: rule__XAndExpression__Group_1_0__0 : rule__XAndExpression__Group_1_0__0__Impl ;
+    // InternalPerspectiveDsl.g:9639:1: rule__XAndExpression__Group_1_0__0 : rule__XAndExpression__Group_1_0__0__Impl ;
     public final void rule__XAndExpression__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9641:1: ( rule__XAndExpression__Group_1_0__0__Impl )
-            // InternalPerspectiveDsl.g:9642:2: rule__XAndExpression__Group_1_0__0__Impl
+            // InternalPerspectiveDsl.g:9643:1: ( rule__XAndExpression__Group_1_0__0__Impl )
+            // InternalPerspectiveDsl.g:9644:2: rule__XAndExpression__Group_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAndExpression__Group_1_0__0__Impl();
@@ -32416,23 +32416,23 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1_0__0__Impl"
-    // InternalPerspectiveDsl.g:9648:1: rule__XAndExpression__Group_1_0__0__Impl : ( ( rule__XAndExpression__Group_1_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:9650:1: rule__XAndExpression__Group_1_0__0__Impl : ( ( rule__XAndExpression__Group_1_0_0__0 ) ) ;
     public final void rule__XAndExpression__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9652:1: ( ( ( rule__XAndExpression__Group_1_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:9653:1: ( ( rule__XAndExpression__Group_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:9654:1: ( ( ( rule__XAndExpression__Group_1_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:9655:1: ( ( rule__XAndExpression__Group_1_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:9653:1: ( ( rule__XAndExpression__Group_1_0_0__0 ) )
-            // InternalPerspectiveDsl.g:9654:2: ( rule__XAndExpression__Group_1_0_0__0 )
+            // InternalPerspectiveDsl.g:9655:1: ( ( rule__XAndExpression__Group_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:9656:2: ( rule__XAndExpression__Group_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getGroup_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:9655:2: ( rule__XAndExpression__Group_1_0_0__0 )
-            // InternalPerspectiveDsl.g:9655:3: rule__XAndExpression__Group_1_0_0__0
+            // InternalPerspectiveDsl.g:9657:2: ( rule__XAndExpression__Group_1_0_0__0 )
+            // InternalPerspectiveDsl.g:9657:3: rule__XAndExpression__Group_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAndExpression__Group_1_0_0__0();
@@ -32467,14 +32467,14 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1_0_0__0"
-    // InternalPerspectiveDsl.g:9664:1: rule__XAndExpression__Group_1_0_0__0 : rule__XAndExpression__Group_1_0_0__0__Impl rule__XAndExpression__Group_1_0_0__1 ;
+    // InternalPerspectiveDsl.g:9666:1: rule__XAndExpression__Group_1_0_0__0 : rule__XAndExpression__Group_1_0_0__0__Impl rule__XAndExpression__Group_1_0_0__1 ;
     public final void rule__XAndExpression__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9668:1: ( rule__XAndExpression__Group_1_0_0__0__Impl rule__XAndExpression__Group_1_0_0__1 )
-            // InternalPerspectiveDsl.g:9669:2: rule__XAndExpression__Group_1_0_0__0__Impl rule__XAndExpression__Group_1_0_0__1
+            // InternalPerspectiveDsl.g:9670:1: ( rule__XAndExpression__Group_1_0_0__0__Impl rule__XAndExpression__Group_1_0_0__1 )
+            // InternalPerspectiveDsl.g:9671:2: rule__XAndExpression__Group_1_0_0__0__Impl rule__XAndExpression__Group_1_0_0__1
             {
             pushFollow(FOLLOW_65);
             rule__XAndExpression__Group_1_0_0__0__Impl();
@@ -32505,23 +32505,23 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:9676:1: rule__XAndExpression__Group_1_0_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:9678:1: rule__XAndExpression__Group_1_0_0__0__Impl : ( () ) ;
     public final void rule__XAndExpression__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9680:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:9681:1: ( () )
+            // InternalPerspectiveDsl.g:9682:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:9683:1: ( () )
             {
-            // InternalPerspectiveDsl.g:9681:1: ( () )
-            // InternalPerspectiveDsl.g:9682:2: ()
+            // InternalPerspectiveDsl.g:9683:1: ( () )
+            // InternalPerspectiveDsl.g:9684:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:9683:2: ()
-            // InternalPerspectiveDsl.g:9683:3: 
+            // InternalPerspectiveDsl.g:9685:2: ()
+            // InternalPerspectiveDsl.g:9685:3: 
             {
             }
 
@@ -32546,14 +32546,14 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1_0_0__1"
-    // InternalPerspectiveDsl.g:9691:1: rule__XAndExpression__Group_1_0_0__1 : rule__XAndExpression__Group_1_0_0__1__Impl ;
+    // InternalPerspectiveDsl.g:9693:1: rule__XAndExpression__Group_1_0_0__1 : rule__XAndExpression__Group_1_0_0__1__Impl ;
     public final void rule__XAndExpression__Group_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9695:1: ( rule__XAndExpression__Group_1_0_0__1__Impl )
-            // InternalPerspectiveDsl.g:9696:2: rule__XAndExpression__Group_1_0_0__1__Impl
+            // InternalPerspectiveDsl.g:9697:1: ( rule__XAndExpression__Group_1_0_0__1__Impl )
+            // InternalPerspectiveDsl.g:9698:2: rule__XAndExpression__Group_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAndExpression__Group_1_0_0__1__Impl();
@@ -32579,23 +32579,23 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:9702:1: rule__XAndExpression__Group_1_0_0__1__Impl : ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:9704:1: rule__XAndExpression__Group_1_0_0__1__Impl : ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) ) ;
     public final void rule__XAndExpression__Group_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9706:1: ( ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) ) )
-            // InternalPerspectiveDsl.g:9707:1: ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalPerspectiveDsl.g:9708:1: ( ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) ) )
+            // InternalPerspectiveDsl.g:9709:1: ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:9707:1: ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) )
-            // InternalPerspectiveDsl.g:9708:2: ( rule__XAndExpression__FeatureAssignment_1_0_0_1 )
+            // InternalPerspectiveDsl.g:9709:1: ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalPerspectiveDsl.g:9710:2: ( rule__XAndExpression__FeatureAssignment_1_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getFeatureAssignment_1_0_0_1()); 
             }
-            // InternalPerspectiveDsl.g:9709:2: ( rule__XAndExpression__FeatureAssignment_1_0_0_1 )
-            // InternalPerspectiveDsl.g:9709:3: rule__XAndExpression__FeatureAssignment_1_0_0_1
+            // InternalPerspectiveDsl.g:9711:2: ( rule__XAndExpression__FeatureAssignment_1_0_0_1 )
+            // InternalPerspectiveDsl.g:9711:3: rule__XAndExpression__FeatureAssignment_1_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XAndExpression__FeatureAssignment_1_0_0_1();
@@ -32630,14 +32630,14 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group__0"
-    // InternalPerspectiveDsl.g:9718:1: rule__XEqualityExpression__Group__0 : rule__XEqualityExpression__Group__0__Impl rule__XEqualityExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:9720:1: rule__XEqualityExpression__Group__0 : rule__XEqualityExpression__Group__0__Impl rule__XEqualityExpression__Group__1 ;
     public final void rule__XEqualityExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9722:1: ( rule__XEqualityExpression__Group__0__Impl rule__XEqualityExpression__Group__1 )
-            // InternalPerspectiveDsl.g:9723:2: rule__XEqualityExpression__Group__0__Impl rule__XEqualityExpression__Group__1
+            // InternalPerspectiveDsl.g:9724:1: ( rule__XEqualityExpression__Group__0__Impl rule__XEqualityExpression__Group__1 )
+            // InternalPerspectiveDsl.g:9725:2: rule__XEqualityExpression__Group__0__Impl rule__XEqualityExpression__Group__1
             {
             pushFollow(FOLLOW_67);
             rule__XEqualityExpression__Group__0__Impl();
@@ -32668,17 +32668,17 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:9730:1: rule__XEqualityExpression__Group__0__Impl : ( ruleXRelationalExpression ) ;
+    // InternalPerspectiveDsl.g:9732:1: rule__XEqualityExpression__Group__0__Impl : ( ruleXRelationalExpression ) ;
     public final void rule__XEqualityExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9734:1: ( ( ruleXRelationalExpression ) )
-            // InternalPerspectiveDsl.g:9735:1: ( ruleXRelationalExpression )
+            // InternalPerspectiveDsl.g:9736:1: ( ( ruleXRelationalExpression ) )
+            // InternalPerspectiveDsl.g:9737:1: ( ruleXRelationalExpression )
             {
-            // InternalPerspectiveDsl.g:9735:1: ( ruleXRelationalExpression )
-            // InternalPerspectiveDsl.g:9736:2: ruleXRelationalExpression
+            // InternalPerspectiveDsl.g:9737:1: ( ruleXRelationalExpression )
+            // InternalPerspectiveDsl.g:9738:2: ruleXRelationalExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0()); 
@@ -32713,14 +32713,14 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group__1"
-    // InternalPerspectiveDsl.g:9745:1: rule__XEqualityExpression__Group__1 : rule__XEqualityExpression__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:9747:1: rule__XEqualityExpression__Group__1 : rule__XEqualityExpression__Group__1__Impl ;
     public final void rule__XEqualityExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9749:1: ( rule__XEqualityExpression__Group__1__Impl )
-            // InternalPerspectiveDsl.g:9750:2: rule__XEqualityExpression__Group__1__Impl
+            // InternalPerspectiveDsl.g:9751:1: ( rule__XEqualityExpression__Group__1__Impl )
+            // InternalPerspectiveDsl.g:9752:2: rule__XEqualityExpression__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XEqualityExpression__Group__1__Impl();
@@ -32746,22 +32746,22 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:9756:1: rule__XEqualityExpression__Group__1__Impl : ( ( rule__XEqualityExpression__Group_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:9758:1: rule__XEqualityExpression__Group__1__Impl : ( ( rule__XEqualityExpression__Group_1__0 )* ) ;
     public final void rule__XEqualityExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9760:1: ( ( ( rule__XEqualityExpression__Group_1__0 )* ) )
-            // InternalPerspectiveDsl.g:9761:1: ( ( rule__XEqualityExpression__Group_1__0 )* )
+            // InternalPerspectiveDsl.g:9762:1: ( ( ( rule__XEqualityExpression__Group_1__0 )* ) )
+            // InternalPerspectiveDsl.g:9763:1: ( ( rule__XEqualityExpression__Group_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:9761:1: ( ( rule__XEqualityExpression__Group_1__0 )* )
-            // InternalPerspectiveDsl.g:9762:2: ( rule__XEqualityExpression__Group_1__0 )*
+            // InternalPerspectiveDsl.g:9763:1: ( ( rule__XEqualityExpression__Group_1__0 )* )
+            // InternalPerspectiveDsl.g:9764:2: ( rule__XEqualityExpression__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getGroup_1()); 
             }
-            // InternalPerspectiveDsl.g:9763:2: ( rule__XEqualityExpression__Group_1__0 )*
+            // InternalPerspectiveDsl.g:9765:2: ( rule__XEqualityExpression__Group_1__0 )*
             loop73:
             do {
                 int alt73=2;
@@ -32815,7 +32815,7 @@
 
                 switch (alt73) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:9763:3: rule__XEqualityExpression__Group_1__0
+            	    // InternalPerspectiveDsl.g:9765:3: rule__XEqualityExpression__Group_1__0
             	    {
             	    pushFollow(FOLLOW_68);
             	    rule__XEqualityExpression__Group_1__0();
@@ -32856,14 +32856,14 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1__0"
-    // InternalPerspectiveDsl.g:9772:1: rule__XEqualityExpression__Group_1__0 : rule__XEqualityExpression__Group_1__0__Impl rule__XEqualityExpression__Group_1__1 ;
+    // InternalPerspectiveDsl.g:9774:1: rule__XEqualityExpression__Group_1__0 : rule__XEqualityExpression__Group_1__0__Impl rule__XEqualityExpression__Group_1__1 ;
     public final void rule__XEqualityExpression__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9776:1: ( rule__XEqualityExpression__Group_1__0__Impl rule__XEqualityExpression__Group_1__1 )
-            // InternalPerspectiveDsl.g:9777:2: rule__XEqualityExpression__Group_1__0__Impl rule__XEqualityExpression__Group_1__1
+            // InternalPerspectiveDsl.g:9778:1: ( rule__XEqualityExpression__Group_1__0__Impl rule__XEqualityExpression__Group_1__1 )
+            // InternalPerspectiveDsl.g:9779:2: rule__XEqualityExpression__Group_1__0__Impl rule__XEqualityExpression__Group_1__1
             {
             pushFollow(FOLLOW_54);
             rule__XEqualityExpression__Group_1__0__Impl();
@@ -32894,23 +32894,23 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1__0__Impl"
-    // InternalPerspectiveDsl.g:9784:1: rule__XEqualityExpression__Group_1__0__Impl : ( ( rule__XEqualityExpression__Group_1_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:9786:1: rule__XEqualityExpression__Group_1__0__Impl : ( ( rule__XEqualityExpression__Group_1_0__0 ) ) ;
     public final void rule__XEqualityExpression__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9788:1: ( ( ( rule__XEqualityExpression__Group_1_0__0 ) ) )
-            // InternalPerspectiveDsl.g:9789:1: ( ( rule__XEqualityExpression__Group_1_0__0 ) )
+            // InternalPerspectiveDsl.g:9790:1: ( ( ( rule__XEqualityExpression__Group_1_0__0 ) ) )
+            // InternalPerspectiveDsl.g:9791:1: ( ( rule__XEqualityExpression__Group_1_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:9789:1: ( ( rule__XEqualityExpression__Group_1_0__0 ) )
-            // InternalPerspectiveDsl.g:9790:2: ( rule__XEqualityExpression__Group_1_0__0 )
+            // InternalPerspectiveDsl.g:9791:1: ( ( rule__XEqualityExpression__Group_1_0__0 ) )
+            // InternalPerspectiveDsl.g:9792:2: ( rule__XEqualityExpression__Group_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0()); 
             }
-            // InternalPerspectiveDsl.g:9791:2: ( rule__XEqualityExpression__Group_1_0__0 )
-            // InternalPerspectiveDsl.g:9791:3: rule__XEqualityExpression__Group_1_0__0
+            // InternalPerspectiveDsl.g:9793:2: ( rule__XEqualityExpression__Group_1_0__0 )
+            // InternalPerspectiveDsl.g:9793:3: rule__XEqualityExpression__Group_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XEqualityExpression__Group_1_0__0();
@@ -32945,14 +32945,14 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1__1"
-    // InternalPerspectiveDsl.g:9799:1: rule__XEqualityExpression__Group_1__1 : rule__XEqualityExpression__Group_1__1__Impl ;
+    // InternalPerspectiveDsl.g:9801:1: rule__XEqualityExpression__Group_1__1 : rule__XEqualityExpression__Group_1__1__Impl ;
     public final void rule__XEqualityExpression__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9803:1: ( rule__XEqualityExpression__Group_1__1__Impl )
-            // InternalPerspectiveDsl.g:9804:2: rule__XEqualityExpression__Group_1__1__Impl
+            // InternalPerspectiveDsl.g:9805:1: ( rule__XEqualityExpression__Group_1__1__Impl )
+            // InternalPerspectiveDsl.g:9806:2: rule__XEqualityExpression__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XEqualityExpression__Group_1__1__Impl();
@@ -32978,23 +32978,23 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1__1__Impl"
-    // InternalPerspectiveDsl.g:9810:1: rule__XEqualityExpression__Group_1__1__Impl : ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:9812:1: rule__XEqualityExpression__Group_1__1__Impl : ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) ) ;
     public final void rule__XEqualityExpression__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9814:1: ( ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) ) )
-            // InternalPerspectiveDsl.g:9815:1: ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) )
+            // InternalPerspectiveDsl.g:9816:1: ( ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) ) )
+            // InternalPerspectiveDsl.g:9817:1: ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:9815:1: ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) )
-            // InternalPerspectiveDsl.g:9816:2: ( rule__XEqualityExpression__RightOperandAssignment_1_1 )
+            // InternalPerspectiveDsl.g:9817:1: ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) )
+            // InternalPerspectiveDsl.g:9818:2: ( rule__XEqualityExpression__RightOperandAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getRightOperandAssignment_1_1()); 
             }
-            // InternalPerspectiveDsl.g:9817:2: ( rule__XEqualityExpression__RightOperandAssignment_1_1 )
-            // InternalPerspectiveDsl.g:9817:3: rule__XEqualityExpression__RightOperandAssignment_1_1
+            // InternalPerspectiveDsl.g:9819:2: ( rule__XEqualityExpression__RightOperandAssignment_1_1 )
+            // InternalPerspectiveDsl.g:9819:3: rule__XEqualityExpression__RightOperandAssignment_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XEqualityExpression__RightOperandAssignment_1_1();
@@ -33029,14 +33029,14 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1_0__0"
-    // InternalPerspectiveDsl.g:9826:1: rule__XEqualityExpression__Group_1_0__0 : rule__XEqualityExpression__Group_1_0__0__Impl ;
+    // InternalPerspectiveDsl.g:9828:1: rule__XEqualityExpression__Group_1_0__0 : rule__XEqualityExpression__Group_1_0__0__Impl ;
     public final void rule__XEqualityExpression__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9830:1: ( rule__XEqualityExpression__Group_1_0__0__Impl )
-            // InternalPerspectiveDsl.g:9831:2: rule__XEqualityExpression__Group_1_0__0__Impl
+            // InternalPerspectiveDsl.g:9832:1: ( rule__XEqualityExpression__Group_1_0__0__Impl )
+            // InternalPerspectiveDsl.g:9833:2: rule__XEqualityExpression__Group_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XEqualityExpression__Group_1_0__0__Impl();
@@ -33062,23 +33062,23 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1_0__0__Impl"
-    // InternalPerspectiveDsl.g:9837:1: rule__XEqualityExpression__Group_1_0__0__Impl : ( ( rule__XEqualityExpression__Group_1_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:9839:1: rule__XEqualityExpression__Group_1_0__0__Impl : ( ( rule__XEqualityExpression__Group_1_0_0__0 ) ) ;
     public final void rule__XEqualityExpression__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9841:1: ( ( ( rule__XEqualityExpression__Group_1_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:9842:1: ( ( rule__XEqualityExpression__Group_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:9843:1: ( ( ( rule__XEqualityExpression__Group_1_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:9844:1: ( ( rule__XEqualityExpression__Group_1_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:9842:1: ( ( rule__XEqualityExpression__Group_1_0_0__0 ) )
-            // InternalPerspectiveDsl.g:9843:2: ( rule__XEqualityExpression__Group_1_0_0__0 )
+            // InternalPerspectiveDsl.g:9844:1: ( ( rule__XEqualityExpression__Group_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:9845:2: ( rule__XEqualityExpression__Group_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:9844:2: ( rule__XEqualityExpression__Group_1_0_0__0 )
-            // InternalPerspectiveDsl.g:9844:3: rule__XEqualityExpression__Group_1_0_0__0
+            // InternalPerspectiveDsl.g:9846:2: ( rule__XEqualityExpression__Group_1_0_0__0 )
+            // InternalPerspectiveDsl.g:9846:3: rule__XEqualityExpression__Group_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XEqualityExpression__Group_1_0_0__0();
@@ -33113,14 +33113,14 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1_0_0__0"
-    // InternalPerspectiveDsl.g:9853:1: rule__XEqualityExpression__Group_1_0_0__0 : rule__XEqualityExpression__Group_1_0_0__0__Impl rule__XEqualityExpression__Group_1_0_0__1 ;
+    // InternalPerspectiveDsl.g:9855:1: rule__XEqualityExpression__Group_1_0_0__0 : rule__XEqualityExpression__Group_1_0_0__0__Impl rule__XEqualityExpression__Group_1_0_0__1 ;
     public final void rule__XEqualityExpression__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9857:1: ( rule__XEqualityExpression__Group_1_0_0__0__Impl rule__XEqualityExpression__Group_1_0_0__1 )
-            // InternalPerspectiveDsl.g:9858:2: rule__XEqualityExpression__Group_1_0_0__0__Impl rule__XEqualityExpression__Group_1_0_0__1
+            // InternalPerspectiveDsl.g:9859:1: ( rule__XEqualityExpression__Group_1_0_0__0__Impl rule__XEqualityExpression__Group_1_0_0__1 )
+            // InternalPerspectiveDsl.g:9860:2: rule__XEqualityExpression__Group_1_0_0__0__Impl rule__XEqualityExpression__Group_1_0_0__1
             {
             pushFollow(FOLLOW_67);
             rule__XEqualityExpression__Group_1_0_0__0__Impl();
@@ -33151,23 +33151,23 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:9865:1: rule__XEqualityExpression__Group_1_0_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:9867:1: rule__XEqualityExpression__Group_1_0_0__0__Impl : ( () ) ;
     public final void rule__XEqualityExpression__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9869:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:9870:1: ( () )
+            // InternalPerspectiveDsl.g:9871:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:9872:1: ( () )
             {
-            // InternalPerspectiveDsl.g:9870:1: ( () )
-            // InternalPerspectiveDsl.g:9871:2: ()
+            // InternalPerspectiveDsl.g:9872:1: ( () )
+            // InternalPerspectiveDsl.g:9873:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:9872:2: ()
-            // InternalPerspectiveDsl.g:9872:3: 
+            // InternalPerspectiveDsl.g:9874:2: ()
+            // InternalPerspectiveDsl.g:9874:3: 
             {
             }
 
@@ -33192,14 +33192,14 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1_0_0__1"
-    // InternalPerspectiveDsl.g:9880:1: rule__XEqualityExpression__Group_1_0_0__1 : rule__XEqualityExpression__Group_1_0_0__1__Impl ;
+    // InternalPerspectiveDsl.g:9882:1: rule__XEqualityExpression__Group_1_0_0__1 : rule__XEqualityExpression__Group_1_0_0__1__Impl ;
     public final void rule__XEqualityExpression__Group_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9884:1: ( rule__XEqualityExpression__Group_1_0_0__1__Impl )
-            // InternalPerspectiveDsl.g:9885:2: rule__XEqualityExpression__Group_1_0_0__1__Impl
+            // InternalPerspectiveDsl.g:9886:1: ( rule__XEqualityExpression__Group_1_0_0__1__Impl )
+            // InternalPerspectiveDsl.g:9887:2: rule__XEqualityExpression__Group_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XEqualityExpression__Group_1_0_0__1__Impl();
@@ -33225,23 +33225,23 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:9891:1: rule__XEqualityExpression__Group_1_0_0__1__Impl : ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:9893:1: rule__XEqualityExpression__Group_1_0_0__1__Impl : ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) ) ;
     public final void rule__XEqualityExpression__Group_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9895:1: ( ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) ) )
-            // InternalPerspectiveDsl.g:9896:1: ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalPerspectiveDsl.g:9897:1: ( ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) ) )
+            // InternalPerspectiveDsl.g:9898:1: ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:9896:1: ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) )
-            // InternalPerspectiveDsl.g:9897:2: ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 )
+            // InternalPerspectiveDsl.g:9898:1: ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalPerspectiveDsl.g:9899:2: ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getFeatureAssignment_1_0_0_1()); 
             }
-            // InternalPerspectiveDsl.g:9898:2: ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 )
-            // InternalPerspectiveDsl.g:9898:3: rule__XEqualityExpression__FeatureAssignment_1_0_0_1
+            // InternalPerspectiveDsl.g:9900:2: ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 )
+            // InternalPerspectiveDsl.g:9900:3: rule__XEqualityExpression__FeatureAssignment_1_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XEqualityExpression__FeatureAssignment_1_0_0_1();
@@ -33276,14 +33276,14 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group__0"
-    // InternalPerspectiveDsl.g:9907:1: rule__XRelationalExpression__Group__0 : rule__XRelationalExpression__Group__0__Impl rule__XRelationalExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:9909:1: rule__XRelationalExpression__Group__0 : rule__XRelationalExpression__Group__0__Impl rule__XRelationalExpression__Group__1 ;
     public final void rule__XRelationalExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9911:1: ( rule__XRelationalExpression__Group__0__Impl rule__XRelationalExpression__Group__1 )
-            // InternalPerspectiveDsl.g:9912:2: rule__XRelationalExpression__Group__0__Impl rule__XRelationalExpression__Group__1
+            // InternalPerspectiveDsl.g:9913:1: ( rule__XRelationalExpression__Group__0__Impl rule__XRelationalExpression__Group__1 )
+            // InternalPerspectiveDsl.g:9914:2: rule__XRelationalExpression__Group__0__Impl rule__XRelationalExpression__Group__1
             {
             pushFollow(FOLLOW_69);
             rule__XRelationalExpression__Group__0__Impl();
@@ -33314,17 +33314,17 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:9919:1: rule__XRelationalExpression__Group__0__Impl : ( ruleXOtherOperatorExpression ) ;
+    // InternalPerspectiveDsl.g:9921:1: rule__XRelationalExpression__Group__0__Impl : ( ruleXOtherOperatorExpression ) ;
     public final void rule__XRelationalExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9923:1: ( ( ruleXOtherOperatorExpression ) )
-            // InternalPerspectiveDsl.g:9924:1: ( ruleXOtherOperatorExpression )
+            // InternalPerspectiveDsl.g:9925:1: ( ( ruleXOtherOperatorExpression ) )
+            // InternalPerspectiveDsl.g:9926:1: ( ruleXOtherOperatorExpression )
             {
-            // InternalPerspectiveDsl.g:9924:1: ( ruleXOtherOperatorExpression )
-            // InternalPerspectiveDsl.g:9925:2: ruleXOtherOperatorExpression
+            // InternalPerspectiveDsl.g:9926:1: ( ruleXOtherOperatorExpression )
+            // InternalPerspectiveDsl.g:9927:2: ruleXOtherOperatorExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0()); 
@@ -33359,14 +33359,14 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group__1"
-    // InternalPerspectiveDsl.g:9934:1: rule__XRelationalExpression__Group__1 : rule__XRelationalExpression__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:9936:1: rule__XRelationalExpression__Group__1 : rule__XRelationalExpression__Group__1__Impl ;
     public final void rule__XRelationalExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9938:1: ( rule__XRelationalExpression__Group__1__Impl )
-            // InternalPerspectiveDsl.g:9939:2: rule__XRelationalExpression__Group__1__Impl
+            // InternalPerspectiveDsl.g:9940:1: ( rule__XRelationalExpression__Group__1__Impl )
+            // InternalPerspectiveDsl.g:9941:2: rule__XRelationalExpression__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group__1__Impl();
@@ -33392,22 +33392,22 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:9945:1: rule__XRelationalExpression__Group__1__Impl : ( ( rule__XRelationalExpression__Alternatives_1 )* ) ;
+    // InternalPerspectiveDsl.g:9947:1: rule__XRelationalExpression__Group__1__Impl : ( ( rule__XRelationalExpression__Alternatives_1 )* ) ;
     public final void rule__XRelationalExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9949:1: ( ( ( rule__XRelationalExpression__Alternatives_1 )* ) )
-            // InternalPerspectiveDsl.g:9950:1: ( ( rule__XRelationalExpression__Alternatives_1 )* )
+            // InternalPerspectiveDsl.g:9951:1: ( ( ( rule__XRelationalExpression__Alternatives_1 )* ) )
+            // InternalPerspectiveDsl.g:9952:1: ( ( rule__XRelationalExpression__Alternatives_1 )* )
             {
-            // InternalPerspectiveDsl.g:9950:1: ( ( rule__XRelationalExpression__Alternatives_1 )* )
-            // InternalPerspectiveDsl.g:9951:2: ( rule__XRelationalExpression__Alternatives_1 )*
+            // InternalPerspectiveDsl.g:9952:1: ( ( rule__XRelationalExpression__Alternatives_1 )* )
+            // InternalPerspectiveDsl.g:9953:2: ( rule__XRelationalExpression__Alternatives_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getAlternatives_1()); 
             }
-            // InternalPerspectiveDsl.g:9952:2: ( rule__XRelationalExpression__Alternatives_1 )*
+            // InternalPerspectiveDsl.g:9954:2: ( rule__XRelationalExpression__Alternatives_1 )*
             loop74:
             do {
                 int alt74=2;
@@ -33461,7 +33461,7 @@
 
                 switch (alt74) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:9952:3: rule__XRelationalExpression__Alternatives_1
+            	    // InternalPerspectiveDsl.g:9954:3: rule__XRelationalExpression__Alternatives_1
             	    {
             	    pushFollow(FOLLOW_70);
             	    rule__XRelationalExpression__Alternatives_1();
@@ -33502,14 +33502,14 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0__0"
-    // InternalPerspectiveDsl.g:9961:1: rule__XRelationalExpression__Group_1_0__0 : rule__XRelationalExpression__Group_1_0__0__Impl rule__XRelationalExpression__Group_1_0__1 ;
+    // InternalPerspectiveDsl.g:9963:1: rule__XRelationalExpression__Group_1_0__0 : rule__XRelationalExpression__Group_1_0__0__Impl rule__XRelationalExpression__Group_1_0__1 ;
     public final void rule__XRelationalExpression__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9965:1: ( rule__XRelationalExpression__Group_1_0__0__Impl rule__XRelationalExpression__Group_1_0__1 )
-            // InternalPerspectiveDsl.g:9966:2: rule__XRelationalExpression__Group_1_0__0__Impl rule__XRelationalExpression__Group_1_0__1
+            // InternalPerspectiveDsl.g:9967:1: ( rule__XRelationalExpression__Group_1_0__0__Impl rule__XRelationalExpression__Group_1_0__1 )
+            // InternalPerspectiveDsl.g:9968:2: rule__XRelationalExpression__Group_1_0__0__Impl rule__XRelationalExpression__Group_1_0__1
             {
             pushFollow(FOLLOW_71);
             rule__XRelationalExpression__Group_1_0__0__Impl();
@@ -33540,23 +33540,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0__0__Impl"
-    // InternalPerspectiveDsl.g:9973:1: rule__XRelationalExpression__Group_1_0__0__Impl : ( ( rule__XRelationalExpression__Group_1_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:9975:1: rule__XRelationalExpression__Group_1_0__0__Impl : ( ( rule__XRelationalExpression__Group_1_0_0__0 ) ) ;
     public final void rule__XRelationalExpression__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9977:1: ( ( ( rule__XRelationalExpression__Group_1_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:9978:1: ( ( rule__XRelationalExpression__Group_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:9979:1: ( ( ( rule__XRelationalExpression__Group_1_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:9980:1: ( ( rule__XRelationalExpression__Group_1_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:9978:1: ( ( rule__XRelationalExpression__Group_1_0_0__0 ) )
-            // InternalPerspectiveDsl.g:9979:2: ( rule__XRelationalExpression__Group_1_0_0__0 )
+            // InternalPerspectiveDsl.g:9980:1: ( ( rule__XRelationalExpression__Group_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:9981:2: ( rule__XRelationalExpression__Group_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:9980:2: ( rule__XRelationalExpression__Group_1_0_0__0 )
-            // InternalPerspectiveDsl.g:9980:3: rule__XRelationalExpression__Group_1_0_0__0
+            // InternalPerspectiveDsl.g:9982:2: ( rule__XRelationalExpression__Group_1_0_0__0 )
+            // InternalPerspectiveDsl.g:9982:3: rule__XRelationalExpression__Group_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_0_0__0();
@@ -33591,14 +33591,14 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0__1"
-    // InternalPerspectiveDsl.g:9988:1: rule__XRelationalExpression__Group_1_0__1 : rule__XRelationalExpression__Group_1_0__1__Impl ;
+    // InternalPerspectiveDsl.g:9990:1: rule__XRelationalExpression__Group_1_0__1 : rule__XRelationalExpression__Group_1_0__1__Impl ;
     public final void rule__XRelationalExpression__Group_1_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:9992:1: ( rule__XRelationalExpression__Group_1_0__1__Impl )
-            // InternalPerspectiveDsl.g:9993:2: rule__XRelationalExpression__Group_1_0__1__Impl
+            // InternalPerspectiveDsl.g:9994:1: ( rule__XRelationalExpression__Group_1_0__1__Impl )
+            // InternalPerspectiveDsl.g:9995:2: rule__XRelationalExpression__Group_1_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_0__1__Impl();
@@ -33624,23 +33624,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0__1__Impl"
-    // InternalPerspectiveDsl.g:9999:1: rule__XRelationalExpression__Group_1_0__1__Impl : ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:10001:1: rule__XRelationalExpression__Group_1_0__1__Impl : ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) ) ;
     public final void rule__XRelationalExpression__Group_1_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10003:1: ( ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) ) )
-            // InternalPerspectiveDsl.g:10004:1: ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) )
+            // InternalPerspectiveDsl.g:10005:1: ( ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) ) )
+            // InternalPerspectiveDsl.g:10006:1: ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:10004:1: ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) )
-            // InternalPerspectiveDsl.g:10005:2: ( rule__XRelationalExpression__TypeAssignment_1_0_1 )
+            // InternalPerspectiveDsl.g:10006:1: ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) )
+            // InternalPerspectiveDsl.g:10007:2: ( rule__XRelationalExpression__TypeAssignment_1_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getTypeAssignment_1_0_1()); 
             }
-            // InternalPerspectiveDsl.g:10006:2: ( rule__XRelationalExpression__TypeAssignment_1_0_1 )
-            // InternalPerspectiveDsl.g:10006:3: rule__XRelationalExpression__TypeAssignment_1_0_1
+            // InternalPerspectiveDsl.g:10008:2: ( rule__XRelationalExpression__TypeAssignment_1_0_1 )
+            // InternalPerspectiveDsl.g:10008:3: rule__XRelationalExpression__TypeAssignment_1_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__TypeAssignment_1_0_1();
@@ -33675,14 +33675,14 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0_0__0"
-    // InternalPerspectiveDsl.g:10015:1: rule__XRelationalExpression__Group_1_0_0__0 : rule__XRelationalExpression__Group_1_0_0__0__Impl ;
+    // InternalPerspectiveDsl.g:10017:1: rule__XRelationalExpression__Group_1_0_0__0 : rule__XRelationalExpression__Group_1_0_0__0__Impl ;
     public final void rule__XRelationalExpression__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10019:1: ( rule__XRelationalExpression__Group_1_0_0__0__Impl )
-            // InternalPerspectiveDsl.g:10020:2: rule__XRelationalExpression__Group_1_0_0__0__Impl
+            // InternalPerspectiveDsl.g:10021:1: ( rule__XRelationalExpression__Group_1_0_0__0__Impl )
+            // InternalPerspectiveDsl.g:10022:2: rule__XRelationalExpression__Group_1_0_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_0_0__0__Impl();
@@ -33708,23 +33708,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:10026:1: rule__XRelationalExpression__Group_1_0_0__0__Impl : ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:10028:1: rule__XRelationalExpression__Group_1_0_0__0__Impl : ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) ) ;
     public final void rule__XRelationalExpression__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10030:1: ( ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:10031:1: ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) )
+            // InternalPerspectiveDsl.g:10032:1: ( ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:10033:1: ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:10031:1: ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) )
-            // InternalPerspectiveDsl.g:10032:2: ( rule__XRelationalExpression__Group_1_0_0_0__0 )
+            // InternalPerspectiveDsl.g:10033:1: ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) )
+            // InternalPerspectiveDsl.g:10034:2: ( rule__XRelationalExpression__Group_1_0_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:10033:2: ( rule__XRelationalExpression__Group_1_0_0_0__0 )
-            // InternalPerspectiveDsl.g:10033:3: rule__XRelationalExpression__Group_1_0_0_0__0
+            // InternalPerspectiveDsl.g:10035:2: ( rule__XRelationalExpression__Group_1_0_0_0__0 )
+            // InternalPerspectiveDsl.g:10035:3: rule__XRelationalExpression__Group_1_0_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_0_0_0__0();
@@ -33759,14 +33759,14 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0_0_0__0"
-    // InternalPerspectiveDsl.g:10042:1: rule__XRelationalExpression__Group_1_0_0_0__0 : rule__XRelationalExpression__Group_1_0_0_0__0__Impl rule__XRelationalExpression__Group_1_0_0_0__1 ;
+    // InternalPerspectiveDsl.g:10044:1: rule__XRelationalExpression__Group_1_0_0_0__0 : rule__XRelationalExpression__Group_1_0_0_0__0__Impl rule__XRelationalExpression__Group_1_0_0_0__1 ;
     public final void rule__XRelationalExpression__Group_1_0_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10046:1: ( rule__XRelationalExpression__Group_1_0_0_0__0__Impl rule__XRelationalExpression__Group_1_0_0_0__1 )
-            // InternalPerspectiveDsl.g:10047:2: rule__XRelationalExpression__Group_1_0_0_0__0__Impl rule__XRelationalExpression__Group_1_0_0_0__1
+            // InternalPerspectiveDsl.g:10048:1: ( rule__XRelationalExpression__Group_1_0_0_0__0__Impl rule__XRelationalExpression__Group_1_0_0_0__1 )
+            // InternalPerspectiveDsl.g:10049:2: rule__XRelationalExpression__Group_1_0_0_0__0__Impl rule__XRelationalExpression__Group_1_0_0_0__1
             {
             pushFollow(FOLLOW_72);
             rule__XRelationalExpression__Group_1_0_0_0__0__Impl();
@@ -33797,23 +33797,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:10054:1: rule__XRelationalExpression__Group_1_0_0_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:10056:1: rule__XRelationalExpression__Group_1_0_0_0__0__Impl : ( () ) ;
     public final void rule__XRelationalExpression__Group_1_0_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10058:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:10059:1: ( () )
+            // InternalPerspectiveDsl.g:10060:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:10061:1: ( () )
             {
-            // InternalPerspectiveDsl.g:10059:1: ( () )
-            // InternalPerspectiveDsl.g:10060:2: ()
+            // InternalPerspectiveDsl.g:10061:1: ( () )
+            // InternalPerspectiveDsl.g:10062:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:10061:2: ()
-            // InternalPerspectiveDsl.g:10061:3: 
+            // InternalPerspectiveDsl.g:10063:2: ()
+            // InternalPerspectiveDsl.g:10063:3: 
             {
             }
 
@@ -33838,14 +33838,14 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0_0_0__1"
-    // InternalPerspectiveDsl.g:10069:1: rule__XRelationalExpression__Group_1_0_0_0__1 : rule__XRelationalExpression__Group_1_0_0_0__1__Impl ;
+    // InternalPerspectiveDsl.g:10071:1: rule__XRelationalExpression__Group_1_0_0_0__1 : rule__XRelationalExpression__Group_1_0_0_0__1__Impl ;
     public final void rule__XRelationalExpression__Group_1_0_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10073:1: ( rule__XRelationalExpression__Group_1_0_0_0__1__Impl )
-            // InternalPerspectiveDsl.g:10074:2: rule__XRelationalExpression__Group_1_0_0_0__1__Impl
+            // InternalPerspectiveDsl.g:10075:1: ( rule__XRelationalExpression__Group_1_0_0_0__1__Impl )
+            // InternalPerspectiveDsl.g:10076:2: rule__XRelationalExpression__Group_1_0_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_0_0_0__1__Impl();
@@ -33871,17 +33871,17 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:10080:1: rule__XRelationalExpression__Group_1_0_0_0__1__Impl : ( 'instanceof' ) ;
+    // InternalPerspectiveDsl.g:10082:1: rule__XRelationalExpression__Group_1_0_0_0__1__Impl : ( 'instanceof' ) ;
     public final void rule__XRelationalExpression__Group_1_0_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10084:1: ( ( 'instanceof' ) )
-            // InternalPerspectiveDsl.g:10085:1: ( 'instanceof' )
+            // InternalPerspectiveDsl.g:10086:1: ( ( 'instanceof' ) )
+            // InternalPerspectiveDsl.g:10087:1: ( 'instanceof' )
             {
-            // InternalPerspectiveDsl.g:10085:1: ( 'instanceof' )
-            // InternalPerspectiveDsl.g:10086:2: 'instanceof'
+            // InternalPerspectiveDsl.g:10087:1: ( 'instanceof' )
+            // InternalPerspectiveDsl.g:10088:2: 'instanceof'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1()); 
@@ -33912,14 +33912,14 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1__0"
-    // InternalPerspectiveDsl.g:10096:1: rule__XRelationalExpression__Group_1_1__0 : rule__XRelationalExpression__Group_1_1__0__Impl rule__XRelationalExpression__Group_1_1__1 ;
+    // InternalPerspectiveDsl.g:10098:1: rule__XRelationalExpression__Group_1_1__0 : rule__XRelationalExpression__Group_1_1__0__Impl rule__XRelationalExpression__Group_1_1__1 ;
     public final void rule__XRelationalExpression__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10100:1: ( rule__XRelationalExpression__Group_1_1__0__Impl rule__XRelationalExpression__Group_1_1__1 )
-            // InternalPerspectiveDsl.g:10101:2: rule__XRelationalExpression__Group_1_1__0__Impl rule__XRelationalExpression__Group_1_1__1
+            // InternalPerspectiveDsl.g:10102:1: ( rule__XRelationalExpression__Group_1_1__0__Impl rule__XRelationalExpression__Group_1_1__1 )
+            // InternalPerspectiveDsl.g:10103:2: rule__XRelationalExpression__Group_1_1__0__Impl rule__XRelationalExpression__Group_1_1__1
             {
             pushFollow(FOLLOW_54);
             rule__XRelationalExpression__Group_1_1__0__Impl();
@@ -33950,23 +33950,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1__0__Impl"
-    // InternalPerspectiveDsl.g:10108:1: rule__XRelationalExpression__Group_1_1__0__Impl : ( ( rule__XRelationalExpression__Group_1_1_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:10110:1: rule__XRelationalExpression__Group_1_1__0__Impl : ( ( rule__XRelationalExpression__Group_1_1_0__0 ) ) ;
     public final void rule__XRelationalExpression__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10112:1: ( ( ( rule__XRelationalExpression__Group_1_1_0__0 ) ) )
-            // InternalPerspectiveDsl.g:10113:1: ( ( rule__XRelationalExpression__Group_1_1_0__0 ) )
+            // InternalPerspectiveDsl.g:10114:1: ( ( ( rule__XRelationalExpression__Group_1_1_0__0 ) ) )
+            // InternalPerspectiveDsl.g:10115:1: ( ( rule__XRelationalExpression__Group_1_1_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:10113:1: ( ( rule__XRelationalExpression__Group_1_1_0__0 ) )
-            // InternalPerspectiveDsl.g:10114:2: ( rule__XRelationalExpression__Group_1_1_0__0 )
+            // InternalPerspectiveDsl.g:10115:1: ( ( rule__XRelationalExpression__Group_1_1_0__0 ) )
+            // InternalPerspectiveDsl.g:10116:2: ( rule__XRelationalExpression__Group_1_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0()); 
             }
-            // InternalPerspectiveDsl.g:10115:2: ( rule__XRelationalExpression__Group_1_1_0__0 )
-            // InternalPerspectiveDsl.g:10115:3: rule__XRelationalExpression__Group_1_1_0__0
+            // InternalPerspectiveDsl.g:10117:2: ( rule__XRelationalExpression__Group_1_1_0__0 )
+            // InternalPerspectiveDsl.g:10117:3: rule__XRelationalExpression__Group_1_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_1_0__0();
@@ -34001,14 +34001,14 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1__1"
-    // InternalPerspectiveDsl.g:10123:1: rule__XRelationalExpression__Group_1_1__1 : rule__XRelationalExpression__Group_1_1__1__Impl ;
+    // InternalPerspectiveDsl.g:10125:1: rule__XRelationalExpression__Group_1_1__1 : rule__XRelationalExpression__Group_1_1__1__Impl ;
     public final void rule__XRelationalExpression__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10127:1: ( rule__XRelationalExpression__Group_1_1__1__Impl )
-            // InternalPerspectiveDsl.g:10128:2: rule__XRelationalExpression__Group_1_1__1__Impl
+            // InternalPerspectiveDsl.g:10129:1: ( rule__XRelationalExpression__Group_1_1__1__Impl )
+            // InternalPerspectiveDsl.g:10130:2: rule__XRelationalExpression__Group_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_1__1__Impl();
@@ -34034,23 +34034,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1__1__Impl"
-    // InternalPerspectiveDsl.g:10134:1: rule__XRelationalExpression__Group_1_1__1__Impl : ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:10136:1: rule__XRelationalExpression__Group_1_1__1__Impl : ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) ) ;
     public final void rule__XRelationalExpression__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10138:1: ( ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) ) )
-            // InternalPerspectiveDsl.g:10139:1: ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) )
+            // InternalPerspectiveDsl.g:10140:1: ( ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) ) )
+            // InternalPerspectiveDsl.g:10141:1: ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:10139:1: ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) )
-            // InternalPerspectiveDsl.g:10140:2: ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 )
+            // InternalPerspectiveDsl.g:10141:1: ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) )
+            // InternalPerspectiveDsl.g:10142:2: ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getRightOperandAssignment_1_1_1()); 
             }
-            // InternalPerspectiveDsl.g:10141:2: ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 )
-            // InternalPerspectiveDsl.g:10141:3: rule__XRelationalExpression__RightOperandAssignment_1_1_1
+            // InternalPerspectiveDsl.g:10143:2: ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 )
+            // InternalPerspectiveDsl.g:10143:3: rule__XRelationalExpression__RightOperandAssignment_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__RightOperandAssignment_1_1_1();
@@ -34085,14 +34085,14 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1_0__0"
-    // InternalPerspectiveDsl.g:10150:1: rule__XRelationalExpression__Group_1_1_0__0 : rule__XRelationalExpression__Group_1_1_0__0__Impl ;
+    // InternalPerspectiveDsl.g:10152:1: rule__XRelationalExpression__Group_1_1_0__0 : rule__XRelationalExpression__Group_1_1_0__0__Impl ;
     public final void rule__XRelationalExpression__Group_1_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10154:1: ( rule__XRelationalExpression__Group_1_1_0__0__Impl )
-            // InternalPerspectiveDsl.g:10155:2: rule__XRelationalExpression__Group_1_1_0__0__Impl
+            // InternalPerspectiveDsl.g:10156:1: ( rule__XRelationalExpression__Group_1_1_0__0__Impl )
+            // InternalPerspectiveDsl.g:10157:2: rule__XRelationalExpression__Group_1_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_1_0__0__Impl();
@@ -34118,23 +34118,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1_0__0__Impl"
-    // InternalPerspectiveDsl.g:10161:1: rule__XRelationalExpression__Group_1_1_0__0__Impl : ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:10163:1: rule__XRelationalExpression__Group_1_1_0__0__Impl : ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) ) ;
     public final void rule__XRelationalExpression__Group_1_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10165:1: ( ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:10166:1: ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:10167:1: ( ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:10168:1: ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:10166:1: ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) )
-            // InternalPerspectiveDsl.g:10167:2: ( rule__XRelationalExpression__Group_1_1_0_0__0 )
+            // InternalPerspectiveDsl.g:10168:1: ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:10169:2: ( rule__XRelationalExpression__Group_1_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:10168:2: ( rule__XRelationalExpression__Group_1_1_0_0__0 )
-            // InternalPerspectiveDsl.g:10168:3: rule__XRelationalExpression__Group_1_1_0_0__0
+            // InternalPerspectiveDsl.g:10170:2: ( rule__XRelationalExpression__Group_1_1_0_0__0 )
+            // InternalPerspectiveDsl.g:10170:3: rule__XRelationalExpression__Group_1_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_1_0_0__0();
@@ -34169,14 +34169,14 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1_0_0__0"
-    // InternalPerspectiveDsl.g:10177:1: rule__XRelationalExpression__Group_1_1_0_0__0 : rule__XRelationalExpression__Group_1_1_0_0__0__Impl rule__XRelationalExpression__Group_1_1_0_0__1 ;
+    // InternalPerspectiveDsl.g:10179:1: rule__XRelationalExpression__Group_1_1_0_0__0 : rule__XRelationalExpression__Group_1_1_0_0__0__Impl rule__XRelationalExpression__Group_1_1_0_0__1 ;
     public final void rule__XRelationalExpression__Group_1_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10181:1: ( rule__XRelationalExpression__Group_1_1_0_0__0__Impl rule__XRelationalExpression__Group_1_1_0_0__1 )
-            // InternalPerspectiveDsl.g:10182:2: rule__XRelationalExpression__Group_1_1_0_0__0__Impl rule__XRelationalExpression__Group_1_1_0_0__1
+            // InternalPerspectiveDsl.g:10183:1: ( rule__XRelationalExpression__Group_1_1_0_0__0__Impl rule__XRelationalExpression__Group_1_1_0_0__1 )
+            // InternalPerspectiveDsl.g:10184:2: rule__XRelationalExpression__Group_1_1_0_0__0__Impl rule__XRelationalExpression__Group_1_1_0_0__1
             {
             pushFollow(FOLLOW_69);
             rule__XRelationalExpression__Group_1_1_0_0__0__Impl();
@@ -34207,23 +34207,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:10189:1: rule__XRelationalExpression__Group_1_1_0_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:10191:1: rule__XRelationalExpression__Group_1_1_0_0__0__Impl : ( () ) ;
     public final void rule__XRelationalExpression__Group_1_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10193:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:10194:1: ( () )
+            // InternalPerspectiveDsl.g:10195:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:10196:1: ( () )
             {
-            // InternalPerspectiveDsl.g:10194:1: ( () )
-            // InternalPerspectiveDsl.g:10195:2: ()
+            // InternalPerspectiveDsl.g:10196:1: ( () )
+            // InternalPerspectiveDsl.g:10197:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:10196:2: ()
-            // InternalPerspectiveDsl.g:10196:3: 
+            // InternalPerspectiveDsl.g:10198:2: ()
+            // InternalPerspectiveDsl.g:10198:3: 
             {
             }
 
@@ -34248,14 +34248,14 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1_0_0__1"
-    // InternalPerspectiveDsl.g:10204:1: rule__XRelationalExpression__Group_1_1_0_0__1 : rule__XRelationalExpression__Group_1_1_0_0__1__Impl ;
+    // InternalPerspectiveDsl.g:10206:1: rule__XRelationalExpression__Group_1_1_0_0__1 : rule__XRelationalExpression__Group_1_1_0_0__1__Impl ;
     public final void rule__XRelationalExpression__Group_1_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10208:1: ( rule__XRelationalExpression__Group_1_1_0_0__1__Impl )
-            // InternalPerspectiveDsl.g:10209:2: rule__XRelationalExpression__Group_1_1_0_0__1__Impl
+            // InternalPerspectiveDsl.g:10210:1: ( rule__XRelationalExpression__Group_1_1_0_0__1__Impl )
+            // InternalPerspectiveDsl.g:10211:2: rule__XRelationalExpression__Group_1_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_1_0_0__1__Impl();
@@ -34281,23 +34281,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:10215:1: rule__XRelationalExpression__Group_1_1_0_0__1__Impl : ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:10217:1: rule__XRelationalExpression__Group_1_1_0_0__1__Impl : ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) ) ;
     public final void rule__XRelationalExpression__Group_1_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10219:1: ( ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) ) )
-            // InternalPerspectiveDsl.g:10220:1: ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) )
+            // InternalPerspectiveDsl.g:10221:1: ( ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) ) )
+            // InternalPerspectiveDsl.g:10222:1: ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:10220:1: ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) )
-            // InternalPerspectiveDsl.g:10221:2: ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 )
+            // InternalPerspectiveDsl.g:10222:1: ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) )
+            // InternalPerspectiveDsl.g:10223:2: ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getFeatureAssignment_1_1_0_0_1()); 
             }
-            // InternalPerspectiveDsl.g:10222:2: ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 )
-            // InternalPerspectiveDsl.g:10222:3: rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1
+            // InternalPerspectiveDsl.g:10224:2: ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 )
+            // InternalPerspectiveDsl.g:10224:3: rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1();
@@ -34332,14 +34332,14 @@
 
 
     // $ANTLR start "rule__OpCompare__Group_1__0"
-    // InternalPerspectiveDsl.g:10231:1: rule__OpCompare__Group_1__0 : rule__OpCompare__Group_1__0__Impl rule__OpCompare__Group_1__1 ;
+    // InternalPerspectiveDsl.g:10233:1: rule__OpCompare__Group_1__0 : rule__OpCompare__Group_1__0__Impl rule__OpCompare__Group_1__1 ;
     public final void rule__OpCompare__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10235:1: ( rule__OpCompare__Group_1__0__Impl rule__OpCompare__Group_1__1 )
-            // InternalPerspectiveDsl.g:10236:2: rule__OpCompare__Group_1__0__Impl rule__OpCompare__Group_1__1
+            // InternalPerspectiveDsl.g:10237:1: ( rule__OpCompare__Group_1__0__Impl rule__OpCompare__Group_1__1 )
+            // InternalPerspectiveDsl.g:10238:2: rule__OpCompare__Group_1__0__Impl rule__OpCompare__Group_1__1
             {
             pushFollow(FOLLOW_55);
             rule__OpCompare__Group_1__0__Impl();
@@ -34370,17 +34370,17 @@
 
 
     // $ANTLR start "rule__OpCompare__Group_1__0__Impl"
-    // InternalPerspectiveDsl.g:10243:1: rule__OpCompare__Group_1__0__Impl : ( '<' ) ;
+    // InternalPerspectiveDsl.g:10245:1: rule__OpCompare__Group_1__0__Impl : ( '<' ) ;
     public final void rule__OpCompare__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10247:1: ( ( '<' ) )
-            // InternalPerspectiveDsl.g:10248:1: ( '<' )
+            // InternalPerspectiveDsl.g:10249:1: ( ( '<' ) )
+            // InternalPerspectiveDsl.g:10250:1: ( '<' )
             {
-            // InternalPerspectiveDsl.g:10248:1: ( '<' )
-            // InternalPerspectiveDsl.g:10249:2: '<'
+            // InternalPerspectiveDsl.g:10250:1: ( '<' )
+            // InternalPerspectiveDsl.g:10251:2: '<'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0()); 
@@ -34411,14 +34411,14 @@
 
 
     // $ANTLR start "rule__OpCompare__Group_1__1"
-    // InternalPerspectiveDsl.g:10258:1: rule__OpCompare__Group_1__1 : rule__OpCompare__Group_1__1__Impl ;
+    // InternalPerspectiveDsl.g:10260:1: rule__OpCompare__Group_1__1 : rule__OpCompare__Group_1__1__Impl ;
     public final void rule__OpCompare__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10262:1: ( rule__OpCompare__Group_1__1__Impl )
-            // InternalPerspectiveDsl.g:10263:2: rule__OpCompare__Group_1__1__Impl
+            // InternalPerspectiveDsl.g:10264:1: ( rule__OpCompare__Group_1__1__Impl )
+            // InternalPerspectiveDsl.g:10265:2: rule__OpCompare__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpCompare__Group_1__1__Impl();
@@ -34444,17 +34444,17 @@
 
 
     // $ANTLR start "rule__OpCompare__Group_1__1__Impl"
-    // InternalPerspectiveDsl.g:10269:1: rule__OpCompare__Group_1__1__Impl : ( '=' ) ;
+    // InternalPerspectiveDsl.g:10271:1: rule__OpCompare__Group_1__1__Impl : ( '=' ) ;
     public final void rule__OpCompare__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10273:1: ( ( '=' ) )
-            // InternalPerspectiveDsl.g:10274:1: ( '=' )
+            // InternalPerspectiveDsl.g:10275:1: ( ( '=' ) )
+            // InternalPerspectiveDsl.g:10276:1: ( '=' )
             {
-            // InternalPerspectiveDsl.g:10274:1: ( '=' )
-            // InternalPerspectiveDsl.g:10275:2: '='
+            // InternalPerspectiveDsl.g:10276:1: ( '=' )
+            // InternalPerspectiveDsl.g:10277:2: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1()); 
@@ -34485,14 +34485,14 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group__0"
-    // InternalPerspectiveDsl.g:10285:1: rule__XOtherOperatorExpression__Group__0 : rule__XOtherOperatorExpression__Group__0__Impl rule__XOtherOperatorExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:10287:1: rule__XOtherOperatorExpression__Group__0 : rule__XOtherOperatorExpression__Group__0__Impl rule__XOtherOperatorExpression__Group__1 ;
     public final void rule__XOtherOperatorExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10289:1: ( rule__XOtherOperatorExpression__Group__0__Impl rule__XOtherOperatorExpression__Group__1 )
-            // InternalPerspectiveDsl.g:10290:2: rule__XOtherOperatorExpression__Group__0__Impl rule__XOtherOperatorExpression__Group__1
+            // InternalPerspectiveDsl.g:10291:1: ( rule__XOtherOperatorExpression__Group__0__Impl rule__XOtherOperatorExpression__Group__1 )
+            // InternalPerspectiveDsl.g:10292:2: rule__XOtherOperatorExpression__Group__0__Impl rule__XOtherOperatorExpression__Group__1
             {
             pushFollow(FOLLOW_73);
             rule__XOtherOperatorExpression__Group__0__Impl();
@@ -34523,17 +34523,17 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:10297:1: rule__XOtherOperatorExpression__Group__0__Impl : ( ruleXAdditiveExpression ) ;
+    // InternalPerspectiveDsl.g:10299:1: rule__XOtherOperatorExpression__Group__0__Impl : ( ruleXAdditiveExpression ) ;
     public final void rule__XOtherOperatorExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10301:1: ( ( ruleXAdditiveExpression ) )
-            // InternalPerspectiveDsl.g:10302:1: ( ruleXAdditiveExpression )
+            // InternalPerspectiveDsl.g:10303:1: ( ( ruleXAdditiveExpression ) )
+            // InternalPerspectiveDsl.g:10304:1: ( ruleXAdditiveExpression )
             {
-            // InternalPerspectiveDsl.g:10302:1: ( ruleXAdditiveExpression )
-            // InternalPerspectiveDsl.g:10303:2: ruleXAdditiveExpression
+            // InternalPerspectiveDsl.g:10304:1: ( ruleXAdditiveExpression )
+            // InternalPerspectiveDsl.g:10305:2: ruleXAdditiveExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0()); 
@@ -34568,14 +34568,14 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group__1"
-    // InternalPerspectiveDsl.g:10312:1: rule__XOtherOperatorExpression__Group__1 : rule__XOtherOperatorExpression__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:10314:1: rule__XOtherOperatorExpression__Group__1 : rule__XOtherOperatorExpression__Group__1__Impl ;
     public final void rule__XOtherOperatorExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10316:1: ( rule__XOtherOperatorExpression__Group__1__Impl )
-            // InternalPerspectiveDsl.g:10317:2: rule__XOtherOperatorExpression__Group__1__Impl
+            // InternalPerspectiveDsl.g:10318:1: ( rule__XOtherOperatorExpression__Group__1__Impl )
+            // InternalPerspectiveDsl.g:10319:2: rule__XOtherOperatorExpression__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XOtherOperatorExpression__Group__1__Impl();
@@ -34601,29 +34601,29 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:10323:1: rule__XOtherOperatorExpression__Group__1__Impl : ( ( rule__XOtherOperatorExpression__Group_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:10325:1: rule__XOtherOperatorExpression__Group__1__Impl : ( ( rule__XOtherOperatorExpression__Group_1__0 )* ) ;
     public final void rule__XOtherOperatorExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10327:1: ( ( ( rule__XOtherOperatorExpression__Group_1__0 )* ) )
-            // InternalPerspectiveDsl.g:10328:1: ( ( rule__XOtherOperatorExpression__Group_1__0 )* )
+            // InternalPerspectiveDsl.g:10329:1: ( ( ( rule__XOtherOperatorExpression__Group_1__0 )* ) )
+            // InternalPerspectiveDsl.g:10330:1: ( ( rule__XOtherOperatorExpression__Group_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:10328:1: ( ( rule__XOtherOperatorExpression__Group_1__0 )* )
-            // InternalPerspectiveDsl.g:10329:2: ( rule__XOtherOperatorExpression__Group_1__0 )*
+            // InternalPerspectiveDsl.g:10330:1: ( ( rule__XOtherOperatorExpression__Group_1__0 )* )
+            // InternalPerspectiveDsl.g:10331:2: ( rule__XOtherOperatorExpression__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1()); 
             }
-            // InternalPerspectiveDsl.g:10330:2: ( rule__XOtherOperatorExpression__Group_1__0 )*
+            // InternalPerspectiveDsl.g:10332:2: ( rule__XOtherOperatorExpression__Group_1__0 )*
             loop75:
             do {
                 int alt75=2;
                 alt75 = dfa75.predict(input);
                 switch (alt75) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:10330:3: rule__XOtherOperatorExpression__Group_1__0
+            	    // InternalPerspectiveDsl.g:10332:3: rule__XOtherOperatorExpression__Group_1__0
             	    {
             	    pushFollow(FOLLOW_74);
             	    rule__XOtherOperatorExpression__Group_1__0();
@@ -34664,14 +34664,14 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1__0"
-    // InternalPerspectiveDsl.g:10339:1: rule__XOtherOperatorExpression__Group_1__0 : rule__XOtherOperatorExpression__Group_1__0__Impl rule__XOtherOperatorExpression__Group_1__1 ;
+    // InternalPerspectiveDsl.g:10341:1: rule__XOtherOperatorExpression__Group_1__0 : rule__XOtherOperatorExpression__Group_1__0__Impl rule__XOtherOperatorExpression__Group_1__1 ;
     public final void rule__XOtherOperatorExpression__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10343:1: ( rule__XOtherOperatorExpression__Group_1__0__Impl rule__XOtherOperatorExpression__Group_1__1 )
-            // InternalPerspectiveDsl.g:10344:2: rule__XOtherOperatorExpression__Group_1__0__Impl rule__XOtherOperatorExpression__Group_1__1
+            // InternalPerspectiveDsl.g:10345:1: ( rule__XOtherOperatorExpression__Group_1__0__Impl rule__XOtherOperatorExpression__Group_1__1 )
+            // InternalPerspectiveDsl.g:10346:2: rule__XOtherOperatorExpression__Group_1__0__Impl rule__XOtherOperatorExpression__Group_1__1
             {
             pushFollow(FOLLOW_54);
             rule__XOtherOperatorExpression__Group_1__0__Impl();
@@ -34702,23 +34702,23 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1__0__Impl"
-    // InternalPerspectiveDsl.g:10351:1: rule__XOtherOperatorExpression__Group_1__0__Impl : ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:10353:1: rule__XOtherOperatorExpression__Group_1__0__Impl : ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) ) ;
     public final void rule__XOtherOperatorExpression__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10355:1: ( ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) ) )
-            // InternalPerspectiveDsl.g:10356:1: ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) )
+            // InternalPerspectiveDsl.g:10357:1: ( ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) ) )
+            // InternalPerspectiveDsl.g:10358:1: ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:10356:1: ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) )
-            // InternalPerspectiveDsl.g:10357:2: ( rule__XOtherOperatorExpression__Group_1_0__0 )
+            // InternalPerspectiveDsl.g:10358:1: ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) )
+            // InternalPerspectiveDsl.g:10359:2: ( rule__XOtherOperatorExpression__Group_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0()); 
             }
-            // InternalPerspectiveDsl.g:10358:2: ( rule__XOtherOperatorExpression__Group_1_0__0 )
-            // InternalPerspectiveDsl.g:10358:3: rule__XOtherOperatorExpression__Group_1_0__0
+            // InternalPerspectiveDsl.g:10360:2: ( rule__XOtherOperatorExpression__Group_1_0__0 )
+            // InternalPerspectiveDsl.g:10360:3: rule__XOtherOperatorExpression__Group_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XOtherOperatorExpression__Group_1_0__0();
@@ -34753,14 +34753,14 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1__1"
-    // InternalPerspectiveDsl.g:10366:1: rule__XOtherOperatorExpression__Group_1__1 : rule__XOtherOperatorExpression__Group_1__1__Impl ;
+    // InternalPerspectiveDsl.g:10368:1: rule__XOtherOperatorExpression__Group_1__1 : rule__XOtherOperatorExpression__Group_1__1__Impl ;
     public final void rule__XOtherOperatorExpression__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10370:1: ( rule__XOtherOperatorExpression__Group_1__1__Impl )
-            // InternalPerspectiveDsl.g:10371:2: rule__XOtherOperatorExpression__Group_1__1__Impl
+            // InternalPerspectiveDsl.g:10372:1: ( rule__XOtherOperatorExpression__Group_1__1__Impl )
+            // InternalPerspectiveDsl.g:10373:2: rule__XOtherOperatorExpression__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XOtherOperatorExpression__Group_1__1__Impl();
@@ -34786,23 +34786,23 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1__1__Impl"
-    // InternalPerspectiveDsl.g:10377:1: rule__XOtherOperatorExpression__Group_1__1__Impl : ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:10379:1: rule__XOtherOperatorExpression__Group_1__1__Impl : ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) ) ;
     public final void rule__XOtherOperatorExpression__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10381:1: ( ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) ) )
-            // InternalPerspectiveDsl.g:10382:1: ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) )
+            // InternalPerspectiveDsl.g:10383:1: ( ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) ) )
+            // InternalPerspectiveDsl.g:10384:1: ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:10382:1: ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) )
-            // InternalPerspectiveDsl.g:10383:2: ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 )
+            // InternalPerspectiveDsl.g:10384:1: ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) )
+            // InternalPerspectiveDsl.g:10385:2: ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandAssignment_1_1()); 
             }
-            // InternalPerspectiveDsl.g:10384:2: ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 )
-            // InternalPerspectiveDsl.g:10384:3: rule__XOtherOperatorExpression__RightOperandAssignment_1_1
+            // InternalPerspectiveDsl.g:10386:2: ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 )
+            // InternalPerspectiveDsl.g:10386:3: rule__XOtherOperatorExpression__RightOperandAssignment_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XOtherOperatorExpression__RightOperandAssignment_1_1();
@@ -34837,14 +34837,14 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1_0__0"
-    // InternalPerspectiveDsl.g:10393:1: rule__XOtherOperatorExpression__Group_1_0__0 : rule__XOtherOperatorExpression__Group_1_0__0__Impl ;
+    // InternalPerspectiveDsl.g:10395:1: rule__XOtherOperatorExpression__Group_1_0__0 : rule__XOtherOperatorExpression__Group_1_0__0__Impl ;
     public final void rule__XOtherOperatorExpression__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10397:1: ( rule__XOtherOperatorExpression__Group_1_0__0__Impl )
-            // InternalPerspectiveDsl.g:10398:2: rule__XOtherOperatorExpression__Group_1_0__0__Impl
+            // InternalPerspectiveDsl.g:10399:1: ( rule__XOtherOperatorExpression__Group_1_0__0__Impl )
+            // InternalPerspectiveDsl.g:10400:2: rule__XOtherOperatorExpression__Group_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XOtherOperatorExpression__Group_1_0__0__Impl();
@@ -34870,23 +34870,23 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1_0__0__Impl"
-    // InternalPerspectiveDsl.g:10404:1: rule__XOtherOperatorExpression__Group_1_0__0__Impl : ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:10406:1: rule__XOtherOperatorExpression__Group_1_0__0__Impl : ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) ) ;
     public final void rule__XOtherOperatorExpression__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10408:1: ( ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:10409:1: ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:10410:1: ( ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:10411:1: ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:10409:1: ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) )
-            // InternalPerspectiveDsl.g:10410:2: ( rule__XOtherOperatorExpression__Group_1_0_0__0 )
+            // InternalPerspectiveDsl.g:10411:1: ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:10412:2: ( rule__XOtherOperatorExpression__Group_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:10411:2: ( rule__XOtherOperatorExpression__Group_1_0_0__0 )
-            // InternalPerspectiveDsl.g:10411:3: rule__XOtherOperatorExpression__Group_1_0_0__0
+            // InternalPerspectiveDsl.g:10413:2: ( rule__XOtherOperatorExpression__Group_1_0_0__0 )
+            // InternalPerspectiveDsl.g:10413:3: rule__XOtherOperatorExpression__Group_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XOtherOperatorExpression__Group_1_0_0__0();
@@ -34921,14 +34921,14 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1_0_0__0"
-    // InternalPerspectiveDsl.g:10420:1: rule__XOtherOperatorExpression__Group_1_0_0__0 : rule__XOtherOperatorExpression__Group_1_0_0__0__Impl rule__XOtherOperatorExpression__Group_1_0_0__1 ;
+    // InternalPerspectiveDsl.g:10422:1: rule__XOtherOperatorExpression__Group_1_0_0__0 : rule__XOtherOperatorExpression__Group_1_0_0__0__Impl rule__XOtherOperatorExpression__Group_1_0_0__1 ;
     public final void rule__XOtherOperatorExpression__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10424:1: ( rule__XOtherOperatorExpression__Group_1_0_0__0__Impl rule__XOtherOperatorExpression__Group_1_0_0__1 )
-            // InternalPerspectiveDsl.g:10425:2: rule__XOtherOperatorExpression__Group_1_0_0__0__Impl rule__XOtherOperatorExpression__Group_1_0_0__1
+            // InternalPerspectiveDsl.g:10426:1: ( rule__XOtherOperatorExpression__Group_1_0_0__0__Impl rule__XOtherOperatorExpression__Group_1_0_0__1 )
+            // InternalPerspectiveDsl.g:10427:2: rule__XOtherOperatorExpression__Group_1_0_0__0__Impl rule__XOtherOperatorExpression__Group_1_0_0__1
             {
             pushFollow(FOLLOW_73);
             rule__XOtherOperatorExpression__Group_1_0_0__0__Impl();
@@ -34959,23 +34959,23 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:10432:1: rule__XOtherOperatorExpression__Group_1_0_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:10434:1: rule__XOtherOperatorExpression__Group_1_0_0__0__Impl : ( () ) ;
     public final void rule__XOtherOperatorExpression__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10436:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:10437:1: ( () )
+            // InternalPerspectiveDsl.g:10438:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:10439:1: ( () )
             {
-            // InternalPerspectiveDsl.g:10437:1: ( () )
-            // InternalPerspectiveDsl.g:10438:2: ()
+            // InternalPerspectiveDsl.g:10439:1: ( () )
+            // InternalPerspectiveDsl.g:10440:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:10439:2: ()
-            // InternalPerspectiveDsl.g:10439:3: 
+            // InternalPerspectiveDsl.g:10441:2: ()
+            // InternalPerspectiveDsl.g:10441:3: 
             {
             }
 
@@ -35000,14 +35000,14 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1_0_0__1"
-    // InternalPerspectiveDsl.g:10447:1: rule__XOtherOperatorExpression__Group_1_0_0__1 : rule__XOtherOperatorExpression__Group_1_0_0__1__Impl ;
+    // InternalPerspectiveDsl.g:10449:1: rule__XOtherOperatorExpression__Group_1_0_0__1 : rule__XOtherOperatorExpression__Group_1_0_0__1__Impl ;
     public final void rule__XOtherOperatorExpression__Group_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10451:1: ( rule__XOtherOperatorExpression__Group_1_0_0__1__Impl )
-            // InternalPerspectiveDsl.g:10452:2: rule__XOtherOperatorExpression__Group_1_0_0__1__Impl
+            // InternalPerspectiveDsl.g:10453:1: ( rule__XOtherOperatorExpression__Group_1_0_0__1__Impl )
+            // InternalPerspectiveDsl.g:10454:2: rule__XOtherOperatorExpression__Group_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XOtherOperatorExpression__Group_1_0_0__1__Impl();
@@ -35033,23 +35033,23 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:10458:1: rule__XOtherOperatorExpression__Group_1_0_0__1__Impl : ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:10460:1: rule__XOtherOperatorExpression__Group_1_0_0__1__Impl : ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) ) ;
     public final void rule__XOtherOperatorExpression__Group_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10462:1: ( ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) ) )
-            // InternalPerspectiveDsl.g:10463:1: ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalPerspectiveDsl.g:10464:1: ( ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) ) )
+            // InternalPerspectiveDsl.g:10465:1: ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:10463:1: ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) )
-            // InternalPerspectiveDsl.g:10464:2: ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 )
+            // InternalPerspectiveDsl.g:10465:1: ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalPerspectiveDsl.g:10466:2: ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureAssignment_1_0_0_1()); 
             }
-            // InternalPerspectiveDsl.g:10465:2: ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 )
-            // InternalPerspectiveDsl.g:10465:3: rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1
+            // InternalPerspectiveDsl.g:10467:2: ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 )
+            // InternalPerspectiveDsl.g:10467:3: rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1();
@@ -35084,14 +35084,14 @@
 
 
     // $ANTLR start "rule__OpOther__Group_2__0"
-    // InternalPerspectiveDsl.g:10474:1: rule__OpOther__Group_2__0 : rule__OpOther__Group_2__0__Impl rule__OpOther__Group_2__1 ;
+    // InternalPerspectiveDsl.g:10476:1: rule__OpOther__Group_2__0 : rule__OpOther__Group_2__0__Impl rule__OpOther__Group_2__1 ;
     public final void rule__OpOther__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10478:1: ( rule__OpOther__Group_2__0__Impl rule__OpOther__Group_2__1 )
-            // InternalPerspectiveDsl.g:10479:2: rule__OpOther__Group_2__0__Impl rule__OpOther__Group_2__1
+            // InternalPerspectiveDsl.g:10480:1: ( rule__OpOther__Group_2__0__Impl rule__OpOther__Group_2__1 )
+            // InternalPerspectiveDsl.g:10481:2: rule__OpOther__Group_2__0__Impl rule__OpOther__Group_2__1
             {
             pushFollow(FOLLOW_75);
             rule__OpOther__Group_2__0__Impl();
@@ -35122,17 +35122,17 @@
 
 
     // $ANTLR start "rule__OpOther__Group_2__0__Impl"
-    // InternalPerspectiveDsl.g:10486:1: rule__OpOther__Group_2__0__Impl : ( '>' ) ;
+    // InternalPerspectiveDsl.g:10488:1: rule__OpOther__Group_2__0__Impl : ( '>' ) ;
     public final void rule__OpOther__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10490:1: ( ( '>' ) )
-            // InternalPerspectiveDsl.g:10491:1: ( '>' )
+            // InternalPerspectiveDsl.g:10492:1: ( ( '>' ) )
+            // InternalPerspectiveDsl.g:10493:1: ( '>' )
             {
-            // InternalPerspectiveDsl.g:10491:1: ( '>' )
-            // InternalPerspectiveDsl.g:10492:2: '>'
+            // InternalPerspectiveDsl.g:10493:1: ( '>' )
+            // InternalPerspectiveDsl.g:10494:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0()); 
@@ -35163,14 +35163,14 @@
 
 
     // $ANTLR start "rule__OpOther__Group_2__1"
-    // InternalPerspectiveDsl.g:10501:1: rule__OpOther__Group_2__1 : rule__OpOther__Group_2__1__Impl ;
+    // InternalPerspectiveDsl.g:10503:1: rule__OpOther__Group_2__1 : rule__OpOther__Group_2__1__Impl ;
     public final void rule__OpOther__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10505:1: ( rule__OpOther__Group_2__1__Impl )
-            // InternalPerspectiveDsl.g:10506:2: rule__OpOther__Group_2__1__Impl
+            // InternalPerspectiveDsl.g:10507:1: ( rule__OpOther__Group_2__1__Impl )
+            // InternalPerspectiveDsl.g:10508:2: rule__OpOther__Group_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Group_2__1__Impl();
@@ -35196,17 +35196,17 @@
 
 
     // $ANTLR start "rule__OpOther__Group_2__1__Impl"
-    // InternalPerspectiveDsl.g:10512:1: rule__OpOther__Group_2__1__Impl : ( '..' ) ;
+    // InternalPerspectiveDsl.g:10514:1: rule__OpOther__Group_2__1__Impl : ( '..' ) ;
     public final void rule__OpOther__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10516:1: ( ( '..' ) )
-            // InternalPerspectiveDsl.g:10517:1: ( '..' )
+            // InternalPerspectiveDsl.g:10518:1: ( ( '..' ) )
+            // InternalPerspectiveDsl.g:10519:1: ( '..' )
             {
-            // InternalPerspectiveDsl.g:10517:1: ( '..' )
-            // InternalPerspectiveDsl.g:10518:2: '..'
+            // InternalPerspectiveDsl.g:10519:1: ( '..' )
+            // InternalPerspectiveDsl.g:10520:2: '..'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1()); 
@@ -35237,14 +35237,14 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5__0"
-    // InternalPerspectiveDsl.g:10528:1: rule__OpOther__Group_5__0 : rule__OpOther__Group_5__0__Impl rule__OpOther__Group_5__1 ;
+    // InternalPerspectiveDsl.g:10530:1: rule__OpOther__Group_5__0 : rule__OpOther__Group_5__0__Impl rule__OpOther__Group_5__1 ;
     public final void rule__OpOther__Group_5__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10532:1: ( rule__OpOther__Group_5__0__Impl rule__OpOther__Group_5__1 )
-            // InternalPerspectiveDsl.g:10533:2: rule__OpOther__Group_5__0__Impl rule__OpOther__Group_5__1
+            // InternalPerspectiveDsl.g:10534:1: ( rule__OpOther__Group_5__0__Impl rule__OpOther__Group_5__1 )
+            // InternalPerspectiveDsl.g:10535:2: rule__OpOther__Group_5__0__Impl rule__OpOther__Group_5__1
             {
             pushFollow(FOLLOW_76);
             rule__OpOther__Group_5__0__Impl();
@@ -35275,17 +35275,17 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5__0__Impl"
-    // InternalPerspectiveDsl.g:10540:1: rule__OpOther__Group_5__0__Impl : ( '>' ) ;
+    // InternalPerspectiveDsl.g:10542:1: rule__OpOther__Group_5__0__Impl : ( '>' ) ;
     public final void rule__OpOther__Group_5__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10544:1: ( ( '>' ) )
-            // InternalPerspectiveDsl.g:10545:1: ( '>' )
+            // InternalPerspectiveDsl.g:10546:1: ( ( '>' ) )
+            // InternalPerspectiveDsl.g:10547:1: ( '>' )
             {
-            // InternalPerspectiveDsl.g:10545:1: ( '>' )
-            // InternalPerspectiveDsl.g:10546:2: '>'
+            // InternalPerspectiveDsl.g:10547:1: ( '>' )
+            // InternalPerspectiveDsl.g:10548:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0()); 
@@ -35316,14 +35316,14 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5__1"
-    // InternalPerspectiveDsl.g:10555:1: rule__OpOther__Group_5__1 : rule__OpOther__Group_5__1__Impl ;
+    // InternalPerspectiveDsl.g:10557:1: rule__OpOther__Group_5__1 : rule__OpOther__Group_5__1__Impl ;
     public final void rule__OpOther__Group_5__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10559:1: ( rule__OpOther__Group_5__1__Impl )
-            // InternalPerspectiveDsl.g:10560:2: rule__OpOther__Group_5__1__Impl
+            // InternalPerspectiveDsl.g:10561:1: ( rule__OpOther__Group_5__1__Impl )
+            // InternalPerspectiveDsl.g:10562:2: rule__OpOther__Group_5__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Group_5__1__Impl();
@@ -35349,23 +35349,23 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5__1__Impl"
-    // InternalPerspectiveDsl.g:10566:1: rule__OpOther__Group_5__1__Impl : ( ( rule__OpOther__Alternatives_5_1 ) ) ;
+    // InternalPerspectiveDsl.g:10568:1: rule__OpOther__Group_5__1__Impl : ( ( rule__OpOther__Alternatives_5_1 ) ) ;
     public final void rule__OpOther__Group_5__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10570:1: ( ( ( rule__OpOther__Alternatives_5_1 ) ) )
-            // InternalPerspectiveDsl.g:10571:1: ( ( rule__OpOther__Alternatives_5_1 ) )
+            // InternalPerspectiveDsl.g:10572:1: ( ( ( rule__OpOther__Alternatives_5_1 ) ) )
+            // InternalPerspectiveDsl.g:10573:1: ( ( rule__OpOther__Alternatives_5_1 ) )
             {
-            // InternalPerspectiveDsl.g:10571:1: ( ( rule__OpOther__Alternatives_5_1 ) )
-            // InternalPerspectiveDsl.g:10572:2: ( rule__OpOther__Alternatives_5_1 )
+            // InternalPerspectiveDsl.g:10573:1: ( ( rule__OpOther__Alternatives_5_1 ) )
+            // InternalPerspectiveDsl.g:10574:2: ( rule__OpOther__Alternatives_5_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getAlternatives_5_1()); 
             }
-            // InternalPerspectiveDsl.g:10573:2: ( rule__OpOther__Alternatives_5_1 )
-            // InternalPerspectiveDsl.g:10573:3: rule__OpOther__Alternatives_5_1
+            // InternalPerspectiveDsl.g:10575:2: ( rule__OpOther__Alternatives_5_1 )
+            // InternalPerspectiveDsl.g:10575:3: rule__OpOther__Alternatives_5_1
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Alternatives_5_1();
@@ -35400,14 +35400,14 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5_1_0__0"
-    // InternalPerspectiveDsl.g:10582:1: rule__OpOther__Group_5_1_0__0 : rule__OpOther__Group_5_1_0__0__Impl ;
+    // InternalPerspectiveDsl.g:10584:1: rule__OpOther__Group_5_1_0__0 : rule__OpOther__Group_5_1_0__0__Impl ;
     public final void rule__OpOther__Group_5_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10586:1: ( rule__OpOther__Group_5_1_0__0__Impl )
-            // InternalPerspectiveDsl.g:10587:2: rule__OpOther__Group_5_1_0__0__Impl
+            // InternalPerspectiveDsl.g:10588:1: ( rule__OpOther__Group_5_1_0__0__Impl )
+            // InternalPerspectiveDsl.g:10589:2: rule__OpOther__Group_5_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Group_5_1_0__0__Impl();
@@ -35433,23 +35433,23 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5_1_0__0__Impl"
-    // InternalPerspectiveDsl.g:10593:1: rule__OpOther__Group_5_1_0__0__Impl : ( ( rule__OpOther__Group_5_1_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:10595:1: rule__OpOther__Group_5_1_0__0__Impl : ( ( rule__OpOther__Group_5_1_0_0__0 ) ) ;
     public final void rule__OpOther__Group_5_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10597:1: ( ( ( rule__OpOther__Group_5_1_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:10598:1: ( ( rule__OpOther__Group_5_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:10599:1: ( ( ( rule__OpOther__Group_5_1_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:10600:1: ( ( rule__OpOther__Group_5_1_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:10598:1: ( ( rule__OpOther__Group_5_1_0_0__0 ) )
-            // InternalPerspectiveDsl.g:10599:2: ( rule__OpOther__Group_5_1_0_0__0 )
+            // InternalPerspectiveDsl.g:10600:1: ( ( rule__OpOther__Group_5_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:10601:2: ( rule__OpOther__Group_5_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getGroup_5_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:10600:2: ( rule__OpOther__Group_5_1_0_0__0 )
-            // InternalPerspectiveDsl.g:10600:3: rule__OpOther__Group_5_1_0_0__0
+            // InternalPerspectiveDsl.g:10602:2: ( rule__OpOther__Group_5_1_0_0__0 )
+            // InternalPerspectiveDsl.g:10602:3: rule__OpOther__Group_5_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Group_5_1_0_0__0();
@@ -35484,14 +35484,14 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5_1_0_0__0"
-    // InternalPerspectiveDsl.g:10609:1: rule__OpOther__Group_5_1_0_0__0 : rule__OpOther__Group_5_1_0_0__0__Impl rule__OpOther__Group_5_1_0_0__1 ;
+    // InternalPerspectiveDsl.g:10611:1: rule__OpOther__Group_5_1_0_0__0 : rule__OpOther__Group_5_1_0_0__0__Impl rule__OpOther__Group_5_1_0_0__1 ;
     public final void rule__OpOther__Group_5_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10613:1: ( rule__OpOther__Group_5_1_0_0__0__Impl rule__OpOther__Group_5_1_0_0__1 )
-            // InternalPerspectiveDsl.g:10614:2: rule__OpOther__Group_5_1_0_0__0__Impl rule__OpOther__Group_5_1_0_0__1
+            // InternalPerspectiveDsl.g:10615:1: ( rule__OpOther__Group_5_1_0_0__0__Impl rule__OpOther__Group_5_1_0_0__1 )
+            // InternalPerspectiveDsl.g:10616:2: rule__OpOther__Group_5_1_0_0__0__Impl rule__OpOther__Group_5_1_0_0__1
             {
             pushFollow(FOLLOW_76);
             rule__OpOther__Group_5_1_0_0__0__Impl();
@@ -35522,17 +35522,17 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5_1_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:10621:1: rule__OpOther__Group_5_1_0_0__0__Impl : ( '>' ) ;
+    // InternalPerspectiveDsl.g:10623:1: rule__OpOther__Group_5_1_0_0__0__Impl : ( '>' ) ;
     public final void rule__OpOther__Group_5_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10625:1: ( ( '>' ) )
-            // InternalPerspectiveDsl.g:10626:1: ( '>' )
+            // InternalPerspectiveDsl.g:10627:1: ( ( '>' ) )
+            // InternalPerspectiveDsl.g:10628:1: ( '>' )
             {
-            // InternalPerspectiveDsl.g:10626:1: ( '>' )
-            // InternalPerspectiveDsl.g:10627:2: '>'
+            // InternalPerspectiveDsl.g:10628:1: ( '>' )
+            // InternalPerspectiveDsl.g:10629:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0()); 
@@ -35563,14 +35563,14 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5_1_0_0__1"
-    // InternalPerspectiveDsl.g:10636:1: rule__OpOther__Group_5_1_0_0__1 : rule__OpOther__Group_5_1_0_0__1__Impl ;
+    // InternalPerspectiveDsl.g:10638:1: rule__OpOther__Group_5_1_0_0__1 : rule__OpOther__Group_5_1_0_0__1__Impl ;
     public final void rule__OpOther__Group_5_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10640:1: ( rule__OpOther__Group_5_1_0_0__1__Impl )
-            // InternalPerspectiveDsl.g:10641:2: rule__OpOther__Group_5_1_0_0__1__Impl
+            // InternalPerspectiveDsl.g:10642:1: ( rule__OpOther__Group_5_1_0_0__1__Impl )
+            // InternalPerspectiveDsl.g:10643:2: rule__OpOther__Group_5_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Group_5_1_0_0__1__Impl();
@@ -35596,17 +35596,17 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5_1_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:10647:1: rule__OpOther__Group_5_1_0_0__1__Impl : ( '>' ) ;
+    // InternalPerspectiveDsl.g:10649:1: rule__OpOther__Group_5_1_0_0__1__Impl : ( '>' ) ;
     public final void rule__OpOther__Group_5_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10651:1: ( ( '>' ) )
-            // InternalPerspectiveDsl.g:10652:1: ( '>' )
+            // InternalPerspectiveDsl.g:10653:1: ( ( '>' ) )
+            // InternalPerspectiveDsl.g:10654:1: ( '>' )
             {
-            // InternalPerspectiveDsl.g:10652:1: ( '>' )
-            // InternalPerspectiveDsl.g:10653:2: '>'
+            // InternalPerspectiveDsl.g:10654:1: ( '>' )
+            // InternalPerspectiveDsl.g:10655:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1()); 
@@ -35637,14 +35637,14 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6__0"
-    // InternalPerspectiveDsl.g:10663:1: rule__OpOther__Group_6__0 : rule__OpOther__Group_6__0__Impl rule__OpOther__Group_6__1 ;
+    // InternalPerspectiveDsl.g:10665:1: rule__OpOther__Group_6__0 : rule__OpOther__Group_6__0__Impl rule__OpOther__Group_6__1 ;
     public final void rule__OpOther__Group_6__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10667:1: ( rule__OpOther__Group_6__0__Impl rule__OpOther__Group_6__1 )
-            // InternalPerspectiveDsl.g:10668:2: rule__OpOther__Group_6__0__Impl rule__OpOther__Group_6__1
+            // InternalPerspectiveDsl.g:10669:1: ( rule__OpOther__Group_6__0__Impl rule__OpOther__Group_6__1 )
+            // InternalPerspectiveDsl.g:10670:2: rule__OpOther__Group_6__0__Impl rule__OpOther__Group_6__1
             {
             pushFollow(FOLLOW_77);
             rule__OpOther__Group_6__0__Impl();
@@ -35675,17 +35675,17 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6__0__Impl"
-    // InternalPerspectiveDsl.g:10675:1: rule__OpOther__Group_6__0__Impl : ( '<' ) ;
+    // InternalPerspectiveDsl.g:10677:1: rule__OpOther__Group_6__0__Impl : ( '<' ) ;
     public final void rule__OpOther__Group_6__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10679:1: ( ( '<' ) )
-            // InternalPerspectiveDsl.g:10680:1: ( '<' )
+            // InternalPerspectiveDsl.g:10681:1: ( ( '<' ) )
+            // InternalPerspectiveDsl.g:10682:1: ( '<' )
             {
-            // InternalPerspectiveDsl.g:10680:1: ( '<' )
-            // InternalPerspectiveDsl.g:10681:2: '<'
+            // InternalPerspectiveDsl.g:10682:1: ( '<' )
+            // InternalPerspectiveDsl.g:10683:2: '<'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0()); 
@@ -35716,14 +35716,14 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6__1"
-    // InternalPerspectiveDsl.g:10690:1: rule__OpOther__Group_6__1 : rule__OpOther__Group_6__1__Impl ;
+    // InternalPerspectiveDsl.g:10692:1: rule__OpOther__Group_6__1 : rule__OpOther__Group_6__1__Impl ;
     public final void rule__OpOther__Group_6__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10694:1: ( rule__OpOther__Group_6__1__Impl )
-            // InternalPerspectiveDsl.g:10695:2: rule__OpOther__Group_6__1__Impl
+            // InternalPerspectiveDsl.g:10696:1: ( rule__OpOther__Group_6__1__Impl )
+            // InternalPerspectiveDsl.g:10697:2: rule__OpOther__Group_6__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Group_6__1__Impl();
@@ -35749,23 +35749,23 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6__1__Impl"
-    // InternalPerspectiveDsl.g:10701:1: rule__OpOther__Group_6__1__Impl : ( ( rule__OpOther__Alternatives_6_1 ) ) ;
+    // InternalPerspectiveDsl.g:10703:1: rule__OpOther__Group_6__1__Impl : ( ( rule__OpOther__Alternatives_6_1 ) ) ;
     public final void rule__OpOther__Group_6__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10705:1: ( ( ( rule__OpOther__Alternatives_6_1 ) ) )
-            // InternalPerspectiveDsl.g:10706:1: ( ( rule__OpOther__Alternatives_6_1 ) )
+            // InternalPerspectiveDsl.g:10707:1: ( ( ( rule__OpOther__Alternatives_6_1 ) ) )
+            // InternalPerspectiveDsl.g:10708:1: ( ( rule__OpOther__Alternatives_6_1 ) )
             {
-            // InternalPerspectiveDsl.g:10706:1: ( ( rule__OpOther__Alternatives_6_1 ) )
-            // InternalPerspectiveDsl.g:10707:2: ( rule__OpOther__Alternatives_6_1 )
+            // InternalPerspectiveDsl.g:10708:1: ( ( rule__OpOther__Alternatives_6_1 ) )
+            // InternalPerspectiveDsl.g:10709:2: ( rule__OpOther__Alternatives_6_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getAlternatives_6_1()); 
             }
-            // InternalPerspectiveDsl.g:10708:2: ( rule__OpOther__Alternatives_6_1 )
-            // InternalPerspectiveDsl.g:10708:3: rule__OpOther__Alternatives_6_1
+            // InternalPerspectiveDsl.g:10710:2: ( rule__OpOther__Alternatives_6_1 )
+            // InternalPerspectiveDsl.g:10710:3: rule__OpOther__Alternatives_6_1
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Alternatives_6_1();
@@ -35800,14 +35800,14 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6_1_0__0"
-    // InternalPerspectiveDsl.g:10717:1: rule__OpOther__Group_6_1_0__0 : rule__OpOther__Group_6_1_0__0__Impl ;
+    // InternalPerspectiveDsl.g:10719:1: rule__OpOther__Group_6_1_0__0 : rule__OpOther__Group_6_1_0__0__Impl ;
     public final void rule__OpOther__Group_6_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10721:1: ( rule__OpOther__Group_6_1_0__0__Impl )
-            // InternalPerspectiveDsl.g:10722:2: rule__OpOther__Group_6_1_0__0__Impl
+            // InternalPerspectiveDsl.g:10723:1: ( rule__OpOther__Group_6_1_0__0__Impl )
+            // InternalPerspectiveDsl.g:10724:2: rule__OpOther__Group_6_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Group_6_1_0__0__Impl();
@@ -35833,23 +35833,23 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6_1_0__0__Impl"
-    // InternalPerspectiveDsl.g:10728:1: rule__OpOther__Group_6_1_0__0__Impl : ( ( rule__OpOther__Group_6_1_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:10730:1: rule__OpOther__Group_6_1_0__0__Impl : ( ( rule__OpOther__Group_6_1_0_0__0 ) ) ;
     public final void rule__OpOther__Group_6_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10732:1: ( ( ( rule__OpOther__Group_6_1_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:10733:1: ( ( rule__OpOther__Group_6_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:10734:1: ( ( ( rule__OpOther__Group_6_1_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:10735:1: ( ( rule__OpOther__Group_6_1_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:10733:1: ( ( rule__OpOther__Group_6_1_0_0__0 ) )
-            // InternalPerspectiveDsl.g:10734:2: ( rule__OpOther__Group_6_1_0_0__0 )
+            // InternalPerspectiveDsl.g:10735:1: ( ( rule__OpOther__Group_6_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:10736:2: ( rule__OpOther__Group_6_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getGroup_6_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:10735:2: ( rule__OpOther__Group_6_1_0_0__0 )
-            // InternalPerspectiveDsl.g:10735:3: rule__OpOther__Group_6_1_0_0__0
+            // InternalPerspectiveDsl.g:10737:2: ( rule__OpOther__Group_6_1_0_0__0 )
+            // InternalPerspectiveDsl.g:10737:3: rule__OpOther__Group_6_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Group_6_1_0_0__0();
@@ -35884,14 +35884,14 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6_1_0_0__0"
-    // InternalPerspectiveDsl.g:10744:1: rule__OpOther__Group_6_1_0_0__0 : rule__OpOther__Group_6_1_0_0__0__Impl rule__OpOther__Group_6_1_0_0__1 ;
+    // InternalPerspectiveDsl.g:10746:1: rule__OpOther__Group_6_1_0_0__0 : rule__OpOther__Group_6_1_0_0__0__Impl rule__OpOther__Group_6_1_0_0__1 ;
     public final void rule__OpOther__Group_6_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10748:1: ( rule__OpOther__Group_6_1_0_0__0__Impl rule__OpOther__Group_6_1_0_0__1 )
-            // InternalPerspectiveDsl.g:10749:2: rule__OpOther__Group_6_1_0_0__0__Impl rule__OpOther__Group_6_1_0_0__1
+            // InternalPerspectiveDsl.g:10750:1: ( rule__OpOther__Group_6_1_0_0__0__Impl rule__OpOther__Group_6_1_0_0__1 )
+            // InternalPerspectiveDsl.g:10751:2: rule__OpOther__Group_6_1_0_0__0__Impl rule__OpOther__Group_6_1_0_0__1
             {
             pushFollow(FOLLOW_61);
             rule__OpOther__Group_6_1_0_0__0__Impl();
@@ -35922,17 +35922,17 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6_1_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:10756:1: rule__OpOther__Group_6_1_0_0__0__Impl : ( '<' ) ;
+    // InternalPerspectiveDsl.g:10758:1: rule__OpOther__Group_6_1_0_0__0__Impl : ( '<' ) ;
     public final void rule__OpOther__Group_6_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10760:1: ( ( '<' ) )
-            // InternalPerspectiveDsl.g:10761:1: ( '<' )
+            // InternalPerspectiveDsl.g:10762:1: ( ( '<' ) )
+            // InternalPerspectiveDsl.g:10763:1: ( '<' )
             {
-            // InternalPerspectiveDsl.g:10761:1: ( '<' )
-            // InternalPerspectiveDsl.g:10762:2: '<'
+            // InternalPerspectiveDsl.g:10763:1: ( '<' )
+            // InternalPerspectiveDsl.g:10764:2: '<'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0()); 
@@ -35963,14 +35963,14 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6_1_0_0__1"
-    // InternalPerspectiveDsl.g:10771:1: rule__OpOther__Group_6_1_0_0__1 : rule__OpOther__Group_6_1_0_0__1__Impl ;
+    // InternalPerspectiveDsl.g:10773:1: rule__OpOther__Group_6_1_0_0__1 : rule__OpOther__Group_6_1_0_0__1__Impl ;
     public final void rule__OpOther__Group_6_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10775:1: ( rule__OpOther__Group_6_1_0_0__1__Impl )
-            // InternalPerspectiveDsl.g:10776:2: rule__OpOther__Group_6_1_0_0__1__Impl
+            // InternalPerspectiveDsl.g:10777:1: ( rule__OpOther__Group_6_1_0_0__1__Impl )
+            // InternalPerspectiveDsl.g:10778:2: rule__OpOther__Group_6_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Group_6_1_0_0__1__Impl();
@@ -35996,17 +35996,17 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6_1_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:10782:1: rule__OpOther__Group_6_1_0_0__1__Impl : ( '<' ) ;
+    // InternalPerspectiveDsl.g:10784:1: rule__OpOther__Group_6_1_0_0__1__Impl : ( '<' ) ;
     public final void rule__OpOther__Group_6_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10786:1: ( ( '<' ) )
-            // InternalPerspectiveDsl.g:10787:1: ( '<' )
+            // InternalPerspectiveDsl.g:10788:1: ( ( '<' ) )
+            // InternalPerspectiveDsl.g:10789:1: ( '<' )
             {
-            // InternalPerspectiveDsl.g:10787:1: ( '<' )
-            // InternalPerspectiveDsl.g:10788:2: '<'
+            // InternalPerspectiveDsl.g:10789:1: ( '<' )
+            // InternalPerspectiveDsl.g:10790:2: '<'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1()); 
@@ -36037,14 +36037,14 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group__0"
-    // InternalPerspectiveDsl.g:10798:1: rule__XAdditiveExpression__Group__0 : rule__XAdditiveExpression__Group__0__Impl rule__XAdditiveExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:10800:1: rule__XAdditiveExpression__Group__0 : rule__XAdditiveExpression__Group__0__Impl rule__XAdditiveExpression__Group__1 ;
     public final void rule__XAdditiveExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10802:1: ( rule__XAdditiveExpression__Group__0__Impl rule__XAdditiveExpression__Group__1 )
-            // InternalPerspectiveDsl.g:10803:2: rule__XAdditiveExpression__Group__0__Impl rule__XAdditiveExpression__Group__1
+            // InternalPerspectiveDsl.g:10804:1: ( rule__XAdditiveExpression__Group__0__Impl rule__XAdditiveExpression__Group__1 )
+            // InternalPerspectiveDsl.g:10805:2: rule__XAdditiveExpression__Group__0__Impl rule__XAdditiveExpression__Group__1
             {
             pushFollow(FOLLOW_78);
             rule__XAdditiveExpression__Group__0__Impl();
@@ -36075,17 +36075,17 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:10810:1: rule__XAdditiveExpression__Group__0__Impl : ( ruleXMultiplicativeExpression ) ;
+    // InternalPerspectiveDsl.g:10812:1: rule__XAdditiveExpression__Group__0__Impl : ( ruleXMultiplicativeExpression ) ;
     public final void rule__XAdditiveExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10814:1: ( ( ruleXMultiplicativeExpression ) )
-            // InternalPerspectiveDsl.g:10815:1: ( ruleXMultiplicativeExpression )
+            // InternalPerspectiveDsl.g:10816:1: ( ( ruleXMultiplicativeExpression ) )
+            // InternalPerspectiveDsl.g:10817:1: ( ruleXMultiplicativeExpression )
             {
-            // InternalPerspectiveDsl.g:10815:1: ( ruleXMultiplicativeExpression )
-            // InternalPerspectiveDsl.g:10816:2: ruleXMultiplicativeExpression
+            // InternalPerspectiveDsl.g:10817:1: ( ruleXMultiplicativeExpression )
+            // InternalPerspectiveDsl.g:10818:2: ruleXMultiplicativeExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0()); 
@@ -36120,14 +36120,14 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group__1"
-    // InternalPerspectiveDsl.g:10825:1: rule__XAdditiveExpression__Group__1 : rule__XAdditiveExpression__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:10827:1: rule__XAdditiveExpression__Group__1 : rule__XAdditiveExpression__Group__1__Impl ;
     public final void rule__XAdditiveExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10829:1: ( rule__XAdditiveExpression__Group__1__Impl )
-            // InternalPerspectiveDsl.g:10830:2: rule__XAdditiveExpression__Group__1__Impl
+            // InternalPerspectiveDsl.g:10831:1: ( rule__XAdditiveExpression__Group__1__Impl )
+            // InternalPerspectiveDsl.g:10832:2: rule__XAdditiveExpression__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAdditiveExpression__Group__1__Impl();
@@ -36153,22 +36153,22 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:10836:1: rule__XAdditiveExpression__Group__1__Impl : ( ( rule__XAdditiveExpression__Group_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:10838:1: rule__XAdditiveExpression__Group__1__Impl : ( ( rule__XAdditiveExpression__Group_1__0 )* ) ;
     public final void rule__XAdditiveExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10840:1: ( ( ( rule__XAdditiveExpression__Group_1__0 )* ) )
-            // InternalPerspectiveDsl.g:10841:1: ( ( rule__XAdditiveExpression__Group_1__0 )* )
+            // InternalPerspectiveDsl.g:10842:1: ( ( ( rule__XAdditiveExpression__Group_1__0 )* ) )
+            // InternalPerspectiveDsl.g:10843:1: ( ( rule__XAdditiveExpression__Group_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:10841:1: ( ( rule__XAdditiveExpression__Group_1__0 )* )
-            // InternalPerspectiveDsl.g:10842:2: ( rule__XAdditiveExpression__Group_1__0 )*
+            // InternalPerspectiveDsl.g:10843:1: ( ( rule__XAdditiveExpression__Group_1__0 )* )
+            // InternalPerspectiveDsl.g:10844:2: ( rule__XAdditiveExpression__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getGroup_1()); 
             }
-            // InternalPerspectiveDsl.g:10843:2: ( rule__XAdditiveExpression__Group_1__0 )*
+            // InternalPerspectiveDsl.g:10845:2: ( rule__XAdditiveExpression__Group_1__0 )*
             loop76:
             do {
                 int alt76=2;
@@ -36196,7 +36196,7 @@
 
                 switch (alt76) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:10843:3: rule__XAdditiveExpression__Group_1__0
+            	    // InternalPerspectiveDsl.g:10845:3: rule__XAdditiveExpression__Group_1__0
             	    {
             	    pushFollow(FOLLOW_79);
             	    rule__XAdditiveExpression__Group_1__0();
@@ -36237,14 +36237,14 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1__0"
-    // InternalPerspectiveDsl.g:10852:1: rule__XAdditiveExpression__Group_1__0 : rule__XAdditiveExpression__Group_1__0__Impl rule__XAdditiveExpression__Group_1__1 ;
+    // InternalPerspectiveDsl.g:10854:1: rule__XAdditiveExpression__Group_1__0 : rule__XAdditiveExpression__Group_1__0__Impl rule__XAdditiveExpression__Group_1__1 ;
     public final void rule__XAdditiveExpression__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10856:1: ( rule__XAdditiveExpression__Group_1__0__Impl rule__XAdditiveExpression__Group_1__1 )
-            // InternalPerspectiveDsl.g:10857:2: rule__XAdditiveExpression__Group_1__0__Impl rule__XAdditiveExpression__Group_1__1
+            // InternalPerspectiveDsl.g:10858:1: ( rule__XAdditiveExpression__Group_1__0__Impl rule__XAdditiveExpression__Group_1__1 )
+            // InternalPerspectiveDsl.g:10859:2: rule__XAdditiveExpression__Group_1__0__Impl rule__XAdditiveExpression__Group_1__1
             {
             pushFollow(FOLLOW_54);
             rule__XAdditiveExpression__Group_1__0__Impl();
@@ -36275,23 +36275,23 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1__0__Impl"
-    // InternalPerspectiveDsl.g:10864:1: rule__XAdditiveExpression__Group_1__0__Impl : ( ( rule__XAdditiveExpression__Group_1_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:10866:1: rule__XAdditiveExpression__Group_1__0__Impl : ( ( rule__XAdditiveExpression__Group_1_0__0 ) ) ;
     public final void rule__XAdditiveExpression__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10868:1: ( ( ( rule__XAdditiveExpression__Group_1_0__0 ) ) )
-            // InternalPerspectiveDsl.g:10869:1: ( ( rule__XAdditiveExpression__Group_1_0__0 ) )
+            // InternalPerspectiveDsl.g:10870:1: ( ( ( rule__XAdditiveExpression__Group_1_0__0 ) ) )
+            // InternalPerspectiveDsl.g:10871:1: ( ( rule__XAdditiveExpression__Group_1_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:10869:1: ( ( rule__XAdditiveExpression__Group_1_0__0 ) )
-            // InternalPerspectiveDsl.g:10870:2: ( rule__XAdditiveExpression__Group_1_0__0 )
+            // InternalPerspectiveDsl.g:10871:1: ( ( rule__XAdditiveExpression__Group_1_0__0 ) )
+            // InternalPerspectiveDsl.g:10872:2: ( rule__XAdditiveExpression__Group_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0()); 
             }
-            // InternalPerspectiveDsl.g:10871:2: ( rule__XAdditiveExpression__Group_1_0__0 )
-            // InternalPerspectiveDsl.g:10871:3: rule__XAdditiveExpression__Group_1_0__0
+            // InternalPerspectiveDsl.g:10873:2: ( rule__XAdditiveExpression__Group_1_0__0 )
+            // InternalPerspectiveDsl.g:10873:3: rule__XAdditiveExpression__Group_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAdditiveExpression__Group_1_0__0();
@@ -36326,14 +36326,14 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1__1"
-    // InternalPerspectiveDsl.g:10879:1: rule__XAdditiveExpression__Group_1__1 : rule__XAdditiveExpression__Group_1__1__Impl ;
+    // InternalPerspectiveDsl.g:10881:1: rule__XAdditiveExpression__Group_1__1 : rule__XAdditiveExpression__Group_1__1__Impl ;
     public final void rule__XAdditiveExpression__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10883:1: ( rule__XAdditiveExpression__Group_1__1__Impl )
-            // InternalPerspectiveDsl.g:10884:2: rule__XAdditiveExpression__Group_1__1__Impl
+            // InternalPerspectiveDsl.g:10885:1: ( rule__XAdditiveExpression__Group_1__1__Impl )
+            // InternalPerspectiveDsl.g:10886:2: rule__XAdditiveExpression__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAdditiveExpression__Group_1__1__Impl();
@@ -36359,23 +36359,23 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1__1__Impl"
-    // InternalPerspectiveDsl.g:10890:1: rule__XAdditiveExpression__Group_1__1__Impl : ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:10892:1: rule__XAdditiveExpression__Group_1__1__Impl : ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) ) ;
     public final void rule__XAdditiveExpression__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10894:1: ( ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) ) )
-            // InternalPerspectiveDsl.g:10895:1: ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) )
+            // InternalPerspectiveDsl.g:10896:1: ( ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) ) )
+            // InternalPerspectiveDsl.g:10897:1: ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:10895:1: ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) )
-            // InternalPerspectiveDsl.g:10896:2: ( rule__XAdditiveExpression__RightOperandAssignment_1_1 )
+            // InternalPerspectiveDsl.g:10897:1: ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) )
+            // InternalPerspectiveDsl.g:10898:2: ( rule__XAdditiveExpression__RightOperandAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getRightOperandAssignment_1_1()); 
             }
-            // InternalPerspectiveDsl.g:10897:2: ( rule__XAdditiveExpression__RightOperandAssignment_1_1 )
-            // InternalPerspectiveDsl.g:10897:3: rule__XAdditiveExpression__RightOperandAssignment_1_1
+            // InternalPerspectiveDsl.g:10899:2: ( rule__XAdditiveExpression__RightOperandAssignment_1_1 )
+            // InternalPerspectiveDsl.g:10899:3: rule__XAdditiveExpression__RightOperandAssignment_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XAdditiveExpression__RightOperandAssignment_1_1();
@@ -36410,14 +36410,14 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1_0__0"
-    // InternalPerspectiveDsl.g:10906:1: rule__XAdditiveExpression__Group_1_0__0 : rule__XAdditiveExpression__Group_1_0__0__Impl ;
+    // InternalPerspectiveDsl.g:10908:1: rule__XAdditiveExpression__Group_1_0__0 : rule__XAdditiveExpression__Group_1_0__0__Impl ;
     public final void rule__XAdditiveExpression__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10910:1: ( rule__XAdditiveExpression__Group_1_0__0__Impl )
-            // InternalPerspectiveDsl.g:10911:2: rule__XAdditiveExpression__Group_1_0__0__Impl
+            // InternalPerspectiveDsl.g:10912:1: ( rule__XAdditiveExpression__Group_1_0__0__Impl )
+            // InternalPerspectiveDsl.g:10913:2: rule__XAdditiveExpression__Group_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAdditiveExpression__Group_1_0__0__Impl();
@@ -36443,23 +36443,23 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1_0__0__Impl"
-    // InternalPerspectiveDsl.g:10917:1: rule__XAdditiveExpression__Group_1_0__0__Impl : ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:10919:1: rule__XAdditiveExpression__Group_1_0__0__Impl : ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) ) ;
     public final void rule__XAdditiveExpression__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10921:1: ( ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:10922:1: ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:10923:1: ( ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:10924:1: ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:10922:1: ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) )
-            // InternalPerspectiveDsl.g:10923:2: ( rule__XAdditiveExpression__Group_1_0_0__0 )
+            // InternalPerspectiveDsl.g:10924:1: ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:10925:2: ( rule__XAdditiveExpression__Group_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:10924:2: ( rule__XAdditiveExpression__Group_1_0_0__0 )
-            // InternalPerspectiveDsl.g:10924:3: rule__XAdditiveExpression__Group_1_0_0__0
+            // InternalPerspectiveDsl.g:10926:2: ( rule__XAdditiveExpression__Group_1_0_0__0 )
+            // InternalPerspectiveDsl.g:10926:3: rule__XAdditiveExpression__Group_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAdditiveExpression__Group_1_0_0__0();
@@ -36494,14 +36494,14 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1_0_0__0"
-    // InternalPerspectiveDsl.g:10933:1: rule__XAdditiveExpression__Group_1_0_0__0 : rule__XAdditiveExpression__Group_1_0_0__0__Impl rule__XAdditiveExpression__Group_1_0_0__1 ;
+    // InternalPerspectiveDsl.g:10935:1: rule__XAdditiveExpression__Group_1_0_0__0 : rule__XAdditiveExpression__Group_1_0_0__0__Impl rule__XAdditiveExpression__Group_1_0_0__1 ;
     public final void rule__XAdditiveExpression__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10937:1: ( rule__XAdditiveExpression__Group_1_0_0__0__Impl rule__XAdditiveExpression__Group_1_0_0__1 )
-            // InternalPerspectiveDsl.g:10938:2: rule__XAdditiveExpression__Group_1_0_0__0__Impl rule__XAdditiveExpression__Group_1_0_0__1
+            // InternalPerspectiveDsl.g:10939:1: ( rule__XAdditiveExpression__Group_1_0_0__0__Impl rule__XAdditiveExpression__Group_1_0_0__1 )
+            // InternalPerspectiveDsl.g:10940:2: rule__XAdditiveExpression__Group_1_0_0__0__Impl rule__XAdditiveExpression__Group_1_0_0__1
             {
             pushFollow(FOLLOW_78);
             rule__XAdditiveExpression__Group_1_0_0__0__Impl();
@@ -36532,23 +36532,23 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:10945:1: rule__XAdditiveExpression__Group_1_0_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:10947:1: rule__XAdditiveExpression__Group_1_0_0__0__Impl : ( () ) ;
     public final void rule__XAdditiveExpression__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10949:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:10950:1: ( () )
+            // InternalPerspectiveDsl.g:10951:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:10952:1: ( () )
             {
-            // InternalPerspectiveDsl.g:10950:1: ( () )
-            // InternalPerspectiveDsl.g:10951:2: ()
+            // InternalPerspectiveDsl.g:10952:1: ( () )
+            // InternalPerspectiveDsl.g:10953:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:10952:2: ()
-            // InternalPerspectiveDsl.g:10952:3: 
+            // InternalPerspectiveDsl.g:10954:2: ()
+            // InternalPerspectiveDsl.g:10954:3: 
             {
             }
 
@@ -36573,14 +36573,14 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1_0_0__1"
-    // InternalPerspectiveDsl.g:10960:1: rule__XAdditiveExpression__Group_1_0_0__1 : rule__XAdditiveExpression__Group_1_0_0__1__Impl ;
+    // InternalPerspectiveDsl.g:10962:1: rule__XAdditiveExpression__Group_1_0_0__1 : rule__XAdditiveExpression__Group_1_0_0__1__Impl ;
     public final void rule__XAdditiveExpression__Group_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10964:1: ( rule__XAdditiveExpression__Group_1_0_0__1__Impl )
-            // InternalPerspectiveDsl.g:10965:2: rule__XAdditiveExpression__Group_1_0_0__1__Impl
+            // InternalPerspectiveDsl.g:10966:1: ( rule__XAdditiveExpression__Group_1_0_0__1__Impl )
+            // InternalPerspectiveDsl.g:10967:2: rule__XAdditiveExpression__Group_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAdditiveExpression__Group_1_0_0__1__Impl();
@@ -36606,23 +36606,23 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:10971:1: rule__XAdditiveExpression__Group_1_0_0__1__Impl : ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:10973:1: rule__XAdditiveExpression__Group_1_0_0__1__Impl : ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) ) ;
     public final void rule__XAdditiveExpression__Group_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10975:1: ( ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) ) )
-            // InternalPerspectiveDsl.g:10976:1: ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalPerspectiveDsl.g:10977:1: ( ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) ) )
+            // InternalPerspectiveDsl.g:10978:1: ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:10976:1: ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) )
-            // InternalPerspectiveDsl.g:10977:2: ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 )
+            // InternalPerspectiveDsl.g:10978:1: ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalPerspectiveDsl.g:10979:2: ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getFeatureAssignment_1_0_0_1()); 
             }
-            // InternalPerspectiveDsl.g:10978:2: ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 )
-            // InternalPerspectiveDsl.g:10978:3: rule__XAdditiveExpression__FeatureAssignment_1_0_0_1
+            // InternalPerspectiveDsl.g:10980:2: ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 )
+            // InternalPerspectiveDsl.g:10980:3: rule__XAdditiveExpression__FeatureAssignment_1_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XAdditiveExpression__FeatureAssignment_1_0_0_1();
@@ -36657,14 +36657,14 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group__0"
-    // InternalPerspectiveDsl.g:10987:1: rule__XMultiplicativeExpression__Group__0 : rule__XMultiplicativeExpression__Group__0__Impl rule__XMultiplicativeExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:10989:1: rule__XMultiplicativeExpression__Group__0 : rule__XMultiplicativeExpression__Group__0__Impl rule__XMultiplicativeExpression__Group__1 ;
     public final void rule__XMultiplicativeExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:10991:1: ( rule__XMultiplicativeExpression__Group__0__Impl rule__XMultiplicativeExpression__Group__1 )
-            // InternalPerspectiveDsl.g:10992:2: rule__XMultiplicativeExpression__Group__0__Impl rule__XMultiplicativeExpression__Group__1
+            // InternalPerspectiveDsl.g:10993:1: ( rule__XMultiplicativeExpression__Group__0__Impl rule__XMultiplicativeExpression__Group__1 )
+            // InternalPerspectiveDsl.g:10994:2: rule__XMultiplicativeExpression__Group__0__Impl rule__XMultiplicativeExpression__Group__1
             {
             pushFollow(FOLLOW_80);
             rule__XMultiplicativeExpression__Group__0__Impl();
@@ -36695,17 +36695,17 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:10999:1: rule__XMultiplicativeExpression__Group__0__Impl : ( ruleXUnaryOperation ) ;
+    // InternalPerspectiveDsl.g:11001:1: rule__XMultiplicativeExpression__Group__0__Impl : ( ruleXUnaryOperation ) ;
     public final void rule__XMultiplicativeExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11003:1: ( ( ruleXUnaryOperation ) )
-            // InternalPerspectiveDsl.g:11004:1: ( ruleXUnaryOperation )
+            // InternalPerspectiveDsl.g:11005:1: ( ( ruleXUnaryOperation ) )
+            // InternalPerspectiveDsl.g:11006:1: ( ruleXUnaryOperation )
             {
-            // InternalPerspectiveDsl.g:11004:1: ( ruleXUnaryOperation )
-            // InternalPerspectiveDsl.g:11005:2: ruleXUnaryOperation
+            // InternalPerspectiveDsl.g:11006:1: ( ruleXUnaryOperation )
+            // InternalPerspectiveDsl.g:11007:2: ruleXUnaryOperation
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0()); 
@@ -36740,14 +36740,14 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group__1"
-    // InternalPerspectiveDsl.g:11014:1: rule__XMultiplicativeExpression__Group__1 : rule__XMultiplicativeExpression__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:11016:1: rule__XMultiplicativeExpression__Group__1 : rule__XMultiplicativeExpression__Group__1__Impl ;
     public final void rule__XMultiplicativeExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11018:1: ( rule__XMultiplicativeExpression__Group__1__Impl )
-            // InternalPerspectiveDsl.g:11019:2: rule__XMultiplicativeExpression__Group__1__Impl
+            // InternalPerspectiveDsl.g:11020:1: ( rule__XMultiplicativeExpression__Group__1__Impl )
+            // InternalPerspectiveDsl.g:11021:2: rule__XMultiplicativeExpression__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMultiplicativeExpression__Group__1__Impl();
@@ -36773,22 +36773,22 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:11025:1: rule__XMultiplicativeExpression__Group__1__Impl : ( ( rule__XMultiplicativeExpression__Group_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:11027:1: rule__XMultiplicativeExpression__Group__1__Impl : ( ( rule__XMultiplicativeExpression__Group_1__0 )* ) ;
     public final void rule__XMultiplicativeExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11029:1: ( ( ( rule__XMultiplicativeExpression__Group_1__0 )* ) )
-            // InternalPerspectiveDsl.g:11030:1: ( ( rule__XMultiplicativeExpression__Group_1__0 )* )
+            // InternalPerspectiveDsl.g:11031:1: ( ( ( rule__XMultiplicativeExpression__Group_1__0 )* ) )
+            // InternalPerspectiveDsl.g:11032:1: ( ( rule__XMultiplicativeExpression__Group_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:11030:1: ( ( rule__XMultiplicativeExpression__Group_1__0 )* )
-            // InternalPerspectiveDsl.g:11031:2: ( rule__XMultiplicativeExpression__Group_1__0 )*
+            // InternalPerspectiveDsl.g:11032:1: ( ( rule__XMultiplicativeExpression__Group_1__0 )* )
+            // InternalPerspectiveDsl.g:11033:2: ( rule__XMultiplicativeExpression__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1()); 
             }
-            // InternalPerspectiveDsl.g:11032:2: ( rule__XMultiplicativeExpression__Group_1__0 )*
+            // InternalPerspectiveDsl.g:11034:2: ( rule__XMultiplicativeExpression__Group_1__0 )*
             loop77:
             do {
                 int alt77=2;
@@ -36842,7 +36842,7 @@
 
                 switch (alt77) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:11032:3: rule__XMultiplicativeExpression__Group_1__0
+            	    // InternalPerspectiveDsl.g:11034:3: rule__XMultiplicativeExpression__Group_1__0
             	    {
             	    pushFollow(FOLLOW_81);
             	    rule__XMultiplicativeExpression__Group_1__0();
@@ -36883,14 +36883,14 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1__0"
-    // InternalPerspectiveDsl.g:11041:1: rule__XMultiplicativeExpression__Group_1__0 : rule__XMultiplicativeExpression__Group_1__0__Impl rule__XMultiplicativeExpression__Group_1__1 ;
+    // InternalPerspectiveDsl.g:11043:1: rule__XMultiplicativeExpression__Group_1__0 : rule__XMultiplicativeExpression__Group_1__0__Impl rule__XMultiplicativeExpression__Group_1__1 ;
     public final void rule__XMultiplicativeExpression__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11045:1: ( rule__XMultiplicativeExpression__Group_1__0__Impl rule__XMultiplicativeExpression__Group_1__1 )
-            // InternalPerspectiveDsl.g:11046:2: rule__XMultiplicativeExpression__Group_1__0__Impl rule__XMultiplicativeExpression__Group_1__1
+            // InternalPerspectiveDsl.g:11047:1: ( rule__XMultiplicativeExpression__Group_1__0__Impl rule__XMultiplicativeExpression__Group_1__1 )
+            // InternalPerspectiveDsl.g:11048:2: rule__XMultiplicativeExpression__Group_1__0__Impl rule__XMultiplicativeExpression__Group_1__1
             {
             pushFollow(FOLLOW_54);
             rule__XMultiplicativeExpression__Group_1__0__Impl();
@@ -36921,23 +36921,23 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1__0__Impl"
-    // InternalPerspectiveDsl.g:11053:1: rule__XMultiplicativeExpression__Group_1__0__Impl : ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:11055:1: rule__XMultiplicativeExpression__Group_1__0__Impl : ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) ) ;
     public final void rule__XMultiplicativeExpression__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11057:1: ( ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) ) )
-            // InternalPerspectiveDsl.g:11058:1: ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) )
+            // InternalPerspectiveDsl.g:11059:1: ( ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) ) )
+            // InternalPerspectiveDsl.g:11060:1: ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:11058:1: ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) )
-            // InternalPerspectiveDsl.g:11059:2: ( rule__XMultiplicativeExpression__Group_1_0__0 )
+            // InternalPerspectiveDsl.g:11060:1: ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) )
+            // InternalPerspectiveDsl.g:11061:2: ( rule__XMultiplicativeExpression__Group_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0()); 
             }
-            // InternalPerspectiveDsl.g:11060:2: ( rule__XMultiplicativeExpression__Group_1_0__0 )
-            // InternalPerspectiveDsl.g:11060:3: rule__XMultiplicativeExpression__Group_1_0__0
+            // InternalPerspectiveDsl.g:11062:2: ( rule__XMultiplicativeExpression__Group_1_0__0 )
+            // InternalPerspectiveDsl.g:11062:3: rule__XMultiplicativeExpression__Group_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XMultiplicativeExpression__Group_1_0__0();
@@ -36972,14 +36972,14 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1__1"
-    // InternalPerspectiveDsl.g:11068:1: rule__XMultiplicativeExpression__Group_1__1 : rule__XMultiplicativeExpression__Group_1__1__Impl ;
+    // InternalPerspectiveDsl.g:11070:1: rule__XMultiplicativeExpression__Group_1__1 : rule__XMultiplicativeExpression__Group_1__1__Impl ;
     public final void rule__XMultiplicativeExpression__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11072:1: ( rule__XMultiplicativeExpression__Group_1__1__Impl )
-            // InternalPerspectiveDsl.g:11073:2: rule__XMultiplicativeExpression__Group_1__1__Impl
+            // InternalPerspectiveDsl.g:11074:1: ( rule__XMultiplicativeExpression__Group_1__1__Impl )
+            // InternalPerspectiveDsl.g:11075:2: rule__XMultiplicativeExpression__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMultiplicativeExpression__Group_1__1__Impl();
@@ -37005,23 +37005,23 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1__1__Impl"
-    // InternalPerspectiveDsl.g:11079:1: rule__XMultiplicativeExpression__Group_1__1__Impl : ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:11081:1: rule__XMultiplicativeExpression__Group_1__1__Impl : ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) ) ;
     public final void rule__XMultiplicativeExpression__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11083:1: ( ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) ) )
-            // InternalPerspectiveDsl.g:11084:1: ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) )
+            // InternalPerspectiveDsl.g:11085:1: ( ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) ) )
+            // InternalPerspectiveDsl.g:11086:1: ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:11084:1: ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) )
-            // InternalPerspectiveDsl.g:11085:2: ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 )
+            // InternalPerspectiveDsl.g:11086:1: ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) )
+            // InternalPerspectiveDsl.g:11087:2: ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandAssignment_1_1()); 
             }
-            // InternalPerspectiveDsl.g:11086:2: ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 )
-            // InternalPerspectiveDsl.g:11086:3: rule__XMultiplicativeExpression__RightOperandAssignment_1_1
+            // InternalPerspectiveDsl.g:11088:2: ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 )
+            // InternalPerspectiveDsl.g:11088:3: rule__XMultiplicativeExpression__RightOperandAssignment_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XMultiplicativeExpression__RightOperandAssignment_1_1();
@@ -37056,14 +37056,14 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1_0__0"
-    // InternalPerspectiveDsl.g:11095:1: rule__XMultiplicativeExpression__Group_1_0__0 : rule__XMultiplicativeExpression__Group_1_0__0__Impl ;
+    // InternalPerspectiveDsl.g:11097:1: rule__XMultiplicativeExpression__Group_1_0__0 : rule__XMultiplicativeExpression__Group_1_0__0__Impl ;
     public final void rule__XMultiplicativeExpression__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11099:1: ( rule__XMultiplicativeExpression__Group_1_0__0__Impl )
-            // InternalPerspectiveDsl.g:11100:2: rule__XMultiplicativeExpression__Group_1_0__0__Impl
+            // InternalPerspectiveDsl.g:11101:1: ( rule__XMultiplicativeExpression__Group_1_0__0__Impl )
+            // InternalPerspectiveDsl.g:11102:2: rule__XMultiplicativeExpression__Group_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMultiplicativeExpression__Group_1_0__0__Impl();
@@ -37089,23 +37089,23 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1_0__0__Impl"
-    // InternalPerspectiveDsl.g:11106:1: rule__XMultiplicativeExpression__Group_1_0__0__Impl : ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:11108:1: rule__XMultiplicativeExpression__Group_1_0__0__Impl : ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) ) ;
     public final void rule__XMultiplicativeExpression__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11110:1: ( ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:11111:1: ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:11112:1: ( ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:11113:1: ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:11111:1: ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) )
-            // InternalPerspectiveDsl.g:11112:2: ( rule__XMultiplicativeExpression__Group_1_0_0__0 )
+            // InternalPerspectiveDsl.g:11113:1: ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:11114:2: ( rule__XMultiplicativeExpression__Group_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:11113:2: ( rule__XMultiplicativeExpression__Group_1_0_0__0 )
-            // InternalPerspectiveDsl.g:11113:3: rule__XMultiplicativeExpression__Group_1_0_0__0
+            // InternalPerspectiveDsl.g:11115:2: ( rule__XMultiplicativeExpression__Group_1_0_0__0 )
+            // InternalPerspectiveDsl.g:11115:3: rule__XMultiplicativeExpression__Group_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XMultiplicativeExpression__Group_1_0_0__0();
@@ -37140,14 +37140,14 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1_0_0__0"
-    // InternalPerspectiveDsl.g:11122:1: rule__XMultiplicativeExpression__Group_1_0_0__0 : rule__XMultiplicativeExpression__Group_1_0_0__0__Impl rule__XMultiplicativeExpression__Group_1_0_0__1 ;
+    // InternalPerspectiveDsl.g:11124:1: rule__XMultiplicativeExpression__Group_1_0_0__0 : rule__XMultiplicativeExpression__Group_1_0_0__0__Impl rule__XMultiplicativeExpression__Group_1_0_0__1 ;
     public final void rule__XMultiplicativeExpression__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11126:1: ( rule__XMultiplicativeExpression__Group_1_0_0__0__Impl rule__XMultiplicativeExpression__Group_1_0_0__1 )
-            // InternalPerspectiveDsl.g:11127:2: rule__XMultiplicativeExpression__Group_1_0_0__0__Impl rule__XMultiplicativeExpression__Group_1_0_0__1
+            // InternalPerspectiveDsl.g:11128:1: ( rule__XMultiplicativeExpression__Group_1_0_0__0__Impl rule__XMultiplicativeExpression__Group_1_0_0__1 )
+            // InternalPerspectiveDsl.g:11129:2: rule__XMultiplicativeExpression__Group_1_0_0__0__Impl rule__XMultiplicativeExpression__Group_1_0_0__1
             {
             pushFollow(FOLLOW_80);
             rule__XMultiplicativeExpression__Group_1_0_0__0__Impl();
@@ -37178,23 +37178,23 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:11134:1: rule__XMultiplicativeExpression__Group_1_0_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:11136:1: rule__XMultiplicativeExpression__Group_1_0_0__0__Impl : ( () ) ;
     public final void rule__XMultiplicativeExpression__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11138:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:11139:1: ( () )
+            // InternalPerspectiveDsl.g:11140:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:11141:1: ( () )
             {
-            // InternalPerspectiveDsl.g:11139:1: ( () )
-            // InternalPerspectiveDsl.g:11140:2: ()
+            // InternalPerspectiveDsl.g:11141:1: ( () )
+            // InternalPerspectiveDsl.g:11142:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:11141:2: ()
-            // InternalPerspectiveDsl.g:11141:3: 
+            // InternalPerspectiveDsl.g:11143:2: ()
+            // InternalPerspectiveDsl.g:11143:3: 
             {
             }
 
@@ -37219,14 +37219,14 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1_0_0__1"
-    // InternalPerspectiveDsl.g:11149:1: rule__XMultiplicativeExpression__Group_1_0_0__1 : rule__XMultiplicativeExpression__Group_1_0_0__1__Impl ;
+    // InternalPerspectiveDsl.g:11151:1: rule__XMultiplicativeExpression__Group_1_0_0__1 : rule__XMultiplicativeExpression__Group_1_0_0__1__Impl ;
     public final void rule__XMultiplicativeExpression__Group_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11153:1: ( rule__XMultiplicativeExpression__Group_1_0_0__1__Impl )
-            // InternalPerspectiveDsl.g:11154:2: rule__XMultiplicativeExpression__Group_1_0_0__1__Impl
+            // InternalPerspectiveDsl.g:11155:1: ( rule__XMultiplicativeExpression__Group_1_0_0__1__Impl )
+            // InternalPerspectiveDsl.g:11156:2: rule__XMultiplicativeExpression__Group_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMultiplicativeExpression__Group_1_0_0__1__Impl();
@@ -37252,23 +37252,23 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:11160:1: rule__XMultiplicativeExpression__Group_1_0_0__1__Impl : ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:11162:1: rule__XMultiplicativeExpression__Group_1_0_0__1__Impl : ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) ) ;
     public final void rule__XMultiplicativeExpression__Group_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11164:1: ( ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) ) )
-            // InternalPerspectiveDsl.g:11165:1: ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalPerspectiveDsl.g:11166:1: ( ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) ) )
+            // InternalPerspectiveDsl.g:11167:1: ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:11165:1: ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) )
-            // InternalPerspectiveDsl.g:11166:2: ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 )
+            // InternalPerspectiveDsl.g:11167:1: ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalPerspectiveDsl.g:11168:2: ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureAssignment_1_0_0_1()); 
             }
-            // InternalPerspectiveDsl.g:11167:2: ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 )
-            // InternalPerspectiveDsl.g:11167:3: rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1
+            // InternalPerspectiveDsl.g:11169:2: ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 )
+            // InternalPerspectiveDsl.g:11169:3: rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1();
@@ -37303,14 +37303,14 @@
 
 
     // $ANTLR start "rule__XUnaryOperation__Group_0__0"
-    // InternalPerspectiveDsl.g:11176:1: rule__XUnaryOperation__Group_0__0 : rule__XUnaryOperation__Group_0__0__Impl rule__XUnaryOperation__Group_0__1 ;
+    // InternalPerspectiveDsl.g:11178:1: rule__XUnaryOperation__Group_0__0 : rule__XUnaryOperation__Group_0__0__Impl rule__XUnaryOperation__Group_0__1 ;
     public final void rule__XUnaryOperation__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11180:1: ( rule__XUnaryOperation__Group_0__0__Impl rule__XUnaryOperation__Group_0__1 )
-            // InternalPerspectiveDsl.g:11181:2: rule__XUnaryOperation__Group_0__0__Impl rule__XUnaryOperation__Group_0__1
+            // InternalPerspectiveDsl.g:11182:1: ( rule__XUnaryOperation__Group_0__0__Impl rule__XUnaryOperation__Group_0__1 )
+            // InternalPerspectiveDsl.g:11183:2: rule__XUnaryOperation__Group_0__0__Impl rule__XUnaryOperation__Group_0__1
             {
             pushFollow(FOLLOW_82);
             rule__XUnaryOperation__Group_0__0__Impl();
@@ -37341,23 +37341,23 @@
 
 
     // $ANTLR start "rule__XUnaryOperation__Group_0__0__Impl"
-    // InternalPerspectiveDsl.g:11188:1: rule__XUnaryOperation__Group_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:11190:1: rule__XUnaryOperation__Group_0__0__Impl : ( () ) ;
     public final void rule__XUnaryOperation__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11192:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:11193:1: ( () )
+            // InternalPerspectiveDsl.g:11194:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:11195:1: ( () )
             {
-            // InternalPerspectiveDsl.g:11193:1: ( () )
-            // InternalPerspectiveDsl.g:11194:2: ()
+            // InternalPerspectiveDsl.g:11195:1: ( () )
+            // InternalPerspectiveDsl.g:11196:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0()); 
             }
-            // InternalPerspectiveDsl.g:11195:2: ()
-            // InternalPerspectiveDsl.g:11195:3: 
+            // InternalPerspectiveDsl.g:11197:2: ()
+            // InternalPerspectiveDsl.g:11197:3: 
             {
             }
 
@@ -37382,14 +37382,14 @@
 
 
     // $ANTLR start "rule__XUnaryOperation__Group_0__1"
-    // InternalPerspectiveDsl.g:11203:1: rule__XUnaryOperation__Group_0__1 : rule__XUnaryOperation__Group_0__1__Impl rule__XUnaryOperation__Group_0__2 ;
+    // InternalPerspectiveDsl.g:11205:1: rule__XUnaryOperation__Group_0__1 : rule__XUnaryOperation__Group_0__1__Impl rule__XUnaryOperation__Group_0__2 ;
     public final void rule__XUnaryOperation__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11207:1: ( rule__XUnaryOperation__Group_0__1__Impl rule__XUnaryOperation__Group_0__2 )
-            // InternalPerspectiveDsl.g:11208:2: rule__XUnaryOperation__Group_0__1__Impl rule__XUnaryOperation__Group_0__2
+            // InternalPerspectiveDsl.g:11209:1: ( rule__XUnaryOperation__Group_0__1__Impl rule__XUnaryOperation__Group_0__2 )
+            // InternalPerspectiveDsl.g:11210:2: rule__XUnaryOperation__Group_0__1__Impl rule__XUnaryOperation__Group_0__2
             {
             pushFollow(FOLLOW_54);
             rule__XUnaryOperation__Group_0__1__Impl();
@@ -37420,23 +37420,23 @@
 
 
     // $ANTLR start "rule__XUnaryOperation__Group_0__1__Impl"
-    // InternalPerspectiveDsl.g:11215:1: rule__XUnaryOperation__Group_0__1__Impl : ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:11217:1: rule__XUnaryOperation__Group_0__1__Impl : ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) ) ;
     public final void rule__XUnaryOperation__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11219:1: ( ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) ) )
-            // InternalPerspectiveDsl.g:11220:1: ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) )
+            // InternalPerspectiveDsl.g:11221:1: ( ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) ) )
+            // InternalPerspectiveDsl.g:11222:1: ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:11220:1: ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) )
-            // InternalPerspectiveDsl.g:11221:2: ( rule__XUnaryOperation__FeatureAssignment_0_1 )
+            // InternalPerspectiveDsl.g:11222:1: ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) )
+            // InternalPerspectiveDsl.g:11223:2: ( rule__XUnaryOperation__FeatureAssignment_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXUnaryOperationAccess().getFeatureAssignment_0_1()); 
             }
-            // InternalPerspectiveDsl.g:11222:2: ( rule__XUnaryOperation__FeatureAssignment_0_1 )
-            // InternalPerspectiveDsl.g:11222:3: rule__XUnaryOperation__FeatureAssignment_0_1
+            // InternalPerspectiveDsl.g:11224:2: ( rule__XUnaryOperation__FeatureAssignment_0_1 )
+            // InternalPerspectiveDsl.g:11224:3: rule__XUnaryOperation__FeatureAssignment_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XUnaryOperation__FeatureAssignment_0_1();
@@ -37471,14 +37471,14 @@
 
 
     // $ANTLR start "rule__XUnaryOperation__Group_0__2"
-    // InternalPerspectiveDsl.g:11230:1: rule__XUnaryOperation__Group_0__2 : rule__XUnaryOperation__Group_0__2__Impl ;
+    // InternalPerspectiveDsl.g:11232:1: rule__XUnaryOperation__Group_0__2 : rule__XUnaryOperation__Group_0__2__Impl ;
     public final void rule__XUnaryOperation__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11234:1: ( rule__XUnaryOperation__Group_0__2__Impl )
-            // InternalPerspectiveDsl.g:11235:2: rule__XUnaryOperation__Group_0__2__Impl
+            // InternalPerspectiveDsl.g:11236:1: ( rule__XUnaryOperation__Group_0__2__Impl )
+            // InternalPerspectiveDsl.g:11237:2: rule__XUnaryOperation__Group_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XUnaryOperation__Group_0__2__Impl();
@@ -37504,23 +37504,23 @@
 
 
     // $ANTLR start "rule__XUnaryOperation__Group_0__2__Impl"
-    // InternalPerspectiveDsl.g:11241:1: rule__XUnaryOperation__Group_0__2__Impl : ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) ) ;
+    // InternalPerspectiveDsl.g:11243:1: rule__XUnaryOperation__Group_0__2__Impl : ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) ) ;
     public final void rule__XUnaryOperation__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11245:1: ( ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) ) )
-            // InternalPerspectiveDsl.g:11246:1: ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) )
+            // InternalPerspectiveDsl.g:11247:1: ( ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) ) )
+            // InternalPerspectiveDsl.g:11248:1: ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) )
             {
-            // InternalPerspectiveDsl.g:11246:1: ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) )
-            // InternalPerspectiveDsl.g:11247:2: ( rule__XUnaryOperation__OperandAssignment_0_2 )
+            // InternalPerspectiveDsl.g:11248:1: ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) )
+            // InternalPerspectiveDsl.g:11249:2: ( rule__XUnaryOperation__OperandAssignment_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXUnaryOperationAccess().getOperandAssignment_0_2()); 
             }
-            // InternalPerspectiveDsl.g:11248:2: ( rule__XUnaryOperation__OperandAssignment_0_2 )
-            // InternalPerspectiveDsl.g:11248:3: rule__XUnaryOperation__OperandAssignment_0_2
+            // InternalPerspectiveDsl.g:11250:2: ( rule__XUnaryOperation__OperandAssignment_0_2 )
+            // InternalPerspectiveDsl.g:11250:3: rule__XUnaryOperation__OperandAssignment_0_2
             {
             pushFollow(FOLLOW_2);
             rule__XUnaryOperation__OperandAssignment_0_2();
@@ -37555,14 +37555,14 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group__0"
-    // InternalPerspectiveDsl.g:11257:1: rule__XCastedExpression__Group__0 : rule__XCastedExpression__Group__0__Impl rule__XCastedExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:11259:1: rule__XCastedExpression__Group__0 : rule__XCastedExpression__Group__0__Impl rule__XCastedExpression__Group__1 ;
     public final void rule__XCastedExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11261:1: ( rule__XCastedExpression__Group__0__Impl rule__XCastedExpression__Group__1 )
-            // InternalPerspectiveDsl.g:11262:2: rule__XCastedExpression__Group__0__Impl rule__XCastedExpression__Group__1
+            // InternalPerspectiveDsl.g:11263:1: ( rule__XCastedExpression__Group__0__Impl rule__XCastedExpression__Group__1 )
+            // InternalPerspectiveDsl.g:11264:2: rule__XCastedExpression__Group__0__Impl rule__XCastedExpression__Group__1
             {
             pushFollow(FOLLOW_83);
             rule__XCastedExpression__Group__0__Impl();
@@ -37593,17 +37593,17 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:11269:1: rule__XCastedExpression__Group__0__Impl : ( ruleXPostfixOperation ) ;
+    // InternalPerspectiveDsl.g:11271:1: rule__XCastedExpression__Group__0__Impl : ( ruleXPostfixOperation ) ;
     public final void rule__XCastedExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11273:1: ( ( ruleXPostfixOperation ) )
-            // InternalPerspectiveDsl.g:11274:1: ( ruleXPostfixOperation )
+            // InternalPerspectiveDsl.g:11275:1: ( ( ruleXPostfixOperation ) )
+            // InternalPerspectiveDsl.g:11276:1: ( ruleXPostfixOperation )
             {
-            // InternalPerspectiveDsl.g:11274:1: ( ruleXPostfixOperation )
-            // InternalPerspectiveDsl.g:11275:2: ruleXPostfixOperation
+            // InternalPerspectiveDsl.g:11276:1: ( ruleXPostfixOperation )
+            // InternalPerspectiveDsl.g:11277:2: ruleXPostfixOperation
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0()); 
@@ -37638,14 +37638,14 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group__1"
-    // InternalPerspectiveDsl.g:11284:1: rule__XCastedExpression__Group__1 : rule__XCastedExpression__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:11286:1: rule__XCastedExpression__Group__1 : rule__XCastedExpression__Group__1__Impl ;
     public final void rule__XCastedExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11288:1: ( rule__XCastedExpression__Group__1__Impl )
-            // InternalPerspectiveDsl.g:11289:2: rule__XCastedExpression__Group__1__Impl
+            // InternalPerspectiveDsl.g:11290:1: ( rule__XCastedExpression__Group__1__Impl )
+            // InternalPerspectiveDsl.g:11291:2: rule__XCastedExpression__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XCastedExpression__Group__1__Impl();
@@ -37671,22 +37671,22 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:11295:1: rule__XCastedExpression__Group__1__Impl : ( ( rule__XCastedExpression__Group_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:11297:1: rule__XCastedExpression__Group__1__Impl : ( ( rule__XCastedExpression__Group_1__0 )* ) ;
     public final void rule__XCastedExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11299:1: ( ( ( rule__XCastedExpression__Group_1__0 )* ) )
-            // InternalPerspectiveDsl.g:11300:1: ( ( rule__XCastedExpression__Group_1__0 )* )
+            // InternalPerspectiveDsl.g:11301:1: ( ( ( rule__XCastedExpression__Group_1__0 )* ) )
+            // InternalPerspectiveDsl.g:11302:1: ( ( rule__XCastedExpression__Group_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:11300:1: ( ( rule__XCastedExpression__Group_1__0 )* )
-            // InternalPerspectiveDsl.g:11301:2: ( rule__XCastedExpression__Group_1__0 )*
+            // InternalPerspectiveDsl.g:11302:1: ( ( rule__XCastedExpression__Group_1__0 )* )
+            // InternalPerspectiveDsl.g:11303:2: ( rule__XCastedExpression__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionAccess().getGroup_1()); 
             }
-            // InternalPerspectiveDsl.g:11302:2: ( rule__XCastedExpression__Group_1__0 )*
+            // InternalPerspectiveDsl.g:11304:2: ( rule__XCastedExpression__Group_1__0 )*
             loop78:
             do {
                 int alt78=2;
@@ -37705,7 +37705,7 @@
 
                 switch (alt78) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:11302:3: rule__XCastedExpression__Group_1__0
+            	    // InternalPerspectiveDsl.g:11304:3: rule__XCastedExpression__Group_1__0
             	    {
             	    pushFollow(FOLLOW_84);
             	    rule__XCastedExpression__Group_1__0();
@@ -37746,14 +37746,14 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1__0"
-    // InternalPerspectiveDsl.g:11311:1: rule__XCastedExpression__Group_1__0 : rule__XCastedExpression__Group_1__0__Impl rule__XCastedExpression__Group_1__1 ;
+    // InternalPerspectiveDsl.g:11313:1: rule__XCastedExpression__Group_1__0 : rule__XCastedExpression__Group_1__0__Impl rule__XCastedExpression__Group_1__1 ;
     public final void rule__XCastedExpression__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11315:1: ( rule__XCastedExpression__Group_1__0__Impl rule__XCastedExpression__Group_1__1 )
-            // InternalPerspectiveDsl.g:11316:2: rule__XCastedExpression__Group_1__0__Impl rule__XCastedExpression__Group_1__1
+            // InternalPerspectiveDsl.g:11317:1: ( rule__XCastedExpression__Group_1__0__Impl rule__XCastedExpression__Group_1__1 )
+            // InternalPerspectiveDsl.g:11318:2: rule__XCastedExpression__Group_1__0__Impl rule__XCastedExpression__Group_1__1
             {
             pushFollow(FOLLOW_71);
             rule__XCastedExpression__Group_1__0__Impl();
@@ -37784,23 +37784,23 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1__0__Impl"
-    // InternalPerspectiveDsl.g:11323:1: rule__XCastedExpression__Group_1__0__Impl : ( ( rule__XCastedExpression__Group_1_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:11325:1: rule__XCastedExpression__Group_1__0__Impl : ( ( rule__XCastedExpression__Group_1_0__0 ) ) ;
     public final void rule__XCastedExpression__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11327:1: ( ( ( rule__XCastedExpression__Group_1_0__0 ) ) )
-            // InternalPerspectiveDsl.g:11328:1: ( ( rule__XCastedExpression__Group_1_0__0 ) )
+            // InternalPerspectiveDsl.g:11329:1: ( ( ( rule__XCastedExpression__Group_1_0__0 ) ) )
+            // InternalPerspectiveDsl.g:11330:1: ( ( rule__XCastedExpression__Group_1_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:11328:1: ( ( rule__XCastedExpression__Group_1_0__0 ) )
-            // InternalPerspectiveDsl.g:11329:2: ( rule__XCastedExpression__Group_1_0__0 )
+            // InternalPerspectiveDsl.g:11330:1: ( ( rule__XCastedExpression__Group_1_0__0 ) )
+            // InternalPerspectiveDsl.g:11331:2: ( rule__XCastedExpression__Group_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionAccess().getGroup_1_0()); 
             }
-            // InternalPerspectiveDsl.g:11330:2: ( rule__XCastedExpression__Group_1_0__0 )
-            // InternalPerspectiveDsl.g:11330:3: rule__XCastedExpression__Group_1_0__0
+            // InternalPerspectiveDsl.g:11332:2: ( rule__XCastedExpression__Group_1_0__0 )
+            // InternalPerspectiveDsl.g:11332:3: rule__XCastedExpression__Group_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XCastedExpression__Group_1_0__0();
@@ -37835,14 +37835,14 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1__1"
-    // InternalPerspectiveDsl.g:11338:1: rule__XCastedExpression__Group_1__1 : rule__XCastedExpression__Group_1__1__Impl ;
+    // InternalPerspectiveDsl.g:11340:1: rule__XCastedExpression__Group_1__1 : rule__XCastedExpression__Group_1__1__Impl ;
     public final void rule__XCastedExpression__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11342:1: ( rule__XCastedExpression__Group_1__1__Impl )
-            // InternalPerspectiveDsl.g:11343:2: rule__XCastedExpression__Group_1__1__Impl
+            // InternalPerspectiveDsl.g:11344:1: ( rule__XCastedExpression__Group_1__1__Impl )
+            // InternalPerspectiveDsl.g:11345:2: rule__XCastedExpression__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XCastedExpression__Group_1__1__Impl();
@@ -37868,23 +37868,23 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1__1__Impl"
-    // InternalPerspectiveDsl.g:11349:1: rule__XCastedExpression__Group_1__1__Impl : ( ( rule__XCastedExpression__TypeAssignment_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:11351:1: rule__XCastedExpression__Group_1__1__Impl : ( ( rule__XCastedExpression__TypeAssignment_1_1 ) ) ;
     public final void rule__XCastedExpression__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11353:1: ( ( ( rule__XCastedExpression__TypeAssignment_1_1 ) ) )
-            // InternalPerspectiveDsl.g:11354:1: ( ( rule__XCastedExpression__TypeAssignment_1_1 ) )
+            // InternalPerspectiveDsl.g:11355:1: ( ( ( rule__XCastedExpression__TypeAssignment_1_1 ) ) )
+            // InternalPerspectiveDsl.g:11356:1: ( ( rule__XCastedExpression__TypeAssignment_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:11354:1: ( ( rule__XCastedExpression__TypeAssignment_1_1 ) )
-            // InternalPerspectiveDsl.g:11355:2: ( rule__XCastedExpression__TypeAssignment_1_1 )
+            // InternalPerspectiveDsl.g:11356:1: ( ( rule__XCastedExpression__TypeAssignment_1_1 ) )
+            // InternalPerspectiveDsl.g:11357:2: ( rule__XCastedExpression__TypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionAccess().getTypeAssignment_1_1()); 
             }
-            // InternalPerspectiveDsl.g:11356:2: ( rule__XCastedExpression__TypeAssignment_1_1 )
-            // InternalPerspectiveDsl.g:11356:3: rule__XCastedExpression__TypeAssignment_1_1
+            // InternalPerspectiveDsl.g:11358:2: ( rule__XCastedExpression__TypeAssignment_1_1 )
+            // InternalPerspectiveDsl.g:11358:3: rule__XCastedExpression__TypeAssignment_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XCastedExpression__TypeAssignment_1_1();
@@ -37919,14 +37919,14 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1_0__0"
-    // InternalPerspectiveDsl.g:11365:1: rule__XCastedExpression__Group_1_0__0 : rule__XCastedExpression__Group_1_0__0__Impl ;
+    // InternalPerspectiveDsl.g:11367:1: rule__XCastedExpression__Group_1_0__0 : rule__XCastedExpression__Group_1_0__0__Impl ;
     public final void rule__XCastedExpression__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11369:1: ( rule__XCastedExpression__Group_1_0__0__Impl )
-            // InternalPerspectiveDsl.g:11370:2: rule__XCastedExpression__Group_1_0__0__Impl
+            // InternalPerspectiveDsl.g:11371:1: ( rule__XCastedExpression__Group_1_0__0__Impl )
+            // InternalPerspectiveDsl.g:11372:2: rule__XCastedExpression__Group_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XCastedExpression__Group_1_0__0__Impl();
@@ -37952,23 +37952,23 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1_0__0__Impl"
-    // InternalPerspectiveDsl.g:11376:1: rule__XCastedExpression__Group_1_0__0__Impl : ( ( rule__XCastedExpression__Group_1_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:11378:1: rule__XCastedExpression__Group_1_0__0__Impl : ( ( rule__XCastedExpression__Group_1_0_0__0 ) ) ;
     public final void rule__XCastedExpression__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11380:1: ( ( ( rule__XCastedExpression__Group_1_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:11381:1: ( ( rule__XCastedExpression__Group_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:11382:1: ( ( ( rule__XCastedExpression__Group_1_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:11383:1: ( ( rule__XCastedExpression__Group_1_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:11381:1: ( ( rule__XCastedExpression__Group_1_0_0__0 ) )
-            // InternalPerspectiveDsl.g:11382:2: ( rule__XCastedExpression__Group_1_0_0__0 )
+            // InternalPerspectiveDsl.g:11383:1: ( ( rule__XCastedExpression__Group_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:11384:2: ( rule__XCastedExpression__Group_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionAccess().getGroup_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:11383:2: ( rule__XCastedExpression__Group_1_0_0__0 )
-            // InternalPerspectiveDsl.g:11383:3: rule__XCastedExpression__Group_1_0_0__0
+            // InternalPerspectiveDsl.g:11385:2: ( rule__XCastedExpression__Group_1_0_0__0 )
+            // InternalPerspectiveDsl.g:11385:3: rule__XCastedExpression__Group_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XCastedExpression__Group_1_0_0__0();
@@ -38003,14 +38003,14 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1_0_0__0"
-    // InternalPerspectiveDsl.g:11392:1: rule__XCastedExpression__Group_1_0_0__0 : rule__XCastedExpression__Group_1_0_0__0__Impl rule__XCastedExpression__Group_1_0_0__1 ;
+    // InternalPerspectiveDsl.g:11394:1: rule__XCastedExpression__Group_1_0_0__0 : rule__XCastedExpression__Group_1_0_0__0__Impl rule__XCastedExpression__Group_1_0_0__1 ;
     public final void rule__XCastedExpression__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11396:1: ( rule__XCastedExpression__Group_1_0_0__0__Impl rule__XCastedExpression__Group_1_0_0__1 )
-            // InternalPerspectiveDsl.g:11397:2: rule__XCastedExpression__Group_1_0_0__0__Impl rule__XCastedExpression__Group_1_0_0__1
+            // InternalPerspectiveDsl.g:11398:1: ( rule__XCastedExpression__Group_1_0_0__0__Impl rule__XCastedExpression__Group_1_0_0__1 )
+            // InternalPerspectiveDsl.g:11399:2: rule__XCastedExpression__Group_1_0_0__0__Impl rule__XCastedExpression__Group_1_0_0__1
             {
             pushFollow(FOLLOW_83);
             rule__XCastedExpression__Group_1_0_0__0__Impl();
@@ -38041,23 +38041,23 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:11404:1: rule__XCastedExpression__Group_1_0_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:11406:1: rule__XCastedExpression__Group_1_0_0__0__Impl : ( () ) ;
     public final void rule__XCastedExpression__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11408:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:11409:1: ( () )
+            // InternalPerspectiveDsl.g:11410:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:11411:1: ( () )
             {
-            // InternalPerspectiveDsl.g:11409:1: ( () )
-            // InternalPerspectiveDsl.g:11410:2: ()
+            // InternalPerspectiveDsl.g:11411:1: ( () )
+            // InternalPerspectiveDsl.g:11412:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:11411:2: ()
-            // InternalPerspectiveDsl.g:11411:3: 
+            // InternalPerspectiveDsl.g:11413:2: ()
+            // InternalPerspectiveDsl.g:11413:3: 
             {
             }
 
@@ -38082,14 +38082,14 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1_0_0__1"
-    // InternalPerspectiveDsl.g:11419:1: rule__XCastedExpression__Group_1_0_0__1 : rule__XCastedExpression__Group_1_0_0__1__Impl ;
+    // InternalPerspectiveDsl.g:11421:1: rule__XCastedExpression__Group_1_0_0__1 : rule__XCastedExpression__Group_1_0_0__1__Impl ;
     public final void rule__XCastedExpression__Group_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11423:1: ( rule__XCastedExpression__Group_1_0_0__1__Impl )
-            // InternalPerspectiveDsl.g:11424:2: rule__XCastedExpression__Group_1_0_0__1__Impl
+            // InternalPerspectiveDsl.g:11425:1: ( rule__XCastedExpression__Group_1_0_0__1__Impl )
+            // InternalPerspectiveDsl.g:11426:2: rule__XCastedExpression__Group_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XCastedExpression__Group_1_0_0__1__Impl();
@@ -38115,17 +38115,17 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:11430:1: rule__XCastedExpression__Group_1_0_0__1__Impl : ( 'as' ) ;
+    // InternalPerspectiveDsl.g:11432:1: rule__XCastedExpression__Group_1_0_0__1__Impl : ( 'as' ) ;
     public final void rule__XCastedExpression__Group_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11434:1: ( ( 'as' ) )
-            // InternalPerspectiveDsl.g:11435:1: ( 'as' )
+            // InternalPerspectiveDsl.g:11436:1: ( ( 'as' ) )
+            // InternalPerspectiveDsl.g:11437:1: ( 'as' )
             {
-            // InternalPerspectiveDsl.g:11435:1: ( 'as' )
-            // InternalPerspectiveDsl.g:11436:2: 'as'
+            // InternalPerspectiveDsl.g:11437:1: ( 'as' )
+            // InternalPerspectiveDsl.g:11438:2: 'as'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1()); 
@@ -38156,14 +38156,14 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group__0"
-    // InternalPerspectiveDsl.g:11446:1: rule__XPostfixOperation__Group__0 : rule__XPostfixOperation__Group__0__Impl rule__XPostfixOperation__Group__1 ;
+    // InternalPerspectiveDsl.g:11448:1: rule__XPostfixOperation__Group__0 : rule__XPostfixOperation__Group__0__Impl rule__XPostfixOperation__Group__1 ;
     public final void rule__XPostfixOperation__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11450:1: ( rule__XPostfixOperation__Group__0__Impl rule__XPostfixOperation__Group__1 )
-            // InternalPerspectiveDsl.g:11451:2: rule__XPostfixOperation__Group__0__Impl rule__XPostfixOperation__Group__1
+            // InternalPerspectiveDsl.g:11452:1: ( rule__XPostfixOperation__Group__0__Impl rule__XPostfixOperation__Group__1 )
+            // InternalPerspectiveDsl.g:11453:2: rule__XPostfixOperation__Group__0__Impl rule__XPostfixOperation__Group__1
             {
             pushFollow(FOLLOW_85);
             rule__XPostfixOperation__Group__0__Impl();
@@ -38194,17 +38194,17 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group__0__Impl"
-    // InternalPerspectiveDsl.g:11458:1: rule__XPostfixOperation__Group__0__Impl : ( ruleXMemberFeatureCall ) ;
+    // InternalPerspectiveDsl.g:11460:1: rule__XPostfixOperation__Group__0__Impl : ( ruleXMemberFeatureCall ) ;
     public final void rule__XPostfixOperation__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11462:1: ( ( ruleXMemberFeatureCall ) )
-            // InternalPerspectiveDsl.g:11463:1: ( ruleXMemberFeatureCall )
+            // InternalPerspectiveDsl.g:11464:1: ( ( ruleXMemberFeatureCall ) )
+            // InternalPerspectiveDsl.g:11465:1: ( ruleXMemberFeatureCall )
             {
-            // InternalPerspectiveDsl.g:11463:1: ( ruleXMemberFeatureCall )
-            // InternalPerspectiveDsl.g:11464:2: ruleXMemberFeatureCall
+            // InternalPerspectiveDsl.g:11465:1: ( ruleXMemberFeatureCall )
+            // InternalPerspectiveDsl.g:11466:2: ruleXMemberFeatureCall
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0()); 
@@ -38239,14 +38239,14 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group__1"
-    // InternalPerspectiveDsl.g:11473:1: rule__XPostfixOperation__Group__1 : rule__XPostfixOperation__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:11475:1: rule__XPostfixOperation__Group__1 : rule__XPostfixOperation__Group__1__Impl ;
     public final void rule__XPostfixOperation__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11477:1: ( rule__XPostfixOperation__Group__1__Impl )
-            // InternalPerspectiveDsl.g:11478:2: rule__XPostfixOperation__Group__1__Impl
+            // InternalPerspectiveDsl.g:11479:1: ( rule__XPostfixOperation__Group__1__Impl )
+            // InternalPerspectiveDsl.g:11480:2: rule__XPostfixOperation__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XPostfixOperation__Group__1__Impl();
@@ -38272,22 +38272,22 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group__1__Impl"
-    // InternalPerspectiveDsl.g:11484:1: rule__XPostfixOperation__Group__1__Impl : ( ( rule__XPostfixOperation__Group_1__0 )? ) ;
+    // InternalPerspectiveDsl.g:11486:1: rule__XPostfixOperation__Group__1__Impl : ( ( rule__XPostfixOperation__Group_1__0 )? ) ;
     public final void rule__XPostfixOperation__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11488:1: ( ( ( rule__XPostfixOperation__Group_1__0 )? ) )
-            // InternalPerspectiveDsl.g:11489:1: ( ( rule__XPostfixOperation__Group_1__0 )? )
+            // InternalPerspectiveDsl.g:11490:1: ( ( ( rule__XPostfixOperation__Group_1__0 )? ) )
+            // InternalPerspectiveDsl.g:11491:1: ( ( rule__XPostfixOperation__Group_1__0 )? )
             {
-            // InternalPerspectiveDsl.g:11489:1: ( ( rule__XPostfixOperation__Group_1__0 )? )
-            // InternalPerspectiveDsl.g:11490:2: ( rule__XPostfixOperation__Group_1__0 )?
+            // InternalPerspectiveDsl.g:11491:1: ( ( rule__XPostfixOperation__Group_1__0 )? )
+            // InternalPerspectiveDsl.g:11492:2: ( rule__XPostfixOperation__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPostfixOperationAccess().getGroup_1()); 
             }
-            // InternalPerspectiveDsl.g:11491:2: ( rule__XPostfixOperation__Group_1__0 )?
+            // InternalPerspectiveDsl.g:11493:2: ( rule__XPostfixOperation__Group_1__0 )?
             int alt79=2;
             int LA79_0 = input.LA(1);
 
@@ -38307,7 +38307,7 @@
             }
             switch (alt79) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:11491:3: rule__XPostfixOperation__Group_1__0
+                    // InternalPerspectiveDsl.g:11493:3: rule__XPostfixOperation__Group_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XPostfixOperation__Group_1__0();
@@ -38345,14 +38345,14 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group_1__0"
-    // InternalPerspectiveDsl.g:11500:1: rule__XPostfixOperation__Group_1__0 : rule__XPostfixOperation__Group_1__0__Impl ;
+    // InternalPerspectiveDsl.g:11502:1: rule__XPostfixOperation__Group_1__0 : rule__XPostfixOperation__Group_1__0__Impl ;
     public final void rule__XPostfixOperation__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11504:1: ( rule__XPostfixOperation__Group_1__0__Impl )
-            // InternalPerspectiveDsl.g:11505:2: rule__XPostfixOperation__Group_1__0__Impl
+            // InternalPerspectiveDsl.g:11506:1: ( rule__XPostfixOperation__Group_1__0__Impl )
+            // InternalPerspectiveDsl.g:11507:2: rule__XPostfixOperation__Group_1__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XPostfixOperation__Group_1__0__Impl();
@@ -38378,23 +38378,23 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group_1__0__Impl"
-    // InternalPerspectiveDsl.g:11511:1: rule__XPostfixOperation__Group_1__0__Impl : ( ( rule__XPostfixOperation__Group_1_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:11513:1: rule__XPostfixOperation__Group_1__0__Impl : ( ( rule__XPostfixOperation__Group_1_0__0 ) ) ;
     public final void rule__XPostfixOperation__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11515:1: ( ( ( rule__XPostfixOperation__Group_1_0__0 ) ) )
-            // InternalPerspectiveDsl.g:11516:1: ( ( rule__XPostfixOperation__Group_1_0__0 ) )
+            // InternalPerspectiveDsl.g:11517:1: ( ( ( rule__XPostfixOperation__Group_1_0__0 ) ) )
+            // InternalPerspectiveDsl.g:11518:1: ( ( rule__XPostfixOperation__Group_1_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:11516:1: ( ( rule__XPostfixOperation__Group_1_0__0 ) )
-            // InternalPerspectiveDsl.g:11517:2: ( rule__XPostfixOperation__Group_1_0__0 )
+            // InternalPerspectiveDsl.g:11518:1: ( ( rule__XPostfixOperation__Group_1_0__0 ) )
+            // InternalPerspectiveDsl.g:11519:2: ( rule__XPostfixOperation__Group_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPostfixOperationAccess().getGroup_1_0()); 
             }
-            // InternalPerspectiveDsl.g:11518:2: ( rule__XPostfixOperation__Group_1_0__0 )
-            // InternalPerspectiveDsl.g:11518:3: rule__XPostfixOperation__Group_1_0__0
+            // InternalPerspectiveDsl.g:11520:2: ( rule__XPostfixOperation__Group_1_0__0 )
+            // InternalPerspectiveDsl.g:11520:3: rule__XPostfixOperation__Group_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XPostfixOperation__Group_1_0__0();
@@ -38429,14 +38429,14 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group_1_0__0"
-    // InternalPerspectiveDsl.g:11527:1: rule__XPostfixOperation__Group_1_0__0 : rule__XPostfixOperation__Group_1_0__0__Impl rule__XPostfixOperation__Group_1_0__1 ;
+    // InternalPerspectiveDsl.g:11529:1: rule__XPostfixOperation__Group_1_0__0 : rule__XPostfixOperation__Group_1_0__0__Impl rule__XPostfixOperation__Group_1_0__1 ;
     public final void rule__XPostfixOperation__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11531:1: ( rule__XPostfixOperation__Group_1_0__0__Impl rule__XPostfixOperation__Group_1_0__1 )
-            // InternalPerspectiveDsl.g:11532:2: rule__XPostfixOperation__Group_1_0__0__Impl rule__XPostfixOperation__Group_1_0__1
+            // InternalPerspectiveDsl.g:11533:1: ( rule__XPostfixOperation__Group_1_0__0__Impl rule__XPostfixOperation__Group_1_0__1 )
+            // InternalPerspectiveDsl.g:11534:2: rule__XPostfixOperation__Group_1_0__0__Impl rule__XPostfixOperation__Group_1_0__1
             {
             pushFollow(FOLLOW_85);
             rule__XPostfixOperation__Group_1_0__0__Impl();
@@ -38467,23 +38467,23 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group_1_0__0__Impl"
-    // InternalPerspectiveDsl.g:11539:1: rule__XPostfixOperation__Group_1_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:11541:1: rule__XPostfixOperation__Group_1_0__0__Impl : ( () ) ;
     public final void rule__XPostfixOperation__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11543:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:11544:1: ( () )
+            // InternalPerspectiveDsl.g:11545:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:11546:1: ( () )
             {
-            // InternalPerspectiveDsl.g:11544:1: ( () )
-            // InternalPerspectiveDsl.g:11545:2: ()
+            // InternalPerspectiveDsl.g:11546:1: ( () )
+            // InternalPerspectiveDsl.g:11547:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:11546:2: ()
-            // InternalPerspectiveDsl.g:11546:3: 
+            // InternalPerspectiveDsl.g:11548:2: ()
+            // InternalPerspectiveDsl.g:11548:3: 
             {
             }
 
@@ -38508,14 +38508,14 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group_1_0__1"
-    // InternalPerspectiveDsl.g:11554:1: rule__XPostfixOperation__Group_1_0__1 : rule__XPostfixOperation__Group_1_0__1__Impl ;
+    // InternalPerspectiveDsl.g:11556:1: rule__XPostfixOperation__Group_1_0__1 : rule__XPostfixOperation__Group_1_0__1__Impl ;
     public final void rule__XPostfixOperation__Group_1_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11558:1: ( rule__XPostfixOperation__Group_1_0__1__Impl )
-            // InternalPerspectiveDsl.g:11559:2: rule__XPostfixOperation__Group_1_0__1__Impl
+            // InternalPerspectiveDsl.g:11560:1: ( rule__XPostfixOperation__Group_1_0__1__Impl )
+            // InternalPerspectiveDsl.g:11561:2: rule__XPostfixOperation__Group_1_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XPostfixOperation__Group_1_0__1__Impl();
@@ -38541,23 +38541,23 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group_1_0__1__Impl"
-    // InternalPerspectiveDsl.g:11565:1: rule__XPostfixOperation__Group_1_0__1__Impl : ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:11567:1: rule__XPostfixOperation__Group_1_0__1__Impl : ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) ) ;
     public final void rule__XPostfixOperation__Group_1_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11569:1: ( ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) ) )
-            // InternalPerspectiveDsl.g:11570:1: ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) )
+            // InternalPerspectiveDsl.g:11571:1: ( ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) ) )
+            // InternalPerspectiveDsl.g:11572:1: ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:11570:1: ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) )
-            // InternalPerspectiveDsl.g:11571:2: ( rule__XPostfixOperation__FeatureAssignment_1_0_1 )
+            // InternalPerspectiveDsl.g:11572:1: ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) )
+            // InternalPerspectiveDsl.g:11573:2: ( rule__XPostfixOperation__FeatureAssignment_1_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPostfixOperationAccess().getFeatureAssignment_1_0_1()); 
             }
-            // InternalPerspectiveDsl.g:11572:2: ( rule__XPostfixOperation__FeatureAssignment_1_0_1 )
-            // InternalPerspectiveDsl.g:11572:3: rule__XPostfixOperation__FeatureAssignment_1_0_1
+            // InternalPerspectiveDsl.g:11574:2: ( rule__XPostfixOperation__FeatureAssignment_1_0_1 )
+            // InternalPerspectiveDsl.g:11574:3: rule__XPostfixOperation__FeatureAssignment_1_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XPostfixOperation__FeatureAssignment_1_0_1();
@@ -38592,14 +38592,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group__0"
-    // InternalPerspectiveDsl.g:11581:1: rule__XMemberFeatureCall__Group__0 : rule__XMemberFeatureCall__Group__0__Impl rule__XMemberFeatureCall__Group__1 ;
+    // InternalPerspectiveDsl.g:11583:1: rule__XMemberFeatureCall__Group__0 : rule__XMemberFeatureCall__Group__0__Impl rule__XMemberFeatureCall__Group__1 ;
     public final void rule__XMemberFeatureCall__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11585:1: ( rule__XMemberFeatureCall__Group__0__Impl rule__XMemberFeatureCall__Group__1 )
-            // InternalPerspectiveDsl.g:11586:2: rule__XMemberFeatureCall__Group__0__Impl rule__XMemberFeatureCall__Group__1
+            // InternalPerspectiveDsl.g:11587:1: ( rule__XMemberFeatureCall__Group__0__Impl rule__XMemberFeatureCall__Group__1 )
+            // InternalPerspectiveDsl.g:11588:2: rule__XMemberFeatureCall__Group__0__Impl rule__XMemberFeatureCall__Group__1
             {
             pushFollow(FOLLOW_86);
             rule__XMemberFeatureCall__Group__0__Impl();
@@ -38630,17 +38630,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group__0__Impl"
-    // InternalPerspectiveDsl.g:11593:1: rule__XMemberFeatureCall__Group__0__Impl : ( ruleXPrimaryExpression ) ;
+    // InternalPerspectiveDsl.g:11595:1: rule__XMemberFeatureCall__Group__0__Impl : ( ruleXPrimaryExpression ) ;
     public final void rule__XMemberFeatureCall__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11597:1: ( ( ruleXPrimaryExpression ) )
-            // InternalPerspectiveDsl.g:11598:1: ( ruleXPrimaryExpression )
+            // InternalPerspectiveDsl.g:11599:1: ( ( ruleXPrimaryExpression ) )
+            // InternalPerspectiveDsl.g:11600:1: ( ruleXPrimaryExpression )
             {
-            // InternalPerspectiveDsl.g:11598:1: ( ruleXPrimaryExpression )
-            // InternalPerspectiveDsl.g:11599:2: ruleXPrimaryExpression
+            // InternalPerspectiveDsl.g:11600:1: ( ruleXPrimaryExpression )
+            // InternalPerspectiveDsl.g:11601:2: ruleXPrimaryExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0()); 
@@ -38675,14 +38675,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group__1"
-    // InternalPerspectiveDsl.g:11608:1: rule__XMemberFeatureCall__Group__1 : rule__XMemberFeatureCall__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:11610:1: rule__XMemberFeatureCall__Group__1 : rule__XMemberFeatureCall__Group__1__Impl ;
     public final void rule__XMemberFeatureCall__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11612:1: ( rule__XMemberFeatureCall__Group__1__Impl )
-            // InternalPerspectiveDsl.g:11613:2: rule__XMemberFeatureCall__Group__1__Impl
+            // InternalPerspectiveDsl.g:11614:1: ( rule__XMemberFeatureCall__Group__1__Impl )
+            // InternalPerspectiveDsl.g:11615:2: rule__XMemberFeatureCall__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group__1__Impl();
@@ -38708,22 +38708,22 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group__1__Impl"
-    // InternalPerspectiveDsl.g:11619:1: rule__XMemberFeatureCall__Group__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1 )* ) ;
+    // InternalPerspectiveDsl.g:11621:1: rule__XMemberFeatureCall__Group__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1 )* ) ;
     public final void rule__XMemberFeatureCall__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11623:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1 )* ) )
-            // InternalPerspectiveDsl.g:11624:1: ( ( rule__XMemberFeatureCall__Alternatives_1 )* )
+            // InternalPerspectiveDsl.g:11625:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1 )* ) )
+            // InternalPerspectiveDsl.g:11626:1: ( ( rule__XMemberFeatureCall__Alternatives_1 )* )
             {
-            // InternalPerspectiveDsl.g:11624:1: ( ( rule__XMemberFeatureCall__Alternatives_1 )* )
-            // InternalPerspectiveDsl.g:11625:2: ( rule__XMemberFeatureCall__Alternatives_1 )*
+            // InternalPerspectiveDsl.g:11626:1: ( ( rule__XMemberFeatureCall__Alternatives_1 )* )
+            // InternalPerspectiveDsl.g:11627:2: ( rule__XMemberFeatureCall__Alternatives_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1()); 
             }
-            // InternalPerspectiveDsl.g:11626:2: ( rule__XMemberFeatureCall__Alternatives_1 )*
+            // InternalPerspectiveDsl.g:11628:2: ( rule__XMemberFeatureCall__Alternatives_1 )*
             loop80:
             do {
                 int alt80=2;
@@ -38766,7 +38766,7 @@
 
                 switch (alt80) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:11626:3: rule__XMemberFeatureCall__Alternatives_1
+            	    // InternalPerspectiveDsl.g:11628:3: rule__XMemberFeatureCall__Alternatives_1
             	    {
             	    pushFollow(FOLLOW_87);
             	    rule__XMemberFeatureCall__Alternatives_1();
@@ -38807,14 +38807,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0__0"
-    // InternalPerspectiveDsl.g:11635:1: rule__XMemberFeatureCall__Group_1_0__0 : rule__XMemberFeatureCall__Group_1_0__0__Impl rule__XMemberFeatureCall__Group_1_0__1 ;
+    // InternalPerspectiveDsl.g:11637:1: rule__XMemberFeatureCall__Group_1_0__0 : rule__XMemberFeatureCall__Group_1_0__0__Impl rule__XMemberFeatureCall__Group_1_0__1 ;
     public final void rule__XMemberFeatureCall__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11639:1: ( rule__XMemberFeatureCall__Group_1_0__0__Impl rule__XMemberFeatureCall__Group_1_0__1 )
-            // InternalPerspectiveDsl.g:11640:2: rule__XMemberFeatureCall__Group_1_0__0__Impl rule__XMemberFeatureCall__Group_1_0__1
+            // InternalPerspectiveDsl.g:11641:1: ( rule__XMemberFeatureCall__Group_1_0__0__Impl rule__XMemberFeatureCall__Group_1_0__1 )
+            // InternalPerspectiveDsl.g:11642:2: rule__XMemberFeatureCall__Group_1_0__0__Impl rule__XMemberFeatureCall__Group_1_0__1
             {
             pushFollow(FOLLOW_54);
             rule__XMemberFeatureCall__Group_1_0__0__Impl();
@@ -38845,23 +38845,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0__0__Impl"
-    // InternalPerspectiveDsl.g:11647:1: rule__XMemberFeatureCall__Group_1_0__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:11649:1: rule__XMemberFeatureCall__Group_1_0__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11651:1: ( ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:11652:1: ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:11653:1: ( ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:11654:1: ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:11652:1: ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) )
-            // InternalPerspectiveDsl.g:11653:2: ( rule__XMemberFeatureCall__Group_1_0_0__0 )
+            // InternalPerspectiveDsl.g:11654:1: ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:11655:2: ( rule__XMemberFeatureCall__Group_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:11654:2: ( rule__XMemberFeatureCall__Group_1_0_0__0 )
-            // InternalPerspectiveDsl.g:11654:3: rule__XMemberFeatureCall__Group_1_0_0__0
+            // InternalPerspectiveDsl.g:11656:2: ( rule__XMemberFeatureCall__Group_1_0_0__0 )
+            // InternalPerspectiveDsl.g:11656:3: rule__XMemberFeatureCall__Group_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_0_0__0();
@@ -38896,14 +38896,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0__1"
-    // InternalPerspectiveDsl.g:11662:1: rule__XMemberFeatureCall__Group_1_0__1 : rule__XMemberFeatureCall__Group_1_0__1__Impl ;
+    // InternalPerspectiveDsl.g:11664:1: rule__XMemberFeatureCall__Group_1_0__1 : rule__XMemberFeatureCall__Group_1_0__1__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11666:1: ( rule__XMemberFeatureCall__Group_1_0__1__Impl )
-            // InternalPerspectiveDsl.g:11667:2: rule__XMemberFeatureCall__Group_1_0__1__Impl
+            // InternalPerspectiveDsl.g:11668:1: ( rule__XMemberFeatureCall__Group_1_0__1__Impl )
+            // InternalPerspectiveDsl.g:11669:2: rule__XMemberFeatureCall__Group_1_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_0__1__Impl();
@@ -38929,23 +38929,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0__1__Impl"
-    // InternalPerspectiveDsl.g:11673:1: rule__XMemberFeatureCall__Group_1_0__1__Impl : ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:11675:1: rule__XMemberFeatureCall__Group_1_0__1__Impl : ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11677:1: ( ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) ) )
-            // InternalPerspectiveDsl.g:11678:1: ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) )
+            // InternalPerspectiveDsl.g:11679:1: ( ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) ) )
+            // InternalPerspectiveDsl.g:11680:1: ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:11678:1: ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) )
-            // InternalPerspectiveDsl.g:11679:2: ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 )
+            // InternalPerspectiveDsl.g:11680:1: ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) )
+            // InternalPerspectiveDsl.g:11681:2: ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getValueAssignment_1_0_1()); 
             }
-            // InternalPerspectiveDsl.g:11680:2: ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 )
-            // InternalPerspectiveDsl.g:11680:3: rule__XMemberFeatureCall__ValueAssignment_1_0_1
+            // InternalPerspectiveDsl.g:11682:2: ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 )
+            // InternalPerspectiveDsl.g:11682:3: rule__XMemberFeatureCall__ValueAssignment_1_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__ValueAssignment_1_0_1();
@@ -38980,14 +38980,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0__0"
-    // InternalPerspectiveDsl.g:11689:1: rule__XMemberFeatureCall__Group_1_0_0__0 : rule__XMemberFeatureCall__Group_1_0_0__0__Impl ;
+    // InternalPerspectiveDsl.g:11691:1: rule__XMemberFeatureCall__Group_1_0_0__0 : rule__XMemberFeatureCall__Group_1_0_0__0__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11693:1: ( rule__XMemberFeatureCall__Group_1_0_0__0__Impl )
-            // InternalPerspectiveDsl.g:11694:2: rule__XMemberFeatureCall__Group_1_0_0__0__Impl
+            // InternalPerspectiveDsl.g:11695:1: ( rule__XMemberFeatureCall__Group_1_0_0__0__Impl )
+            // InternalPerspectiveDsl.g:11696:2: rule__XMemberFeatureCall__Group_1_0_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_0_0__0__Impl();
@@ -39013,23 +39013,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:11700:1: rule__XMemberFeatureCall__Group_1_0_0__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:11702:1: rule__XMemberFeatureCall__Group_1_0_0__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11704:1: ( ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:11705:1: ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) )
+            // InternalPerspectiveDsl.g:11706:1: ( ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:11707:1: ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:11705:1: ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) )
-            // InternalPerspectiveDsl.g:11706:2: ( rule__XMemberFeatureCall__Group_1_0_0_0__0 )
+            // InternalPerspectiveDsl.g:11707:1: ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) )
+            // InternalPerspectiveDsl.g:11708:2: ( rule__XMemberFeatureCall__Group_1_0_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:11707:2: ( rule__XMemberFeatureCall__Group_1_0_0_0__0 )
-            // InternalPerspectiveDsl.g:11707:3: rule__XMemberFeatureCall__Group_1_0_0_0__0
+            // InternalPerspectiveDsl.g:11709:2: ( rule__XMemberFeatureCall__Group_1_0_0_0__0 )
+            // InternalPerspectiveDsl.g:11709:3: rule__XMemberFeatureCall__Group_1_0_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_0_0_0__0();
@@ -39064,14 +39064,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__0"
-    // InternalPerspectiveDsl.g:11716:1: rule__XMemberFeatureCall__Group_1_0_0_0__0 : rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl rule__XMemberFeatureCall__Group_1_0_0_0__1 ;
+    // InternalPerspectiveDsl.g:11718:1: rule__XMemberFeatureCall__Group_1_0_0_0__0 : rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl rule__XMemberFeatureCall__Group_1_0_0_0__1 ;
     public final void rule__XMemberFeatureCall__Group_1_0_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11720:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl rule__XMemberFeatureCall__Group_1_0_0_0__1 )
-            // InternalPerspectiveDsl.g:11721:2: rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl rule__XMemberFeatureCall__Group_1_0_0_0__1
+            // InternalPerspectiveDsl.g:11722:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl rule__XMemberFeatureCall__Group_1_0_0_0__1 )
+            // InternalPerspectiveDsl.g:11723:2: rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl rule__XMemberFeatureCall__Group_1_0_0_0__1
             {
             pushFollow(FOLLOW_88);
             rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl();
@@ -39102,23 +39102,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:11728:1: rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:11730:1: rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl : ( () ) ;
     public final void rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11732:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:11733:1: ( () )
+            // InternalPerspectiveDsl.g:11734:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:11735:1: ( () )
             {
-            // InternalPerspectiveDsl.g:11733:1: ( () )
-            // InternalPerspectiveDsl.g:11734:2: ()
+            // InternalPerspectiveDsl.g:11735:1: ( () )
+            // InternalPerspectiveDsl.g:11736:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:11735:2: ()
-            // InternalPerspectiveDsl.g:11735:3: 
+            // InternalPerspectiveDsl.g:11737:2: ()
+            // InternalPerspectiveDsl.g:11737:3: 
             {
             }
 
@@ -39143,14 +39143,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__1"
-    // InternalPerspectiveDsl.g:11743:1: rule__XMemberFeatureCall__Group_1_0_0_0__1 : rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl rule__XMemberFeatureCall__Group_1_0_0_0__2 ;
+    // InternalPerspectiveDsl.g:11745:1: rule__XMemberFeatureCall__Group_1_0_0_0__1 : rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl rule__XMemberFeatureCall__Group_1_0_0_0__2 ;
     public final void rule__XMemberFeatureCall__Group_1_0_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11747:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl rule__XMemberFeatureCall__Group_1_0_0_0__2 )
-            // InternalPerspectiveDsl.g:11748:2: rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl rule__XMemberFeatureCall__Group_1_0_0_0__2
+            // InternalPerspectiveDsl.g:11749:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl rule__XMemberFeatureCall__Group_1_0_0_0__2 )
+            // InternalPerspectiveDsl.g:11750:2: rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl rule__XMemberFeatureCall__Group_1_0_0_0__2
             {
             pushFollow(FOLLOW_59);
             rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl();
@@ -39181,23 +39181,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:11755:1: rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:11757:1: rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11759:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) ) )
-            // InternalPerspectiveDsl.g:11760:1: ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) )
+            // InternalPerspectiveDsl.g:11761:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) ) )
+            // InternalPerspectiveDsl.g:11762:1: ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:11760:1: ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) )
-            // InternalPerspectiveDsl.g:11761:2: ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 )
+            // InternalPerspectiveDsl.g:11762:1: ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) )
+            // InternalPerspectiveDsl.g:11763:2: ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_0_0_0_1()); 
             }
-            // InternalPerspectiveDsl.g:11762:2: ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 )
-            // InternalPerspectiveDsl.g:11762:3: rule__XMemberFeatureCall__Alternatives_1_0_0_0_1
+            // InternalPerspectiveDsl.g:11764:2: ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 )
+            // InternalPerspectiveDsl.g:11764:3: rule__XMemberFeatureCall__Alternatives_1_0_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Alternatives_1_0_0_0_1();
@@ -39232,14 +39232,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__2"
-    // InternalPerspectiveDsl.g:11770:1: rule__XMemberFeatureCall__Group_1_0_0_0__2 : rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl rule__XMemberFeatureCall__Group_1_0_0_0__3 ;
+    // InternalPerspectiveDsl.g:11772:1: rule__XMemberFeatureCall__Group_1_0_0_0__2 : rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl rule__XMemberFeatureCall__Group_1_0_0_0__3 ;
     public final void rule__XMemberFeatureCall__Group_1_0_0_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11774:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl rule__XMemberFeatureCall__Group_1_0_0_0__3 )
-            // InternalPerspectiveDsl.g:11775:2: rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl rule__XMemberFeatureCall__Group_1_0_0_0__3
+            // InternalPerspectiveDsl.g:11776:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl rule__XMemberFeatureCall__Group_1_0_0_0__3 )
+            // InternalPerspectiveDsl.g:11777:2: rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl rule__XMemberFeatureCall__Group_1_0_0_0__3
             {
             pushFollow(FOLLOW_55);
             rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl();
@@ -39270,23 +39270,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl"
-    // InternalPerspectiveDsl.g:11782:1: rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl : ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) ) ;
+    // InternalPerspectiveDsl.g:11784:1: rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl : ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11786:1: ( ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) ) )
-            // InternalPerspectiveDsl.g:11787:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) )
+            // InternalPerspectiveDsl.g:11788:1: ( ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) ) )
+            // InternalPerspectiveDsl.g:11789:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) )
             {
-            // InternalPerspectiveDsl.g:11787:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) )
-            // InternalPerspectiveDsl.g:11788:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 )
+            // InternalPerspectiveDsl.g:11789:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) )
+            // InternalPerspectiveDsl.g:11790:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getFeatureAssignment_1_0_0_0_2()); 
             }
-            // InternalPerspectiveDsl.g:11789:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 )
-            // InternalPerspectiveDsl.g:11789:3: rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2
+            // InternalPerspectiveDsl.g:11791:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 )
+            // InternalPerspectiveDsl.g:11791:3: rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2();
@@ -39321,14 +39321,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__3"
-    // InternalPerspectiveDsl.g:11797:1: rule__XMemberFeatureCall__Group_1_0_0_0__3 : rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl ;
+    // InternalPerspectiveDsl.g:11799:1: rule__XMemberFeatureCall__Group_1_0_0_0__3 : rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_0_0_0__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11801:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl )
-            // InternalPerspectiveDsl.g:11802:2: rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl
+            // InternalPerspectiveDsl.g:11803:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl )
+            // InternalPerspectiveDsl.g:11804:2: rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl();
@@ -39354,17 +39354,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl"
-    // InternalPerspectiveDsl.g:11808:1: rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl : ( ruleOpSingleAssign ) ;
+    // InternalPerspectiveDsl.g:11810:1: rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl : ( ruleOpSingleAssign ) ;
     public final void rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11812:1: ( ( ruleOpSingleAssign ) )
-            // InternalPerspectiveDsl.g:11813:1: ( ruleOpSingleAssign )
+            // InternalPerspectiveDsl.g:11814:1: ( ( ruleOpSingleAssign ) )
+            // InternalPerspectiveDsl.g:11815:1: ( ruleOpSingleAssign )
             {
-            // InternalPerspectiveDsl.g:11813:1: ( ruleOpSingleAssign )
-            // InternalPerspectiveDsl.g:11814:2: ruleOpSingleAssign
+            // InternalPerspectiveDsl.g:11815:1: ( ruleOpSingleAssign )
+            // InternalPerspectiveDsl.g:11816:2: ruleOpSingleAssign
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getOpSingleAssignParserRuleCall_1_0_0_0_3()); 
@@ -39399,14 +39399,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__0"
-    // InternalPerspectiveDsl.g:11824:1: rule__XMemberFeatureCall__Group_1_1__0 : rule__XMemberFeatureCall__Group_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1__1 ;
+    // InternalPerspectiveDsl.g:11826:1: rule__XMemberFeatureCall__Group_1_1__0 : rule__XMemberFeatureCall__Group_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1__1 ;
     public final void rule__XMemberFeatureCall__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11828:1: ( rule__XMemberFeatureCall__Group_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1__1 )
-            // InternalPerspectiveDsl.g:11829:2: rule__XMemberFeatureCall__Group_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1__1
+            // InternalPerspectiveDsl.g:11830:1: ( rule__XMemberFeatureCall__Group_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1__1 )
+            // InternalPerspectiveDsl.g:11831:2: rule__XMemberFeatureCall__Group_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1__1
             {
             pushFollow(FOLLOW_89);
             rule__XMemberFeatureCall__Group_1_1__0__Impl();
@@ -39437,23 +39437,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__0__Impl"
-    // InternalPerspectiveDsl.g:11836:1: rule__XMemberFeatureCall__Group_1_1__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:11838:1: rule__XMemberFeatureCall__Group_1_1__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11840:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) ) )
-            // InternalPerspectiveDsl.g:11841:1: ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) )
+            // InternalPerspectiveDsl.g:11842:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) ) )
+            // InternalPerspectiveDsl.g:11843:1: ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:11841:1: ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) )
-            // InternalPerspectiveDsl.g:11842:2: ( rule__XMemberFeatureCall__Group_1_1_0__0 )
+            // InternalPerspectiveDsl.g:11843:1: ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) )
+            // InternalPerspectiveDsl.g:11844:2: ( rule__XMemberFeatureCall__Group_1_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_0()); 
             }
-            // InternalPerspectiveDsl.g:11843:2: ( rule__XMemberFeatureCall__Group_1_1_0__0 )
-            // InternalPerspectiveDsl.g:11843:3: rule__XMemberFeatureCall__Group_1_1_0__0
+            // InternalPerspectiveDsl.g:11845:2: ( rule__XMemberFeatureCall__Group_1_1_0__0 )
+            // InternalPerspectiveDsl.g:11845:3: rule__XMemberFeatureCall__Group_1_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1_0__0();
@@ -39488,14 +39488,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__1"
-    // InternalPerspectiveDsl.g:11851:1: rule__XMemberFeatureCall__Group_1_1__1 : rule__XMemberFeatureCall__Group_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1__2 ;
+    // InternalPerspectiveDsl.g:11853:1: rule__XMemberFeatureCall__Group_1_1__1 : rule__XMemberFeatureCall__Group_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1__2 ;
     public final void rule__XMemberFeatureCall__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11855:1: ( rule__XMemberFeatureCall__Group_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1__2 )
-            // InternalPerspectiveDsl.g:11856:2: rule__XMemberFeatureCall__Group_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1__2
+            // InternalPerspectiveDsl.g:11857:1: ( rule__XMemberFeatureCall__Group_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1__2 )
+            // InternalPerspectiveDsl.g:11858:2: rule__XMemberFeatureCall__Group_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1__2
             {
             pushFollow(FOLLOW_89);
             rule__XMemberFeatureCall__Group_1_1__1__Impl();
@@ -39526,22 +39526,22 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__1__Impl"
-    // InternalPerspectiveDsl.g:11863:1: rule__XMemberFeatureCall__Group_1_1__1__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? ) ;
+    // InternalPerspectiveDsl.g:11865:1: rule__XMemberFeatureCall__Group_1_1__1__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? ) ;
     public final void rule__XMemberFeatureCall__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11867:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? ) )
-            // InternalPerspectiveDsl.g:11868:1: ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? )
+            // InternalPerspectiveDsl.g:11869:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? ) )
+            // InternalPerspectiveDsl.g:11870:1: ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? )
             {
-            // InternalPerspectiveDsl.g:11868:1: ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? )
-            // InternalPerspectiveDsl.g:11869:2: ( rule__XMemberFeatureCall__Group_1_1_1__0 )?
+            // InternalPerspectiveDsl.g:11870:1: ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? )
+            // InternalPerspectiveDsl.g:11871:2: ( rule__XMemberFeatureCall__Group_1_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_1()); 
             }
-            // InternalPerspectiveDsl.g:11870:2: ( rule__XMemberFeatureCall__Group_1_1_1__0 )?
+            // InternalPerspectiveDsl.g:11872:2: ( rule__XMemberFeatureCall__Group_1_1_1__0 )?
             int alt81=2;
             int LA81_0 = input.LA(1);
 
@@ -39550,7 +39550,7 @@
             }
             switch (alt81) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:11870:3: rule__XMemberFeatureCall__Group_1_1_1__0
+                    // InternalPerspectiveDsl.g:11872:3: rule__XMemberFeatureCall__Group_1_1_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__Group_1_1_1__0();
@@ -39588,14 +39588,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__2"
-    // InternalPerspectiveDsl.g:11878:1: rule__XMemberFeatureCall__Group_1_1__2 : rule__XMemberFeatureCall__Group_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1__3 ;
+    // InternalPerspectiveDsl.g:11880:1: rule__XMemberFeatureCall__Group_1_1__2 : rule__XMemberFeatureCall__Group_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1__3 ;
     public final void rule__XMemberFeatureCall__Group_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11882:1: ( rule__XMemberFeatureCall__Group_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1__3 )
-            // InternalPerspectiveDsl.g:11883:2: rule__XMemberFeatureCall__Group_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1__3
+            // InternalPerspectiveDsl.g:11884:1: ( rule__XMemberFeatureCall__Group_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1__3 )
+            // InternalPerspectiveDsl.g:11885:2: rule__XMemberFeatureCall__Group_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1__3
             {
             pushFollow(FOLLOW_90);
             rule__XMemberFeatureCall__Group_1_1__2__Impl();
@@ -39626,23 +39626,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__2__Impl"
-    // InternalPerspectiveDsl.g:11890:1: rule__XMemberFeatureCall__Group_1_1__2__Impl : ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) ) ;
+    // InternalPerspectiveDsl.g:11892:1: rule__XMemberFeatureCall__Group_1_1__2__Impl : ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11894:1: ( ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) ) )
-            // InternalPerspectiveDsl.g:11895:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) )
+            // InternalPerspectiveDsl.g:11896:1: ( ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) ) )
+            // InternalPerspectiveDsl.g:11897:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) )
             {
-            // InternalPerspectiveDsl.g:11895:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) )
-            // InternalPerspectiveDsl.g:11896:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 )
+            // InternalPerspectiveDsl.g:11897:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) )
+            // InternalPerspectiveDsl.g:11898:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getFeatureAssignment_1_1_2()); 
             }
-            // InternalPerspectiveDsl.g:11897:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 )
-            // InternalPerspectiveDsl.g:11897:3: rule__XMemberFeatureCall__FeatureAssignment_1_1_2
+            // InternalPerspectiveDsl.g:11899:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 )
+            // InternalPerspectiveDsl.g:11899:3: rule__XMemberFeatureCall__FeatureAssignment_1_1_2
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__FeatureAssignment_1_1_2();
@@ -39677,14 +39677,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__3"
-    // InternalPerspectiveDsl.g:11905:1: rule__XMemberFeatureCall__Group_1_1__3 : rule__XMemberFeatureCall__Group_1_1__3__Impl rule__XMemberFeatureCall__Group_1_1__4 ;
+    // InternalPerspectiveDsl.g:11907:1: rule__XMemberFeatureCall__Group_1_1__3 : rule__XMemberFeatureCall__Group_1_1__3__Impl rule__XMemberFeatureCall__Group_1_1__4 ;
     public final void rule__XMemberFeatureCall__Group_1_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11909:1: ( rule__XMemberFeatureCall__Group_1_1__3__Impl rule__XMemberFeatureCall__Group_1_1__4 )
-            // InternalPerspectiveDsl.g:11910:2: rule__XMemberFeatureCall__Group_1_1__3__Impl rule__XMemberFeatureCall__Group_1_1__4
+            // InternalPerspectiveDsl.g:11911:1: ( rule__XMemberFeatureCall__Group_1_1__3__Impl rule__XMemberFeatureCall__Group_1_1__4 )
+            // InternalPerspectiveDsl.g:11912:2: rule__XMemberFeatureCall__Group_1_1__3__Impl rule__XMemberFeatureCall__Group_1_1__4
             {
             pushFollow(FOLLOW_90);
             rule__XMemberFeatureCall__Group_1_1__3__Impl();
@@ -39715,27 +39715,27 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__3__Impl"
-    // InternalPerspectiveDsl.g:11917:1: rule__XMemberFeatureCall__Group_1_1__3__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? ) ;
+    // InternalPerspectiveDsl.g:11919:1: rule__XMemberFeatureCall__Group_1_1__3__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? ) ;
     public final void rule__XMemberFeatureCall__Group_1_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11921:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? ) )
-            // InternalPerspectiveDsl.g:11922:1: ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? )
+            // InternalPerspectiveDsl.g:11923:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? ) )
+            // InternalPerspectiveDsl.g:11924:1: ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? )
             {
-            // InternalPerspectiveDsl.g:11922:1: ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? )
-            // InternalPerspectiveDsl.g:11923:2: ( rule__XMemberFeatureCall__Group_1_1_3__0 )?
+            // InternalPerspectiveDsl.g:11924:1: ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? )
+            // InternalPerspectiveDsl.g:11925:2: ( rule__XMemberFeatureCall__Group_1_1_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3()); 
             }
-            // InternalPerspectiveDsl.g:11924:2: ( rule__XMemberFeatureCall__Group_1_1_3__0 )?
+            // InternalPerspectiveDsl.g:11926:2: ( rule__XMemberFeatureCall__Group_1_1_3__0 )?
             int alt82=2;
             alt82 = dfa82.predict(input);
             switch (alt82) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:11924:3: rule__XMemberFeatureCall__Group_1_1_3__0
+                    // InternalPerspectiveDsl.g:11926:3: rule__XMemberFeatureCall__Group_1_1_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__Group_1_1_3__0();
@@ -39773,14 +39773,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__4"
-    // InternalPerspectiveDsl.g:11932:1: rule__XMemberFeatureCall__Group_1_1__4 : rule__XMemberFeatureCall__Group_1_1__4__Impl ;
+    // InternalPerspectiveDsl.g:11934:1: rule__XMemberFeatureCall__Group_1_1__4 : rule__XMemberFeatureCall__Group_1_1__4__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_1__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11936:1: ( rule__XMemberFeatureCall__Group_1_1__4__Impl )
-            // InternalPerspectiveDsl.g:11937:2: rule__XMemberFeatureCall__Group_1_1__4__Impl
+            // InternalPerspectiveDsl.g:11938:1: ( rule__XMemberFeatureCall__Group_1_1__4__Impl )
+            // InternalPerspectiveDsl.g:11939:2: rule__XMemberFeatureCall__Group_1_1__4__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1__4__Impl();
@@ -39806,27 +39806,27 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__4__Impl"
-    // InternalPerspectiveDsl.g:11943:1: rule__XMemberFeatureCall__Group_1_1__4__Impl : ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? ) ;
+    // InternalPerspectiveDsl.g:11945:1: rule__XMemberFeatureCall__Group_1_1__4__Impl : ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? ) ;
     public final void rule__XMemberFeatureCall__Group_1_1__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11947:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? ) )
-            // InternalPerspectiveDsl.g:11948:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? )
+            // InternalPerspectiveDsl.g:11949:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? ) )
+            // InternalPerspectiveDsl.g:11950:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? )
             {
-            // InternalPerspectiveDsl.g:11948:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? )
-            // InternalPerspectiveDsl.g:11949:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )?
+            // InternalPerspectiveDsl.g:11950:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? )
+            // InternalPerspectiveDsl.g:11951:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_4()); 
             }
-            // InternalPerspectiveDsl.g:11950:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )?
+            // InternalPerspectiveDsl.g:11952:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )?
             int alt83=2;
             alt83 = dfa83.predict(input);
             switch (alt83) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:11950:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4
+                    // InternalPerspectiveDsl.g:11952:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4();
@@ -39864,14 +39864,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_0__0"
-    // InternalPerspectiveDsl.g:11959:1: rule__XMemberFeatureCall__Group_1_1_0__0 : rule__XMemberFeatureCall__Group_1_1_0__0__Impl ;
+    // InternalPerspectiveDsl.g:11961:1: rule__XMemberFeatureCall__Group_1_1_0__0 : rule__XMemberFeatureCall__Group_1_1_0__0__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11963:1: ( rule__XMemberFeatureCall__Group_1_1_0__0__Impl )
-            // InternalPerspectiveDsl.g:11964:2: rule__XMemberFeatureCall__Group_1_1_0__0__Impl
+            // InternalPerspectiveDsl.g:11965:1: ( rule__XMemberFeatureCall__Group_1_1_0__0__Impl )
+            // InternalPerspectiveDsl.g:11966:2: rule__XMemberFeatureCall__Group_1_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1_0__0__Impl();
@@ -39897,23 +39897,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_0__0__Impl"
-    // InternalPerspectiveDsl.g:11970:1: rule__XMemberFeatureCall__Group_1_1_0__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:11972:1: rule__XMemberFeatureCall__Group_1_1_0__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11974:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:11975:1: ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:11976:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:11977:1: ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:11975:1: ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) )
-            // InternalPerspectiveDsl.g:11976:2: ( rule__XMemberFeatureCall__Group_1_1_0_0__0 )
+            // InternalPerspectiveDsl.g:11977:1: ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:11978:2: ( rule__XMemberFeatureCall__Group_1_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:11977:2: ( rule__XMemberFeatureCall__Group_1_1_0_0__0 )
-            // InternalPerspectiveDsl.g:11977:3: rule__XMemberFeatureCall__Group_1_1_0_0__0
+            // InternalPerspectiveDsl.g:11979:2: ( rule__XMemberFeatureCall__Group_1_1_0_0__0 )
+            // InternalPerspectiveDsl.g:11979:3: rule__XMemberFeatureCall__Group_1_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1_0_0__0();
@@ -39948,14 +39948,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_0_0__0"
-    // InternalPerspectiveDsl.g:11986:1: rule__XMemberFeatureCall__Group_1_1_0_0__0 : rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl rule__XMemberFeatureCall__Group_1_1_0_0__1 ;
+    // InternalPerspectiveDsl.g:11988:1: rule__XMemberFeatureCall__Group_1_1_0_0__0 : rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl rule__XMemberFeatureCall__Group_1_1_0_0__1 ;
     public final void rule__XMemberFeatureCall__Group_1_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:11990:1: ( rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl rule__XMemberFeatureCall__Group_1_1_0_0__1 )
-            // InternalPerspectiveDsl.g:11991:2: rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl rule__XMemberFeatureCall__Group_1_1_0_0__1
+            // InternalPerspectiveDsl.g:11992:1: ( rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl rule__XMemberFeatureCall__Group_1_1_0_0__1 )
+            // InternalPerspectiveDsl.g:11993:2: rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl rule__XMemberFeatureCall__Group_1_1_0_0__1
             {
             pushFollow(FOLLOW_86);
             rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl();
@@ -39986,23 +39986,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:11998:1: rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:12000:1: rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl : ( () ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12002:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:12003:1: ( () )
+            // InternalPerspectiveDsl.g:12004:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:12005:1: ( () )
             {
-            // InternalPerspectiveDsl.g:12003:1: ( () )
-            // InternalPerspectiveDsl.g:12004:2: ()
+            // InternalPerspectiveDsl.g:12005:1: ( () )
+            // InternalPerspectiveDsl.g:12006:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:12005:2: ()
-            // InternalPerspectiveDsl.g:12005:3: 
+            // InternalPerspectiveDsl.g:12007:2: ()
+            // InternalPerspectiveDsl.g:12007:3: 
             {
             }
 
@@ -40027,14 +40027,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_0_0__1"
-    // InternalPerspectiveDsl.g:12013:1: rule__XMemberFeatureCall__Group_1_1_0_0__1 : rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl ;
+    // InternalPerspectiveDsl.g:12015:1: rule__XMemberFeatureCall__Group_1_1_0_0__1 : rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12017:1: ( rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl )
-            // InternalPerspectiveDsl.g:12018:2: rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl
+            // InternalPerspectiveDsl.g:12019:1: ( rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl )
+            // InternalPerspectiveDsl.g:12020:2: rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl();
@@ -40060,23 +40060,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:12024:1: rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:12026:1: rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12028:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) ) )
-            // InternalPerspectiveDsl.g:12029:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) )
+            // InternalPerspectiveDsl.g:12030:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) ) )
+            // InternalPerspectiveDsl.g:12031:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:12029:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) )
-            // InternalPerspectiveDsl.g:12030:2: ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 )
+            // InternalPerspectiveDsl.g:12031:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) )
+            // InternalPerspectiveDsl.g:12032:2: ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_1_0_0_1()); 
             }
-            // InternalPerspectiveDsl.g:12031:2: ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 )
-            // InternalPerspectiveDsl.g:12031:3: rule__XMemberFeatureCall__Alternatives_1_1_0_0_1
+            // InternalPerspectiveDsl.g:12033:2: ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 )
+            // InternalPerspectiveDsl.g:12033:3: rule__XMemberFeatureCall__Alternatives_1_1_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Alternatives_1_1_0_0_1();
@@ -40111,14 +40111,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__0"
-    // InternalPerspectiveDsl.g:12040:1: rule__XMemberFeatureCall__Group_1_1_1__0 : rule__XMemberFeatureCall__Group_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_1__1 ;
+    // InternalPerspectiveDsl.g:12042:1: rule__XMemberFeatureCall__Group_1_1_1__0 : rule__XMemberFeatureCall__Group_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_1__1 ;
     public final void rule__XMemberFeatureCall__Group_1_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12044:1: ( rule__XMemberFeatureCall__Group_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_1__1 )
-            // InternalPerspectiveDsl.g:12045:2: rule__XMemberFeatureCall__Group_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_1__1
+            // InternalPerspectiveDsl.g:12046:1: ( rule__XMemberFeatureCall__Group_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_1__1 )
+            // InternalPerspectiveDsl.g:12047:2: rule__XMemberFeatureCall__Group_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_1__1
             {
             pushFollow(FOLLOW_91);
             rule__XMemberFeatureCall__Group_1_1_1__0__Impl();
@@ -40149,17 +40149,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__0__Impl"
-    // InternalPerspectiveDsl.g:12052:1: rule__XMemberFeatureCall__Group_1_1_1__0__Impl : ( '<' ) ;
+    // InternalPerspectiveDsl.g:12054:1: rule__XMemberFeatureCall__Group_1_1_1__0__Impl : ( '<' ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12056:1: ( ( '<' ) )
-            // InternalPerspectiveDsl.g:12057:1: ( '<' )
+            // InternalPerspectiveDsl.g:12058:1: ( ( '<' ) )
+            // InternalPerspectiveDsl.g:12059:1: ( '<' )
             {
-            // InternalPerspectiveDsl.g:12057:1: ( '<' )
-            // InternalPerspectiveDsl.g:12058:2: '<'
+            // InternalPerspectiveDsl.g:12059:1: ( '<' )
+            // InternalPerspectiveDsl.g:12060:2: '<'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0()); 
@@ -40190,14 +40190,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__1"
-    // InternalPerspectiveDsl.g:12067:1: rule__XMemberFeatureCall__Group_1_1_1__1 : rule__XMemberFeatureCall__Group_1_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1_1__2 ;
+    // InternalPerspectiveDsl.g:12069:1: rule__XMemberFeatureCall__Group_1_1_1__1 : rule__XMemberFeatureCall__Group_1_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1_1__2 ;
     public final void rule__XMemberFeatureCall__Group_1_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12071:1: ( rule__XMemberFeatureCall__Group_1_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1_1__2 )
-            // InternalPerspectiveDsl.g:12072:2: rule__XMemberFeatureCall__Group_1_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1_1__2
+            // InternalPerspectiveDsl.g:12073:1: ( rule__XMemberFeatureCall__Group_1_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1_1__2 )
+            // InternalPerspectiveDsl.g:12074:2: rule__XMemberFeatureCall__Group_1_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1_1__2
             {
             pushFollow(FOLLOW_92);
             rule__XMemberFeatureCall__Group_1_1_1__1__Impl();
@@ -40228,23 +40228,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__1__Impl"
-    // InternalPerspectiveDsl.g:12079:1: rule__XMemberFeatureCall__Group_1_1_1__1__Impl : ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:12081:1: rule__XMemberFeatureCall__Group_1_1_1__1__Impl : ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12083:1: ( ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) ) )
-            // InternalPerspectiveDsl.g:12084:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) )
+            // InternalPerspectiveDsl.g:12085:1: ( ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) ) )
+            // InternalPerspectiveDsl.g:12086:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:12084:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) )
-            // InternalPerspectiveDsl.g:12085:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 )
+            // InternalPerspectiveDsl.g:12086:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) )
+            // InternalPerspectiveDsl.g:12087:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsAssignment_1_1_1_1()); 
             }
-            // InternalPerspectiveDsl.g:12086:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 )
-            // InternalPerspectiveDsl.g:12086:3: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1
+            // InternalPerspectiveDsl.g:12088:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 )
+            // InternalPerspectiveDsl.g:12088:3: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1();
@@ -40279,14 +40279,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__2"
-    // InternalPerspectiveDsl.g:12094:1: rule__XMemberFeatureCall__Group_1_1_1__2 : rule__XMemberFeatureCall__Group_1_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1_1__3 ;
+    // InternalPerspectiveDsl.g:12096:1: rule__XMemberFeatureCall__Group_1_1_1__2 : rule__XMemberFeatureCall__Group_1_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1_1__3 ;
     public final void rule__XMemberFeatureCall__Group_1_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12098:1: ( rule__XMemberFeatureCall__Group_1_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1_1__3 )
-            // InternalPerspectiveDsl.g:12099:2: rule__XMemberFeatureCall__Group_1_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1_1__3
+            // InternalPerspectiveDsl.g:12100:1: ( rule__XMemberFeatureCall__Group_1_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1_1__3 )
+            // InternalPerspectiveDsl.g:12101:2: rule__XMemberFeatureCall__Group_1_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1_1__3
             {
             pushFollow(FOLLOW_92);
             rule__XMemberFeatureCall__Group_1_1_1__2__Impl();
@@ -40317,22 +40317,22 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__2__Impl"
-    // InternalPerspectiveDsl.g:12106:1: rule__XMemberFeatureCall__Group_1_1_1__2__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* ) ;
+    // InternalPerspectiveDsl.g:12108:1: rule__XMemberFeatureCall__Group_1_1_1__2__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12110:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* ) )
-            // InternalPerspectiveDsl.g:12111:1: ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* )
+            // InternalPerspectiveDsl.g:12112:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* ) )
+            // InternalPerspectiveDsl.g:12113:1: ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* )
             {
-            // InternalPerspectiveDsl.g:12111:1: ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* )
-            // InternalPerspectiveDsl.g:12112:2: ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )*
+            // InternalPerspectiveDsl.g:12113:1: ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* )
+            // InternalPerspectiveDsl.g:12114:2: ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_1_2()); 
             }
-            // InternalPerspectiveDsl.g:12113:2: ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )*
+            // InternalPerspectiveDsl.g:12115:2: ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )*
             loop84:
             do {
                 int alt84=2;
@@ -40345,7 +40345,7 @@
 
                 switch (alt84) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:12113:3: rule__XMemberFeatureCall__Group_1_1_1_2__0
+            	    // InternalPerspectiveDsl.g:12115:3: rule__XMemberFeatureCall__Group_1_1_1_2__0
             	    {
             	    pushFollow(FOLLOW_53);
             	    rule__XMemberFeatureCall__Group_1_1_1_2__0();
@@ -40386,14 +40386,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__3"
-    // InternalPerspectiveDsl.g:12121:1: rule__XMemberFeatureCall__Group_1_1_1__3 : rule__XMemberFeatureCall__Group_1_1_1__3__Impl ;
+    // InternalPerspectiveDsl.g:12123:1: rule__XMemberFeatureCall__Group_1_1_1__3 : rule__XMemberFeatureCall__Group_1_1_1__3__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_1_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12125:1: ( rule__XMemberFeatureCall__Group_1_1_1__3__Impl )
-            // InternalPerspectiveDsl.g:12126:2: rule__XMemberFeatureCall__Group_1_1_1__3__Impl
+            // InternalPerspectiveDsl.g:12127:1: ( rule__XMemberFeatureCall__Group_1_1_1__3__Impl )
+            // InternalPerspectiveDsl.g:12128:2: rule__XMemberFeatureCall__Group_1_1_1__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1_1__3__Impl();
@@ -40419,17 +40419,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__3__Impl"
-    // InternalPerspectiveDsl.g:12132:1: rule__XMemberFeatureCall__Group_1_1_1__3__Impl : ( '>' ) ;
+    // InternalPerspectiveDsl.g:12134:1: rule__XMemberFeatureCall__Group_1_1_1__3__Impl : ( '>' ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12136:1: ( ( '>' ) )
-            // InternalPerspectiveDsl.g:12137:1: ( '>' )
+            // InternalPerspectiveDsl.g:12138:1: ( ( '>' ) )
+            // InternalPerspectiveDsl.g:12139:1: ( '>' )
             {
-            // InternalPerspectiveDsl.g:12137:1: ( '>' )
-            // InternalPerspectiveDsl.g:12138:2: '>'
+            // InternalPerspectiveDsl.g:12139:1: ( '>' )
+            // InternalPerspectiveDsl.g:12140:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3()); 
@@ -40460,14 +40460,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1_2__0"
-    // InternalPerspectiveDsl.g:12148:1: rule__XMemberFeatureCall__Group_1_1_1_2__0 : rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl rule__XMemberFeatureCall__Group_1_1_1_2__1 ;
+    // InternalPerspectiveDsl.g:12150:1: rule__XMemberFeatureCall__Group_1_1_1_2__0 : rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl rule__XMemberFeatureCall__Group_1_1_1_2__1 ;
     public final void rule__XMemberFeatureCall__Group_1_1_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12152:1: ( rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl rule__XMemberFeatureCall__Group_1_1_1_2__1 )
-            // InternalPerspectiveDsl.g:12153:2: rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl rule__XMemberFeatureCall__Group_1_1_1_2__1
+            // InternalPerspectiveDsl.g:12154:1: ( rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl rule__XMemberFeatureCall__Group_1_1_1_2__1 )
+            // InternalPerspectiveDsl.g:12155:2: rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl rule__XMemberFeatureCall__Group_1_1_1_2__1
             {
             pushFollow(FOLLOW_91);
             rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl();
@@ -40498,17 +40498,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl"
-    // InternalPerspectiveDsl.g:12160:1: rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl : ( ',' ) ;
+    // InternalPerspectiveDsl.g:12162:1: rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl : ( ',' ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12164:1: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:12165:1: ( ',' )
+            // InternalPerspectiveDsl.g:12166:1: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:12167:1: ( ',' )
             {
-            // InternalPerspectiveDsl.g:12165:1: ( ',' )
-            // InternalPerspectiveDsl.g:12166:2: ','
+            // InternalPerspectiveDsl.g:12167:1: ( ',' )
+            // InternalPerspectiveDsl.g:12168:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0()); 
@@ -40539,14 +40539,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1_2__1"
-    // InternalPerspectiveDsl.g:12175:1: rule__XMemberFeatureCall__Group_1_1_1_2__1 : rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl ;
+    // InternalPerspectiveDsl.g:12177:1: rule__XMemberFeatureCall__Group_1_1_1_2__1 : rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_1_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12179:1: ( rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl )
-            // InternalPerspectiveDsl.g:12180:2: rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl
+            // InternalPerspectiveDsl.g:12181:1: ( rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl )
+            // InternalPerspectiveDsl.g:12182:2: rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl();
@@ -40572,23 +40572,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl"
-    // InternalPerspectiveDsl.g:12186:1: rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl : ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) ) ;
+    // InternalPerspectiveDsl.g:12188:1: rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl : ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12190:1: ( ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) ) )
-            // InternalPerspectiveDsl.g:12191:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) )
+            // InternalPerspectiveDsl.g:12192:1: ( ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) ) )
+            // InternalPerspectiveDsl.g:12193:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) )
             {
-            // InternalPerspectiveDsl.g:12191:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) )
-            // InternalPerspectiveDsl.g:12192:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 )
+            // InternalPerspectiveDsl.g:12193:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) )
+            // InternalPerspectiveDsl.g:12194:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsAssignment_1_1_1_2_1()); 
             }
-            // InternalPerspectiveDsl.g:12193:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 )
-            // InternalPerspectiveDsl.g:12193:3: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1
+            // InternalPerspectiveDsl.g:12195:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 )
+            // InternalPerspectiveDsl.g:12195:3: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1();
@@ -40623,14 +40623,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3__0"
-    // InternalPerspectiveDsl.g:12202:1: rule__XMemberFeatureCall__Group_1_1_3__0 : rule__XMemberFeatureCall__Group_1_1_3__0__Impl rule__XMemberFeatureCall__Group_1_1_3__1 ;
+    // InternalPerspectiveDsl.g:12204:1: rule__XMemberFeatureCall__Group_1_1_3__0 : rule__XMemberFeatureCall__Group_1_1_3__0__Impl rule__XMemberFeatureCall__Group_1_1_3__1 ;
     public final void rule__XMemberFeatureCall__Group_1_1_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12206:1: ( rule__XMemberFeatureCall__Group_1_1_3__0__Impl rule__XMemberFeatureCall__Group_1_1_3__1 )
-            // InternalPerspectiveDsl.g:12207:2: rule__XMemberFeatureCall__Group_1_1_3__0__Impl rule__XMemberFeatureCall__Group_1_1_3__1
+            // InternalPerspectiveDsl.g:12208:1: ( rule__XMemberFeatureCall__Group_1_1_3__0__Impl rule__XMemberFeatureCall__Group_1_1_3__1 )
+            // InternalPerspectiveDsl.g:12209:2: rule__XMemberFeatureCall__Group_1_1_3__0__Impl rule__XMemberFeatureCall__Group_1_1_3__1
             {
             pushFollow(FOLLOW_93);
             rule__XMemberFeatureCall__Group_1_1_3__0__Impl();
@@ -40661,23 +40661,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3__0__Impl"
-    // InternalPerspectiveDsl.g:12214:1: rule__XMemberFeatureCall__Group_1_1_3__0__Impl : ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) ) ;
+    // InternalPerspectiveDsl.g:12216:1: rule__XMemberFeatureCall__Group_1_1_3__0__Impl : ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12218:1: ( ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) ) )
-            // InternalPerspectiveDsl.g:12219:1: ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) )
+            // InternalPerspectiveDsl.g:12220:1: ( ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) ) )
+            // InternalPerspectiveDsl.g:12221:1: ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) )
             {
-            // InternalPerspectiveDsl.g:12219:1: ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) )
-            // InternalPerspectiveDsl.g:12220:2: ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 )
+            // InternalPerspectiveDsl.g:12221:1: ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) )
+            // InternalPerspectiveDsl.g:12222:2: ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallAssignment_1_1_3_0()); 
             }
-            // InternalPerspectiveDsl.g:12221:2: ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 )
-            // InternalPerspectiveDsl.g:12221:3: rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0
+            // InternalPerspectiveDsl.g:12223:2: ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 )
+            // InternalPerspectiveDsl.g:12223:3: rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0();
@@ -40712,14 +40712,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3__1"
-    // InternalPerspectiveDsl.g:12229:1: rule__XMemberFeatureCall__Group_1_1_3__1 : rule__XMemberFeatureCall__Group_1_1_3__1__Impl rule__XMemberFeatureCall__Group_1_1_3__2 ;
+    // InternalPerspectiveDsl.g:12231:1: rule__XMemberFeatureCall__Group_1_1_3__1 : rule__XMemberFeatureCall__Group_1_1_3__1__Impl rule__XMemberFeatureCall__Group_1_1_3__2 ;
     public final void rule__XMemberFeatureCall__Group_1_1_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12233:1: ( rule__XMemberFeatureCall__Group_1_1_3__1__Impl rule__XMemberFeatureCall__Group_1_1_3__2 )
-            // InternalPerspectiveDsl.g:12234:2: rule__XMemberFeatureCall__Group_1_1_3__1__Impl rule__XMemberFeatureCall__Group_1_1_3__2
+            // InternalPerspectiveDsl.g:12235:1: ( rule__XMemberFeatureCall__Group_1_1_3__1__Impl rule__XMemberFeatureCall__Group_1_1_3__2 )
+            // InternalPerspectiveDsl.g:12236:2: rule__XMemberFeatureCall__Group_1_1_3__1__Impl rule__XMemberFeatureCall__Group_1_1_3__2
             {
             pushFollow(FOLLOW_93);
             rule__XMemberFeatureCall__Group_1_1_3__1__Impl();
@@ -40750,22 +40750,22 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3__1__Impl"
-    // InternalPerspectiveDsl.g:12241:1: rule__XMemberFeatureCall__Group_1_1_3__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? ) ;
+    // InternalPerspectiveDsl.g:12243:1: rule__XMemberFeatureCall__Group_1_1_3__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12245:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? ) )
-            // InternalPerspectiveDsl.g:12246:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? )
+            // InternalPerspectiveDsl.g:12247:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? ) )
+            // InternalPerspectiveDsl.g:12248:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? )
             {
-            // InternalPerspectiveDsl.g:12246:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? )
-            // InternalPerspectiveDsl.g:12247:2: ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )?
+            // InternalPerspectiveDsl.g:12248:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? )
+            // InternalPerspectiveDsl.g:12249:2: ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_1_3_1()); 
             }
-            // InternalPerspectiveDsl.g:12248:2: ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )?
+            // InternalPerspectiveDsl.g:12250:2: ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )?
             int alt85=2;
             int LA85_0 = input.LA(1);
 
@@ -40774,7 +40774,7 @@
             }
             switch (alt85) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:12248:3: rule__XMemberFeatureCall__Alternatives_1_1_3_1
+                    // InternalPerspectiveDsl.g:12250:3: rule__XMemberFeatureCall__Alternatives_1_1_3_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__Alternatives_1_1_3_1();
@@ -40812,14 +40812,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3__2"
-    // InternalPerspectiveDsl.g:12256:1: rule__XMemberFeatureCall__Group_1_1_3__2 : rule__XMemberFeatureCall__Group_1_1_3__2__Impl ;
+    // InternalPerspectiveDsl.g:12258:1: rule__XMemberFeatureCall__Group_1_1_3__2 : rule__XMemberFeatureCall__Group_1_1_3__2__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_1_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12260:1: ( rule__XMemberFeatureCall__Group_1_1_3__2__Impl )
-            // InternalPerspectiveDsl.g:12261:2: rule__XMemberFeatureCall__Group_1_1_3__2__Impl
+            // InternalPerspectiveDsl.g:12262:1: ( rule__XMemberFeatureCall__Group_1_1_3__2__Impl )
+            // InternalPerspectiveDsl.g:12263:2: rule__XMemberFeatureCall__Group_1_1_3__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1_3__2__Impl();
@@ -40845,17 +40845,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3__2__Impl"
-    // InternalPerspectiveDsl.g:12267:1: rule__XMemberFeatureCall__Group_1_1_3__2__Impl : ( ')' ) ;
+    // InternalPerspectiveDsl.g:12269:1: rule__XMemberFeatureCall__Group_1_1_3__2__Impl : ( ')' ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_3__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12271:1: ( ( ')' ) )
-            // InternalPerspectiveDsl.g:12272:1: ( ')' )
+            // InternalPerspectiveDsl.g:12273:1: ( ( ')' ) )
+            // InternalPerspectiveDsl.g:12274:1: ( ')' )
             {
-            // InternalPerspectiveDsl.g:12272:1: ( ')' )
-            // InternalPerspectiveDsl.g:12273:2: ')'
+            // InternalPerspectiveDsl.g:12274:1: ( ')' )
+            // InternalPerspectiveDsl.g:12275:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2()); 
@@ -40886,14 +40886,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1__0"
-    // InternalPerspectiveDsl.g:12283:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__0 : rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1__1 ;
+    // InternalPerspectiveDsl.g:12285:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__0 : rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1__1 ;
     public final void rule__XMemberFeatureCall__Group_1_1_3_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12287:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1__1 )
-            // InternalPerspectiveDsl.g:12288:2: rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1__1
+            // InternalPerspectiveDsl.g:12289:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1__1 )
+            // InternalPerspectiveDsl.g:12290:2: rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1__1
             {
             pushFollow(FOLLOW_52);
             rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl();
@@ -40924,23 +40924,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl"
-    // InternalPerspectiveDsl.g:12295:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl : ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) ) ;
+    // InternalPerspectiveDsl.g:12297:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl : ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12299:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) ) )
-            // InternalPerspectiveDsl.g:12300:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) )
+            // InternalPerspectiveDsl.g:12301:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) ) )
+            // InternalPerspectiveDsl.g:12302:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) )
             {
-            // InternalPerspectiveDsl.g:12300:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) )
-            // InternalPerspectiveDsl.g:12301:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 )
+            // InternalPerspectiveDsl.g:12302:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) )
+            // InternalPerspectiveDsl.g:12303:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_1_0()); 
             }
-            // InternalPerspectiveDsl.g:12302:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 )
-            // InternalPerspectiveDsl.g:12302:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0
+            // InternalPerspectiveDsl.g:12304:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 )
+            // InternalPerspectiveDsl.g:12304:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0();
@@ -40975,14 +40975,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1__1"
-    // InternalPerspectiveDsl.g:12310:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__1 : rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl ;
+    // InternalPerspectiveDsl.g:12312:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__1 : rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_1_3_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12314:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl )
-            // InternalPerspectiveDsl.g:12315:2: rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl
+            // InternalPerspectiveDsl.g:12316:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl )
+            // InternalPerspectiveDsl.g:12317:2: rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl();
@@ -41008,22 +41008,22 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl"
-    // InternalPerspectiveDsl.g:12321:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:12323:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12325:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* ) )
-            // InternalPerspectiveDsl.g:12326:1: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* )
+            // InternalPerspectiveDsl.g:12327:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* ) )
+            // InternalPerspectiveDsl.g:12328:1: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:12326:1: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* )
-            // InternalPerspectiveDsl.g:12327:2: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )*
+            // InternalPerspectiveDsl.g:12328:1: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* )
+            // InternalPerspectiveDsl.g:12329:2: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1_1()); 
             }
-            // InternalPerspectiveDsl.g:12328:2: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )*
+            // InternalPerspectiveDsl.g:12330:2: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )*
             loop86:
             do {
                 int alt86=2;
@@ -41036,7 +41036,7 @@
 
                 switch (alt86) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:12328:3: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0
+            	    // InternalPerspectiveDsl.g:12330:3: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0
             	    {
             	    pushFollow(FOLLOW_53);
             	    rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0();
@@ -41077,14 +41077,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0"
-    // InternalPerspectiveDsl.g:12337:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 : rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1 ;
+    // InternalPerspectiveDsl.g:12339:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 : rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1 ;
     public final void rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12341:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1 )
-            // InternalPerspectiveDsl.g:12342:2: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1
+            // InternalPerspectiveDsl.g:12343:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1 )
+            // InternalPerspectiveDsl.g:12344:2: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1
             {
             pushFollow(FOLLOW_54);
             rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl();
@@ -41115,17 +41115,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl"
-    // InternalPerspectiveDsl.g:12349:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl : ( ',' ) ;
+    // InternalPerspectiveDsl.g:12351:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl : ( ',' ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12353:1: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:12354:1: ( ',' )
+            // InternalPerspectiveDsl.g:12355:1: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:12356:1: ( ',' )
             {
-            // InternalPerspectiveDsl.g:12354:1: ( ',' )
-            // InternalPerspectiveDsl.g:12355:2: ','
+            // InternalPerspectiveDsl.g:12356:1: ( ',' )
+            // InternalPerspectiveDsl.g:12357:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0()); 
@@ -41156,14 +41156,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1"
-    // InternalPerspectiveDsl.g:12364:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1 : rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl ;
+    // InternalPerspectiveDsl.g:12366:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1 : rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12368:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl )
-            // InternalPerspectiveDsl.g:12369:2: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl
+            // InternalPerspectiveDsl.g:12370:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl )
+            // InternalPerspectiveDsl.g:12371:2: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl();
@@ -41189,23 +41189,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl"
-    // InternalPerspectiveDsl.g:12375:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl : ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:12377:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl : ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12379:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) ) )
-            // InternalPerspectiveDsl.g:12380:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) )
+            // InternalPerspectiveDsl.g:12381:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) ) )
+            // InternalPerspectiveDsl.g:12382:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:12380:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) )
-            // InternalPerspectiveDsl.g:12381:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 )
+            // InternalPerspectiveDsl.g:12382:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) )
+            // InternalPerspectiveDsl.g:12383:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_1_1_1()); 
             }
-            // InternalPerspectiveDsl.g:12382:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 )
-            // InternalPerspectiveDsl.g:12382:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1
+            // InternalPerspectiveDsl.g:12384:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 )
+            // InternalPerspectiveDsl.g:12384:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1();
@@ -41240,14 +41240,14 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__0"
-    // InternalPerspectiveDsl.g:12391:1: rule__XSetLiteral__Group__0 : rule__XSetLiteral__Group__0__Impl rule__XSetLiteral__Group__1 ;
+    // InternalPerspectiveDsl.g:12393:1: rule__XSetLiteral__Group__0 : rule__XSetLiteral__Group__0__Impl rule__XSetLiteral__Group__1 ;
     public final void rule__XSetLiteral__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12395:1: ( rule__XSetLiteral__Group__0__Impl rule__XSetLiteral__Group__1 )
-            // InternalPerspectiveDsl.g:12396:2: rule__XSetLiteral__Group__0__Impl rule__XSetLiteral__Group__1
+            // InternalPerspectiveDsl.g:12397:1: ( rule__XSetLiteral__Group__0__Impl rule__XSetLiteral__Group__1 )
+            // InternalPerspectiveDsl.g:12398:2: rule__XSetLiteral__Group__0__Impl rule__XSetLiteral__Group__1
             {
             pushFollow(FOLLOW_57);
             rule__XSetLiteral__Group__0__Impl();
@@ -41278,23 +41278,23 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__0__Impl"
-    // InternalPerspectiveDsl.g:12403:1: rule__XSetLiteral__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:12405:1: rule__XSetLiteral__Group__0__Impl : ( () ) ;
     public final void rule__XSetLiteral__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12407:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:12408:1: ( () )
+            // InternalPerspectiveDsl.g:12409:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:12410:1: ( () )
             {
-            // InternalPerspectiveDsl.g:12408:1: ( () )
-            // InternalPerspectiveDsl.g:12409:2: ()
+            // InternalPerspectiveDsl.g:12410:1: ( () )
+            // InternalPerspectiveDsl.g:12411:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0()); 
             }
-            // InternalPerspectiveDsl.g:12410:2: ()
-            // InternalPerspectiveDsl.g:12410:3: 
+            // InternalPerspectiveDsl.g:12412:2: ()
+            // InternalPerspectiveDsl.g:12412:3: 
             {
             }
 
@@ -41319,14 +41319,14 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__1"
-    // InternalPerspectiveDsl.g:12418:1: rule__XSetLiteral__Group__1 : rule__XSetLiteral__Group__1__Impl rule__XSetLiteral__Group__2 ;
+    // InternalPerspectiveDsl.g:12420:1: rule__XSetLiteral__Group__1 : rule__XSetLiteral__Group__1__Impl rule__XSetLiteral__Group__2 ;
     public final void rule__XSetLiteral__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12422:1: ( rule__XSetLiteral__Group__1__Impl rule__XSetLiteral__Group__2 )
-            // InternalPerspectiveDsl.g:12423:2: rule__XSetLiteral__Group__1__Impl rule__XSetLiteral__Group__2
+            // InternalPerspectiveDsl.g:12424:1: ( rule__XSetLiteral__Group__1__Impl rule__XSetLiteral__Group__2 )
+            // InternalPerspectiveDsl.g:12425:2: rule__XSetLiteral__Group__1__Impl rule__XSetLiteral__Group__2
             {
             pushFollow(FOLLOW_8);
             rule__XSetLiteral__Group__1__Impl();
@@ -41357,17 +41357,17 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__1__Impl"
-    // InternalPerspectiveDsl.g:12430:1: rule__XSetLiteral__Group__1__Impl : ( '#' ) ;
+    // InternalPerspectiveDsl.g:12432:1: rule__XSetLiteral__Group__1__Impl : ( '#' ) ;
     public final void rule__XSetLiteral__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12434:1: ( ( '#' ) )
-            // InternalPerspectiveDsl.g:12435:1: ( '#' )
+            // InternalPerspectiveDsl.g:12436:1: ( ( '#' ) )
+            // InternalPerspectiveDsl.g:12437:1: ( '#' )
             {
-            // InternalPerspectiveDsl.g:12435:1: ( '#' )
-            // InternalPerspectiveDsl.g:12436:2: '#'
+            // InternalPerspectiveDsl.g:12437:1: ( '#' )
+            // InternalPerspectiveDsl.g:12438:2: '#'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1()); 
@@ -41398,14 +41398,14 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__2"
-    // InternalPerspectiveDsl.g:12445:1: rule__XSetLiteral__Group__2 : rule__XSetLiteral__Group__2__Impl rule__XSetLiteral__Group__3 ;
+    // InternalPerspectiveDsl.g:12447:1: rule__XSetLiteral__Group__2 : rule__XSetLiteral__Group__2__Impl rule__XSetLiteral__Group__3 ;
     public final void rule__XSetLiteral__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12449:1: ( rule__XSetLiteral__Group__2__Impl rule__XSetLiteral__Group__3 )
-            // InternalPerspectiveDsl.g:12450:2: rule__XSetLiteral__Group__2__Impl rule__XSetLiteral__Group__3
+            // InternalPerspectiveDsl.g:12451:1: ( rule__XSetLiteral__Group__2__Impl rule__XSetLiteral__Group__3 )
+            // InternalPerspectiveDsl.g:12452:2: rule__XSetLiteral__Group__2__Impl rule__XSetLiteral__Group__3
             {
             pushFollow(FOLLOW_94);
             rule__XSetLiteral__Group__2__Impl();
@@ -41436,17 +41436,17 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__2__Impl"
-    // InternalPerspectiveDsl.g:12457:1: rule__XSetLiteral__Group__2__Impl : ( '{' ) ;
+    // InternalPerspectiveDsl.g:12459:1: rule__XSetLiteral__Group__2__Impl : ( '{' ) ;
     public final void rule__XSetLiteral__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12461:1: ( ( '{' ) )
-            // InternalPerspectiveDsl.g:12462:1: ( '{' )
+            // InternalPerspectiveDsl.g:12463:1: ( ( '{' ) )
+            // InternalPerspectiveDsl.g:12464:1: ( '{' )
             {
-            // InternalPerspectiveDsl.g:12462:1: ( '{' )
-            // InternalPerspectiveDsl.g:12463:2: '{'
+            // InternalPerspectiveDsl.g:12464:1: ( '{' )
+            // InternalPerspectiveDsl.g:12465:2: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2()); 
@@ -41477,14 +41477,14 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__3"
-    // InternalPerspectiveDsl.g:12472:1: rule__XSetLiteral__Group__3 : rule__XSetLiteral__Group__3__Impl rule__XSetLiteral__Group__4 ;
+    // InternalPerspectiveDsl.g:12474:1: rule__XSetLiteral__Group__3 : rule__XSetLiteral__Group__3__Impl rule__XSetLiteral__Group__4 ;
     public final void rule__XSetLiteral__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12476:1: ( rule__XSetLiteral__Group__3__Impl rule__XSetLiteral__Group__4 )
-            // InternalPerspectiveDsl.g:12477:2: rule__XSetLiteral__Group__3__Impl rule__XSetLiteral__Group__4
+            // InternalPerspectiveDsl.g:12478:1: ( rule__XSetLiteral__Group__3__Impl rule__XSetLiteral__Group__4 )
+            // InternalPerspectiveDsl.g:12479:2: rule__XSetLiteral__Group__3__Impl rule__XSetLiteral__Group__4
             {
             pushFollow(FOLLOW_94);
             rule__XSetLiteral__Group__3__Impl();
@@ -41515,22 +41515,22 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__3__Impl"
-    // InternalPerspectiveDsl.g:12484:1: rule__XSetLiteral__Group__3__Impl : ( ( rule__XSetLiteral__Group_3__0 )? ) ;
+    // InternalPerspectiveDsl.g:12486:1: rule__XSetLiteral__Group__3__Impl : ( ( rule__XSetLiteral__Group_3__0 )? ) ;
     public final void rule__XSetLiteral__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12488:1: ( ( ( rule__XSetLiteral__Group_3__0 )? ) )
-            // InternalPerspectiveDsl.g:12489:1: ( ( rule__XSetLiteral__Group_3__0 )? )
+            // InternalPerspectiveDsl.g:12490:1: ( ( ( rule__XSetLiteral__Group_3__0 )? ) )
+            // InternalPerspectiveDsl.g:12491:1: ( ( rule__XSetLiteral__Group_3__0 )? )
             {
-            // InternalPerspectiveDsl.g:12489:1: ( ( rule__XSetLiteral__Group_3__0 )? )
-            // InternalPerspectiveDsl.g:12490:2: ( rule__XSetLiteral__Group_3__0 )?
+            // InternalPerspectiveDsl.g:12491:1: ( ( rule__XSetLiteral__Group_3__0 )? )
+            // InternalPerspectiveDsl.g:12492:2: ( rule__XSetLiteral__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getGroup_3()); 
             }
-            // InternalPerspectiveDsl.g:12491:2: ( rule__XSetLiteral__Group_3__0 )?
+            // InternalPerspectiveDsl.g:12493:2: ( rule__XSetLiteral__Group_3__0 )?
             int alt87=2;
             int LA87_0 = input.LA(1);
 
@@ -41539,7 +41539,7 @@
             }
             switch (alt87) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:12491:3: rule__XSetLiteral__Group_3__0
+                    // InternalPerspectiveDsl.g:12493:3: rule__XSetLiteral__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XSetLiteral__Group_3__0();
@@ -41577,14 +41577,14 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__4"
-    // InternalPerspectiveDsl.g:12499:1: rule__XSetLiteral__Group__4 : rule__XSetLiteral__Group__4__Impl ;
+    // InternalPerspectiveDsl.g:12501:1: rule__XSetLiteral__Group__4 : rule__XSetLiteral__Group__4__Impl ;
     public final void rule__XSetLiteral__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12503:1: ( rule__XSetLiteral__Group__4__Impl )
-            // InternalPerspectiveDsl.g:12504:2: rule__XSetLiteral__Group__4__Impl
+            // InternalPerspectiveDsl.g:12505:1: ( rule__XSetLiteral__Group__4__Impl )
+            // InternalPerspectiveDsl.g:12506:2: rule__XSetLiteral__Group__4__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSetLiteral__Group__4__Impl();
@@ -41610,17 +41610,17 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__4__Impl"
-    // InternalPerspectiveDsl.g:12510:1: rule__XSetLiteral__Group__4__Impl : ( '}' ) ;
+    // InternalPerspectiveDsl.g:12512:1: rule__XSetLiteral__Group__4__Impl : ( '}' ) ;
     public final void rule__XSetLiteral__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12514:1: ( ( '}' ) )
-            // InternalPerspectiveDsl.g:12515:1: ( '}' )
+            // InternalPerspectiveDsl.g:12516:1: ( ( '}' ) )
+            // InternalPerspectiveDsl.g:12517:1: ( '}' )
             {
-            // InternalPerspectiveDsl.g:12515:1: ( '}' )
-            // InternalPerspectiveDsl.g:12516:2: '}'
+            // InternalPerspectiveDsl.g:12517:1: ( '}' )
+            // InternalPerspectiveDsl.g:12518:2: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getRightCurlyBracketKeyword_4()); 
@@ -41651,14 +41651,14 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group_3__0"
-    // InternalPerspectiveDsl.g:12526:1: rule__XSetLiteral__Group_3__0 : rule__XSetLiteral__Group_3__0__Impl rule__XSetLiteral__Group_3__1 ;
+    // InternalPerspectiveDsl.g:12528:1: rule__XSetLiteral__Group_3__0 : rule__XSetLiteral__Group_3__0__Impl rule__XSetLiteral__Group_3__1 ;
     public final void rule__XSetLiteral__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12530:1: ( rule__XSetLiteral__Group_3__0__Impl rule__XSetLiteral__Group_3__1 )
-            // InternalPerspectiveDsl.g:12531:2: rule__XSetLiteral__Group_3__0__Impl rule__XSetLiteral__Group_3__1
+            // InternalPerspectiveDsl.g:12532:1: ( rule__XSetLiteral__Group_3__0__Impl rule__XSetLiteral__Group_3__1 )
+            // InternalPerspectiveDsl.g:12533:2: rule__XSetLiteral__Group_3__0__Impl rule__XSetLiteral__Group_3__1
             {
             pushFollow(FOLLOW_52);
             rule__XSetLiteral__Group_3__0__Impl();
@@ -41689,23 +41689,23 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group_3__0__Impl"
-    // InternalPerspectiveDsl.g:12538:1: rule__XSetLiteral__Group_3__0__Impl : ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) ) ;
+    // InternalPerspectiveDsl.g:12540:1: rule__XSetLiteral__Group_3__0__Impl : ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) ) ;
     public final void rule__XSetLiteral__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12542:1: ( ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) ) )
-            // InternalPerspectiveDsl.g:12543:1: ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) )
+            // InternalPerspectiveDsl.g:12544:1: ( ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) ) )
+            // InternalPerspectiveDsl.g:12545:1: ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) )
             {
-            // InternalPerspectiveDsl.g:12543:1: ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) )
-            // InternalPerspectiveDsl.g:12544:2: ( rule__XSetLiteral__ElementsAssignment_3_0 )
+            // InternalPerspectiveDsl.g:12545:1: ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) )
+            // InternalPerspectiveDsl.g:12546:2: ( rule__XSetLiteral__ElementsAssignment_3_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getElementsAssignment_3_0()); 
             }
-            // InternalPerspectiveDsl.g:12545:2: ( rule__XSetLiteral__ElementsAssignment_3_0 )
-            // InternalPerspectiveDsl.g:12545:3: rule__XSetLiteral__ElementsAssignment_3_0
+            // InternalPerspectiveDsl.g:12547:2: ( rule__XSetLiteral__ElementsAssignment_3_0 )
+            // InternalPerspectiveDsl.g:12547:3: rule__XSetLiteral__ElementsAssignment_3_0
             {
             pushFollow(FOLLOW_2);
             rule__XSetLiteral__ElementsAssignment_3_0();
@@ -41740,14 +41740,14 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group_3__1"
-    // InternalPerspectiveDsl.g:12553:1: rule__XSetLiteral__Group_3__1 : rule__XSetLiteral__Group_3__1__Impl ;
+    // InternalPerspectiveDsl.g:12555:1: rule__XSetLiteral__Group_3__1 : rule__XSetLiteral__Group_3__1__Impl ;
     public final void rule__XSetLiteral__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12557:1: ( rule__XSetLiteral__Group_3__1__Impl )
-            // InternalPerspectiveDsl.g:12558:2: rule__XSetLiteral__Group_3__1__Impl
+            // InternalPerspectiveDsl.g:12559:1: ( rule__XSetLiteral__Group_3__1__Impl )
+            // InternalPerspectiveDsl.g:12560:2: rule__XSetLiteral__Group_3__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSetLiteral__Group_3__1__Impl();
@@ -41773,22 +41773,22 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group_3__1__Impl"
-    // InternalPerspectiveDsl.g:12564:1: rule__XSetLiteral__Group_3__1__Impl : ( ( rule__XSetLiteral__Group_3_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:12566:1: rule__XSetLiteral__Group_3__1__Impl : ( ( rule__XSetLiteral__Group_3_1__0 )* ) ;
     public final void rule__XSetLiteral__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12568:1: ( ( ( rule__XSetLiteral__Group_3_1__0 )* ) )
-            // InternalPerspectiveDsl.g:12569:1: ( ( rule__XSetLiteral__Group_3_1__0 )* )
+            // InternalPerspectiveDsl.g:12570:1: ( ( ( rule__XSetLiteral__Group_3_1__0 )* ) )
+            // InternalPerspectiveDsl.g:12571:1: ( ( rule__XSetLiteral__Group_3_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:12569:1: ( ( rule__XSetLiteral__Group_3_1__0 )* )
-            // InternalPerspectiveDsl.g:12570:2: ( rule__XSetLiteral__Group_3_1__0 )*
+            // InternalPerspectiveDsl.g:12571:1: ( ( rule__XSetLiteral__Group_3_1__0 )* )
+            // InternalPerspectiveDsl.g:12572:2: ( rule__XSetLiteral__Group_3_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getGroup_3_1()); 
             }
-            // InternalPerspectiveDsl.g:12571:2: ( rule__XSetLiteral__Group_3_1__0 )*
+            // InternalPerspectiveDsl.g:12573:2: ( rule__XSetLiteral__Group_3_1__0 )*
             loop88:
             do {
                 int alt88=2;
@@ -41801,7 +41801,7 @@
 
                 switch (alt88) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:12571:3: rule__XSetLiteral__Group_3_1__0
+            	    // InternalPerspectiveDsl.g:12573:3: rule__XSetLiteral__Group_3_1__0
             	    {
             	    pushFollow(FOLLOW_53);
             	    rule__XSetLiteral__Group_3_1__0();
@@ -41842,14 +41842,14 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group_3_1__0"
-    // InternalPerspectiveDsl.g:12580:1: rule__XSetLiteral__Group_3_1__0 : rule__XSetLiteral__Group_3_1__0__Impl rule__XSetLiteral__Group_3_1__1 ;
+    // InternalPerspectiveDsl.g:12582:1: rule__XSetLiteral__Group_3_1__0 : rule__XSetLiteral__Group_3_1__0__Impl rule__XSetLiteral__Group_3_1__1 ;
     public final void rule__XSetLiteral__Group_3_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12584:1: ( rule__XSetLiteral__Group_3_1__0__Impl rule__XSetLiteral__Group_3_1__1 )
-            // InternalPerspectiveDsl.g:12585:2: rule__XSetLiteral__Group_3_1__0__Impl rule__XSetLiteral__Group_3_1__1
+            // InternalPerspectiveDsl.g:12586:1: ( rule__XSetLiteral__Group_3_1__0__Impl rule__XSetLiteral__Group_3_1__1 )
+            // InternalPerspectiveDsl.g:12587:2: rule__XSetLiteral__Group_3_1__0__Impl rule__XSetLiteral__Group_3_1__1
             {
             pushFollow(FOLLOW_54);
             rule__XSetLiteral__Group_3_1__0__Impl();
@@ -41880,17 +41880,17 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group_3_1__0__Impl"
-    // InternalPerspectiveDsl.g:12592:1: rule__XSetLiteral__Group_3_1__0__Impl : ( ',' ) ;
+    // InternalPerspectiveDsl.g:12594:1: rule__XSetLiteral__Group_3_1__0__Impl : ( ',' ) ;
     public final void rule__XSetLiteral__Group_3_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12596:1: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:12597:1: ( ',' )
+            // InternalPerspectiveDsl.g:12598:1: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:12599:1: ( ',' )
             {
-            // InternalPerspectiveDsl.g:12597:1: ( ',' )
-            // InternalPerspectiveDsl.g:12598:2: ','
+            // InternalPerspectiveDsl.g:12599:1: ( ',' )
+            // InternalPerspectiveDsl.g:12600:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0()); 
@@ -41921,14 +41921,14 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group_3_1__1"
-    // InternalPerspectiveDsl.g:12607:1: rule__XSetLiteral__Group_3_1__1 : rule__XSetLiteral__Group_3_1__1__Impl ;
+    // InternalPerspectiveDsl.g:12609:1: rule__XSetLiteral__Group_3_1__1 : rule__XSetLiteral__Group_3_1__1__Impl ;
     public final void rule__XSetLiteral__Group_3_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12611:1: ( rule__XSetLiteral__Group_3_1__1__Impl )
-            // InternalPerspectiveDsl.g:12612:2: rule__XSetLiteral__Group_3_1__1__Impl
+            // InternalPerspectiveDsl.g:12613:1: ( rule__XSetLiteral__Group_3_1__1__Impl )
+            // InternalPerspectiveDsl.g:12614:2: rule__XSetLiteral__Group_3_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSetLiteral__Group_3_1__1__Impl();
@@ -41954,23 +41954,23 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group_3_1__1__Impl"
-    // InternalPerspectiveDsl.g:12618:1: rule__XSetLiteral__Group_3_1__1__Impl : ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:12620:1: rule__XSetLiteral__Group_3_1__1__Impl : ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) ) ;
     public final void rule__XSetLiteral__Group_3_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12622:1: ( ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) ) )
-            // InternalPerspectiveDsl.g:12623:1: ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) )
+            // InternalPerspectiveDsl.g:12624:1: ( ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) ) )
+            // InternalPerspectiveDsl.g:12625:1: ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:12623:1: ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) )
-            // InternalPerspectiveDsl.g:12624:2: ( rule__XSetLiteral__ElementsAssignment_3_1_1 )
+            // InternalPerspectiveDsl.g:12625:1: ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) )
+            // InternalPerspectiveDsl.g:12626:2: ( rule__XSetLiteral__ElementsAssignment_3_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getElementsAssignment_3_1_1()); 
             }
-            // InternalPerspectiveDsl.g:12625:2: ( rule__XSetLiteral__ElementsAssignment_3_1_1 )
-            // InternalPerspectiveDsl.g:12625:3: rule__XSetLiteral__ElementsAssignment_3_1_1
+            // InternalPerspectiveDsl.g:12627:2: ( rule__XSetLiteral__ElementsAssignment_3_1_1 )
+            // InternalPerspectiveDsl.g:12627:3: rule__XSetLiteral__ElementsAssignment_3_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XSetLiteral__ElementsAssignment_3_1_1();
@@ -42005,14 +42005,14 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__0"
-    // InternalPerspectiveDsl.g:12634:1: rule__XListLiteral__Group__0 : rule__XListLiteral__Group__0__Impl rule__XListLiteral__Group__1 ;
+    // InternalPerspectiveDsl.g:12636:1: rule__XListLiteral__Group__0 : rule__XListLiteral__Group__0__Impl rule__XListLiteral__Group__1 ;
     public final void rule__XListLiteral__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12638:1: ( rule__XListLiteral__Group__0__Impl rule__XListLiteral__Group__1 )
-            // InternalPerspectiveDsl.g:12639:2: rule__XListLiteral__Group__0__Impl rule__XListLiteral__Group__1
+            // InternalPerspectiveDsl.g:12640:1: ( rule__XListLiteral__Group__0__Impl rule__XListLiteral__Group__1 )
+            // InternalPerspectiveDsl.g:12641:2: rule__XListLiteral__Group__0__Impl rule__XListLiteral__Group__1
             {
             pushFollow(FOLLOW_57);
             rule__XListLiteral__Group__0__Impl();
@@ -42043,23 +42043,23 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__0__Impl"
-    // InternalPerspectiveDsl.g:12646:1: rule__XListLiteral__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:12648:1: rule__XListLiteral__Group__0__Impl : ( () ) ;
     public final void rule__XListLiteral__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12650:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:12651:1: ( () )
+            // InternalPerspectiveDsl.g:12652:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:12653:1: ( () )
             {
-            // InternalPerspectiveDsl.g:12651:1: ( () )
-            // InternalPerspectiveDsl.g:12652:2: ()
+            // InternalPerspectiveDsl.g:12653:1: ( () )
+            // InternalPerspectiveDsl.g:12654:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getXListLiteralAction_0()); 
             }
-            // InternalPerspectiveDsl.g:12653:2: ()
-            // InternalPerspectiveDsl.g:12653:3: 
+            // InternalPerspectiveDsl.g:12655:2: ()
+            // InternalPerspectiveDsl.g:12655:3: 
             {
             }
 
@@ -42084,14 +42084,14 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__1"
-    // InternalPerspectiveDsl.g:12661:1: rule__XListLiteral__Group__1 : rule__XListLiteral__Group__1__Impl rule__XListLiteral__Group__2 ;
+    // InternalPerspectiveDsl.g:12663:1: rule__XListLiteral__Group__1 : rule__XListLiteral__Group__1__Impl rule__XListLiteral__Group__2 ;
     public final void rule__XListLiteral__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12665:1: ( rule__XListLiteral__Group__1__Impl rule__XListLiteral__Group__2 )
-            // InternalPerspectiveDsl.g:12666:2: rule__XListLiteral__Group__1__Impl rule__XListLiteral__Group__2
+            // InternalPerspectiveDsl.g:12667:1: ( rule__XListLiteral__Group__1__Impl rule__XListLiteral__Group__2 )
+            // InternalPerspectiveDsl.g:12668:2: rule__XListLiteral__Group__1__Impl rule__XListLiteral__Group__2
             {
             pushFollow(FOLLOW_58);
             rule__XListLiteral__Group__1__Impl();
@@ -42122,17 +42122,17 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__1__Impl"
-    // InternalPerspectiveDsl.g:12673:1: rule__XListLiteral__Group__1__Impl : ( '#' ) ;
+    // InternalPerspectiveDsl.g:12675:1: rule__XListLiteral__Group__1__Impl : ( '#' ) ;
     public final void rule__XListLiteral__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12677:1: ( ( '#' ) )
-            // InternalPerspectiveDsl.g:12678:1: ( '#' )
+            // InternalPerspectiveDsl.g:12679:1: ( ( '#' ) )
+            // InternalPerspectiveDsl.g:12680:1: ( '#' )
             {
-            // InternalPerspectiveDsl.g:12678:1: ( '#' )
-            // InternalPerspectiveDsl.g:12679:2: '#'
+            // InternalPerspectiveDsl.g:12680:1: ( '#' )
+            // InternalPerspectiveDsl.g:12681:2: '#'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1()); 
@@ -42163,14 +42163,14 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__2"
-    // InternalPerspectiveDsl.g:12688:1: rule__XListLiteral__Group__2 : rule__XListLiteral__Group__2__Impl rule__XListLiteral__Group__3 ;
+    // InternalPerspectiveDsl.g:12690:1: rule__XListLiteral__Group__2 : rule__XListLiteral__Group__2__Impl rule__XListLiteral__Group__3 ;
     public final void rule__XListLiteral__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12692:1: ( rule__XListLiteral__Group__2__Impl rule__XListLiteral__Group__3 )
-            // InternalPerspectiveDsl.g:12693:2: rule__XListLiteral__Group__2__Impl rule__XListLiteral__Group__3
+            // InternalPerspectiveDsl.g:12694:1: ( rule__XListLiteral__Group__2__Impl rule__XListLiteral__Group__3 )
+            // InternalPerspectiveDsl.g:12695:2: rule__XListLiteral__Group__2__Impl rule__XListLiteral__Group__3
             {
             pushFollow(FOLLOW_56);
             rule__XListLiteral__Group__2__Impl();
@@ -42201,17 +42201,17 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__2__Impl"
-    // InternalPerspectiveDsl.g:12700:1: rule__XListLiteral__Group__2__Impl : ( '[' ) ;
+    // InternalPerspectiveDsl.g:12702:1: rule__XListLiteral__Group__2__Impl : ( '[' ) ;
     public final void rule__XListLiteral__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12704:1: ( ( '[' ) )
-            // InternalPerspectiveDsl.g:12705:1: ( '[' )
+            // InternalPerspectiveDsl.g:12706:1: ( ( '[' ) )
+            // InternalPerspectiveDsl.g:12707:1: ( '[' )
             {
-            // InternalPerspectiveDsl.g:12705:1: ( '[' )
-            // InternalPerspectiveDsl.g:12706:2: '['
+            // InternalPerspectiveDsl.g:12707:1: ( '[' )
+            // InternalPerspectiveDsl.g:12708:2: '['
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2()); 
@@ -42242,14 +42242,14 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__3"
-    // InternalPerspectiveDsl.g:12715:1: rule__XListLiteral__Group__3 : rule__XListLiteral__Group__3__Impl rule__XListLiteral__Group__4 ;
+    // InternalPerspectiveDsl.g:12717:1: rule__XListLiteral__Group__3 : rule__XListLiteral__Group__3__Impl rule__XListLiteral__Group__4 ;
     public final void rule__XListLiteral__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12719:1: ( rule__XListLiteral__Group__3__Impl rule__XListLiteral__Group__4 )
-            // InternalPerspectiveDsl.g:12720:2: rule__XListLiteral__Group__3__Impl rule__XListLiteral__Group__4
+            // InternalPerspectiveDsl.g:12721:1: ( rule__XListLiteral__Group__3__Impl rule__XListLiteral__Group__4 )
+            // InternalPerspectiveDsl.g:12722:2: rule__XListLiteral__Group__3__Impl rule__XListLiteral__Group__4
             {
             pushFollow(FOLLOW_56);
             rule__XListLiteral__Group__3__Impl();
@@ -42280,22 +42280,22 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__3__Impl"
-    // InternalPerspectiveDsl.g:12727:1: rule__XListLiteral__Group__3__Impl : ( ( rule__XListLiteral__Group_3__0 )? ) ;
+    // InternalPerspectiveDsl.g:12729:1: rule__XListLiteral__Group__3__Impl : ( ( rule__XListLiteral__Group_3__0 )? ) ;
     public final void rule__XListLiteral__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12731:1: ( ( ( rule__XListLiteral__Group_3__0 )? ) )
-            // InternalPerspectiveDsl.g:12732:1: ( ( rule__XListLiteral__Group_3__0 )? )
+            // InternalPerspectiveDsl.g:12733:1: ( ( ( rule__XListLiteral__Group_3__0 )? ) )
+            // InternalPerspectiveDsl.g:12734:1: ( ( rule__XListLiteral__Group_3__0 )? )
             {
-            // InternalPerspectiveDsl.g:12732:1: ( ( rule__XListLiteral__Group_3__0 )? )
-            // InternalPerspectiveDsl.g:12733:2: ( rule__XListLiteral__Group_3__0 )?
+            // InternalPerspectiveDsl.g:12734:1: ( ( rule__XListLiteral__Group_3__0 )? )
+            // InternalPerspectiveDsl.g:12735:2: ( rule__XListLiteral__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getGroup_3()); 
             }
-            // InternalPerspectiveDsl.g:12734:2: ( rule__XListLiteral__Group_3__0 )?
+            // InternalPerspectiveDsl.g:12736:2: ( rule__XListLiteral__Group_3__0 )?
             int alt89=2;
             int LA89_0 = input.LA(1);
 
@@ -42304,7 +42304,7 @@
             }
             switch (alt89) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:12734:3: rule__XListLiteral__Group_3__0
+                    // InternalPerspectiveDsl.g:12736:3: rule__XListLiteral__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XListLiteral__Group_3__0();
@@ -42342,14 +42342,14 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__4"
-    // InternalPerspectiveDsl.g:12742:1: rule__XListLiteral__Group__4 : rule__XListLiteral__Group__4__Impl ;
+    // InternalPerspectiveDsl.g:12744:1: rule__XListLiteral__Group__4 : rule__XListLiteral__Group__4__Impl ;
     public final void rule__XListLiteral__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12746:1: ( rule__XListLiteral__Group__4__Impl )
-            // InternalPerspectiveDsl.g:12747:2: rule__XListLiteral__Group__4__Impl
+            // InternalPerspectiveDsl.g:12748:1: ( rule__XListLiteral__Group__4__Impl )
+            // InternalPerspectiveDsl.g:12749:2: rule__XListLiteral__Group__4__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XListLiteral__Group__4__Impl();
@@ -42375,17 +42375,17 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__4__Impl"
-    // InternalPerspectiveDsl.g:12753:1: rule__XListLiteral__Group__4__Impl : ( ']' ) ;
+    // InternalPerspectiveDsl.g:12755:1: rule__XListLiteral__Group__4__Impl : ( ']' ) ;
     public final void rule__XListLiteral__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12757:1: ( ( ']' ) )
-            // InternalPerspectiveDsl.g:12758:1: ( ']' )
+            // InternalPerspectiveDsl.g:12759:1: ( ( ']' ) )
+            // InternalPerspectiveDsl.g:12760:1: ( ']' )
             {
-            // InternalPerspectiveDsl.g:12758:1: ( ']' )
-            // InternalPerspectiveDsl.g:12759:2: ']'
+            // InternalPerspectiveDsl.g:12760:1: ( ']' )
+            // InternalPerspectiveDsl.g:12761:2: ']'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4()); 
@@ -42416,14 +42416,14 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group_3__0"
-    // InternalPerspectiveDsl.g:12769:1: rule__XListLiteral__Group_3__0 : rule__XListLiteral__Group_3__0__Impl rule__XListLiteral__Group_3__1 ;
+    // InternalPerspectiveDsl.g:12771:1: rule__XListLiteral__Group_3__0 : rule__XListLiteral__Group_3__0__Impl rule__XListLiteral__Group_3__1 ;
     public final void rule__XListLiteral__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12773:1: ( rule__XListLiteral__Group_3__0__Impl rule__XListLiteral__Group_3__1 )
-            // InternalPerspectiveDsl.g:12774:2: rule__XListLiteral__Group_3__0__Impl rule__XListLiteral__Group_3__1
+            // InternalPerspectiveDsl.g:12775:1: ( rule__XListLiteral__Group_3__0__Impl rule__XListLiteral__Group_3__1 )
+            // InternalPerspectiveDsl.g:12776:2: rule__XListLiteral__Group_3__0__Impl rule__XListLiteral__Group_3__1
             {
             pushFollow(FOLLOW_52);
             rule__XListLiteral__Group_3__0__Impl();
@@ -42454,23 +42454,23 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group_3__0__Impl"
-    // InternalPerspectiveDsl.g:12781:1: rule__XListLiteral__Group_3__0__Impl : ( ( rule__XListLiteral__ElementsAssignment_3_0 ) ) ;
+    // InternalPerspectiveDsl.g:12783:1: rule__XListLiteral__Group_3__0__Impl : ( ( rule__XListLiteral__ElementsAssignment_3_0 ) ) ;
     public final void rule__XListLiteral__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12785:1: ( ( ( rule__XListLiteral__ElementsAssignment_3_0 ) ) )
-            // InternalPerspectiveDsl.g:12786:1: ( ( rule__XListLiteral__ElementsAssignment_3_0 ) )
+            // InternalPerspectiveDsl.g:12787:1: ( ( ( rule__XListLiteral__ElementsAssignment_3_0 ) ) )
+            // InternalPerspectiveDsl.g:12788:1: ( ( rule__XListLiteral__ElementsAssignment_3_0 ) )
             {
-            // InternalPerspectiveDsl.g:12786:1: ( ( rule__XListLiteral__ElementsAssignment_3_0 ) )
-            // InternalPerspectiveDsl.g:12787:2: ( rule__XListLiteral__ElementsAssignment_3_0 )
+            // InternalPerspectiveDsl.g:12788:1: ( ( rule__XListLiteral__ElementsAssignment_3_0 ) )
+            // InternalPerspectiveDsl.g:12789:2: ( rule__XListLiteral__ElementsAssignment_3_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getElementsAssignment_3_0()); 
             }
-            // InternalPerspectiveDsl.g:12788:2: ( rule__XListLiteral__ElementsAssignment_3_0 )
-            // InternalPerspectiveDsl.g:12788:3: rule__XListLiteral__ElementsAssignment_3_0
+            // InternalPerspectiveDsl.g:12790:2: ( rule__XListLiteral__ElementsAssignment_3_0 )
+            // InternalPerspectiveDsl.g:12790:3: rule__XListLiteral__ElementsAssignment_3_0
             {
             pushFollow(FOLLOW_2);
             rule__XListLiteral__ElementsAssignment_3_0();
@@ -42505,14 +42505,14 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group_3__1"
-    // InternalPerspectiveDsl.g:12796:1: rule__XListLiteral__Group_3__1 : rule__XListLiteral__Group_3__1__Impl ;
+    // InternalPerspectiveDsl.g:12798:1: rule__XListLiteral__Group_3__1 : rule__XListLiteral__Group_3__1__Impl ;
     public final void rule__XListLiteral__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12800:1: ( rule__XListLiteral__Group_3__1__Impl )
-            // InternalPerspectiveDsl.g:12801:2: rule__XListLiteral__Group_3__1__Impl
+            // InternalPerspectiveDsl.g:12802:1: ( rule__XListLiteral__Group_3__1__Impl )
+            // InternalPerspectiveDsl.g:12803:2: rule__XListLiteral__Group_3__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XListLiteral__Group_3__1__Impl();
@@ -42538,22 +42538,22 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group_3__1__Impl"
-    // InternalPerspectiveDsl.g:12807:1: rule__XListLiteral__Group_3__1__Impl : ( ( rule__XListLiteral__Group_3_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:12809:1: rule__XListLiteral__Group_3__1__Impl : ( ( rule__XListLiteral__Group_3_1__0 )* ) ;
     public final void rule__XListLiteral__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12811:1: ( ( ( rule__XListLiteral__Group_3_1__0 )* ) )
-            // InternalPerspectiveDsl.g:12812:1: ( ( rule__XListLiteral__Group_3_1__0 )* )
+            // InternalPerspectiveDsl.g:12813:1: ( ( ( rule__XListLiteral__Group_3_1__0 )* ) )
+            // InternalPerspectiveDsl.g:12814:1: ( ( rule__XListLiteral__Group_3_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:12812:1: ( ( rule__XListLiteral__Group_3_1__0 )* )
-            // InternalPerspectiveDsl.g:12813:2: ( rule__XListLiteral__Group_3_1__0 )*
+            // InternalPerspectiveDsl.g:12814:1: ( ( rule__XListLiteral__Group_3_1__0 )* )
+            // InternalPerspectiveDsl.g:12815:2: ( rule__XListLiteral__Group_3_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getGroup_3_1()); 
             }
-            // InternalPerspectiveDsl.g:12814:2: ( rule__XListLiteral__Group_3_1__0 )*
+            // InternalPerspectiveDsl.g:12816:2: ( rule__XListLiteral__Group_3_1__0 )*
             loop90:
             do {
                 int alt90=2;
@@ -42566,7 +42566,7 @@
 
                 switch (alt90) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:12814:3: rule__XListLiteral__Group_3_1__0
+            	    // InternalPerspectiveDsl.g:12816:3: rule__XListLiteral__Group_3_1__0
             	    {
             	    pushFollow(FOLLOW_53);
             	    rule__XListLiteral__Group_3_1__0();
@@ -42607,14 +42607,14 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group_3_1__0"
-    // InternalPerspectiveDsl.g:12823:1: rule__XListLiteral__Group_3_1__0 : rule__XListLiteral__Group_3_1__0__Impl rule__XListLiteral__Group_3_1__1 ;
+    // InternalPerspectiveDsl.g:12825:1: rule__XListLiteral__Group_3_1__0 : rule__XListLiteral__Group_3_1__0__Impl rule__XListLiteral__Group_3_1__1 ;
     public final void rule__XListLiteral__Group_3_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12827:1: ( rule__XListLiteral__Group_3_1__0__Impl rule__XListLiteral__Group_3_1__1 )
-            // InternalPerspectiveDsl.g:12828:2: rule__XListLiteral__Group_3_1__0__Impl rule__XListLiteral__Group_3_1__1
+            // InternalPerspectiveDsl.g:12829:1: ( rule__XListLiteral__Group_3_1__0__Impl rule__XListLiteral__Group_3_1__1 )
+            // InternalPerspectiveDsl.g:12830:2: rule__XListLiteral__Group_3_1__0__Impl rule__XListLiteral__Group_3_1__1
             {
             pushFollow(FOLLOW_54);
             rule__XListLiteral__Group_3_1__0__Impl();
@@ -42645,17 +42645,17 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group_3_1__0__Impl"
-    // InternalPerspectiveDsl.g:12835:1: rule__XListLiteral__Group_3_1__0__Impl : ( ',' ) ;
+    // InternalPerspectiveDsl.g:12837:1: rule__XListLiteral__Group_3_1__0__Impl : ( ',' ) ;
     public final void rule__XListLiteral__Group_3_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12839:1: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:12840:1: ( ',' )
+            // InternalPerspectiveDsl.g:12841:1: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:12842:1: ( ',' )
             {
-            // InternalPerspectiveDsl.g:12840:1: ( ',' )
-            // InternalPerspectiveDsl.g:12841:2: ','
+            // InternalPerspectiveDsl.g:12842:1: ( ',' )
+            // InternalPerspectiveDsl.g:12843:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0()); 
@@ -42686,14 +42686,14 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group_3_1__1"
-    // InternalPerspectiveDsl.g:12850:1: rule__XListLiteral__Group_3_1__1 : rule__XListLiteral__Group_3_1__1__Impl ;
+    // InternalPerspectiveDsl.g:12852:1: rule__XListLiteral__Group_3_1__1 : rule__XListLiteral__Group_3_1__1__Impl ;
     public final void rule__XListLiteral__Group_3_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12854:1: ( rule__XListLiteral__Group_3_1__1__Impl )
-            // InternalPerspectiveDsl.g:12855:2: rule__XListLiteral__Group_3_1__1__Impl
+            // InternalPerspectiveDsl.g:12856:1: ( rule__XListLiteral__Group_3_1__1__Impl )
+            // InternalPerspectiveDsl.g:12857:2: rule__XListLiteral__Group_3_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XListLiteral__Group_3_1__1__Impl();
@@ -42719,23 +42719,23 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group_3_1__1__Impl"
-    // InternalPerspectiveDsl.g:12861:1: rule__XListLiteral__Group_3_1__1__Impl : ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:12863:1: rule__XListLiteral__Group_3_1__1__Impl : ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) ) ;
     public final void rule__XListLiteral__Group_3_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12865:1: ( ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) ) )
-            // InternalPerspectiveDsl.g:12866:1: ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) )
+            // InternalPerspectiveDsl.g:12867:1: ( ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) ) )
+            // InternalPerspectiveDsl.g:12868:1: ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:12866:1: ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) )
-            // InternalPerspectiveDsl.g:12867:2: ( rule__XListLiteral__ElementsAssignment_3_1_1 )
+            // InternalPerspectiveDsl.g:12868:1: ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) )
+            // InternalPerspectiveDsl.g:12869:2: ( rule__XListLiteral__ElementsAssignment_3_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getElementsAssignment_3_1_1()); 
             }
-            // InternalPerspectiveDsl.g:12868:2: ( rule__XListLiteral__ElementsAssignment_3_1_1 )
-            // InternalPerspectiveDsl.g:12868:3: rule__XListLiteral__ElementsAssignment_3_1_1
+            // InternalPerspectiveDsl.g:12870:2: ( rule__XListLiteral__ElementsAssignment_3_1_1 )
+            // InternalPerspectiveDsl.g:12870:3: rule__XListLiteral__ElementsAssignment_3_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XListLiteral__ElementsAssignment_3_1_1();
@@ -42770,14 +42770,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group__0"
-    // InternalPerspectiveDsl.g:12877:1: rule__XClosure__Group__0 : rule__XClosure__Group__0__Impl rule__XClosure__Group__1 ;
+    // InternalPerspectiveDsl.g:12879:1: rule__XClosure__Group__0 : rule__XClosure__Group__0__Impl rule__XClosure__Group__1 ;
     public final void rule__XClosure__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12881:1: ( rule__XClosure__Group__0__Impl rule__XClosure__Group__1 )
-            // InternalPerspectiveDsl.g:12882:2: rule__XClosure__Group__0__Impl rule__XClosure__Group__1
+            // InternalPerspectiveDsl.g:12883:1: ( rule__XClosure__Group__0__Impl rule__XClosure__Group__1 )
+            // InternalPerspectiveDsl.g:12884:2: rule__XClosure__Group__0__Impl rule__XClosure__Group__1
             {
             pushFollow(FOLLOW_95);
             rule__XClosure__Group__0__Impl();
@@ -42808,23 +42808,23 @@
 
 
     // $ANTLR start "rule__XClosure__Group__0__Impl"
-    // InternalPerspectiveDsl.g:12889:1: rule__XClosure__Group__0__Impl : ( ( rule__XClosure__Group_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:12891:1: rule__XClosure__Group__0__Impl : ( ( rule__XClosure__Group_0__0 ) ) ;
     public final void rule__XClosure__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12893:1: ( ( ( rule__XClosure__Group_0__0 ) ) )
-            // InternalPerspectiveDsl.g:12894:1: ( ( rule__XClosure__Group_0__0 ) )
+            // InternalPerspectiveDsl.g:12895:1: ( ( ( rule__XClosure__Group_0__0 ) ) )
+            // InternalPerspectiveDsl.g:12896:1: ( ( rule__XClosure__Group_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:12894:1: ( ( rule__XClosure__Group_0__0 ) )
-            // InternalPerspectiveDsl.g:12895:2: ( rule__XClosure__Group_0__0 )
+            // InternalPerspectiveDsl.g:12896:1: ( ( rule__XClosure__Group_0__0 ) )
+            // InternalPerspectiveDsl.g:12897:2: ( rule__XClosure__Group_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getGroup_0()); 
             }
-            // InternalPerspectiveDsl.g:12896:2: ( rule__XClosure__Group_0__0 )
-            // InternalPerspectiveDsl.g:12896:3: rule__XClosure__Group_0__0
+            // InternalPerspectiveDsl.g:12898:2: ( rule__XClosure__Group_0__0 )
+            // InternalPerspectiveDsl.g:12898:3: rule__XClosure__Group_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group_0__0();
@@ -42859,14 +42859,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group__1"
-    // InternalPerspectiveDsl.g:12904:1: rule__XClosure__Group__1 : rule__XClosure__Group__1__Impl rule__XClosure__Group__2 ;
+    // InternalPerspectiveDsl.g:12906:1: rule__XClosure__Group__1 : rule__XClosure__Group__1__Impl rule__XClosure__Group__2 ;
     public final void rule__XClosure__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12908:1: ( rule__XClosure__Group__1__Impl rule__XClosure__Group__2 )
-            // InternalPerspectiveDsl.g:12909:2: rule__XClosure__Group__1__Impl rule__XClosure__Group__2
+            // InternalPerspectiveDsl.g:12910:1: ( rule__XClosure__Group__1__Impl rule__XClosure__Group__2 )
+            // InternalPerspectiveDsl.g:12911:2: rule__XClosure__Group__1__Impl rule__XClosure__Group__2
             {
             pushFollow(FOLLOW_95);
             rule__XClosure__Group__1__Impl();
@@ -42897,27 +42897,27 @@
 
 
     // $ANTLR start "rule__XClosure__Group__1__Impl"
-    // InternalPerspectiveDsl.g:12916:1: rule__XClosure__Group__1__Impl : ( ( rule__XClosure__Group_1__0 )? ) ;
+    // InternalPerspectiveDsl.g:12918:1: rule__XClosure__Group__1__Impl : ( ( rule__XClosure__Group_1__0 )? ) ;
     public final void rule__XClosure__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12920:1: ( ( ( rule__XClosure__Group_1__0 )? ) )
-            // InternalPerspectiveDsl.g:12921:1: ( ( rule__XClosure__Group_1__0 )? )
+            // InternalPerspectiveDsl.g:12922:1: ( ( ( rule__XClosure__Group_1__0 )? ) )
+            // InternalPerspectiveDsl.g:12923:1: ( ( rule__XClosure__Group_1__0 )? )
             {
-            // InternalPerspectiveDsl.g:12921:1: ( ( rule__XClosure__Group_1__0 )? )
-            // InternalPerspectiveDsl.g:12922:2: ( rule__XClosure__Group_1__0 )?
+            // InternalPerspectiveDsl.g:12923:1: ( ( rule__XClosure__Group_1__0 )? )
+            // InternalPerspectiveDsl.g:12924:2: ( rule__XClosure__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getGroup_1()); 
             }
-            // InternalPerspectiveDsl.g:12923:2: ( rule__XClosure__Group_1__0 )?
+            // InternalPerspectiveDsl.g:12925:2: ( rule__XClosure__Group_1__0 )?
             int alt91=2;
             alt91 = dfa91.predict(input);
             switch (alt91) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:12923:3: rule__XClosure__Group_1__0
+                    // InternalPerspectiveDsl.g:12925:3: rule__XClosure__Group_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XClosure__Group_1__0();
@@ -42955,14 +42955,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group__2"
-    // InternalPerspectiveDsl.g:12931:1: rule__XClosure__Group__2 : rule__XClosure__Group__2__Impl rule__XClosure__Group__3 ;
+    // InternalPerspectiveDsl.g:12933:1: rule__XClosure__Group__2 : rule__XClosure__Group__2__Impl rule__XClosure__Group__3 ;
     public final void rule__XClosure__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12935:1: ( rule__XClosure__Group__2__Impl rule__XClosure__Group__3 )
-            // InternalPerspectiveDsl.g:12936:2: rule__XClosure__Group__2__Impl rule__XClosure__Group__3
+            // InternalPerspectiveDsl.g:12937:1: ( rule__XClosure__Group__2__Impl rule__XClosure__Group__3 )
+            // InternalPerspectiveDsl.g:12938:2: rule__XClosure__Group__2__Impl rule__XClosure__Group__3
             {
             pushFollow(FOLLOW_96);
             rule__XClosure__Group__2__Impl();
@@ -42993,23 +42993,23 @@
 
 
     // $ANTLR start "rule__XClosure__Group__2__Impl"
-    // InternalPerspectiveDsl.g:12943:1: rule__XClosure__Group__2__Impl : ( ( rule__XClosure__ExpressionAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:12945:1: rule__XClosure__Group__2__Impl : ( ( rule__XClosure__ExpressionAssignment_2 ) ) ;
     public final void rule__XClosure__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12947:1: ( ( ( rule__XClosure__ExpressionAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:12948:1: ( ( rule__XClosure__ExpressionAssignment_2 ) )
+            // InternalPerspectiveDsl.g:12949:1: ( ( ( rule__XClosure__ExpressionAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:12950:1: ( ( rule__XClosure__ExpressionAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:12948:1: ( ( rule__XClosure__ExpressionAssignment_2 ) )
-            // InternalPerspectiveDsl.g:12949:2: ( rule__XClosure__ExpressionAssignment_2 )
+            // InternalPerspectiveDsl.g:12950:1: ( ( rule__XClosure__ExpressionAssignment_2 ) )
+            // InternalPerspectiveDsl.g:12951:2: ( rule__XClosure__ExpressionAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getExpressionAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:12950:2: ( rule__XClosure__ExpressionAssignment_2 )
-            // InternalPerspectiveDsl.g:12950:3: rule__XClosure__ExpressionAssignment_2
+            // InternalPerspectiveDsl.g:12952:2: ( rule__XClosure__ExpressionAssignment_2 )
+            // InternalPerspectiveDsl.g:12952:3: rule__XClosure__ExpressionAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__ExpressionAssignment_2();
@@ -43044,14 +43044,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group__3"
-    // InternalPerspectiveDsl.g:12958:1: rule__XClosure__Group__3 : rule__XClosure__Group__3__Impl ;
+    // InternalPerspectiveDsl.g:12960:1: rule__XClosure__Group__3 : rule__XClosure__Group__3__Impl ;
     public final void rule__XClosure__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12962:1: ( rule__XClosure__Group__3__Impl )
-            // InternalPerspectiveDsl.g:12963:2: rule__XClosure__Group__3__Impl
+            // InternalPerspectiveDsl.g:12964:1: ( rule__XClosure__Group__3__Impl )
+            // InternalPerspectiveDsl.g:12965:2: rule__XClosure__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group__3__Impl();
@@ -43077,17 +43077,17 @@
 
 
     // $ANTLR start "rule__XClosure__Group__3__Impl"
-    // InternalPerspectiveDsl.g:12969:1: rule__XClosure__Group__3__Impl : ( ']' ) ;
+    // InternalPerspectiveDsl.g:12971:1: rule__XClosure__Group__3__Impl : ( ']' ) ;
     public final void rule__XClosure__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12973:1: ( ( ']' ) )
-            // InternalPerspectiveDsl.g:12974:1: ( ']' )
+            // InternalPerspectiveDsl.g:12975:1: ( ( ']' ) )
+            // InternalPerspectiveDsl.g:12976:1: ( ']' )
             {
-            // InternalPerspectiveDsl.g:12974:1: ( ']' )
-            // InternalPerspectiveDsl.g:12975:2: ']'
+            // InternalPerspectiveDsl.g:12976:1: ( ']' )
+            // InternalPerspectiveDsl.g:12977:2: ']'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getRightSquareBracketKeyword_3()); 
@@ -43118,14 +43118,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group_0__0"
-    // InternalPerspectiveDsl.g:12985:1: rule__XClosure__Group_0__0 : rule__XClosure__Group_0__0__Impl ;
+    // InternalPerspectiveDsl.g:12987:1: rule__XClosure__Group_0__0 : rule__XClosure__Group_0__0__Impl ;
     public final void rule__XClosure__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:12989:1: ( rule__XClosure__Group_0__0__Impl )
-            // InternalPerspectiveDsl.g:12990:2: rule__XClosure__Group_0__0__Impl
+            // InternalPerspectiveDsl.g:12991:1: ( rule__XClosure__Group_0__0__Impl )
+            // InternalPerspectiveDsl.g:12992:2: rule__XClosure__Group_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group_0__0__Impl();
@@ -43151,23 +43151,23 @@
 
 
     // $ANTLR start "rule__XClosure__Group_0__0__Impl"
-    // InternalPerspectiveDsl.g:12996:1: rule__XClosure__Group_0__0__Impl : ( ( rule__XClosure__Group_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:12998:1: rule__XClosure__Group_0__0__Impl : ( ( rule__XClosure__Group_0_0__0 ) ) ;
     public final void rule__XClosure__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13000:1: ( ( ( rule__XClosure__Group_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:13001:1: ( ( rule__XClosure__Group_0_0__0 ) )
+            // InternalPerspectiveDsl.g:13002:1: ( ( ( rule__XClosure__Group_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:13003:1: ( ( rule__XClosure__Group_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:13001:1: ( ( rule__XClosure__Group_0_0__0 ) )
-            // InternalPerspectiveDsl.g:13002:2: ( rule__XClosure__Group_0_0__0 )
+            // InternalPerspectiveDsl.g:13003:1: ( ( rule__XClosure__Group_0_0__0 ) )
+            // InternalPerspectiveDsl.g:13004:2: ( rule__XClosure__Group_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getGroup_0_0()); 
             }
-            // InternalPerspectiveDsl.g:13003:2: ( rule__XClosure__Group_0_0__0 )
-            // InternalPerspectiveDsl.g:13003:3: rule__XClosure__Group_0_0__0
+            // InternalPerspectiveDsl.g:13005:2: ( rule__XClosure__Group_0_0__0 )
+            // InternalPerspectiveDsl.g:13005:3: rule__XClosure__Group_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group_0_0__0();
@@ -43202,14 +43202,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group_0_0__0"
-    // InternalPerspectiveDsl.g:13012:1: rule__XClosure__Group_0_0__0 : rule__XClosure__Group_0_0__0__Impl rule__XClosure__Group_0_0__1 ;
+    // InternalPerspectiveDsl.g:13014:1: rule__XClosure__Group_0_0__0 : rule__XClosure__Group_0_0__0__Impl rule__XClosure__Group_0_0__1 ;
     public final void rule__XClosure__Group_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13016:1: ( rule__XClosure__Group_0_0__0__Impl rule__XClosure__Group_0_0__1 )
-            // InternalPerspectiveDsl.g:13017:2: rule__XClosure__Group_0_0__0__Impl rule__XClosure__Group_0_0__1
+            // InternalPerspectiveDsl.g:13018:1: ( rule__XClosure__Group_0_0__0__Impl rule__XClosure__Group_0_0__1 )
+            // InternalPerspectiveDsl.g:13019:2: rule__XClosure__Group_0_0__0__Impl rule__XClosure__Group_0_0__1
             {
             pushFollow(FOLLOW_58);
             rule__XClosure__Group_0_0__0__Impl();
@@ -43240,23 +43240,23 @@
 
 
     // $ANTLR start "rule__XClosure__Group_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:13024:1: rule__XClosure__Group_0_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:13026:1: rule__XClosure__Group_0_0__0__Impl : ( () ) ;
     public final void rule__XClosure__Group_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13028:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:13029:1: ( () )
+            // InternalPerspectiveDsl.g:13030:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:13031:1: ( () )
             {
-            // InternalPerspectiveDsl.g:13029:1: ( () )
-            // InternalPerspectiveDsl.g:13030:2: ()
+            // InternalPerspectiveDsl.g:13031:1: ( () )
+            // InternalPerspectiveDsl.g:13032:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getXClosureAction_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:13031:2: ()
-            // InternalPerspectiveDsl.g:13031:3: 
+            // InternalPerspectiveDsl.g:13033:2: ()
+            // InternalPerspectiveDsl.g:13033:3: 
             {
             }
 
@@ -43281,14 +43281,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group_0_0__1"
-    // InternalPerspectiveDsl.g:13039:1: rule__XClosure__Group_0_0__1 : rule__XClosure__Group_0_0__1__Impl ;
+    // InternalPerspectiveDsl.g:13041:1: rule__XClosure__Group_0_0__1 : rule__XClosure__Group_0_0__1__Impl ;
     public final void rule__XClosure__Group_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13043:1: ( rule__XClosure__Group_0_0__1__Impl )
-            // InternalPerspectiveDsl.g:13044:2: rule__XClosure__Group_0_0__1__Impl
+            // InternalPerspectiveDsl.g:13045:1: ( rule__XClosure__Group_0_0__1__Impl )
+            // InternalPerspectiveDsl.g:13046:2: rule__XClosure__Group_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group_0_0__1__Impl();
@@ -43314,17 +43314,17 @@
 
 
     // $ANTLR start "rule__XClosure__Group_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:13050:1: rule__XClosure__Group_0_0__1__Impl : ( '[' ) ;
+    // InternalPerspectiveDsl.g:13052:1: rule__XClosure__Group_0_0__1__Impl : ( '[' ) ;
     public final void rule__XClosure__Group_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13054:1: ( ( '[' ) )
-            // InternalPerspectiveDsl.g:13055:1: ( '[' )
+            // InternalPerspectiveDsl.g:13056:1: ( ( '[' ) )
+            // InternalPerspectiveDsl.g:13057:1: ( '[' )
             {
-            // InternalPerspectiveDsl.g:13055:1: ( '[' )
-            // InternalPerspectiveDsl.g:13056:2: '['
+            // InternalPerspectiveDsl.g:13057:1: ( '[' )
+            // InternalPerspectiveDsl.g:13058:2: '['
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1()); 
@@ -43355,14 +43355,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1__0"
-    // InternalPerspectiveDsl.g:13066:1: rule__XClosure__Group_1__0 : rule__XClosure__Group_1__0__Impl ;
+    // InternalPerspectiveDsl.g:13068:1: rule__XClosure__Group_1__0 : rule__XClosure__Group_1__0__Impl ;
     public final void rule__XClosure__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13070:1: ( rule__XClosure__Group_1__0__Impl )
-            // InternalPerspectiveDsl.g:13071:2: rule__XClosure__Group_1__0__Impl
+            // InternalPerspectiveDsl.g:13072:1: ( rule__XClosure__Group_1__0__Impl )
+            // InternalPerspectiveDsl.g:13073:2: rule__XClosure__Group_1__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group_1__0__Impl();
@@ -43388,23 +43388,23 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1__0__Impl"
-    // InternalPerspectiveDsl.g:13077:1: rule__XClosure__Group_1__0__Impl : ( ( rule__XClosure__Group_1_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:13079:1: rule__XClosure__Group_1__0__Impl : ( ( rule__XClosure__Group_1_0__0 ) ) ;
     public final void rule__XClosure__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13081:1: ( ( ( rule__XClosure__Group_1_0__0 ) ) )
-            // InternalPerspectiveDsl.g:13082:1: ( ( rule__XClosure__Group_1_0__0 ) )
+            // InternalPerspectiveDsl.g:13083:1: ( ( ( rule__XClosure__Group_1_0__0 ) ) )
+            // InternalPerspectiveDsl.g:13084:1: ( ( rule__XClosure__Group_1_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:13082:1: ( ( rule__XClosure__Group_1_0__0 ) )
-            // InternalPerspectiveDsl.g:13083:2: ( rule__XClosure__Group_1_0__0 )
+            // InternalPerspectiveDsl.g:13084:1: ( ( rule__XClosure__Group_1_0__0 ) )
+            // InternalPerspectiveDsl.g:13085:2: ( rule__XClosure__Group_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getGroup_1_0()); 
             }
-            // InternalPerspectiveDsl.g:13084:2: ( rule__XClosure__Group_1_0__0 )
-            // InternalPerspectiveDsl.g:13084:3: rule__XClosure__Group_1_0__0
+            // InternalPerspectiveDsl.g:13086:2: ( rule__XClosure__Group_1_0__0 )
+            // InternalPerspectiveDsl.g:13086:3: rule__XClosure__Group_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group_1_0__0();
@@ -43439,14 +43439,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0__0"
-    // InternalPerspectiveDsl.g:13093:1: rule__XClosure__Group_1_0__0 : rule__XClosure__Group_1_0__0__Impl rule__XClosure__Group_1_0__1 ;
+    // InternalPerspectiveDsl.g:13095:1: rule__XClosure__Group_1_0__0 : rule__XClosure__Group_1_0__0__Impl rule__XClosure__Group_1_0__1 ;
     public final void rule__XClosure__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13097:1: ( rule__XClosure__Group_1_0__0__Impl rule__XClosure__Group_1_0__1 )
-            // InternalPerspectiveDsl.g:13098:2: rule__XClosure__Group_1_0__0__Impl rule__XClosure__Group_1_0__1
+            // InternalPerspectiveDsl.g:13099:1: ( rule__XClosure__Group_1_0__0__Impl rule__XClosure__Group_1_0__1 )
+            // InternalPerspectiveDsl.g:13100:2: rule__XClosure__Group_1_0__0__Impl rule__XClosure__Group_1_0__1
             {
             pushFollow(FOLLOW_97);
             rule__XClosure__Group_1_0__0__Impl();
@@ -43477,22 +43477,22 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0__0__Impl"
-    // InternalPerspectiveDsl.g:13105:1: rule__XClosure__Group_1_0__0__Impl : ( ( rule__XClosure__Group_1_0_0__0 )? ) ;
+    // InternalPerspectiveDsl.g:13107:1: rule__XClosure__Group_1_0__0__Impl : ( ( rule__XClosure__Group_1_0_0__0 )? ) ;
     public final void rule__XClosure__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13109:1: ( ( ( rule__XClosure__Group_1_0_0__0 )? ) )
-            // InternalPerspectiveDsl.g:13110:1: ( ( rule__XClosure__Group_1_0_0__0 )? )
+            // InternalPerspectiveDsl.g:13111:1: ( ( ( rule__XClosure__Group_1_0_0__0 )? ) )
+            // InternalPerspectiveDsl.g:13112:1: ( ( rule__XClosure__Group_1_0_0__0 )? )
             {
-            // InternalPerspectiveDsl.g:13110:1: ( ( rule__XClosure__Group_1_0_0__0 )? )
-            // InternalPerspectiveDsl.g:13111:2: ( rule__XClosure__Group_1_0_0__0 )?
+            // InternalPerspectiveDsl.g:13112:1: ( ( rule__XClosure__Group_1_0_0__0 )? )
+            // InternalPerspectiveDsl.g:13113:2: ( rule__XClosure__Group_1_0_0__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getGroup_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:13112:2: ( rule__XClosure__Group_1_0_0__0 )?
+            // InternalPerspectiveDsl.g:13114:2: ( rule__XClosure__Group_1_0_0__0 )?
             int alt92=2;
             int LA92_0 = input.LA(1);
 
@@ -43501,7 +43501,7 @@
             }
             switch (alt92) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:13112:3: rule__XClosure__Group_1_0_0__0
+                    // InternalPerspectiveDsl.g:13114:3: rule__XClosure__Group_1_0_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XClosure__Group_1_0_0__0();
@@ -43539,14 +43539,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0__1"
-    // InternalPerspectiveDsl.g:13120:1: rule__XClosure__Group_1_0__1 : rule__XClosure__Group_1_0__1__Impl ;
+    // InternalPerspectiveDsl.g:13122:1: rule__XClosure__Group_1_0__1 : rule__XClosure__Group_1_0__1__Impl ;
     public final void rule__XClosure__Group_1_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13124:1: ( rule__XClosure__Group_1_0__1__Impl )
-            // InternalPerspectiveDsl.g:13125:2: rule__XClosure__Group_1_0__1__Impl
+            // InternalPerspectiveDsl.g:13126:1: ( rule__XClosure__Group_1_0__1__Impl )
+            // InternalPerspectiveDsl.g:13127:2: rule__XClosure__Group_1_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group_1_0__1__Impl();
@@ -43572,23 +43572,23 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0__1__Impl"
-    // InternalPerspectiveDsl.g:13131:1: rule__XClosure__Group_1_0__1__Impl : ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:13133:1: rule__XClosure__Group_1_0__1__Impl : ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) ) ;
     public final void rule__XClosure__Group_1_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13135:1: ( ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) ) )
-            // InternalPerspectiveDsl.g:13136:1: ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) )
+            // InternalPerspectiveDsl.g:13137:1: ( ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) ) )
+            // InternalPerspectiveDsl.g:13138:1: ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:13136:1: ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) )
-            // InternalPerspectiveDsl.g:13137:2: ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 )
+            // InternalPerspectiveDsl.g:13138:1: ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) )
+            // InternalPerspectiveDsl.g:13139:2: ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getExplicitSyntaxAssignment_1_0_1()); 
             }
-            // InternalPerspectiveDsl.g:13138:2: ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 )
-            // InternalPerspectiveDsl.g:13138:3: rule__XClosure__ExplicitSyntaxAssignment_1_0_1
+            // InternalPerspectiveDsl.g:13140:2: ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 )
+            // InternalPerspectiveDsl.g:13140:3: rule__XClosure__ExplicitSyntaxAssignment_1_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__ExplicitSyntaxAssignment_1_0_1();
@@ -43623,14 +43623,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0_0__0"
-    // InternalPerspectiveDsl.g:13147:1: rule__XClosure__Group_1_0_0__0 : rule__XClosure__Group_1_0_0__0__Impl rule__XClosure__Group_1_0_0__1 ;
+    // InternalPerspectiveDsl.g:13149:1: rule__XClosure__Group_1_0_0__0 : rule__XClosure__Group_1_0_0__0__Impl rule__XClosure__Group_1_0_0__1 ;
     public final void rule__XClosure__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13151:1: ( rule__XClosure__Group_1_0_0__0__Impl rule__XClosure__Group_1_0_0__1 )
-            // InternalPerspectiveDsl.g:13152:2: rule__XClosure__Group_1_0_0__0__Impl rule__XClosure__Group_1_0_0__1
+            // InternalPerspectiveDsl.g:13153:1: ( rule__XClosure__Group_1_0_0__0__Impl rule__XClosure__Group_1_0_0__1 )
+            // InternalPerspectiveDsl.g:13154:2: rule__XClosure__Group_1_0_0__0__Impl rule__XClosure__Group_1_0_0__1
             {
             pushFollow(FOLLOW_52);
             rule__XClosure__Group_1_0_0__0__Impl();
@@ -43661,23 +43661,23 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:13159:1: rule__XClosure__Group_1_0_0__0__Impl : ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) ) ;
+    // InternalPerspectiveDsl.g:13161:1: rule__XClosure__Group_1_0_0__0__Impl : ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) ) ;
     public final void rule__XClosure__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13163:1: ( ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) ) )
-            // InternalPerspectiveDsl.g:13164:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) )
+            // InternalPerspectiveDsl.g:13165:1: ( ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) ) )
+            // InternalPerspectiveDsl.g:13166:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) )
             {
-            // InternalPerspectiveDsl.g:13164:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) )
-            // InternalPerspectiveDsl.g:13165:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 )
+            // InternalPerspectiveDsl.g:13166:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) )
+            // InternalPerspectiveDsl.g:13167:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getDeclaredFormalParametersAssignment_1_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:13166:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 )
-            // InternalPerspectiveDsl.g:13166:3: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0
+            // InternalPerspectiveDsl.g:13168:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 )
+            // InternalPerspectiveDsl.g:13168:3: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0();
@@ -43712,14 +43712,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0_0__1"
-    // InternalPerspectiveDsl.g:13174:1: rule__XClosure__Group_1_0_0__1 : rule__XClosure__Group_1_0_0__1__Impl ;
+    // InternalPerspectiveDsl.g:13176:1: rule__XClosure__Group_1_0_0__1 : rule__XClosure__Group_1_0_0__1__Impl ;
     public final void rule__XClosure__Group_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13178:1: ( rule__XClosure__Group_1_0_0__1__Impl )
-            // InternalPerspectiveDsl.g:13179:2: rule__XClosure__Group_1_0_0__1__Impl
+            // InternalPerspectiveDsl.g:13180:1: ( rule__XClosure__Group_1_0_0__1__Impl )
+            // InternalPerspectiveDsl.g:13181:2: rule__XClosure__Group_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group_1_0_0__1__Impl();
@@ -43745,22 +43745,22 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:13185:1: rule__XClosure__Group_1_0_0__1__Impl : ( ( rule__XClosure__Group_1_0_0_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:13187:1: rule__XClosure__Group_1_0_0__1__Impl : ( ( rule__XClosure__Group_1_0_0_1__0 )* ) ;
     public final void rule__XClosure__Group_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13189:1: ( ( ( rule__XClosure__Group_1_0_0_1__0 )* ) )
-            // InternalPerspectiveDsl.g:13190:1: ( ( rule__XClosure__Group_1_0_0_1__0 )* )
+            // InternalPerspectiveDsl.g:13191:1: ( ( ( rule__XClosure__Group_1_0_0_1__0 )* ) )
+            // InternalPerspectiveDsl.g:13192:1: ( ( rule__XClosure__Group_1_0_0_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:13190:1: ( ( rule__XClosure__Group_1_0_0_1__0 )* )
-            // InternalPerspectiveDsl.g:13191:2: ( rule__XClosure__Group_1_0_0_1__0 )*
+            // InternalPerspectiveDsl.g:13192:1: ( ( rule__XClosure__Group_1_0_0_1__0 )* )
+            // InternalPerspectiveDsl.g:13193:2: ( rule__XClosure__Group_1_0_0_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getGroup_1_0_0_1()); 
             }
-            // InternalPerspectiveDsl.g:13192:2: ( rule__XClosure__Group_1_0_0_1__0 )*
+            // InternalPerspectiveDsl.g:13194:2: ( rule__XClosure__Group_1_0_0_1__0 )*
             loop93:
             do {
                 int alt93=2;
@@ -43773,7 +43773,7 @@
 
                 switch (alt93) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:13192:3: rule__XClosure__Group_1_0_0_1__0
+            	    // InternalPerspectiveDsl.g:13194:3: rule__XClosure__Group_1_0_0_1__0
             	    {
             	    pushFollow(FOLLOW_53);
             	    rule__XClosure__Group_1_0_0_1__0();
@@ -43814,14 +43814,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0_0_1__0"
-    // InternalPerspectiveDsl.g:13201:1: rule__XClosure__Group_1_0_0_1__0 : rule__XClosure__Group_1_0_0_1__0__Impl rule__XClosure__Group_1_0_0_1__1 ;
+    // InternalPerspectiveDsl.g:13203:1: rule__XClosure__Group_1_0_0_1__0 : rule__XClosure__Group_1_0_0_1__0__Impl rule__XClosure__Group_1_0_0_1__1 ;
     public final void rule__XClosure__Group_1_0_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13205:1: ( rule__XClosure__Group_1_0_0_1__0__Impl rule__XClosure__Group_1_0_0_1__1 )
-            // InternalPerspectiveDsl.g:13206:2: rule__XClosure__Group_1_0_0_1__0__Impl rule__XClosure__Group_1_0_0_1__1
+            // InternalPerspectiveDsl.g:13207:1: ( rule__XClosure__Group_1_0_0_1__0__Impl rule__XClosure__Group_1_0_0_1__1 )
+            // InternalPerspectiveDsl.g:13208:2: rule__XClosure__Group_1_0_0_1__0__Impl rule__XClosure__Group_1_0_0_1__1
             {
             pushFollow(FOLLOW_71);
             rule__XClosure__Group_1_0_0_1__0__Impl();
@@ -43852,17 +43852,17 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0_0_1__0__Impl"
-    // InternalPerspectiveDsl.g:13213:1: rule__XClosure__Group_1_0_0_1__0__Impl : ( ',' ) ;
+    // InternalPerspectiveDsl.g:13215:1: rule__XClosure__Group_1_0_0_1__0__Impl : ( ',' ) ;
     public final void rule__XClosure__Group_1_0_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13217:1: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:13218:1: ( ',' )
+            // InternalPerspectiveDsl.g:13219:1: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:13220:1: ( ',' )
             {
-            // InternalPerspectiveDsl.g:13218:1: ( ',' )
-            // InternalPerspectiveDsl.g:13219:2: ','
+            // InternalPerspectiveDsl.g:13220:1: ( ',' )
+            // InternalPerspectiveDsl.g:13221:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0()); 
@@ -43893,14 +43893,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0_0_1__1"
-    // InternalPerspectiveDsl.g:13228:1: rule__XClosure__Group_1_0_0_1__1 : rule__XClosure__Group_1_0_0_1__1__Impl ;
+    // InternalPerspectiveDsl.g:13230:1: rule__XClosure__Group_1_0_0_1__1 : rule__XClosure__Group_1_0_0_1__1__Impl ;
     public final void rule__XClosure__Group_1_0_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13232:1: ( rule__XClosure__Group_1_0_0_1__1__Impl )
-            // InternalPerspectiveDsl.g:13233:2: rule__XClosure__Group_1_0_0_1__1__Impl
+            // InternalPerspectiveDsl.g:13234:1: ( rule__XClosure__Group_1_0_0_1__1__Impl )
+            // InternalPerspectiveDsl.g:13235:2: rule__XClosure__Group_1_0_0_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group_1_0_0_1__1__Impl();
@@ -43926,23 +43926,23 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0_0_1__1__Impl"
-    // InternalPerspectiveDsl.g:13239:1: rule__XClosure__Group_1_0_0_1__1__Impl : ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:13241:1: rule__XClosure__Group_1_0_0_1__1__Impl : ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) ) ;
     public final void rule__XClosure__Group_1_0_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13243:1: ( ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) ) )
-            // InternalPerspectiveDsl.g:13244:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) )
+            // InternalPerspectiveDsl.g:13245:1: ( ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) ) )
+            // InternalPerspectiveDsl.g:13246:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:13244:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) )
-            // InternalPerspectiveDsl.g:13245:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 )
+            // InternalPerspectiveDsl.g:13246:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) )
+            // InternalPerspectiveDsl.g:13247:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getDeclaredFormalParametersAssignment_1_0_0_1_1()); 
             }
-            // InternalPerspectiveDsl.g:13246:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 )
-            // InternalPerspectiveDsl.g:13246:3: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1
+            // InternalPerspectiveDsl.g:13248:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 )
+            // InternalPerspectiveDsl.g:13248:3: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1();
@@ -43977,14 +43977,14 @@
 
 
     // $ANTLR start "rule__XExpressionInClosure__Group__0"
-    // InternalPerspectiveDsl.g:13255:1: rule__XExpressionInClosure__Group__0 : rule__XExpressionInClosure__Group__0__Impl rule__XExpressionInClosure__Group__1 ;
+    // InternalPerspectiveDsl.g:13257:1: rule__XExpressionInClosure__Group__0 : rule__XExpressionInClosure__Group__0__Impl rule__XExpressionInClosure__Group__1 ;
     public final void rule__XExpressionInClosure__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13259:1: ( rule__XExpressionInClosure__Group__0__Impl rule__XExpressionInClosure__Group__1 )
-            // InternalPerspectiveDsl.g:13260:2: rule__XExpressionInClosure__Group__0__Impl rule__XExpressionInClosure__Group__1
+            // InternalPerspectiveDsl.g:13261:1: ( rule__XExpressionInClosure__Group__0__Impl rule__XExpressionInClosure__Group__1 )
+            // InternalPerspectiveDsl.g:13262:2: rule__XExpressionInClosure__Group__0__Impl rule__XExpressionInClosure__Group__1
             {
             pushFollow(FOLLOW_95);
             rule__XExpressionInClosure__Group__0__Impl();
@@ -44015,23 +44015,23 @@
 
 
     // $ANTLR start "rule__XExpressionInClosure__Group__0__Impl"
-    // InternalPerspectiveDsl.g:13267:1: rule__XExpressionInClosure__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:13269:1: rule__XExpressionInClosure__Group__0__Impl : ( () ) ;
     public final void rule__XExpressionInClosure__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13271:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:13272:1: ( () )
+            // InternalPerspectiveDsl.g:13273:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:13274:1: ( () )
             {
-            // InternalPerspectiveDsl.g:13272:1: ( () )
-            // InternalPerspectiveDsl.g:13273:2: ()
+            // InternalPerspectiveDsl.g:13274:1: ( () )
+            // InternalPerspectiveDsl.g:13275:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0()); 
             }
-            // InternalPerspectiveDsl.g:13274:2: ()
-            // InternalPerspectiveDsl.g:13274:3: 
+            // InternalPerspectiveDsl.g:13276:2: ()
+            // InternalPerspectiveDsl.g:13276:3: 
             {
             }
 
@@ -44056,14 +44056,14 @@
 
 
     // $ANTLR start "rule__XExpressionInClosure__Group__1"
-    // InternalPerspectiveDsl.g:13282:1: rule__XExpressionInClosure__Group__1 : rule__XExpressionInClosure__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:13284:1: rule__XExpressionInClosure__Group__1 : rule__XExpressionInClosure__Group__1__Impl ;
     public final void rule__XExpressionInClosure__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13286:1: ( rule__XExpressionInClosure__Group__1__Impl )
-            // InternalPerspectiveDsl.g:13287:2: rule__XExpressionInClosure__Group__1__Impl
+            // InternalPerspectiveDsl.g:13288:1: ( rule__XExpressionInClosure__Group__1__Impl )
+            // InternalPerspectiveDsl.g:13289:2: rule__XExpressionInClosure__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XExpressionInClosure__Group__1__Impl();
@@ -44089,22 +44089,22 @@
 
 
     // $ANTLR start "rule__XExpressionInClosure__Group__1__Impl"
-    // InternalPerspectiveDsl.g:13293:1: rule__XExpressionInClosure__Group__1__Impl : ( ( rule__XExpressionInClosure__Group_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:13295:1: rule__XExpressionInClosure__Group__1__Impl : ( ( rule__XExpressionInClosure__Group_1__0 )* ) ;
     public final void rule__XExpressionInClosure__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13297:1: ( ( ( rule__XExpressionInClosure__Group_1__0 )* ) )
-            // InternalPerspectiveDsl.g:13298:1: ( ( rule__XExpressionInClosure__Group_1__0 )* )
+            // InternalPerspectiveDsl.g:13299:1: ( ( ( rule__XExpressionInClosure__Group_1__0 )* ) )
+            // InternalPerspectiveDsl.g:13300:1: ( ( rule__XExpressionInClosure__Group_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:13298:1: ( ( rule__XExpressionInClosure__Group_1__0 )* )
-            // InternalPerspectiveDsl.g:13299:2: ( rule__XExpressionInClosure__Group_1__0 )*
+            // InternalPerspectiveDsl.g:13300:1: ( ( rule__XExpressionInClosure__Group_1__0 )* )
+            // InternalPerspectiveDsl.g:13301:2: ( rule__XExpressionInClosure__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionInClosureAccess().getGroup_1()); 
             }
-            // InternalPerspectiveDsl.g:13300:2: ( rule__XExpressionInClosure__Group_1__0 )*
+            // InternalPerspectiveDsl.g:13302:2: ( rule__XExpressionInClosure__Group_1__0 )*
             loop94:
             do {
                 int alt94=2;
@@ -44117,7 +44117,7 @@
 
                 switch (alt94) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:13300:3: rule__XExpressionInClosure__Group_1__0
+            	    // InternalPerspectiveDsl.g:13302:3: rule__XExpressionInClosure__Group_1__0
             	    {
             	    pushFollow(FOLLOW_98);
             	    rule__XExpressionInClosure__Group_1__0();
@@ -44158,14 +44158,14 @@
 
 
     // $ANTLR start "rule__XExpressionInClosure__Group_1__0"
-    // InternalPerspectiveDsl.g:13309:1: rule__XExpressionInClosure__Group_1__0 : rule__XExpressionInClosure__Group_1__0__Impl rule__XExpressionInClosure__Group_1__1 ;
+    // InternalPerspectiveDsl.g:13311:1: rule__XExpressionInClosure__Group_1__0 : rule__XExpressionInClosure__Group_1__0__Impl rule__XExpressionInClosure__Group_1__1 ;
     public final void rule__XExpressionInClosure__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13313:1: ( rule__XExpressionInClosure__Group_1__0__Impl rule__XExpressionInClosure__Group_1__1 )
-            // InternalPerspectiveDsl.g:13314:2: rule__XExpressionInClosure__Group_1__0__Impl rule__XExpressionInClosure__Group_1__1
+            // InternalPerspectiveDsl.g:13315:1: ( rule__XExpressionInClosure__Group_1__0__Impl rule__XExpressionInClosure__Group_1__1 )
+            // InternalPerspectiveDsl.g:13316:2: rule__XExpressionInClosure__Group_1__0__Impl rule__XExpressionInClosure__Group_1__1
             {
             pushFollow(FOLLOW_46);
             rule__XExpressionInClosure__Group_1__0__Impl();
@@ -44196,23 +44196,23 @@
 
 
     // $ANTLR start "rule__XExpressionInClosure__Group_1__0__Impl"
-    // InternalPerspectiveDsl.g:13321:1: rule__XExpressionInClosure__Group_1__0__Impl : ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) ) ;
+    // InternalPerspectiveDsl.g:13323:1: rule__XExpressionInClosure__Group_1__0__Impl : ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) ) ;
     public final void rule__XExpressionInClosure__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13325:1: ( ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) ) )
-            // InternalPerspectiveDsl.g:13326:1: ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) )
+            // InternalPerspectiveDsl.g:13327:1: ( ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) ) )
+            // InternalPerspectiveDsl.g:13328:1: ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) )
             {
-            // InternalPerspectiveDsl.g:13326:1: ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) )
-            // InternalPerspectiveDsl.g:13327:2: ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 )
+            // InternalPerspectiveDsl.g:13328:1: ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) )
+            // InternalPerspectiveDsl.g:13329:2: ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionInClosureAccess().getExpressionsAssignment_1_0()); 
             }
-            // InternalPerspectiveDsl.g:13328:2: ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 )
-            // InternalPerspectiveDsl.g:13328:3: rule__XExpressionInClosure__ExpressionsAssignment_1_0
+            // InternalPerspectiveDsl.g:13330:2: ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 )
+            // InternalPerspectiveDsl.g:13330:3: rule__XExpressionInClosure__ExpressionsAssignment_1_0
             {
             pushFollow(FOLLOW_2);
             rule__XExpressionInClosure__ExpressionsAssignment_1_0();
@@ -44247,14 +44247,14 @@
 
 
     // $ANTLR start "rule__XExpressionInClosure__Group_1__1"
-    // InternalPerspectiveDsl.g:13336:1: rule__XExpressionInClosure__Group_1__1 : rule__XExpressionInClosure__Group_1__1__Impl ;
+    // InternalPerspectiveDsl.g:13338:1: rule__XExpressionInClosure__Group_1__1 : rule__XExpressionInClosure__Group_1__1__Impl ;
     public final void rule__XExpressionInClosure__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13340:1: ( rule__XExpressionInClosure__Group_1__1__Impl )
-            // InternalPerspectiveDsl.g:13341:2: rule__XExpressionInClosure__Group_1__1__Impl
+            // InternalPerspectiveDsl.g:13342:1: ( rule__XExpressionInClosure__Group_1__1__Impl )
+            // InternalPerspectiveDsl.g:13343:2: rule__XExpressionInClosure__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XExpressionInClosure__Group_1__1__Impl();
@@ -44280,22 +44280,22 @@
 
 
     // $ANTLR start "rule__XExpressionInClosure__Group_1__1__Impl"
-    // InternalPerspectiveDsl.g:13347:1: rule__XExpressionInClosure__Group_1__1__Impl : ( ( ';' )? ) ;
+    // InternalPerspectiveDsl.g:13349:1: rule__XExpressionInClosure__Group_1__1__Impl : ( ( ';' )? ) ;
     public final void rule__XExpressionInClosure__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13351:1: ( ( ( ';' )? ) )
-            // InternalPerspectiveDsl.g:13352:1: ( ( ';' )? )
+            // InternalPerspectiveDsl.g:13353:1: ( ( ( ';' )? ) )
+            // InternalPerspectiveDsl.g:13354:1: ( ( ';' )? )
             {
-            // InternalPerspectiveDsl.g:13352:1: ( ( ';' )? )
-            // InternalPerspectiveDsl.g:13353:2: ( ';' )?
+            // InternalPerspectiveDsl.g:13354:1: ( ( ';' )? )
+            // InternalPerspectiveDsl.g:13355:2: ( ';' )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1()); 
             }
-            // InternalPerspectiveDsl.g:13354:2: ( ';' )?
+            // InternalPerspectiveDsl.g:13356:2: ( ';' )?
             int alt95=2;
             int LA95_0 = input.LA(1);
 
@@ -44304,7 +44304,7 @@
             }
             switch (alt95) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:13354:3: ';'
+                    // InternalPerspectiveDsl.g:13356:3: ';'
                     {
                     match(input,89,FOLLOW_2); if (state.failed) return ;
 
@@ -44338,14 +44338,14 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group__0"
-    // InternalPerspectiveDsl.g:13363:1: rule__XShortClosure__Group__0 : rule__XShortClosure__Group__0__Impl rule__XShortClosure__Group__1 ;
+    // InternalPerspectiveDsl.g:13365:1: rule__XShortClosure__Group__0 : rule__XShortClosure__Group__0__Impl rule__XShortClosure__Group__1 ;
     public final void rule__XShortClosure__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13367:1: ( rule__XShortClosure__Group__0__Impl rule__XShortClosure__Group__1 )
-            // InternalPerspectiveDsl.g:13368:2: rule__XShortClosure__Group__0__Impl rule__XShortClosure__Group__1
+            // InternalPerspectiveDsl.g:13369:1: ( rule__XShortClosure__Group__0__Impl rule__XShortClosure__Group__1 )
+            // InternalPerspectiveDsl.g:13370:2: rule__XShortClosure__Group__0__Impl rule__XShortClosure__Group__1
             {
             pushFollow(FOLLOW_54);
             rule__XShortClosure__Group__0__Impl();
@@ -44376,23 +44376,23 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group__0__Impl"
-    // InternalPerspectiveDsl.g:13375:1: rule__XShortClosure__Group__0__Impl : ( ( rule__XShortClosure__Group_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:13377:1: rule__XShortClosure__Group__0__Impl : ( ( rule__XShortClosure__Group_0__0 ) ) ;
     public final void rule__XShortClosure__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13379:1: ( ( ( rule__XShortClosure__Group_0__0 ) ) )
-            // InternalPerspectiveDsl.g:13380:1: ( ( rule__XShortClosure__Group_0__0 ) )
+            // InternalPerspectiveDsl.g:13381:1: ( ( ( rule__XShortClosure__Group_0__0 ) ) )
+            // InternalPerspectiveDsl.g:13382:1: ( ( rule__XShortClosure__Group_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:13380:1: ( ( rule__XShortClosure__Group_0__0 ) )
-            // InternalPerspectiveDsl.g:13381:2: ( rule__XShortClosure__Group_0__0 )
+            // InternalPerspectiveDsl.g:13382:1: ( ( rule__XShortClosure__Group_0__0 ) )
+            // InternalPerspectiveDsl.g:13383:2: ( rule__XShortClosure__Group_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getGroup_0()); 
             }
-            // InternalPerspectiveDsl.g:13382:2: ( rule__XShortClosure__Group_0__0 )
-            // InternalPerspectiveDsl.g:13382:3: rule__XShortClosure__Group_0__0
+            // InternalPerspectiveDsl.g:13384:2: ( rule__XShortClosure__Group_0__0 )
+            // InternalPerspectiveDsl.g:13384:3: rule__XShortClosure__Group_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__Group_0__0();
@@ -44427,14 +44427,14 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group__1"
-    // InternalPerspectiveDsl.g:13390:1: rule__XShortClosure__Group__1 : rule__XShortClosure__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:13392:1: rule__XShortClosure__Group__1 : rule__XShortClosure__Group__1__Impl ;
     public final void rule__XShortClosure__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13394:1: ( rule__XShortClosure__Group__1__Impl )
-            // InternalPerspectiveDsl.g:13395:2: rule__XShortClosure__Group__1__Impl
+            // InternalPerspectiveDsl.g:13396:1: ( rule__XShortClosure__Group__1__Impl )
+            // InternalPerspectiveDsl.g:13397:2: rule__XShortClosure__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__Group__1__Impl();
@@ -44460,23 +44460,23 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group__1__Impl"
-    // InternalPerspectiveDsl.g:13401:1: rule__XShortClosure__Group__1__Impl : ( ( rule__XShortClosure__ExpressionAssignment_1 ) ) ;
+    // InternalPerspectiveDsl.g:13403:1: rule__XShortClosure__Group__1__Impl : ( ( rule__XShortClosure__ExpressionAssignment_1 ) ) ;
     public final void rule__XShortClosure__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13405:1: ( ( ( rule__XShortClosure__ExpressionAssignment_1 ) ) )
-            // InternalPerspectiveDsl.g:13406:1: ( ( rule__XShortClosure__ExpressionAssignment_1 ) )
+            // InternalPerspectiveDsl.g:13407:1: ( ( ( rule__XShortClosure__ExpressionAssignment_1 ) ) )
+            // InternalPerspectiveDsl.g:13408:1: ( ( rule__XShortClosure__ExpressionAssignment_1 ) )
             {
-            // InternalPerspectiveDsl.g:13406:1: ( ( rule__XShortClosure__ExpressionAssignment_1 ) )
-            // InternalPerspectiveDsl.g:13407:2: ( rule__XShortClosure__ExpressionAssignment_1 )
+            // InternalPerspectiveDsl.g:13408:1: ( ( rule__XShortClosure__ExpressionAssignment_1 ) )
+            // InternalPerspectiveDsl.g:13409:2: ( rule__XShortClosure__ExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getExpressionAssignment_1()); 
             }
-            // InternalPerspectiveDsl.g:13408:2: ( rule__XShortClosure__ExpressionAssignment_1 )
-            // InternalPerspectiveDsl.g:13408:3: rule__XShortClosure__ExpressionAssignment_1
+            // InternalPerspectiveDsl.g:13410:2: ( rule__XShortClosure__ExpressionAssignment_1 )
+            // InternalPerspectiveDsl.g:13410:3: rule__XShortClosure__ExpressionAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__ExpressionAssignment_1();
@@ -44511,14 +44511,14 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0__0"
-    // InternalPerspectiveDsl.g:13417:1: rule__XShortClosure__Group_0__0 : rule__XShortClosure__Group_0__0__Impl ;
+    // InternalPerspectiveDsl.g:13419:1: rule__XShortClosure__Group_0__0 : rule__XShortClosure__Group_0__0__Impl ;
     public final void rule__XShortClosure__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13421:1: ( rule__XShortClosure__Group_0__0__Impl )
-            // InternalPerspectiveDsl.g:13422:2: rule__XShortClosure__Group_0__0__Impl
+            // InternalPerspectiveDsl.g:13423:1: ( rule__XShortClosure__Group_0__0__Impl )
+            // InternalPerspectiveDsl.g:13424:2: rule__XShortClosure__Group_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__Group_0__0__Impl();
@@ -44544,23 +44544,23 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0__0__Impl"
-    // InternalPerspectiveDsl.g:13428:1: rule__XShortClosure__Group_0__0__Impl : ( ( rule__XShortClosure__Group_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:13430:1: rule__XShortClosure__Group_0__0__Impl : ( ( rule__XShortClosure__Group_0_0__0 ) ) ;
     public final void rule__XShortClosure__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13432:1: ( ( ( rule__XShortClosure__Group_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:13433:1: ( ( rule__XShortClosure__Group_0_0__0 ) )
+            // InternalPerspectiveDsl.g:13434:1: ( ( ( rule__XShortClosure__Group_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:13435:1: ( ( rule__XShortClosure__Group_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:13433:1: ( ( rule__XShortClosure__Group_0_0__0 ) )
-            // InternalPerspectiveDsl.g:13434:2: ( rule__XShortClosure__Group_0_0__0 )
+            // InternalPerspectiveDsl.g:13435:1: ( ( rule__XShortClosure__Group_0_0__0 ) )
+            // InternalPerspectiveDsl.g:13436:2: ( rule__XShortClosure__Group_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getGroup_0_0()); 
             }
-            // InternalPerspectiveDsl.g:13435:2: ( rule__XShortClosure__Group_0_0__0 )
-            // InternalPerspectiveDsl.g:13435:3: rule__XShortClosure__Group_0_0__0
+            // InternalPerspectiveDsl.g:13437:2: ( rule__XShortClosure__Group_0_0__0 )
+            // InternalPerspectiveDsl.g:13437:3: rule__XShortClosure__Group_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__Group_0_0__0();
@@ -44595,14 +44595,14 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0__0"
-    // InternalPerspectiveDsl.g:13444:1: rule__XShortClosure__Group_0_0__0 : rule__XShortClosure__Group_0_0__0__Impl rule__XShortClosure__Group_0_0__1 ;
+    // InternalPerspectiveDsl.g:13446:1: rule__XShortClosure__Group_0_0__0 : rule__XShortClosure__Group_0_0__0__Impl rule__XShortClosure__Group_0_0__1 ;
     public final void rule__XShortClosure__Group_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13448:1: ( rule__XShortClosure__Group_0_0__0__Impl rule__XShortClosure__Group_0_0__1 )
-            // InternalPerspectiveDsl.g:13449:2: rule__XShortClosure__Group_0_0__0__Impl rule__XShortClosure__Group_0_0__1
+            // InternalPerspectiveDsl.g:13450:1: ( rule__XShortClosure__Group_0_0__0__Impl rule__XShortClosure__Group_0_0__1 )
+            // InternalPerspectiveDsl.g:13451:2: rule__XShortClosure__Group_0_0__0__Impl rule__XShortClosure__Group_0_0__1
             {
             pushFollow(FOLLOW_97);
             rule__XShortClosure__Group_0_0__0__Impl();
@@ -44633,23 +44633,23 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:13456:1: rule__XShortClosure__Group_0_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:13458:1: rule__XShortClosure__Group_0_0__0__Impl : ( () ) ;
     public final void rule__XShortClosure__Group_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13460:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:13461:1: ( () )
+            // InternalPerspectiveDsl.g:13462:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:13463:1: ( () )
             {
-            // InternalPerspectiveDsl.g:13461:1: ( () )
-            // InternalPerspectiveDsl.g:13462:2: ()
+            // InternalPerspectiveDsl.g:13463:1: ( () )
+            // InternalPerspectiveDsl.g:13464:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:13463:2: ()
-            // InternalPerspectiveDsl.g:13463:3: 
+            // InternalPerspectiveDsl.g:13465:2: ()
+            // InternalPerspectiveDsl.g:13465:3: 
             {
             }
 
@@ -44674,14 +44674,14 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0__1"
-    // InternalPerspectiveDsl.g:13471:1: rule__XShortClosure__Group_0_0__1 : rule__XShortClosure__Group_0_0__1__Impl rule__XShortClosure__Group_0_0__2 ;
+    // InternalPerspectiveDsl.g:13473:1: rule__XShortClosure__Group_0_0__1 : rule__XShortClosure__Group_0_0__1__Impl rule__XShortClosure__Group_0_0__2 ;
     public final void rule__XShortClosure__Group_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13475:1: ( rule__XShortClosure__Group_0_0__1__Impl rule__XShortClosure__Group_0_0__2 )
-            // InternalPerspectiveDsl.g:13476:2: rule__XShortClosure__Group_0_0__1__Impl rule__XShortClosure__Group_0_0__2
+            // InternalPerspectiveDsl.g:13477:1: ( rule__XShortClosure__Group_0_0__1__Impl rule__XShortClosure__Group_0_0__2 )
+            // InternalPerspectiveDsl.g:13478:2: rule__XShortClosure__Group_0_0__1__Impl rule__XShortClosure__Group_0_0__2
             {
             pushFollow(FOLLOW_97);
             rule__XShortClosure__Group_0_0__1__Impl();
@@ -44712,22 +44712,22 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:13483:1: rule__XShortClosure__Group_0_0__1__Impl : ( ( rule__XShortClosure__Group_0_0_1__0 )? ) ;
+    // InternalPerspectiveDsl.g:13485:1: rule__XShortClosure__Group_0_0__1__Impl : ( ( rule__XShortClosure__Group_0_0_1__0 )? ) ;
     public final void rule__XShortClosure__Group_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13487:1: ( ( ( rule__XShortClosure__Group_0_0_1__0 )? ) )
-            // InternalPerspectiveDsl.g:13488:1: ( ( rule__XShortClosure__Group_0_0_1__0 )? )
+            // InternalPerspectiveDsl.g:13489:1: ( ( ( rule__XShortClosure__Group_0_0_1__0 )? ) )
+            // InternalPerspectiveDsl.g:13490:1: ( ( rule__XShortClosure__Group_0_0_1__0 )? )
             {
-            // InternalPerspectiveDsl.g:13488:1: ( ( rule__XShortClosure__Group_0_0_1__0 )? )
-            // InternalPerspectiveDsl.g:13489:2: ( rule__XShortClosure__Group_0_0_1__0 )?
+            // InternalPerspectiveDsl.g:13490:1: ( ( rule__XShortClosure__Group_0_0_1__0 )? )
+            // InternalPerspectiveDsl.g:13491:2: ( rule__XShortClosure__Group_0_0_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getGroup_0_0_1()); 
             }
-            // InternalPerspectiveDsl.g:13490:2: ( rule__XShortClosure__Group_0_0_1__0 )?
+            // InternalPerspectiveDsl.g:13492:2: ( rule__XShortClosure__Group_0_0_1__0 )?
             int alt96=2;
             int LA96_0 = input.LA(1);
 
@@ -44736,7 +44736,7 @@
             }
             switch (alt96) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:13490:3: rule__XShortClosure__Group_0_0_1__0
+                    // InternalPerspectiveDsl.g:13492:3: rule__XShortClosure__Group_0_0_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XShortClosure__Group_0_0_1__0();
@@ -44774,14 +44774,14 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0__2"
-    // InternalPerspectiveDsl.g:13498:1: rule__XShortClosure__Group_0_0__2 : rule__XShortClosure__Group_0_0__2__Impl ;
+    // InternalPerspectiveDsl.g:13500:1: rule__XShortClosure__Group_0_0__2 : rule__XShortClosure__Group_0_0__2__Impl ;
     public final void rule__XShortClosure__Group_0_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13502:1: ( rule__XShortClosure__Group_0_0__2__Impl )
-            // InternalPerspectiveDsl.g:13503:2: rule__XShortClosure__Group_0_0__2__Impl
+            // InternalPerspectiveDsl.g:13504:1: ( rule__XShortClosure__Group_0_0__2__Impl )
+            // InternalPerspectiveDsl.g:13505:2: rule__XShortClosure__Group_0_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__Group_0_0__2__Impl();
@@ -44807,23 +44807,23 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0__2__Impl"
-    // InternalPerspectiveDsl.g:13509:1: rule__XShortClosure__Group_0_0__2__Impl : ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) ) ;
+    // InternalPerspectiveDsl.g:13511:1: rule__XShortClosure__Group_0_0__2__Impl : ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) ) ;
     public final void rule__XShortClosure__Group_0_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13513:1: ( ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) ) )
-            // InternalPerspectiveDsl.g:13514:1: ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) )
+            // InternalPerspectiveDsl.g:13515:1: ( ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) ) )
+            // InternalPerspectiveDsl.g:13516:1: ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) )
             {
-            // InternalPerspectiveDsl.g:13514:1: ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) )
-            // InternalPerspectiveDsl.g:13515:2: ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 )
+            // InternalPerspectiveDsl.g:13516:1: ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) )
+            // InternalPerspectiveDsl.g:13517:2: ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getExplicitSyntaxAssignment_0_0_2()); 
             }
-            // InternalPerspectiveDsl.g:13516:2: ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 )
-            // InternalPerspectiveDsl.g:13516:3: rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2
+            // InternalPerspectiveDsl.g:13518:2: ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 )
+            // InternalPerspectiveDsl.g:13518:3: rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2();
@@ -44858,14 +44858,14 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0_1__0"
-    // InternalPerspectiveDsl.g:13525:1: rule__XShortClosure__Group_0_0_1__0 : rule__XShortClosure__Group_0_0_1__0__Impl rule__XShortClosure__Group_0_0_1__1 ;
+    // InternalPerspectiveDsl.g:13527:1: rule__XShortClosure__Group_0_0_1__0 : rule__XShortClosure__Group_0_0_1__0__Impl rule__XShortClosure__Group_0_0_1__1 ;
     public final void rule__XShortClosure__Group_0_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13529:1: ( rule__XShortClosure__Group_0_0_1__0__Impl rule__XShortClosure__Group_0_0_1__1 )
-            // InternalPerspectiveDsl.g:13530:2: rule__XShortClosure__Group_0_0_1__0__Impl rule__XShortClosure__Group_0_0_1__1
+            // InternalPerspectiveDsl.g:13531:1: ( rule__XShortClosure__Group_0_0_1__0__Impl rule__XShortClosure__Group_0_0_1__1 )
+            // InternalPerspectiveDsl.g:13532:2: rule__XShortClosure__Group_0_0_1__0__Impl rule__XShortClosure__Group_0_0_1__1
             {
             pushFollow(FOLLOW_52);
             rule__XShortClosure__Group_0_0_1__0__Impl();
@@ -44896,23 +44896,23 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0_1__0__Impl"
-    // InternalPerspectiveDsl.g:13537:1: rule__XShortClosure__Group_0_0_1__0__Impl : ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) ) ;
+    // InternalPerspectiveDsl.g:13539:1: rule__XShortClosure__Group_0_0_1__0__Impl : ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) ) ;
     public final void rule__XShortClosure__Group_0_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13541:1: ( ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) ) )
-            // InternalPerspectiveDsl.g:13542:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) )
+            // InternalPerspectiveDsl.g:13543:1: ( ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) ) )
+            // InternalPerspectiveDsl.g:13544:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) )
             {
-            // InternalPerspectiveDsl.g:13542:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) )
-            // InternalPerspectiveDsl.g:13543:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 )
+            // InternalPerspectiveDsl.g:13544:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) )
+            // InternalPerspectiveDsl.g:13545:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersAssignment_0_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:13544:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 )
-            // InternalPerspectiveDsl.g:13544:3: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0
+            // InternalPerspectiveDsl.g:13546:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 )
+            // InternalPerspectiveDsl.g:13546:3: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0();
@@ -44947,14 +44947,14 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0_1__1"
-    // InternalPerspectiveDsl.g:13552:1: rule__XShortClosure__Group_0_0_1__1 : rule__XShortClosure__Group_0_0_1__1__Impl ;
+    // InternalPerspectiveDsl.g:13554:1: rule__XShortClosure__Group_0_0_1__1 : rule__XShortClosure__Group_0_0_1__1__Impl ;
     public final void rule__XShortClosure__Group_0_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13556:1: ( rule__XShortClosure__Group_0_0_1__1__Impl )
-            // InternalPerspectiveDsl.g:13557:2: rule__XShortClosure__Group_0_0_1__1__Impl
+            // InternalPerspectiveDsl.g:13558:1: ( rule__XShortClosure__Group_0_0_1__1__Impl )
+            // InternalPerspectiveDsl.g:13559:2: rule__XShortClosure__Group_0_0_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__Group_0_0_1__1__Impl();
@@ -44980,22 +44980,22 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0_1__1__Impl"
-    // InternalPerspectiveDsl.g:13563:1: rule__XShortClosure__Group_0_0_1__1__Impl : ( ( rule__XShortClosure__Group_0_0_1_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:13565:1: rule__XShortClosure__Group_0_0_1__1__Impl : ( ( rule__XShortClosure__Group_0_0_1_1__0 )* ) ;
     public final void rule__XShortClosure__Group_0_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13567:1: ( ( ( rule__XShortClosure__Group_0_0_1_1__0 )* ) )
-            // InternalPerspectiveDsl.g:13568:1: ( ( rule__XShortClosure__Group_0_0_1_1__0 )* )
+            // InternalPerspectiveDsl.g:13569:1: ( ( ( rule__XShortClosure__Group_0_0_1_1__0 )* ) )
+            // InternalPerspectiveDsl.g:13570:1: ( ( rule__XShortClosure__Group_0_0_1_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:13568:1: ( ( rule__XShortClosure__Group_0_0_1_1__0 )* )
-            // InternalPerspectiveDsl.g:13569:2: ( rule__XShortClosure__Group_0_0_1_1__0 )*
+            // InternalPerspectiveDsl.g:13570:1: ( ( rule__XShortClosure__Group_0_0_1_1__0 )* )
+            // InternalPerspectiveDsl.g:13571:2: ( rule__XShortClosure__Group_0_0_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getGroup_0_0_1_1()); 
             }
-            // InternalPerspectiveDsl.g:13570:2: ( rule__XShortClosure__Group_0_0_1_1__0 )*
+            // InternalPerspectiveDsl.g:13572:2: ( rule__XShortClosure__Group_0_0_1_1__0 )*
             loop97:
             do {
                 int alt97=2;
@@ -45008,7 +45008,7 @@
 
                 switch (alt97) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:13570:3: rule__XShortClosure__Group_0_0_1_1__0
+            	    // InternalPerspectiveDsl.g:13572:3: rule__XShortClosure__Group_0_0_1_1__0
             	    {
             	    pushFollow(FOLLOW_53);
             	    rule__XShortClosure__Group_0_0_1_1__0();
@@ -45049,14 +45049,14 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0_1_1__0"
-    // InternalPerspectiveDsl.g:13579:1: rule__XShortClosure__Group_0_0_1_1__0 : rule__XShortClosure__Group_0_0_1_1__0__Impl rule__XShortClosure__Group_0_0_1_1__1 ;
+    // InternalPerspectiveDsl.g:13581:1: rule__XShortClosure__Group_0_0_1_1__0 : rule__XShortClosure__Group_0_0_1_1__0__Impl rule__XShortClosure__Group_0_0_1_1__1 ;
     public final void rule__XShortClosure__Group_0_0_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13583:1: ( rule__XShortClosure__Group_0_0_1_1__0__Impl rule__XShortClosure__Group_0_0_1_1__1 )
-            // InternalPerspectiveDsl.g:13584:2: rule__XShortClosure__Group_0_0_1_1__0__Impl rule__XShortClosure__Group_0_0_1_1__1
+            // InternalPerspectiveDsl.g:13585:1: ( rule__XShortClosure__Group_0_0_1_1__0__Impl rule__XShortClosure__Group_0_0_1_1__1 )
+            // InternalPerspectiveDsl.g:13586:2: rule__XShortClosure__Group_0_0_1_1__0__Impl rule__XShortClosure__Group_0_0_1_1__1
             {
             pushFollow(FOLLOW_71);
             rule__XShortClosure__Group_0_0_1_1__0__Impl();
@@ -45087,17 +45087,17 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0_1_1__0__Impl"
-    // InternalPerspectiveDsl.g:13591:1: rule__XShortClosure__Group_0_0_1_1__0__Impl : ( ',' ) ;
+    // InternalPerspectiveDsl.g:13593:1: rule__XShortClosure__Group_0_0_1_1__0__Impl : ( ',' ) ;
     public final void rule__XShortClosure__Group_0_0_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13595:1: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:13596:1: ( ',' )
+            // InternalPerspectiveDsl.g:13597:1: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:13598:1: ( ',' )
             {
-            // InternalPerspectiveDsl.g:13596:1: ( ',' )
-            // InternalPerspectiveDsl.g:13597:2: ','
+            // InternalPerspectiveDsl.g:13598:1: ( ',' )
+            // InternalPerspectiveDsl.g:13599:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0()); 
@@ -45128,14 +45128,14 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0_1_1__1"
-    // InternalPerspectiveDsl.g:13606:1: rule__XShortClosure__Group_0_0_1_1__1 : rule__XShortClosure__Group_0_0_1_1__1__Impl ;
+    // InternalPerspectiveDsl.g:13608:1: rule__XShortClosure__Group_0_0_1_1__1 : rule__XShortClosure__Group_0_0_1_1__1__Impl ;
     public final void rule__XShortClosure__Group_0_0_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13610:1: ( rule__XShortClosure__Group_0_0_1_1__1__Impl )
-            // InternalPerspectiveDsl.g:13611:2: rule__XShortClosure__Group_0_0_1_1__1__Impl
+            // InternalPerspectiveDsl.g:13612:1: ( rule__XShortClosure__Group_0_0_1_1__1__Impl )
+            // InternalPerspectiveDsl.g:13613:2: rule__XShortClosure__Group_0_0_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__Group_0_0_1_1__1__Impl();
@@ -45161,23 +45161,23 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0_1_1__1__Impl"
-    // InternalPerspectiveDsl.g:13617:1: rule__XShortClosure__Group_0_0_1_1__1__Impl : ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:13619:1: rule__XShortClosure__Group_0_0_1_1__1__Impl : ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) ) ;
     public final void rule__XShortClosure__Group_0_0_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13621:1: ( ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) ) )
-            // InternalPerspectiveDsl.g:13622:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) )
+            // InternalPerspectiveDsl.g:13623:1: ( ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) ) )
+            // InternalPerspectiveDsl.g:13624:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:13622:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) )
-            // InternalPerspectiveDsl.g:13623:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 )
+            // InternalPerspectiveDsl.g:13624:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) )
+            // InternalPerspectiveDsl.g:13625:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersAssignment_0_0_1_1_1()); 
             }
-            // InternalPerspectiveDsl.g:13624:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 )
-            // InternalPerspectiveDsl.g:13624:3: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1
+            // InternalPerspectiveDsl.g:13626:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 )
+            // InternalPerspectiveDsl.g:13626:3: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1();
@@ -45212,14 +45212,14 @@
 
 
     // $ANTLR start "rule__XParenthesizedExpression__Group__0"
-    // InternalPerspectiveDsl.g:13633:1: rule__XParenthesizedExpression__Group__0 : rule__XParenthesizedExpression__Group__0__Impl rule__XParenthesizedExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:13635:1: rule__XParenthesizedExpression__Group__0 : rule__XParenthesizedExpression__Group__0__Impl rule__XParenthesizedExpression__Group__1 ;
     public final void rule__XParenthesizedExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13637:1: ( rule__XParenthesizedExpression__Group__0__Impl rule__XParenthesizedExpression__Group__1 )
-            // InternalPerspectiveDsl.g:13638:2: rule__XParenthesizedExpression__Group__0__Impl rule__XParenthesizedExpression__Group__1
+            // InternalPerspectiveDsl.g:13639:1: ( rule__XParenthesizedExpression__Group__0__Impl rule__XParenthesizedExpression__Group__1 )
+            // InternalPerspectiveDsl.g:13640:2: rule__XParenthesizedExpression__Group__0__Impl rule__XParenthesizedExpression__Group__1
             {
             pushFollow(FOLLOW_54);
             rule__XParenthesizedExpression__Group__0__Impl();
@@ -45250,17 +45250,17 @@
 
 
     // $ANTLR start "rule__XParenthesizedExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:13645:1: rule__XParenthesizedExpression__Group__0__Impl : ( '(' ) ;
+    // InternalPerspectiveDsl.g:13647:1: rule__XParenthesizedExpression__Group__0__Impl : ( '(' ) ;
     public final void rule__XParenthesizedExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13649:1: ( ( '(' ) )
-            // InternalPerspectiveDsl.g:13650:1: ( '(' )
+            // InternalPerspectiveDsl.g:13651:1: ( ( '(' ) )
+            // InternalPerspectiveDsl.g:13652:1: ( '(' )
             {
-            // InternalPerspectiveDsl.g:13650:1: ( '(' )
-            // InternalPerspectiveDsl.g:13651:2: '('
+            // InternalPerspectiveDsl.g:13652:1: ( '(' )
+            // InternalPerspectiveDsl.g:13653:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0()); 
@@ -45291,14 +45291,14 @@
 
 
     // $ANTLR start "rule__XParenthesizedExpression__Group__1"
-    // InternalPerspectiveDsl.g:13660:1: rule__XParenthesizedExpression__Group__1 : rule__XParenthesizedExpression__Group__1__Impl rule__XParenthesizedExpression__Group__2 ;
+    // InternalPerspectiveDsl.g:13662:1: rule__XParenthesizedExpression__Group__1 : rule__XParenthesizedExpression__Group__1__Impl rule__XParenthesizedExpression__Group__2 ;
     public final void rule__XParenthesizedExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13664:1: ( rule__XParenthesizedExpression__Group__1__Impl rule__XParenthesizedExpression__Group__2 )
-            // InternalPerspectiveDsl.g:13665:2: rule__XParenthesizedExpression__Group__1__Impl rule__XParenthesizedExpression__Group__2
+            // InternalPerspectiveDsl.g:13666:1: ( rule__XParenthesizedExpression__Group__1__Impl rule__XParenthesizedExpression__Group__2 )
+            // InternalPerspectiveDsl.g:13667:2: rule__XParenthesizedExpression__Group__1__Impl rule__XParenthesizedExpression__Group__2
             {
             pushFollow(FOLLOW_99);
             rule__XParenthesizedExpression__Group__1__Impl();
@@ -45329,17 +45329,17 @@
 
 
     // $ANTLR start "rule__XParenthesizedExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:13672:1: rule__XParenthesizedExpression__Group__1__Impl : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:13674:1: rule__XParenthesizedExpression__Group__1__Impl : ( ruleXExpression ) ;
     public final void rule__XParenthesizedExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13676:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:13677:1: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:13678:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:13679:1: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:13677:1: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:13678:2: ruleXExpression
+            // InternalPerspectiveDsl.g:13679:1: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:13680:2: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXParenthesizedExpressionAccess().getXExpressionParserRuleCall_1()); 
@@ -45374,14 +45374,14 @@
 
 
     // $ANTLR start "rule__XParenthesizedExpression__Group__2"
-    // InternalPerspectiveDsl.g:13687:1: rule__XParenthesizedExpression__Group__2 : rule__XParenthesizedExpression__Group__2__Impl ;
+    // InternalPerspectiveDsl.g:13689:1: rule__XParenthesizedExpression__Group__2 : rule__XParenthesizedExpression__Group__2__Impl ;
     public final void rule__XParenthesizedExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13691:1: ( rule__XParenthesizedExpression__Group__2__Impl )
-            // InternalPerspectiveDsl.g:13692:2: rule__XParenthesizedExpression__Group__2__Impl
+            // InternalPerspectiveDsl.g:13693:1: ( rule__XParenthesizedExpression__Group__2__Impl )
+            // InternalPerspectiveDsl.g:13694:2: rule__XParenthesizedExpression__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XParenthesizedExpression__Group__2__Impl();
@@ -45407,17 +45407,17 @@
 
 
     // $ANTLR start "rule__XParenthesizedExpression__Group__2__Impl"
-    // InternalPerspectiveDsl.g:13698:1: rule__XParenthesizedExpression__Group__2__Impl : ( ')' ) ;
+    // InternalPerspectiveDsl.g:13700:1: rule__XParenthesizedExpression__Group__2__Impl : ( ')' ) ;
     public final void rule__XParenthesizedExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13702:1: ( ( ')' ) )
-            // InternalPerspectiveDsl.g:13703:1: ( ')' )
+            // InternalPerspectiveDsl.g:13704:1: ( ( ')' ) )
+            // InternalPerspectiveDsl.g:13705:1: ( ')' )
             {
-            // InternalPerspectiveDsl.g:13703:1: ( ')' )
-            // InternalPerspectiveDsl.g:13704:2: ')'
+            // InternalPerspectiveDsl.g:13705:1: ( ')' )
+            // InternalPerspectiveDsl.g:13706:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXParenthesizedExpressionAccess().getRightParenthesisKeyword_2()); 
@@ -45448,14 +45448,14 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__0"
-    // InternalPerspectiveDsl.g:13714:1: rule__XIfExpression__Group__0 : rule__XIfExpression__Group__0__Impl rule__XIfExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:13716:1: rule__XIfExpression__Group__0 : rule__XIfExpression__Group__0__Impl rule__XIfExpression__Group__1 ;
     public final void rule__XIfExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13718:1: ( rule__XIfExpression__Group__0__Impl rule__XIfExpression__Group__1 )
-            // InternalPerspectiveDsl.g:13719:2: rule__XIfExpression__Group__0__Impl rule__XIfExpression__Group__1
+            // InternalPerspectiveDsl.g:13720:1: ( rule__XIfExpression__Group__0__Impl rule__XIfExpression__Group__1 )
+            // InternalPerspectiveDsl.g:13721:2: rule__XIfExpression__Group__0__Impl rule__XIfExpression__Group__1
             {
             pushFollow(FOLLOW_100);
             rule__XIfExpression__Group__0__Impl();
@@ -45486,23 +45486,23 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:13726:1: rule__XIfExpression__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:13728:1: rule__XIfExpression__Group__0__Impl : ( () ) ;
     public final void rule__XIfExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13730:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:13731:1: ( () )
+            // InternalPerspectiveDsl.g:13732:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:13733:1: ( () )
             {
-            // InternalPerspectiveDsl.g:13731:1: ( () )
-            // InternalPerspectiveDsl.g:13732:2: ()
+            // InternalPerspectiveDsl.g:13733:1: ( () )
+            // InternalPerspectiveDsl.g:13734:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getXIfExpressionAction_0()); 
             }
-            // InternalPerspectiveDsl.g:13733:2: ()
-            // InternalPerspectiveDsl.g:13733:3: 
+            // InternalPerspectiveDsl.g:13735:2: ()
+            // InternalPerspectiveDsl.g:13735:3: 
             {
             }
 
@@ -45527,14 +45527,14 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__1"
-    // InternalPerspectiveDsl.g:13741:1: rule__XIfExpression__Group__1 : rule__XIfExpression__Group__1__Impl rule__XIfExpression__Group__2 ;
+    // InternalPerspectiveDsl.g:13743:1: rule__XIfExpression__Group__1 : rule__XIfExpression__Group__1__Impl rule__XIfExpression__Group__2 ;
     public final void rule__XIfExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13745:1: ( rule__XIfExpression__Group__1__Impl rule__XIfExpression__Group__2 )
-            // InternalPerspectiveDsl.g:13746:2: rule__XIfExpression__Group__1__Impl rule__XIfExpression__Group__2
+            // InternalPerspectiveDsl.g:13747:1: ( rule__XIfExpression__Group__1__Impl rule__XIfExpression__Group__2 )
+            // InternalPerspectiveDsl.g:13748:2: rule__XIfExpression__Group__1__Impl rule__XIfExpression__Group__2
             {
             pushFollow(FOLLOW_50);
             rule__XIfExpression__Group__1__Impl();
@@ -45565,17 +45565,17 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:13753:1: rule__XIfExpression__Group__1__Impl : ( 'if' ) ;
+    // InternalPerspectiveDsl.g:13755:1: rule__XIfExpression__Group__1__Impl : ( 'if' ) ;
     public final void rule__XIfExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13757:1: ( ( 'if' ) )
-            // InternalPerspectiveDsl.g:13758:1: ( 'if' )
+            // InternalPerspectiveDsl.g:13759:1: ( ( 'if' ) )
+            // InternalPerspectiveDsl.g:13760:1: ( 'if' )
             {
-            // InternalPerspectiveDsl.g:13758:1: ( 'if' )
-            // InternalPerspectiveDsl.g:13759:2: 'if'
+            // InternalPerspectiveDsl.g:13760:1: ( 'if' )
+            // InternalPerspectiveDsl.g:13761:2: 'if'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getIfKeyword_1()); 
@@ -45606,14 +45606,14 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__2"
-    // InternalPerspectiveDsl.g:13768:1: rule__XIfExpression__Group__2 : rule__XIfExpression__Group__2__Impl rule__XIfExpression__Group__3 ;
+    // InternalPerspectiveDsl.g:13770:1: rule__XIfExpression__Group__2 : rule__XIfExpression__Group__2__Impl rule__XIfExpression__Group__3 ;
     public final void rule__XIfExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13772:1: ( rule__XIfExpression__Group__2__Impl rule__XIfExpression__Group__3 )
-            // InternalPerspectiveDsl.g:13773:2: rule__XIfExpression__Group__2__Impl rule__XIfExpression__Group__3
+            // InternalPerspectiveDsl.g:13774:1: ( rule__XIfExpression__Group__2__Impl rule__XIfExpression__Group__3 )
+            // InternalPerspectiveDsl.g:13775:2: rule__XIfExpression__Group__2__Impl rule__XIfExpression__Group__3
             {
             pushFollow(FOLLOW_54);
             rule__XIfExpression__Group__2__Impl();
@@ -45644,17 +45644,17 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__2__Impl"
-    // InternalPerspectiveDsl.g:13780:1: rule__XIfExpression__Group__2__Impl : ( '(' ) ;
+    // InternalPerspectiveDsl.g:13782:1: rule__XIfExpression__Group__2__Impl : ( '(' ) ;
     public final void rule__XIfExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13784:1: ( ( '(' ) )
-            // InternalPerspectiveDsl.g:13785:1: ( '(' )
+            // InternalPerspectiveDsl.g:13786:1: ( ( '(' ) )
+            // InternalPerspectiveDsl.g:13787:1: ( '(' )
             {
-            // InternalPerspectiveDsl.g:13785:1: ( '(' )
-            // InternalPerspectiveDsl.g:13786:2: '('
+            // InternalPerspectiveDsl.g:13787:1: ( '(' )
+            // InternalPerspectiveDsl.g:13788:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2()); 
@@ -45685,14 +45685,14 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__3"
-    // InternalPerspectiveDsl.g:13795:1: rule__XIfExpression__Group__3 : rule__XIfExpression__Group__3__Impl rule__XIfExpression__Group__4 ;
+    // InternalPerspectiveDsl.g:13797:1: rule__XIfExpression__Group__3 : rule__XIfExpression__Group__3__Impl rule__XIfExpression__Group__4 ;
     public final void rule__XIfExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13799:1: ( rule__XIfExpression__Group__3__Impl rule__XIfExpression__Group__4 )
-            // InternalPerspectiveDsl.g:13800:2: rule__XIfExpression__Group__3__Impl rule__XIfExpression__Group__4
+            // InternalPerspectiveDsl.g:13801:1: ( rule__XIfExpression__Group__3__Impl rule__XIfExpression__Group__4 )
+            // InternalPerspectiveDsl.g:13802:2: rule__XIfExpression__Group__3__Impl rule__XIfExpression__Group__4
             {
             pushFollow(FOLLOW_99);
             rule__XIfExpression__Group__3__Impl();
@@ -45723,23 +45723,23 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__3__Impl"
-    // InternalPerspectiveDsl.g:13807:1: rule__XIfExpression__Group__3__Impl : ( ( rule__XIfExpression__IfAssignment_3 ) ) ;
+    // InternalPerspectiveDsl.g:13809:1: rule__XIfExpression__Group__3__Impl : ( ( rule__XIfExpression__IfAssignment_3 ) ) ;
     public final void rule__XIfExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13811:1: ( ( ( rule__XIfExpression__IfAssignment_3 ) ) )
-            // InternalPerspectiveDsl.g:13812:1: ( ( rule__XIfExpression__IfAssignment_3 ) )
+            // InternalPerspectiveDsl.g:13813:1: ( ( ( rule__XIfExpression__IfAssignment_3 ) ) )
+            // InternalPerspectiveDsl.g:13814:1: ( ( rule__XIfExpression__IfAssignment_3 ) )
             {
-            // InternalPerspectiveDsl.g:13812:1: ( ( rule__XIfExpression__IfAssignment_3 ) )
-            // InternalPerspectiveDsl.g:13813:2: ( rule__XIfExpression__IfAssignment_3 )
+            // InternalPerspectiveDsl.g:13814:1: ( ( rule__XIfExpression__IfAssignment_3 ) )
+            // InternalPerspectiveDsl.g:13815:2: ( rule__XIfExpression__IfAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getIfAssignment_3()); 
             }
-            // InternalPerspectiveDsl.g:13814:2: ( rule__XIfExpression__IfAssignment_3 )
-            // InternalPerspectiveDsl.g:13814:3: rule__XIfExpression__IfAssignment_3
+            // InternalPerspectiveDsl.g:13816:2: ( rule__XIfExpression__IfAssignment_3 )
+            // InternalPerspectiveDsl.g:13816:3: rule__XIfExpression__IfAssignment_3
             {
             pushFollow(FOLLOW_2);
             rule__XIfExpression__IfAssignment_3();
@@ -45774,14 +45774,14 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__4"
-    // InternalPerspectiveDsl.g:13822:1: rule__XIfExpression__Group__4 : rule__XIfExpression__Group__4__Impl rule__XIfExpression__Group__5 ;
+    // InternalPerspectiveDsl.g:13824:1: rule__XIfExpression__Group__4 : rule__XIfExpression__Group__4__Impl rule__XIfExpression__Group__5 ;
     public final void rule__XIfExpression__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13826:1: ( rule__XIfExpression__Group__4__Impl rule__XIfExpression__Group__5 )
-            // InternalPerspectiveDsl.g:13827:2: rule__XIfExpression__Group__4__Impl rule__XIfExpression__Group__5
+            // InternalPerspectiveDsl.g:13828:1: ( rule__XIfExpression__Group__4__Impl rule__XIfExpression__Group__5 )
+            // InternalPerspectiveDsl.g:13829:2: rule__XIfExpression__Group__4__Impl rule__XIfExpression__Group__5
             {
             pushFollow(FOLLOW_54);
             rule__XIfExpression__Group__4__Impl();
@@ -45812,17 +45812,17 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__4__Impl"
-    // InternalPerspectiveDsl.g:13834:1: rule__XIfExpression__Group__4__Impl : ( ')' ) ;
+    // InternalPerspectiveDsl.g:13836:1: rule__XIfExpression__Group__4__Impl : ( ')' ) ;
     public final void rule__XIfExpression__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13838:1: ( ( ')' ) )
-            // InternalPerspectiveDsl.g:13839:1: ( ')' )
+            // InternalPerspectiveDsl.g:13840:1: ( ( ')' ) )
+            // InternalPerspectiveDsl.g:13841:1: ( ')' )
             {
-            // InternalPerspectiveDsl.g:13839:1: ( ')' )
-            // InternalPerspectiveDsl.g:13840:2: ')'
+            // InternalPerspectiveDsl.g:13841:1: ( ')' )
+            // InternalPerspectiveDsl.g:13842:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4()); 
@@ -45853,14 +45853,14 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__5"
-    // InternalPerspectiveDsl.g:13849:1: rule__XIfExpression__Group__5 : rule__XIfExpression__Group__5__Impl rule__XIfExpression__Group__6 ;
+    // InternalPerspectiveDsl.g:13851:1: rule__XIfExpression__Group__5 : rule__XIfExpression__Group__5__Impl rule__XIfExpression__Group__6 ;
     public final void rule__XIfExpression__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13853:1: ( rule__XIfExpression__Group__5__Impl rule__XIfExpression__Group__6 )
-            // InternalPerspectiveDsl.g:13854:2: rule__XIfExpression__Group__5__Impl rule__XIfExpression__Group__6
+            // InternalPerspectiveDsl.g:13855:1: ( rule__XIfExpression__Group__5__Impl rule__XIfExpression__Group__6 )
+            // InternalPerspectiveDsl.g:13856:2: rule__XIfExpression__Group__5__Impl rule__XIfExpression__Group__6
             {
             pushFollow(FOLLOW_101);
             rule__XIfExpression__Group__5__Impl();
@@ -45891,23 +45891,23 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__5__Impl"
-    // InternalPerspectiveDsl.g:13861:1: rule__XIfExpression__Group__5__Impl : ( ( rule__XIfExpression__ThenAssignment_5 ) ) ;
+    // InternalPerspectiveDsl.g:13863:1: rule__XIfExpression__Group__5__Impl : ( ( rule__XIfExpression__ThenAssignment_5 ) ) ;
     public final void rule__XIfExpression__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13865:1: ( ( ( rule__XIfExpression__ThenAssignment_5 ) ) )
-            // InternalPerspectiveDsl.g:13866:1: ( ( rule__XIfExpression__ThenAssignment_5 ) )
+            // InternalPerspectiveDsl.g:13867:1: ( ( ( rule__XIfExpression__ThenAssignment_5 ) ) )
+            // InternalPerspectiveDsl.g:13868:1: ( ( rule__XIfExpression__ThenAssignment_5 ) )
             {
-            // InternalPerspectiveDsl.g:13866:1: ( ( rule__XIfExpression__ThenAssignment_5 ) )
-            // InternalPerspectiveDsl.g:13867:2: ( rule__XIfExpression__ThenAssignment_5 )
+            // InternalPerspectiveDsl.g:13868:1: ( ( rule__XIfExpression__ThenAssignment_5 ) )
+            // InternalPerspectiveDsl.g:13869:2: ( rule__XIfExpression__ThenAssignment_5 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getThenAssignment_5()); 
             }
-            // InternalPerspectiveDsl.g:13868:2: ( rule__XIfExpression__ThenAssignment_5 )
-            // InternalPerspectiveDsl.g:13868:3: rule__XIfExpression__ThenAssignment_5
+            // InternalPerspectiveDsl.g:13870:2: ( rule__XIfExpression__ThenAssignment_5 )
+            // InternalPerspectiveDsl.g:13870:3: rule__XIfExpression__ThenAssignment_5
             {
             pushFollow(FOLLOW_2);
             rule__XIfExpression__ThenAssignment_5();
@@ -45942,14 +45942,14 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__6"
-    // InternalPerspectiveDsl.g:13876:1: rule__XIfExpression__Group__6 : rule__XIfExpression__Group__6__Impl ;
+    // InternalPerspectiveDsl.g:13878:1: rule__XIfExpression__Group__6 : rule__XIfExpression__Group__6__Impl ;
     public final void rule__XIfExpression__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13880:1: ( rule__XIfExpression__Group__6__Impl )
-            // InternalPerspectiveDsl.g:13881:2: rule__XIfExpression__Group__6__Impl
+            // InternalPerspectiveDsl.g:13882:1: ( rule__XIfExpression__Group__6__Impl )
+            // InternalPerspectiveDsl.g:13883:2: rule__XIfExpression__Group__6__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XIfExpression__Group__6__Impl();
@@ -45975,22 +45975,22 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__6__Impl"
-    // InternalPerspectiveDsl.g:13887:1: rule__XIfExpression__Group__6__Impl : ( ( rule__XIfExpression__Group_6__0 )? ) ;
+    // InternalPerspectiveDsl.g:13889:1: rule__XIfExpression__Group__6__Impl : ( ( rule__XIfExpression__Group_6__0 )? ) ;
     public final void rule__XIfExpression__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13891:1: ( ( ( rule__XIfExpression__Group_6__0 )? ) )
-            // InternalPerspectiveDsl.g:13892:1: ( ( rule__XIfExpression__Group_6__0 )? )
+            // InternalPerspectiveDsl.g:13893:1: ( ( ( rule__XIfExpression__Group_6__0 )? ) )
+            // InternalPerspectiveDsl.g:13894:1: ( ( rule__XIfExpression__Group_6__0 )? )
             {
-            // InternalPerspectiveDsl.g:13892:1: ( ( rule__XIfExpression__Group_6__0 )? )
-            // InternalPerspectiveDsl.g:13893:2: ( rule__XIfExpression__Group_6__0 )?
+            // InternalPerspectiveDsl.g:13894:1: ( ( rule__XIfExpression__Group_6__0 )? )
+            // InternalPerspectiveDsl.g:13895:2: ( rule__XIfExpression__Group_6__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getGroup_6()); 
             }
-            // InternalPerspectiveDsl.g:13894:2: ( rule__XIfExpression__Group_6__0 )?
+            // InternalPerspectiveDsl.g:13896:2: ( rule__XIfExpression__Group_6__0 )?
             int alt98=2;
             int LA98_0 = input.LA(1);
 
@@ -46003,7 +46003,7 @@
             }
             switch (alt98) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:13894:3: rule__XIfExpression__Group_6__0
+                    // InternalPerspectiveDsl.g:13896:3: rule__XIfExpression__Group_6__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XIfExpression__Group_6__0();
@@ -46041,14 +46041,14 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group_6__0"
-    // InternalPerspectiveDsl.g:13903:1: rule__XIfExpression__Group_6__0 : rule__XIfExpression__Group_6__0__Impl rule__XIfExpression__Group_6__1 ;
+    // InternalPerspectiveDsl.g:13905:1: rule__XIfExpression__Group_6__0 : rule__XIfExpression__Group_6__0__Impl rule__XIfExpression__Group_6__1 ;
     public final void rule__XIfExpression__Group_6__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13907:1: ( rule__XIfExpression__Group_6__0__Impl rule__XIfExpression__Group_6__1 )
-            // InternalPerspectiveDsl.g:13908:2: rule__XIfExpression__Group_6__0__Impl rule__XIfExpression__Group_6__1
+            // InternalPerspectiveDsl.g:13909:1: ( rule__XIfExpression__Group_6__0__Impl rule__XIfExpression__Group_6__1 )
+            // InternalPerspectiveDsl.g:13910:2: rule__XIfExpression__Group_6__0__Impl rule__XIfExpression__Group_6__1
             {
             pushFollow(FOLLOW_54);
             rule__XIfExpression__Group_6__0__Impl();
@@ -46079,23 +46079,23 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group_6__0__Impl"
-    // InternalPerspectiveDsl.g:13915:1: rule__XIfExpression__Group_6__0__Impl : ( ( 'else' ) ) ;
+    // InternalPerspectiveDsl.g:13917:1: rule__XIfExpression__Group_6__0__Impl : ( ( 'else' ) ) ;
     public final void rule__XIfExpression__Group_6__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13919:1: ( ( ( 'else' ) ) )
-            // InternalPerspectiveDsl.g:13920:1: ( ( 'else' ) )
+            // InternalPerspectiveDsl.g:13921:1: ( ( ( 'else' ) ) )
+            // InternalPerspectiveDsl.g:13922:1: ( ( 'else' ) )
             {
-            // InternalPerspectiveDsl.g:13920:1: ( ( 'else' ) )
-            // InternalPerspectiveDsl.g:13921:2: ( 'else' )
+            // InternalPerspectiveDsl.g:13922:1: ( ( 'else' ) )
+            // InternalPerspectiveDsl.g:13923:2: ( 'else' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0()); 
             }
-            // InternalPerspectiveDsl.g:13922:2: ( 'else' )
-            // InternalPerspectiveDsl.g:13922:3: 'else'
+            // InternalPerspectiveDsl.g:13924:2: ( 'else' )
+            // InternalPerspectiveDsl.g:13924:3: 'else'
             {
             match(input,100,FOLLOW_2); if (state.failed) return ;
 
@@ -46126,14 +46126,14 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group_6__1"
-    // InternalPerspectiveDsl.g:13930:1: rule__XIfExpression__Group_6__1 : rule__XIfExpression__Group_6__1__Impl ;
+    // InternalPerspectiveDsl.g:13932:1: rule__XIfExpression__Group_6__1 : rule__XIfExpression__Group_6__1__Impl ;
     public final void rule__XIfExpression__Group_6__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13934:1: ( rule__XIfExpression__Group_6__1__Impl )
-            // InternalPerspectiveDsl.g:13935:2: rule__XIfExpression__Group_6__1__Impl
+            // InternalPerspectiveDsl.g:13936:1: ( rule__XIfExpression__Group_6__1__Impl )
+            // InternalPerspectiveDsl.g:13937:2: rule__XIfExpression__Group_6__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XIfExpression__Group_6__1__Impl();
@@ -46159,23 +46159,23 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group_6__1__Impl"
-    // InternalPerspectiveDsl.g:13941:1: rule__XIfExpression__Group_6__1__Impl : ( ( rule__XIfExpression__ElseAssignment_6_1 ) ) ;
+    // InternalPerspectiveDsl.g:13943:1: rule__XIfExpression__Group_6__1__Impl : ( ( rule__XIfExpression__ElseAssignment_6_1 ) ) ;
     public final void rule__XIfExpression__Group_6__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13945:1: ( ( ( rule__XIfExpression__ElseAssignment_6_1 ) ) )
-            // InternalPerspectiveDsl.g:13946:1: ( ( rule__XIfExpression__ElseAssignment_6_1 ) )
+            // InternalPerspectiveDsl.g:13947:1: ( ( ( rule__XIfExpression__ElseAssignment_6_1 ) ) )
+            // InternalPerspectiveDsl.g:13948:1: ( ( rule__XIfExpression__ElseAssignment_6_1 ) )
             {
-            // InternalPerspectiveDsl.g:13946:1: ( ( rule__XIfExpression__ElseAssignment_6_1 ) )
-            // InternalPerspectiveDsl.g:13947:2: ( rule__XIfExpression__ElseAssignment_6_1 )
+            // InternalPerspectiveDsl.g:13948:1: ( ( rule__XIfExpression__ElseAssignment_6_1 ) )
+            // InternalPerspectiveDsl.g:13949:2: ( rule__XIfExpression__ElseAssignment_6_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getElseAssignment_6_1()); 
             }
-            // InternalPerspectiveDsl.g:13948:2: ( rule__XIfExpression__ElseAssignment_6_1 )
-            // InternalPerspectiveDsl.g:13948:3: rule__XIfExpression__ElseAssignment_6_1
+            // InternalPerspectiveDsl.g:13950:2: ( rule__XIfExpression__ElseAssignment_6_1 )
+            // InternalPerspectiveDsl.g:13950:3: rule__XIfExpression__ElseAssignment_6_1
             {
             pushFollow(FOLLOW_2);
             rule__XIfExpression__ElseAssignment_6_1();
@@ -46210,14 +46210,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__0"
-    // InternalPerspectiveDsl.g:13957:1: rule__XSwitchExpression__Group__0 : rule__XSwitchExpression__Group__0__Impl rule__XSwitchExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:13959:1: rule__XSwitchExpression__Group__0 : rule__XSwitchExpression__Group__0__Impl rule__XSwitchExpression__Group__1 ;
     public final void rule__XSwitchExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13961:1: ( rule__XSwitchExpression__Group__0__Impl rule__XSwitchExpression__Group__1 )
-            // InternalPerspectiveDsl.g:13962:2: rule__XSwitchExpression__Group__0__Impl rule__XSwitchExpression__Group__1
+            // InternalPerspectiveDsl.g:13963:1: ( rule__XSwitchExpression__Group__0__Impl rule__XSwitchExpression__Group__1 )
+            // InternalPerspectiveDsl.g:13964:2: rule__XSwitchExpression__Group__0__Impl rule__XSwitchExpression__Group__1
             {
             pushFollow(FOLLOW_102);
             rule__XSwitchExpression__Group__0__Impl();
@@ -46248,23 +46248,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:13969:1: rule__XSwitchExpression__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:13971:1: rule__XSwitchExpression__Group__0__Impl : ( () ) ;
     public final void rule__XSwitchExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13973:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:13974:1: ( () )
+            // InternalPerspectiveDsl.g:13975:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:13976:1: ( () )
             {
-            // InternalPerspectiveDsl.g:13974:1: ( () )
-            // InternalPerspectiveDsl.g:13975:2: ()
+            // InternalPerspectiveDsl.g:13976:1: ( () )
+            // InternalPerspectiveDsl.g:13977:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0()); 
             }
-            // InternalPerspectiveDsl.g:13976:2: ()
-            // InternalPerspectiveDsl.g:13976:3: 
+            // InternalPerspectiveDsl.g:13978:2: ()
+            // InternalPerspectiveDsl.g:13978:3: 
             {
             }
 
@@ -46289,14 +46289,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__1"
-    // InternalPerspectiveDsl.g:13984:1: rule__XSwitchExpression__Group__1 : rule__XSwitchExpression__Group__1__Impl rule__XSwitchExpression__Group__2 ;
+    // InternalPerspectiveDsl.g:13986:1: rule__XSwitchExpression__Group__1 : rule__XSwitchExpression__Group__1__Impl rule__XSwitchExpression__Group__2 ;
     public final void rule__XSwitchExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:13988:1: ( rule__XSwitchExpression__Group__1__Impl rule__XSwitchExpression__Group__2 )
-            // InternalPerspectiveDsl.g:13989:2: rule__XSwitchExpression__Group__1__Impl rule__XSwitchExpression__Group__2
+            // InternalPerspectiveDsl.g:13990:1: ( rule__XSwitchExpression__Group__1__Impl rule__XSwitchExpression__Group__2 )
+            // InternalPerspectiveDsl.g:13991:2: rule__XSwitchExpression__Group__1__Impl rule__XSwitchExpression__Group__2
             {
             pushFollow(FOLLOW_103);
             rule__XSwitchExpression__Group__1__Impl();
@@ -46327,17 +46327,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:13996:1: rule__XSwitchExpression__Group__1__Impl : ( 'switch' ) ;
+    // InternalPerspectiveDsl.g:13998:1: rule__XSwitchExpression__Group__1__Impl : ( 'switch' ) ;
     public final void rule__XSwitchExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14000:1: ( ( 'switch' ) )
-            // InternalPerspectiveDsl.g:14001:1: ( 'switch' )
+            // InternalPerspectiveDsl.g:14002:1: ( ( 'switch' ) )
+            // InternalPerspectiveDsl.g:14003:1: ( 'switch' )
             {
-            // InternalPerspectiveDsl.g:14001:1: ( 'switch' )
-            // InternalPerspectiveDsl.g:14002:2: 'switch'
+            // InternalPerspectiveDsl.g:14003:1: ( 'switch' )
+            // InternalPerspectiveDsl.g:14004:2: 'switch'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1()); 
@@ -46368,14 +46368,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__2"
-    // InternalPerspectiveDsl.g:14011:1: rule__XSwitchExpression__Group__2 : rule__XSwitchExpression__Group__2__Impl rule__XSwitchExpression__Group__3 ;
+    // InternalPerspectiveDsl.g:14013:1: rule__XSwitchExpression__Group__2 : rule__XSwitchExpression__Group__2__Impl rule__XSwitchExpression__Group__3 ;
     public final void rule__XSwitchExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14015:1: ( rule__XSwitchExpression__Group__2__Impl rule__XSwitchExpression__Group__3 )
-            // InternalPerspectiveDsl.g:14016:2: rule__XSwitchExpression__Group__2__Impl rule__XSwitchExpression__Group__3
+            // InternalPerspectiveDsl.g:14017:1: ( rule__XSwitchExpression__Group__2__Impl rule__XSwitchExpression__Group__3 )
+            // InternalPerspectiveDsl.g:14018:2: rule__XSwitchExpression__Group__2__Impl rule__XSwitchExpression__Group__3
             {
             pushFollow(FOLLOW_8);
             rule__XSwitchExpression__Group__2__Impl();
@@ -46406,23 +46406,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__2__Impl"
-    // InternalPerspectiveDsl.g:14023:1: rule__XSwitchExpression__Group__2__Impl : ( ( rule__XSwitchExpression__Alternatives_2 ) ) ;
+    // InternalPerspectiveDsl.g:14025:1: rule__XSwitchExpression__Group__2__Impl : ( ( rule__XSwitchExpression__Alternatives_2 ) ) ;
     public final void rule__XSwitchExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14027:1: ( ( ( rule__XSwitchExpression__Alternatives_2 ) ) )
-            // InternalPerspectiveDsl.g:14028:1: ( ( rule__XSwitchExpression__Alternatives_2 ) )
+            // InternalPerspectiveDsl.g:14029:1: ( ( ( rule__XSwitchExpression__Alternatives_2 ) ) )
+            // InternalPerspectiveDsl.g:14030:1: ( ( rule__XSwitchExpression__Alternatives_2 ) )
             {
-            // InternalPerspectiveDsl.g:14028:1: ( ( rule__XSwitchExpression__Alternatives_2 ) )
-            // InternalPerspectiveDsl.g:14029:2: ( rule__XSwitchExpression__Alternatives_2 )
+            // InternalPerspectiveDsl.g:14030:1: ( ( rule__XSwitchExpression__Alternatives_2 ) )
+            // InternalPerspectiveDsl.g:14031:2: ( rule__XSwitchExpression__Alternatives_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getAlternatives_2()); 
             }
-            // InternalPerspectiveDsl.g:14030:2: ( rule__XSwitchExpression__Alternatives_2 )
-            // InternalPerspectiveDsl.g:14030:3: rule__XSwitchExpression__Alternatives_2
+            // InternalPerspectiveDsl.g:14032:2: ( rule__XSwitchExpression__Alternatives_2 )
+            // InternalPerspectiveDsl.g:14032:3: rule__XSwitchExpression__Alternatives_2
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Alternatives_2();
@@ -46457,14 +46457,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__3"
-    // InternalPerspectiveDsl.g:14038:1: rule__XSwitchExpression__Group__3 : rule__XSwitchExpression__Group__3__Impl rule__XSwitchExpression__Group__4 ;
+    // InternalPerspectiveDsl.g:14040:1: rule__XSwitchExpression__Group__3 : rule__XSwitchExpression__Group__3__Impl rule__XSwitchExpression__Group__4 ;
     public final void rule__XSwitchExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14042:1: ( rule__XSwitchExpression__Group__3__Impl rule__XSwitchExpression__Group__4 )
-            // InternalPerspectiveDsl.g:14043:2: rule__XSwitchExpression__Group__3__Impl rule__XSwitchExpression__Group__4
+            // InternalPerspectiveDsl.g:14044:1: ( rule__XSwitchExpression__Group__3__Impl rule__XSwitchExpression__Group__4 )
+            // InternalPerspectiveDsl.g:14045:2: rule__XSwitchExpression__Group__3__Impl rule__XSwitchExpression__Group__4
             {
             pushFollow(FOLLOW_104);
             rule__XSwitchExpression__Group__3__Impl();
@@ -46495,17 +46495,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__3__Impl"
-    // InternalPerspectiveDsl.g:14050:1: rule__XSwitchExpression__Group__3__Impl : ( '{' ) ;
+    // InternalPerspectiveDsl.g:14052:1: rule__XSwitchExpression__Group__3__Impl : ( '{' ) ;
     public final void rule__XSwitchExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14054:1: ( ( '{' ) )
-            // InternalPerspectiveDsl.g:14055:1: ( '{' )
+            // InternalPerspectiveDsl.g:14056:1: ( ( '{' ) )
+            // InternalPerspectiveDsl.g:14057:1: ( '{' )
             {
-            // InternalPerspectiveDsl.g:14055:1: ( '{' )
-            // InternalPerspectiveDsl.g:14056:2: '{'
+            // InternalPerspectiveDsl.g:14057:1: ( '{' )
+            // InternalPerspectiveDsl.g:14058:2: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3()); 
@@ -46536,14 +46536,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__4"
-    // InternalPerspectiveDsl.g:14065:1: rule__XSwitchExpression__Group__4 : rule__XSwitchExpression__Group__4__Impl rule__XSwitchExpression__Group__5 ;
+    // InternalPerspectiveDsl.g:14067:1: rule__XSwitchExpression__Group__4 : rule__XSwitchExpression__Group__4__Impl rule__XSwitchExpression__Group__5 ;
     public final void rule__XSwitchExpression__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14069:1: ( rule__XSwitchExpression__Group__4__Impl rule__XSwitchExpression__Group__5 )
-            // InternalPerspectiveDsl.g:14070:2: rule__XSwitchExpression__Group__4__Impl rule__XSwitchExpression__Group__5
+            // InternalPerspectiveDsl.g:14071:1: ( rule__XSwitchExpression__Group__4__Impl rule__XSwitchExpression__Group__5 )
+            // InternalPerspectiveDsl.g:14072:2: rule__XSwitchExpression__Group__4__Impl rule__XSwitchExpression__Group__5
             {
             pushFollow(FOLLOW_104);
             rule__XSwitchExpression__Group__4__Impl();
@@ -46574,22 +46574,22 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__4__Impl"
-    // InternalPerspectiveDsl.g:14077:1: rule__XSwitchExpression__Group__4__Impl : ( ( rule__XSwitchExpression__CasesAssignment_4 )* ) ;
+    // InternalPerspectiveDsl.g:14079:1: rule__XSwitchExpression__Group__4__Impl : ( ( rule__XSwitchExpression__CasesAssignment_4 )* ) ;
     public final void rule__XSwitchExpression__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14081:1: ( ( ( rule__XSwitchExpression__CasesAssignment_4 )* ) )
-            // InternalPerspectiveDsl.g:14082:1: ( ( rule__XSwitchExpression__CasesAssignment_4 )* )
+            // InternalPerspectiveDsl.g:14083:1: ( ( ( rule__XSwitchExpression__CasesAssignment_4 )* ) )
+            // InternalPerspectiveDsl.g:14084:1: ( ( rule__XSwitchExpression__CasesAssignment_4 )* )
             {
-            // InternalPerspectiveDsl.g:14082:1: ( ( rule__XSwitchExpression__CasesAssignment_4 )* )
-            // InternalPerspectiveDsl.g:14083:2: ( rule__XSwitchExpression__CasesAssignment_4 )*
+            // InternalPerspectiveDsl.g:14084:1: ( ( rule__XSwitchExpression__CasesAssignment_4 )* )
+            // InternalPerspectiveDsl.g:14085:2: ( rule__XSwitchExpression__CasesAssignment_4 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getCasesAssignment_4()); 
             }
-            // InternalPerspectiveDsl.g:14084:2: ( rule__XSwitchExpression__CasesAssignment_4 )*
+            // InternalPerspectiveDsl.g:14086:2: ( rule__XSwitchExpression__CasesAssignment_4 )*
             loop99:
             do {
                 int alt99=2;
@@ -46602,7 +46602,7 @@
 
                 switch (alt99) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:14084:3: rule__XSwitchExpression__CasesAssignment_4
+            	    // InternalPerspectiveDsl.g:14086:3: rule__XSwitchExpression__CasesAssignment_4
             	    {
             	    pushFollow(FOLLOW_105);
             	    rule__XSwitchExpression__CasesAssignment_4();
@@ -46643,14 +46643,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__5"
-    // InternalPerspectiveDsl.g:14092:1: rule__XSwitchExpression__Group__5 : rule__XSwitchExpression__Group__5__Impl rule__XSwitchExpression__Group__6 ;
+    // InternalPerspectiveDsl.g:14094:1: rule__XSwitchExpression__Group__5 : rule__XSwitchExpression__Group__5__Impl rule__XSwitchExpression__Group__6 ;
     public final void rule__XSwitchExpression__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14096:1: ( rule__XSwitchExpression__Group__5__Impl rule__XSwitchExpression__Group__6 )
-            // InternalPerspectiveDsl.g:14097:2: rule__XSwitchExpression__Group__5__Impl rule__XSwitchExpression__Group__6
+            // InternalPerspectiveDsl.g:14098:1: ( rule__XSwitchExpression__Group__5__Impl rule__XSwitchExpression__Group__6 )
+            // InternalPerspectiveDsl.g:14099:2: rule__XSwitchExpression__Group__5__Impl rule__XSwitchExpression__Group__6
             {
             pushFollow(FOLLOW_104);
             rule__XSwitchExpression__Group__5__Impl();
@@ -46681,22 +46681,22 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__5__Impl"
-    // InternalPerspectiveDsl.g:14104:1: rule__XSwitchExpression__Group__5__Impl : ( ( rule__XSwitchExpression__Group_5__0 )? ) ;
+    // InternalPerspectiveDsl.g:14106:1: rule__XSwitchExpression__Group__5__Impl : ( ( rule__XSwitchExpression__Group_5__0 )? ) ;
     public final void rule__XSwitchExpression__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14108:1: ( ( ( rule__XSwitchExpression__Group_5__0 )? ) )
-            // InternalPerspectiveDsl.g:14109:1: ( ( rule__XSwitchExpression__Group_5__0 )? )
+            // InternalPerspectiveDsl.g:14110:1: ( ( ( rule__XSwitchExpression__Group_5__0 )? ) )
+            // InternalPerspectiveDsl.g:14111:1: ( ( rule__XSwitchExpression__Group_5__0 )? )
             {
-            // InternalPerspectiveDsl.g:14109:1: ( ( rule__XSwitchExpression__Group_5__0 )? )
-            // InternalPerspectiveDsl.g:14110:2: ( rule__XSwitchExpression__Group_5__0 )?
+            // InternalPerspectiveDsl.g:14111:1: ( ( rule__XSwitchExpression__Group_5__0 )? )
+            // InternalPerspectiveDsl.g:14112:2: ( rule__XSwitchExpression__Group_5__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getGroup_5()); 
             }
-            // InternalPerspectiveDsl.g:14111:2: ( rule__XSwitchExpression__Group_5__0 )?
+            // InternalPerspectiveDsl.g:14113:2: ( rule__XSwitchExpression__Group_5__0 )?
             int alt100=2;
             int LA100_0 = input.LA(1);
 
@@ -46705,7 +46705,7 @@
             }
             switch (alt100) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:14111:3: rule__XSwitchExpression__Group_5__0
+                    // InternalPerspectiveDsl.g:14113:3: rule__XSwitchExpression__Group_5__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XSwitchExpression__Group_5__0();
@@ -46743,14 +46743,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__6"
-    // InternalPerspectiveDsl.g:14119:1: rule__XSwitchExpression__Group__6 : rule__XSwitchExpression__Group__6__Impl ;
+    // InternalPerspectiveDsl.g:14121:1: rule__XSwitchExpression__Group__6 : rule__XSwitchExpression__Group__6__Impl ;
     public final void rule__XSwitchExpression__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14123:1: ( rule__XSwitchExpression__Group__6__Impl )
-            // InternalPerspectiveDsl.g:14124:2: rule__XSwitchExpression__Group__6__Impl
+            // InternalPerspectiveDsl.g:14125:1: ( rule__XSwitchExpression__Group__6__Impl )
+            // InternalPerspectiveDsl.g:14126:2: rule__XSwitchExpression__Group__6__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group__6__Impl();
@@ -46776,17 +46776,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__6__Impl"
-    // InternalPerspectiveDsl.g:14130:1: rule__XSwitchExpression__Group__6__Impl : ( '}' ) ;
+    // InternalPerspectiveDsl.g:14132:1: rule__XSwitchExpression__Group__6__Impl : ( '}' ) ;
     public final void rule__XSwitchExpression__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14134:1: ( ( '}' ) )
-            // InternalPerspectiveDsl.g:14135:1: ( '}' )
+            // InternalPerspectiveDsl.g:14136:1: ( ( '}' ) )
+            // InternalPerspectiveDsl.g:14137:1: ( '}' )
             {
-            // InternalPerspectiveDsl.g:14135:1: ( '}' )
-            // InternalPerspectiveDsl.g:14136:2: '}'
+            // InternalPerspectiveDsl.g:14137:1: ( '}' )
+            // InternalPerspectiveDsl.g:14138:2: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getRightCurlyBracketKeyword_6()); 
@@ -46817,14 +46817,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0__0"
-    // InternalPerspectiveDsl.g:14146:1: rule__XSwitchExpression__Group_2_0__0 : rule__XSwitchExpression__Group_2_0__0__Impl rule__XSwitchExpression__Group_2_0__1 ;
+    // InternalPerspectiveDsl.g:14148:1: rule__XSwitchExpression__Group_2_0__0 : rule__XSwitchExpression__Group_2_0__0__Impl rule__XSwitchExpression__Group_2_0__1 ;
     public final void rule__XSwitchExpression__Group_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14150:1: ( rule__XSwitchExpression__Group_2_0__0__Impl rule__XSwitchExpression__Group_2_0__1 )
-            // InternalPerspectiveDsl.g:14151:2: rule__XSwitchExpression__Group_2_0__0__Impl rule__XSwitchExpression__Group_2_0__1
+            // InternalPerspectiveDsl.g:14152:1: ( rule__XSwitchExpression__Group_2_0__0__Impl rule__XSwitchExpression__Group_2_0__1 )
+            // InternalPerspectiveDsl.g:14153:2: rule__XSwitchExpression__Group_2_0__0__Impl rule__XSwitchExpression__Group_2_0__1
             {
             pushFollow(FOLLOW_54);
             rule__XSwitchExpression__Group_2_0__0__Impl();
@@ -46855,23 +46855,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0__0__Impl"
-    // InternalPerspectiveDsl.g:14158:1: rule__XSwitchExpression__Group_2_0__0__Impl : ( ( rule__XSwitchExpression__Group_2_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:14160:1: rule__XSwitchExpression__Group_2_0__0__Impl : ( ( rule__XSwitchExpression__Group_2_0_0__0 ) ) ;
     public final void rule__XSwitchExpression__Group_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14162:1: ( ( ( rule__XSwitchExpression__Group_2_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:14163:1: ( ( rule__XSwitchExpression__Group_2_0_0__0 ) )
+            // InternalPerspectiveDsl.g:14164:1: ( ( ( rule__XSwitchExpression__Group_2_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:14165:1: ( ( rule__XSwitchExpression__Group_2_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:14163:1: ( ( rule__XSwitchExpression__Group_2_0_0__0 ) )
-            // InternalPerspectiveDsl.g:14164:2: ( rule__XSwitchExpression__Group_2_0_0__0 )
+            // InternalPerspectiveDsl.g:14165:1: ( ( rule__XSwitchExpression__Group_2_0_0__0 ) )
+            // InternalPerspectiveDsl.g:14166:2: ( rule__XSwitchExpression__Group_2_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0_0()); 
             }
-            // InternalPerspectiveDsl.g:14165:2: ( rule__XSwitchExpression__Group_2_0_0__0 )
-            // InternalPerspectiveDsl.g:14165:3: rule__XSwitchExpression__Group_2_0_0__0
+            // InternalPerspectiveDsl.g:14167:2: ( rule__XSwitchExpression__Group_2_0_0__0 )
+            // InternalPerspectiveDsl.g:14167:3: rule__XSwitchExpression__Group_2_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_2_0_0__0();
@@ -46906,14 +46906,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0__1"
-    // InternalPerspectiveDsl.g:14173:1: rule__XSwitchExpression__Group_2_0__1 : rule__XSwitchExpression__Group_2_0__1__Impl rule__XSwitchExpression__Group_2_0__2 ;
+    // InternalPerspectiveDsl.g:14175:1: rule__XSwitchExpression__Group_2_0__1 : rule__XSwitchExpression__Group_2_0__1__Impl rule__XSwitchExpression__Group_2_0__2 ;
     public final void rule__XSwitchExpression__Group_2_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14177:1: ( rule__XSwitchExpression__Group_2_0__1__Impl rule__XSwitchExpression__Group_2_0__2 )
-            // InternalPerspectiveDsl.g:14178:2: rule__XSwitchExpression__Group_2_0__1__Impl rule__XSwitchExpression__Group_2_0__2
+            // InternalPerspectiveDsl.g:14179:1: ( rule__XSwitchExpression__Group_2_0__1__Impl rule__XSwitchExpression__Group_2_0__2 )
+            // InternalPerspectiveDsl.g:14180:2: rule__XSwitchExpression__Group_2_0__1__Impl rule__XSwitchExpression__Group_2_0__2
             {
             pushFollow(FOLLOW_99);
             rule__XSwitchExpression__Group_2_0__1__Impl();
@@ -46944,23 +46944,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0__1__Impl"
-    // InternalPerspectiveDsl.g:14185:1: rule__XSwitchExpression__Group_2_0__1__Impl : ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:14187:1: rule__XSwitchExpression__Group_2_0__1__Impl : ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) ) ;
     public final void rule__XSwitchExpression__Group_2_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14189:1: ( ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) ) )
-            // InternalPerspectiveDsl.g:14190:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) )
+            // InternalPerspectiveDsl.g:14191:1: ( ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) ) )
+            // InternalPerspectiveDsl.g:14192:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:14190:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) )
-            // InternalPerspectiveDsl.g:14191:2: ( rule__XSwitchExpression__SwitchAssignment_2_0_1 )
+            // InternalPerspectiveDsl.g:14192:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) )
+            // InternalPerspectiveDsl.g:14193:2: ( rule__XSwitchExpression__SwitchAssignment_2_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getSwitchAssignment_2_0_1()); 
             }
-            // InternalPerspectiveDsl.g:14192:2: ( rule__XSwitchExpression__SwitchAssignment_2_0_1 )
-            // InternalPerspectiveDsl.g:14192:3: rule__XSwitchExpression__SwitchAssignment_2_0_1
+            // InternalPerspectiveDsl.g:14194:2: ( rule__XSwitchExpression__SwitchAssignment_2_0_1 )
+            // InternalPerspectiveDsl.g:14194:3: rule__XSwitchExpression__SwitchAssignment_2_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__SwitchAssignment_2_0_1();
@@ -46995,14 +46995,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0__2"
-    // InternalPerspectiveDsl.g:14200:1: rule__XSwitchExpression__Group_2_0__2 : rule__XSwitchExpression__Group_2_0__2__Impl ;
+    // InternalPerspectiveDsl.g:14202:1: rule__XSwitchExpression__Group_2_0__2 : rule__XSwitchExpression__Group_2_0__2__Impl ;
     public final void rule__XSwitchExpression__Group_2_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14204:1: ( rule__XSwitchExpression__Group_2_0__2__Impl )
-            // InternalPerspectiveDsl.g:14205:2: rule__XSwitchExpression__Group_2_0__2__Impl
+            // InternalPerspectiveDsl.g:14206:1: ( rule__XSwitchExpression__Group_2_0__2__Impl )
+            // InternalPerspectiveDsl.g:14207:2: rule__XSwitchExpression__Group_2_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_2_0__2__Impl();
@@ -47028,17 +47028,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0__2__Impl"
-    // InternalPerspectiveDsl.g:14211:1: rule__XSwitchExpression__Group_2_0__2__Impl : ( ')' ) ;
+    // InternalPerspectiveDsl.g:14213:1: rule__XSwitchExpression__Group_2_0__2__Impl : ( ')' ) ;
     public final void rule__XSwitchExpression__Group_2_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14215:1: ( ( ')' ) )
-            // InternalPerspectiveDsl.g:14216:1: ( ')' )
+            // InternalPerspectiveDsl.g:14217:1: ( ( ')' ) )
+            // InternalPerspectiveDsl.g:14218:1: ( ')' )
             {
-            // InternalPerspectiveDsl.g:14216:1: ( ')' )
-            // InternalPerspectiveDsl.g:14217:2: ')'
+            // InternalPerspectiveDsl.g:14218:1: ( ')' )
+            // InternalPerspectiveDsl.g:14219:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2()); 
@@ -47069,14 +47069,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0_0__0"
-    // InternalPerspectiveDsl.g:14227:1: rule__XSwitchExpression__Group_2_0_0__0 : rule__XSwitchExpression__Group_2_0_0__0__Impl ;
+    // InternalPerspectiveDsl.g:14229:1: rule__XSwitchExpression__Group_2_0_0__0 : rule__XSwitchExpression__Group_2_0_0__0__Impl ;
     public final void rule__XSwitchExpression__Group_2_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14231:1: ( rule__XSwitchExpression__Group_2_0_0__0__Impl )
-            // InternalPerspectiveDsl.g:14232:2: rule__XSwitchExpression__Group_2_0_0__0__Impl
+            // InternalPerspectiveDsl.g:14233:1: ( rule__XSwitchExpression__Group_2_0_0__0__Impl )
+            // InternalPerspectiveDsl.g:14234:2: rule__XSwitchExpression__Group_2_0_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_2_0_0__0__Impl();
@@ -47102,23 +47102,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:14238:1: rule__XSwitchExpression__Group_2_0_0__0__Impl : ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:14240:1: rule__XSwitchExpression__Group_2_0_0__0__Impl : ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) ) ;
     public final void rule__XSwitchExpression__Group_2_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14242:1: ( ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:14243:1: ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) )
+            // InternalPerspectiveDsl.g:14244:1: ( ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:14245:1: ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:14243:1: ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) )
-            // InternalPerspectiveDsl.g:14244:2: ( rule__XSwitchExpression__Group_2_0_0_0__0 )
+            // InternalPerspectiveDsl.g:14245:1: ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) )
+            // InternalPerspectiveDsl.g:14246:2: ( rule__XSwitchExpression__Group_2_0_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:14245:2: ( rule__XSwitchExpression__Group_2_0_0_0__0 )
-            // InternalPerspectiveDsl.g:14245:3: rule__XSwitchExpression__Group_2_0_0_0__0
+            // InternalPerspectiveDsl.g:14247:2: ( rule__XSwitchExpression__Group_2_0_0_0__0 )
+            // InternalPerspectiveDsl.g:14247:3: rule__XSwitchExpression__Group_2_0_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_2_0_0_0__0();
@@ -47153,14 +47153,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0_0_0__0"
-    // InternalPerspectiveDsl.g:14254:1: rule__XSwitchExpression__Group_2_0_0_0__0 : rule__XSwitchExpression__Group_2_0_0_0__0__Impl rule__XSwitchExpression__Group_2_0_0_0__1 ;
+    // InternalPerspectiveDsl.g:14256:1: rule__XSwitchExpression__Group_2_0_0_0__0 : rule__XSwitchExpression__Group_2_0_0_0__0__Impl rule__XSwitchExpression__Group_2_0_0_0__1 ;
     public final void rule__XSwitchExpression__Group_2_0_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14258:1: ( rule__XSwitchExpression__Group_2_0_0_0__0__Impl rule__XSwitchExpression__Group_2_0_0_0__1 )
-            // InternalPerspectiveDsl.g:14259:2: rule__XSwitchExpression__Group_2_0_0_0__0__Impl rule__XSwitchExpression__Group_2_0_0_0__1
+            // InternalPerspectiveDsl.g:14260:1: ( rule__XSwitchExpression__Group_2_0_0_0__0__Impl rule__XSwitchExpression__Group_2_0_0_0__1 )
+            // InternalPerspectiveDsl.g:14261:2: rule__XSwitchExpression__Group_2_0_0_0__0__Impl rule__XSwitchExpression__Group_2_0_0_0__1
             {
             pushFollow(FOLLOW_71);
             rule__XSwitchExpression__Group_2_0_0_0__0__Impl();
@@ -47191,17 +47191,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:14266:1: rule__XSwitchExpression__Group_2_0_0_0__0__Impl : ( '(' ) ;
+    // InternalPerspectiveDsl.g:14268:1: rule__XSwitchExpression__Group_2_0_0_0__0__Impl : ( '(' ) ;
     public final void rule__XSwitchExpression__Group_2_0_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14270:1: ( ( '(' ) )
-            // InternalPerspectiveDsl.g:14271:1: ( '(' )
+            // InternalPerspectiveDsl.g:14272:1: ( ( '(' ) )
+            // InternalPerspectiveDsl.g:14273:1: ( '(' )
             {
-            // InternalPerspectiveDsl.g:14271:1: ( '(' )
-            // InternalPerspectiveDsl.g:14272:2: '('
+            // InternalPerspectiveDsl.g:14273:1: ( '(' )
+            // InternalPerspectiveDsl.g:14274:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0()); 
@@ -47232,14 +47232,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0_0_0__1"
-    // InternalPerspectiveDsl.g:14281:1: rule__XSwitchExpression__Group_2_0_0_0__1 : rule__XSwitchExpression__Group_2_0_0_0__1__Impl rule__XSwitchExpression__Group_2_0_0_0__2 ;
+    // InternalPerspectiveDsl.g:14283:1: rule__XSwitchExpression__Group_2_0_0_0__1 : rule__XSwitchExpression__Group_2_0_0_0__1__Impl rule__XSwitchExpression__Group_2_0_0_0__2 ;
     public final void rule__XSwitchExpression__Group_2_0_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14285:1: ( rule__XSwitchExpression__Group_2_0_0_0__1__Impl rule__XSwitchExpression__Group_2_0_0_0__2 )
-            // InternalPerspectiveDsl.g:14286:2: rule__XSwitchExpression__Group_2_0_0_0__1__Impl rule__XSwitchExpression__Group_2_0_0_0__2
+            // InternalPerspectiveDsl.g:14287:1: ( rule__XSwitchExpression__Group_2_0_0_0__1__Impl rule__XSwitchExpression__Group_2_0_0_0__2 )
+            // InternalPerspectiveDsl.g:14288:2: rule__XSwitchExpression__Group_2_0_0_0__1__Impl rule__XSwitchExpression__Group_2_0_0_0__2
             {
             pushFollow(FOLLOW_106);
             rule__XSwitchExpression__Group_2_0_0_0__1__Impl();
@@ -47270,23 +47270,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:14293:1: rule__XSwitchExpression__Group_2_0_0_0__1__Impl : ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:14295:1: rule__XSwitchExpression__Group_2_0_0_0__1__Impl : ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) ) ;
     public final void rule__XSwitchExpression__Group_2_0_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14297:1: ( ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) ) )
-            // InternalPerspectiveDsl.g:14298:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) )
+            // InternalPerspectiveDsl.g:14299:1: ( ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) ) )
+            // InternalPerspectiveDsl.g:14300:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:14298:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) )
-            // InternalPerspectiveDsl.g:14299:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 )
+            // InternalPerspectiveDsl.g:14300:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) )
+            // InternalPerspectiveDsl.g:14301:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamAssignment_2_0_0_0_1()); 
             }
-            // InternalPerspectiveDsl.g:14300:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 )
-            // InternalPerspectiveDsl.g:14300:3: rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1
+            // InternalPerspectiveDsl.g:14302:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 )
+            // InternalPerspectiveDsl.g:14302:3: rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1();
@@ -47321,14 +47321,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0_0_0__2"
-    // InternalPerspectiveDsl.g:14308:1: rule__XSwitchExpression__Group_2_0_0_0__2 : rule__XSwitchExpression__Group_2_0_0_0__2__Impl ;
+    // InternalPerspectiveDsl.g:14310:1: rule__XSwitchExpression__Group_2_0_0_0__2 : rule__XSwitchExpression__Group_2_0_0_0__2__Impl ;
     public final void rule__XSwitchExpression__Group_2_0_0_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14312:1: ( rule__XSwitchExpression__Group_2_0_0_0__2__Impl )
-            // InternalPerspectiveDsl.g:14313:2: rule__XSwitchExpression__Group_2_0_0_0__2__Impl
+            // InternalPerspectiveDsl.g:14314:1: ( rule__XSwitchExpression__Group_2_0_0_0__2__Impl )
+            // InternalPerspectiveDsl.g:14315:2: rule__XSwitchExpression__Group_2_0_0_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_2_0_0_0__2__Impl();
@@ -47354,17 +47354,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0_0_0__2__Impl"
-    // InternalPerspectiveDsl.g:14319:1: rule__XSwitchExpression__Group_2_0_0_0__2__Impl : ( ':' ) ;
+    // InternalPerspectiveDsl.g:14321:1: rule__XSwitchExpression__Group_2_0_0_0__2__Impl : ( ':' ) ;
     public final void rule__XSwitchExpression__Group_2_0_0_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14323:1: ( ( ':' ) )
-            // InternalPerspectiveDsl.g:14324:1: ( ':' )
+            // InternalPerspectiveDsl.g:14325:1: ( ( ':' ) )
+            // InternalPerspectiveDsl.g:14326:1: ( ':' )
             {
-            // InternalPerspectiveDsl.g:14324:1: ( ':' )
-            // InternalPerspectiveDsl.g:14325:2: ':'
+            // InternalPerspectiveDsl.g:14326:1: ( ':' )
+            // InternalPerspectiveDsl.g:14327:2: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2()); 
@@ -47395,14 +47395,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1__0"
-    // InternalPerspectiveDsl.g:14335:1: rule__XSwitchExpression__Group_2_1__0 : rule__XSwitchExpression__Group_2_1__0__Impl rule__XSwitchExpression__Group_2_1__1 ;
+    // InternalPerspectiveDsl.g:14337:1: rule__XSwitchExpression__Group_2_1__0 : rule__XSwitchExpression__Group_2_1__0__Impl rule__XSwitchExpression__Group_2_1__1 ;
     public final void rule__XSwitchExpression__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14339:1: ( rule__XSwitchExpression__Group_2_1__0__Impl rule__XSwitchExpression__Group_2_1__1 )
-            // InternalPerspectiveDsl.g:14340:2: rule__XSwitchExpression__Group_2_1__0__Impl rule__XSwitchExpression__Group_2_1__1
+            // InternalPerspectiveDsl.g:14341:1: ( rule__XSwitchExpression__Group_2_1__0__Impl rule__XSwitchExpression__Group_2_1__1 )
+            // InternalPerspectiveDsl.g:14342:2: rule__XSwitchExpression__Group_2_1__0__Impl rule__XSwitchExpression__Group_2_1__1
             {
             pushFollow(FOLLOW_103);
             rule__XSwitchExpression__Group_2_1__0__Impl();
@@ -47433,27 +47433,27 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1__0__Impl"
-    // InternalPerspectiveDsl.g:14347:1: rule__XSwitchExpression__Group_2_1__0__Impl : ( ( rule__XSwitchExpression__Group_2_1_0__0 )? ) ;
+    // InternalPerspectiveDsl.g:14349:1: rule__XSwitchExpression__Group_2_1__0__Impl : ( ( rule__XSwitchExpression__Group_2_1_0__0 )? ) ;
     public final void rule__XSwitchExpression__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14351:1: ( ( ( rule__XSwitchExpression__Group_2_1_0__0 )? ) )
-            // InternalPerspectiveDsl.g:14352:1: ( ( rule__XSwitchExpression__Group_2_1_0__0 )? )
+            // InternalPerspectiveDsl.g:14353:1: ( ( ( rule__XSwitchExpression__Group_2_1_0__0 )? ) )
+            // InternalPerspectiveDsl.g:14354:1: ( ( rule__XSwitchExpression__Group_2_1_0__0 )? )
             {
-            // InternalPerspectiveDsl.g:14352:1: ( ( rule__XSwitchExpression__Group_2_1_0__0 )? )
-            // InternalPerspectiveDsl.g:14353:2: ( rule__XSwitchExpression__Group_2_1_0__0 )?
+            // InternalPerspectiveDsl.g:14354:1: ( ( rule__XSwitchExpression__Group_2_1_0__0 )? )
+            // InternalPerspectiveDsl.g:14355:2: ( rule__XSwitchExpression__Group_2_1_0__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1_0()); 
             }
-            // InternalPerspectiveDsl.g:14354:2: ( rule__XSwitchExpression__Group_2_1_0__0 )?
+            // InternalPerspectiveDsl.g:14356:2: ( rule__XSwitchExpression__Group_2_1_0__0 )?
             int alt101=2;
             alt101 = dfa101.predict(input);
             switch (alt101) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:14354:3: rule__XSwitchExpression__Group_2_1_0__0
+                    // InternalPerspectiveDsl.g:14356:3: rule__XSwitchExpression__Group_2_1_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XSwitchExpression__Group_2_1_0__0();
@@ -47491,14 +47491,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1__1"
-    // InternalPerspectiveDsl.g:14362:1: rule__XSwitchExpression__Group_2_1__1 : rule__XSwitchExpression__Group_2_1__1__Impl ;
+    // InternalPerspectiveDsl.g:14364:1: rule__XSwitchExpression__Group_2_1__1 : rule__XSwitchExpression__Group_2_1__1__Impl ;
     public final void rule__XSwitchExpression__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14366:1: ( rule__XSwitchExpression__Group_2_1__1__Impl )
-            // InternalPerspectiveDsl.g:14367:2: rule__XSwitchExpression__Group_2_1__1__Impl
+            // InternalPerspectiveDsl.g:14368:1: ( rule__XSwitchExpression__Group_2_1__1__Impl )
+            // InternalPerspectiveDsl.g:14369:2: rule__XSwitchExpression__Group_2_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_2_1__1__Impl();
@@ -47524,23 +47524,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1__1__Impl"
-    // InternalPerspectiveDsl.g:14373:1: rule__XSwitchExpression__Group_2_1__1__Impl : ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:14375:1: rule__XSwitchExpression__Group_2_1__1__Impl : ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) ) ;
     public final void rule__XSwitchExpression__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14377:1: ( ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) ) )
-            // InternalPerspectiveDsl.g:14378:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) )
+            // InternalPerspectiveDsl.g:14379:1: ( ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) ) )
+            // InternalPerspectiveDsl.g:14380:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:14378:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) )
-            // InternalPerspectiveDsl.g:14379:2: ( rule__XSwitchExpression__SwitchAssignment_2_1_1 )
+            // InternalPerspectiveDsl.g:14380:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) )
+            // InternalPerspectiveDsl.g:14381:2: ( rule__XSwitchExpression__SwitchAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getSwitchAssignment_2_1_1()); 
             }
-            // InternalPerspectiveDsl.g:14380:2: ( rule__XSwitchExpression__SwitchAssignment_2_1_1 )
-            // InternalPerspectiveDsl.g:14380:3: rule__XSwitchExpression__SwitchAssignment_2_1_1
+            // InternalPerspectiveDsl.g:14382:2: ( rule__XSwitchExpression__SwitchAssignment_2_1_1 )
+            // InternalPerspectiveDsl.g:14382:3: rule__XSwitchExpression__SwitchAssignment_2_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__SwitchAssignment_2_1_1();
@@ -47575,14 +47575,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1_0__0"
-    // InternalPerspectiveDsl.g:14389:1: rule__XSwitchExpression__Group_2_1_0__0 : rule__XSwitchExpression__Group_2_1_0__0__Impl ;
+    // InternalPerspectiveDsl.g:14391:1: rule__XSwitchExpression__Group_2_1_0__0 : rule__XSwitchExpression__Group_2_1_0__0__Impl ;
     public final void rule__XSwitchExpression__Group_2_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14393:1: ( rule__XSwitchExpression__Group_2_1_0__0__Impl )
-            // InternalPerspectiveDsl.g:14394:2: rule__XSwitchExpression__Group_2_1_0__0__Impl
+            // InternalPerspectiveDsl.g:14395:1: ( rule__XSwitchExpression__Group_2_1_0__0__Impl )
+            // InternalPerspectiveDsl.g:14396:2: rule__XSwitchExpression__Group_2_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_2_1_0__0__Impl();
@@ -47608,23 +47608,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1_0__0__Impl"
-    // InternalPerspectiveDsl.g:14400:1: rule__XSwitchExpression__Group_2_1_0__0__Impl : ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:14402:1: rule__XSwitchExpression__Group_2_1_0__0__Impl : ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) ) ;
     public final void rule__XSwitchExpression__Group_2_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14404:1: ( ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:14405:1: ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:14406:1: ( ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:14407:1: ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:14405:1: ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) )
-            // InternalPerspectiveDsl.g:14406:2: ( rule__XSwitchExpression__Group_2_1_0_0__0 )
+            // InternalPerspectiveDsl.g:14407:1: ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) )
+            // InternalPerspectiveDsl.g:14408:2: ( rule__XSwitchExpression__Group_2_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:14407:2: ( rule__XSwitchExpression__Group_2_1_0_0__0 )
-            // InternalPerspectiveDsl.g:14407:3: rule__XSwitchExpression__Group_2_1_0_0__0
+            // InternalPerspectiveDsl.g:14409:2: ( rule__XSwitchExpression__Group_2_1_0_0__0 )
+            // InternalPerspectiveDsl.g:14409:3: rule__XSwitchExpression__Group_2_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_2_1_0_0__0();
@@ -47659,14 +47659,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1_0_0__0"
-    // InternalPerspectiveDsl.g:14416:1: rule__XSwitchExpression__Group_2_1_0_0__0 : rule__XSwitchExpression__Group_2_1_0_0__0__Impl rule__XSwitchExpression__Group_2_1_0_0__1 ;
+    // InternalPerspectiveDsl.g:14418:1: rule__XSwitchExpression__Group_2_1_0_0__0 : rule__XSwitchExpression__Group_2_1_0_0__0__Impl rule__XSwitchExpression__Group_2_1_0_0__1 ;
     public final void rule__XSwitchExpression__Group_2_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14420:1: ( rule__XSwitchExpression__Group_2_1_0_0__0__Impl rule__XSwitchExpression__Group_2_1_0_0__1 )
-            // InternalPerspectiveDsl.g:14421:2: rule__XSwitchExpression__Group_2_1_0_0__0__Impl rule__XSwitchExpression__Group_2_1_0_0__1
+            // InternalPerspectiveDsl.g:14422:1: ( rule__XSwitchExpression__Group_2_1_0_0__0__Impl rule__XSwitchExpression__Group_2_1_0_0__1 )
+            // InternalPerspectiveDsl.g:14423:2: rule__XSwitchExpression__Group_2_1_0_0__0__Impl rule__XSwitchExpression__Group_2_1_0_0__1
             {
             pushFollow(FOLLOW_106);
             rule__XSwitchExpression__Group_2_1_0_0__0__Impl();
@@ -47697,23 +47697,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:14428:1: rule__XSwitchExpression__Group_2_1_0_0__0__Impl : ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) ) ;
+    // InternalPerspectiveDsl.g:14430:1: rule__XSwitchExpression__Group_2_1_0_0__0__Impl : ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) ) ;
     public final void rule__XSwitchExpression__Group_2_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14432:1: ( ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) ) )
-            // InternalPerspectiveDsl.g:14433:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) )
+            // InternalPerspectiveDsl.g:14434:1: ( ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) ) )
+            // InternalPerspectiveDsl.g:14435:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) )
             {
-            // InternalPerspectiveDsl.g:14433:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) )
-            // InternalPerspectiveDsl.g:14434:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 )
+            // InternalPerspectiveDsl.g:14435:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) )
+            // InternalPerspectiveDsl.g:14436:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamAssignment_2_1_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:14435:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 )
-            // InternalPerspectiveDsl.g:14435:3: rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0
+            // InternalPerspectiveDsl.g:14437:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 )
+            // InternalPerspectiveDsl.g:14437:3: rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0();
@@ -47748,14 +47748,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1_0_0__1"
-    // InternalPerspectiveDsl.g:14443:1: rule__XSwitchExpression__Group_2_1_0_0__1 : rule__XSwitchExpression__Group_2_1_0_0__1__Impl ;
+    // InternalPerspectiveDsl.g:14445:1: rule__XSwitchExpression__Group_2_1_0_0__1 : rule__XSwitchExpression__Group_2_1_0_0__1__Impl ;
     public final void rule__XSwitchExpression__Group_2_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14447:1: ( rule__XSwitchExpression__Group_2_1_0_0__1__Impl )
-            // InternalPerspectiveDsl.g:14448:2: rule__XSwitchExpression__Group_2_1_0_0__1__Impl
+            // InternalPerspectiveDsl.g:14449:1: ( rule__XSwitchExpression__Group_2_1_0_0__1__Impl )
+            // InternalPerspectiveDsl.g:14450:2: rule__XSwitchExpression__Group_2_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_2_1_0_0__1__Impl();
@@ -47781,17 +47781,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:14454:1: rule__XSwitchExpression__Group_2_1_0_0__1__Impl : ( ':' ) ;
+    // InternalPerspectiveDsl.g:14456:1: rule__XSwitchExpression__Group_2_1_0_0__1__Impl : ( ':' ) ;
     public final void rule__XSwitchExpression__Group_2_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14458:1: ( ( ':' ) )
-            // InternalPerspectiveDsl.g:14459:1: ( ':' )
+            // InternalPerspectiveDsl.g:14460:1: ( ( ':' ) )
+            // InternalPerspectiveDsl.g:14461:1: ( ':' )
             {
-            // InternalPerspectiveDsl.g:14459:1: ( ':' )
-            // InternalPerspectiveDsl.g:14460:2: ':'
+            // InternalPerspectiveDsl.g:14461:1: ( ':' )
+            // InternalPerspectiveDsl.g:14462:2: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1()); 
@@ -47822,14 +47822,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_5__0"
-    // InternalPerspectiveDsl.g:14470:1: rule__XSwitchExpression__Group_5__0 : rule__XSwitchExpression__Group_5__0__Impl rule__XSwitchExpression__Group_5__1 ;
+    // InternalPerspectiveDsl.g:14472:1: rule__XSwitchExpression__Group_5__0 : rule__XSwitchExpression__Group_5__0__Impl rule__XSwitchExpression__Group_5__1 ;
     public final void rule__XSwitchExpression__Group_5__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14474:1: ( rule__XSwitchExpression__Group_5__0__Impl rule__XSwitchExpression__Group_5__1 )
-            // InternalPerspectiveDsl.g:14475:2: rule__XSwitchExpression__Group_5__0__Impl rule__XSwitchExpression__Group_5__1
+            // InternalPerspectiveDsl.g:14476:1: ( rule__XSwitchExpression__Group_5__0__Impl rule__XSwitchExpression__Group_5__1 )
+            // InternalPerspectiveDsl.g:14477:2: rule__XSwitchExpression__Group_5__0__Impl rule__XSwitchExpression__Group_5__1
             {
             pushFollow(FOLLOW_106);
             rule__XSwitchExpression__Group_5__0__Impl();
@@ -47860,17 +47860,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_5__0__Impl"
-    // InternalPerspectiveDsl.g:14482:1: rule__XSwitchExpression__Group_5__0__Impl : ( 'default' ) ;
+    // InternalPerspectiveDsl.g:14484:1: rule__XSwitchExpression__Group_5__0__Impl : ( 'default' ) ;
     public final void rule__XSwitchExpression__Group_5__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14486:1: ( ( 'default' ) )
-            // InternalPerspectiveDsl.g:14487:1: ( 'default' )
+            // InternalPerspectiveDsl.g:14488:1: ( ( 'default' ) )
+            // InternalPerspectiveDsl.g:14489:1: ( 'default' )
             {
-            // InternalPerspectiveDsl.g:14487:1: ( 'default' )
-            // InternalPerspectiveDsl.g:14488:2: 'default'
+            // InternalPerspectiveDsl.g:14489:1: ( 'default' )
+            // InternalPerspectiveDsl.g:14490:2: 'default'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0()); 
@@ -47901,14 +47901,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_5__1"
-    // InternalPerspectiveDsl.g:14497:1: rule__XSwitchExpression__Group_5__1 : rule__XSwitchExpression__Group_5__1__Impl rule__XSwitchExpression__Group_5__2 ;
+    // InternalPerspectiveDsl.g:14499:1: rule__XSwitchExpression__Group_5__1 : rule__XSwitchExpression__Group_5__1__Impl rule__XSwitchExpression__Group_5__2 ;
     public final void rule__XSwitchExpression__Group_5__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14501:1: ( rule__XSwitchExpression__Group_5__1__Impl rule__XSwitchExpression__Group_5__2 )
-            // InternalPerspectiveDsl.g:14502:2: rule__XSwitchExpression__Group_5__1__Impl rule__XSwitchExpression__Group_5__2
+            // InternalPerspectiveDsl.g:14503:1: ( rule__XSwitchExpression__Group_5__1__Impl rule__XSwitchExpression__Group_5__2 )
+            // InternalPerspectiveDsl.g:14504:2: rule__XSwitchExpression__Group_5__1__Impl rule__XSwitchExpression__Group_5__2
             {
             pushFollow(FOLLOW_54);
             rule__XSwitchExpression__Group_5__1__Impl();
@@ -47939,17 +47939,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_5__1__Impl"
-    // InternalPerspectiveDsl.g:14509:1: rule__XSwitchExpression__Group_5__1__Impl : ( ':' ) ;
+    // InternalPerspectiveDsl.g:14511:1: rule__XSwitchExpression__Group_5__1__Impl : ( ':' ) ;
     public final void rule__XSwitchExpression__Group_5__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14513:1: ( ( ':' ) )
-            // InternalPerspectiveDsl.g:14514:1: ( ':' )
+            // InternalPerspectiveDsl.g:14515:1: ( ( ':' ) )
+            // InternalPerspectiveDsl.g:14516:1: ( ':' )
             {
-            // InternalPerspectiveDsl.g:14514:1: ( ':' )
-            // InternalPerspectiveDsl.g:14515:2: ':'
+            // InternalPerspectiveDsl.g:14516:1: ( ':' )
+            // InternalPerspectiveDsl.g:14517:2: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1()); 
@@ -47980,14 +47980,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_5__2"
-    // InternalPerspectiveDsl.g:14524:1: rule__XSwitchExpression__Group_5__2 : rule__XSwitchExpression__Group_5__2__Impl ;
+    // InternalPerspectiveDsl.g:14526:1: rule__XSwitchExpression__Group_5__2 : rule__XSwitchExpression__Group_5__2__Impl ;
     public final void rule__XSwitchExpression__Group_5__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14528:1: ( rule__XSwitchExpression__Group_5__2__Impl )
-            // InternalPerspectiveDsl.g:14529:2: rule__XSwitchExpression__Group_5__2__Impl
+            // InternalPerspectiveDsl.g:14530:1: ( rule__XSwitchExpression__Group_5__2__Impl )
+            // InternalPerspectiveDsl.g:14531:2: rule__XSwitchExpression__Group_5__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_5__2__Impl();
@@ -48013,23 +48013,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_5__2__Impl"
-    // InternalPerspectiveDsl.g:14535:1: rule__XSwitchExpression__Group_5__2__Impl : ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) ) ;
+    // InternalPerspectiveDsl.g:14537:1: rule__XSwitchExpression__Group_5__2__Impl : ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) ) ;
     public final void rule__XSwitchExpression__Group_5__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14539:1: ( ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) ) )
-            // InternalPerspectiveDsl.g:14540:1: ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) )
+            // InternalPerspectiveDsl.g:14541:1: ( ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) ) )
+            // InternalPerspectiveDsl.g:14542:1: ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) )
             {
-            // InternalPerspectiveDsl.g:14540:1: ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) )
-            // InternalPerspectiveDsl.g:14541:2: ( rule__XSwitchExpression__DefaultAssignment_5_2 )
+            // InternalPerspectiveDsl.g:14542:1: ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) )
+            // InternalPerspectiveDsl.g:14543:2: ( rule__XSwitchExpression__DefaultAssignment_5_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getDefaultAssignment_5_2()); 
             }
-            // InternalPerspectiveDsl.g:14542:2: ( rule__XSwitchExpression__DefaultAssignment_5_2 )
-            // InternalPerspectiveDsl.g:14542:3: rule__XSwitchExpression__DefaultAssignment_5_2
+            // InternalPerspectiveDsl.g:14544:2: ( rule__XSwitchExpression__DefaultAssignment_5_2 )
+            // InternalPerspectiveDsl.g:14544:3: rule__XSwitchExpression__DefaultAssignment_5_2
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__DefaultAssignment_5_2();
@@ -48064,14 +48064,14 @@
 
 
     // $ANTLR start "rule__XCasePart__Group__0"
-    // InternalPerspectiveDsl.g:14551:1: rule__XCasePart__Group__0 : rule__XCasePart__Group__0__Impl rule__XCasePart__Group__1 ;
+    // InternalPerspectiveDsl.g:14553:1: rule__XCasePart__Group__0 : rule__XCasePart__Group__0__Impl rule__XCasePart__Group__1 ;
     public final void rule__XCasePart__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14555:1: ( rule__XCasePart__Group__0__Impl rule__XCasePart__Group__1 )
-            // InternalPerspectiveDsl.g:14556:2: rule__XCasePart__Group__0__Impl rule__XCasePart__Group__1
+            // InternalPerspectiveDsl.g:14557:1: ( rule__XCasePart__Group__0__Impl rule__XCasePart__Group__1 )
+            // InternalPerspectiveDsl.g:14558:2: rule__XCasePart__Group__0__Impl rule__XCasePart__Group__1
             {
             pushFollow(FOLLOW_107);
             rule__XCasePart__Group__0__Impl();
@@ -48102,23 +48102,23 @@
 
 
     // $ANTLR start "rule__XCasePart__Group__0__Impl"
-    // InternalPerspectiveDsl.g:14563:1: rule__XCasePart__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:14565:1: rule__XCasePart__Group__0__Impl : ( () ) ;
     public final void rule__XCasePart__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14567:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:14568:1: ( () )
+            // InternalPerspectiveDsl.g:14569:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:14570:1: ( () )
             {
-            // InternalPerspectiveDsl.g:14568:1: ( () )
-            // InternalPerspectiveDsl.g:14569:2: ()
+            // InternalPerspectiveDsl.g:14570:1: ( () )
+            // InternalPerspectiveDsl.g:14571:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getXCasePartAction_0()); 
             }
-            // InternalPerspectiveDsl.g:14570:2: ()
-            // InternalPerspectiveDsl.g:14570:3: 
+            // InternalPerspectiveDsl.g:14572:2: ()
+            // InternalPerspectiveDsl.g:14572:3: 
             {
             }
 
@@ -48143,14 +48143,14 @@
 
 
     // $ANTLR start "rule__XCasePart__Group__1"
-    // InternalPerspectiveDsl.g:14578:1: rule__XCasePart__Group__1 : rule__XCasePart__Group__1__Impl rule__XCasePart__Group__2 ;
+    // InternalPerspectiveDsl.g:14580:1: rule__XCasePart__Group__1 : rule__XCasePart__Group__1__Impl rule__XCasePart__Group__2 ;
     public final void rule__XCasePart__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14582:1: ( rule__XCasePart__Group__1__Impl rule__XCasePart__Group__2 )
-            // InternalPerspectiveDsl.g:14583:2: rule__XCasePart__Group__1__Impl rule__XCasePart__Group__2
+            // InternalPerspectiveDsl.g:14584:1: ( rule__XCasePart__Group__1__Impl rule__XCasePart__Group__2 )
+            // InternalPerspectiveDsl.g:14585:2: rule__XCasePart__Group__1__Impl rule__XCasePart__Group__2
             {
             pushFollow(FOLLOW_107);
             rule__XCasePart__Group__1__Impl();
@@ -48181,22 +48181,22 @@
 
 
     // $ANTLR start "rule__XCasePart__Group__1__Impl"
-    // InternalPerspectiveDsl.g:14590:1: rule__XCasePart__Group__1__Impl : ( ( rule__XCasePart__TypeGuardAssignment_1 )? ) ;
+    // InternalPerspectiveDsl.g:14592:1: rule__XCasePart__Group__1__Impl : ( ( rule__XCasePart__TypeGuardAssignment_1 )? ) ;
     public final void rule__XCasePart__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14594:1: ( ( ( rule__XCasePart__TypeGuardAssignment_1 )? ) )
-            // InternalPerspectiveDsl.g:14595:1: ( ( rule__XCasePart__TypeGuardAssignment_1 )? )
+            // InternalPerspectiveDsl.g:14596:1: ( ( ( rule__XCasePart__TypeGuardAssignment_1 )? ) )
+            // InternalPerspectiveDsl.g:14597:1: ( ( rule__XCasePart__TypeGuardAssignment_1 )? )
             {
-            // InternalPerspectiveDsl.g:14595:1: ( ( rule__XCasePart__TypeGuardAssignment_1 )? )
-            // InternalPerspectiveDsl.g:14596:2: ( rule__XCasePart__TypeGuardAssignment_1 )?
+            // InternalPerspectiveDsl.g:14597:1: ( ( rule__XCasePart__TypeGuardAssignment_1 )? )
+            // InternalPerspectiveDsl.g:14598:2: ( rule__XCasePart__TypeGuardAssignment_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getTypeGuardAssignment_1()); 
             }
-            // InternalPerspectiveDsl.g:14597:2: ( rule__XCasePart__TypeGuardAssignment_1 )?
+            // InternalPerspectiveDsl.g:14599:2: ( rule__XCasePart__TypeGuardAssignment_1 )?
             int alt102=2;
             int LA102_0 = input.LA(1);
 
@@ -48205,7 +48205,7 @@
             }
             switch (alt102) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:14597:3: rule__XCasePart__TypeGuardAssignment_1
+                    // InternalPerspectiveDsl.g:14599:3: rule__XCasePart__TypeGuardAssignment_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XCasePart__TypeGuardAssignment_1();
@@ -48243,14 +48243,14 @@
 
 
     // $ANTLR start "rule__XCasePart__Group__2"
-    // InternalPerspectiveDsl.g:14605:1: rule__XCasePart__Group__2 : rule__XCasePart__Group__2__Impl rule__XCasePart__Group__3 ;
+    // InternalPerspectiveDsl.g:14607:1: rule__XCasePart__Group__2 : rule__XCasePart__Group__2__Impl rule__XCasePart__Group__3 ;
     public final void rule__XCasePart__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14609:1: ( rule__XCasePart__Group__2__Impl rule__XCasePart__Group__3 )
-            // InternalPerspectiveDsl.g:14610:2: rule__XCasePart__Group__2__Impl rule__XCasePart__Group__3
+            // InternalPerspectiveDsl.g:14611:1: ( rule__XCasePart__Group__2__Impl rule__XCasePart__Group__3 )
+            // InternalPerspectiveDsl.g:14612:2: rule__XCasePart__Group__2__Impl rule__XCasePart__Group__3
             {
             pushFollow(FOLLOW_107);
             rule__XCasePart__Group__2__Impl();
@@ -48281,22 +48281,22 @@
 
 
     // $ANTLR start "rule__XCasePart__Group__2__Impl"
-    // InternalPerspectiveDsl.g:14617:1: rule__XCasePart__Group__2__Impl : ( ( rule__XCasePart__Group_2__0 )? ) ;
+    // InternalPerspectiveDsl.g:14619:1: rule__XCasePart__Group__2__Impl : ( ( rule__XCasePart__Group_2__0 )? ) ;
     public final void rule__XCasePart__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14621:1: ( ( ( rule__XCasePart__Group_2__0 )? ) )
-            // InternalPerspectiveDsl.g:14622:1: ( ( rule__XCasePart__Group_2__0 )? )
+            // InternalPerspectiveDsl.g:14623:1: ( ( ( rule__XCasePart__Group_2__0 )? ) )
+            // InternalPerspectiveDsl.g:14624:1: ( ( rule__XCasePart__Group_2__0 )? )
             {
-            // InternalPerspectiveDsl.g:14622:1: ( ( rule__XCasePart__Group_2__0 )? )
-            // InternalPerspectiveDsl.g:14623:2: ( rule__XCasePart__Group_2__0 )?
+            // InternalPerspectiveDsl.g:14624:1: ( ( rule__XCasePart__Group_2__0 )? )
+            // InternalPerspectiveDsl.g:14625:2: ( rule__XCasePart__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getGroup_2()); 
             }
-            // InternalPerspectiveDsl.g:14624:2: ( rule__XCasePart__Group_2__0 )?
+            // InternalPerspectiveDsl.g:14626:2: ( rule__XCasePart__Group_2__0 )?
             int alt103=2;
             int LA103_0 = input.LA(1);
 
@@ -48305,7 +48305,7 @@
             }
             switch (alt103) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:14624:3: rule__XCasePart__Group_2__0
+                    // InternalPerspectiveDsl.g:14626:3: rule__XCasePart__Group_2__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XCasePart__Group_2__0();
@@ -48343,14 +48343,14 @@
 
 
     // $ANTLR start "rule__XCasePart__Group__3"
-    // InternalPerspectiveDsl.g:14632:1: rule__XCasePart__Group__3 : rule__XCasePart__Group__3__Impl ;
+    // InternalPerspectiveDsl.g:14634:1: rule__XCasePart__Group__3 : rule__XCasePart__Group__3__Impl ;
     public final void rule__XCasePart__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14636:1: ( rule__XCasePart__Group__3__Impl )
-            // InternalPerspectiveDsl.g:14637:2: rule__XCasePart__Group__3__Impl
+            // InternalPerspectiveDsl.g:14638:1: ( rule__XCasePart__Group__3__Impl )
+            // InternalPerspectiveDsl.g:14639:2: rule__XCasePart__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XCasePart__Group__3__Impl();
@@ -48376,23 +48376,23 @@
 
 
     // $ANTLR start "rule__XCasePart__Group__3__Impl"
-    // InternalPerspectiveDsl.g:14643:1: rule__XCasePart__Group__3__Impl : ( ( rule__XCasePart__Alternatives_3 ) ) ;
+    // InternalPerspectiveDsl.g:14645:1: rule__XCasePart__Group__3__Impl : ( ( rule__XCasePart__Alternatives_3 ) ) ;
     public final void rule__XCasePart__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14647:1: ( ( ( rule__XCasePart__Alternatives_3 ) ) )
-            // InternalPerspectiveDsl.g:14648:1: ( ( rule__XCasePart__Alternatives_3 ) )
+            // InternalPerspectiveDsl.g:14649:1: ( ( ( rule__XCasePart__Alternatives_3 ) ) )
+            // InternalPerspectiveDsl.g:14650:1: ( ( rule__XCasePart__Alternatives_3 ) )
             {
-            // InternalPerspectiveDsl.g:14648:1: ( ( rule__XCasePart__Alternatives_3 ) )
-            // InternalPerspectiveDsl.g:14649:2: ( rule__XCasePart__Alternatives_3 )
+            // InternalPerspectiveDsl.g:14650:1: ( ( rule__XCasePart__Alternatives_3 ) )
+            // InternalPerspectiveDsl.g:14651:2: ( rule__XCasePart__Alternatives_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getAlternatives_3()); 
             }
-            // InternalPerspectiveDsl.g:14650:2: ( rule__XCasePart__Alternatives_3 )
-            // InternalPerspectiveDsl.g:14650:3: rule__XCasePart__Alternatives_3
+            // InternalPerspectiveDsl.g:14652:2: ( rule__XCasePart__Alternatives_3 )
+            // InternalPerspectiveDsl.g:14652:3: rule__XCasePart__Alternatives_3
             {
             pushFollow(FOLLOW_2);
             rule__XCasePart__Alternatives_3();
@@ -48427,14 +48427,14 @@
 
 
     // $ANTLR start "rule__XCasePart__Group_2__0"
-    // InternalPerspectiveDsl.g:14659:1: rule__XCasePart__Group_2__0 : rule__XCasePart__Group_2__0__Impl rule__XCasePart__Group_2__1 ;
+    // InternalPerspectiveDsl.g:14661:1: rule__XCasePart__Group_2__0 : rule__XCasePart__Group_2__0__Impl rule__XCasePart__Group_2__1 ;
     public final void rule__XCasePart__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14663:1: ( rule__XCasePart__Group_2__0__Impl rule__XCasePart__Group_2__1 )
-            // InternalPerspectiveDsl.g:14664:2: rule__XCasePart__Group_2__0__Impl rule__XCasePart__Group_2__1
+            // InternalPerspectiveDsl.g:14665:1: ( rule__XCasePart__Group_2__0__Impl rule__XCasePart__Group_2__1 )
+            // InternalPerspectiveDsl.g:14666:2: rule__XCasePart__Group_2__0__Impl rule__XCasePart__Group_2__1
             {
             pushFollow(FOLLOW_54);
             rule__XCasePart__Group_2__0__Impl();
@@ -48465,17 +48465,17 @@
 
 
     // $ANTLR start "rule__XCasePart__Group_2__0__Impl"
-    // InternalPerspectiveDsl.g:14671:1: rule__XCasePart__Group_2__0__Impl : ( 'case' ) ;
+    // InternalPerspectiveDsl.g:14673:1: rule__XCasePart__Group_2__0__Impl : ( 'case' ) ;
     public final void rule__XCasePart__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14675:1: ( ( 'case' ) )
-            // InternalPerspectiveDsl.g:14676:1: ( 'case' )
+            // InternalPerspectiveDsl.g:14677:1: ( ( 'case' ) )
+            // InternalPerspectiveDsl.g:14678:1: ( 'case' )
             {
-            // InternalPerspectiveDsl.g:14676:1: ( 'case' )
-            // InternalPerspectiveDsl.g:14677:2: 'case'
+            // InternalPerspectiveDsl.g:14678:1: ( 'case' )
+            // InternalPerspectiveDsl.g:14679:2: 'case'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getCaseKeyword_2_0()); 
@@ -48506,14 +48506,14 @@
 
 
     // $ANTLR start "rule__XCasePart__Group_2__1"
-    // InternalPerspectiveDsl.g:14686:1: rule__XCasePart__Group_2__1 : rule__XCasePart__Group_2__1__Impl ;
+    // InternalPerspectiveDsl.g:14688:1: rule__XCasePart__Group_2__1 : rule__XCasePart__Group_2__1__Impl ;
     public final void rule__XCasePart__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14690:1: ( rule__XCasePart__Group_2__1__Impl )
-            // InternalPerspectiveDsl.g:14691:2: rule__XCasePart__Group_2__1__Impl
+            // InternalPerspectiveDsl.g:14692:1: ( rule__XCasePart__Group_2__1__Impl )
+            // InternalPerspectiveDsl.g:14693:2: rule__XCasePart__Group_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XCasePart__Group_2__1__Impl();
@@ -48539,23 +48539,23 @@
 
 
     // $ANTLR start "rule__XCasePart__Group_2__1__Impl"
-    // InternalPerspectiveDsl.g:14697:1: rule__XCasePart__Group_2__1__Impl : ( ( rule__XCasePart__CaseAssignment_2_1 ) ) ;
+    // InternalPerspectiveDsl.g:14699:1: rule__XCasePart__Group_2__1__Impl : ( ( rule__XCasePart__CaseAssignment_2_1 ) ) ;
     public final void rule__XCasePart__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14701:1: ( ( ( rule__XCasePart__CaseAssignment_2_1 ) ) )
-            // InternalPerspectiveDsl.g:14702:1: ( ( rule__XCasePart__CaseAssignment_2_1 ) )
+            // InternalPerspectiveDsl.g:14703:1: ( ( ( rule__XCasePart__CaseAssignment_2_1 ) ) )
+            // InternalPerspectiveDsl.g:14704:1: ( ( rule__XCasePart__CaseAssignment_2_1 ) )
             {
-            // InternalPerspectiveDsl.g:14702:1: ( ( rule__XCasePart__CaseAssignment_2_1 ) )
-            // InternalPerspectiveDsl.g:14703:2: ( rule__XCasePart__CaseAssignment_2_1 )
+            // InternalPerspectiveDsl.g:14704:1: ( ( rule__XCasePart__CaseAssignment_2_1 ) )
+            // InternalPerspectiveDsl.g:14705:2: ( rule__XCasePart__CaseAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getCaseAssignment_2_1()); 
             }
-            // InternalPerspectiveDsl.g:14704:2: ( rule__XCasePart__CaseAssignment_2_1 )
-            // InternalPerspectiveDsl.g:14704:3: rule__XCasePart__CaseAssignment_2_1
+            // InternalPerspectiveDsl.g:14706:2: ( rule__XCasePart__CaseAssignment_2_1 )
+            // InternalPerspectiveDsl.g:14706:3: rule__XCasePart__CaseAssignment_2_1
             {
             pushFollow(FOLLOW_2);
             rule__XCasePart__CaseAssignment_2_1();
@@ -48590,14 +48590,14 @@
 
 
     // $ANTLR start "rule__XCasePart__Group_3_0__0"
-    // InternalPerspectiveDsl.g:14713:1: rule__XCasePart__Group_3_0__0 : rule__XCasePart__Group_3_0__0__Impl rule__XCasePart__Group_3_0__1 ;
+    // InternalPerspectiveDsl.g:14715:1: rule__XCasePart__Group_3_0__0 : rule__XCasePart__Group_3_0__0__Impl rule__XCasePart__Group_3_0__1 ;
     public final void rule__XCasePart__Group_3_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14717:1: ( rule__XCasePart__Group_3_0__0__Impl rule__XCasePart__Group_3_0__1 )
-            // InternalPerspectiveDsl.g:14718:2: rule__XCasePart__Group_3_0__0__Impl rule__XCasePart__Group_3_0__1
+            // InternalPerspectiveDsl.g:14719:1: ( rule__XCasePart__Group_3_0__0__Impl rule__XCasePart__Group_3_0__1 )
+            // InternalPerspectiveDsl.g:14720:2: rule__XCasePart__Group_3_0__0__Impl rule__XCasePart__Group_3_0__1
             {
             pushFollow(FOLLOW_54);
             rule__XCasePart__Group_3_0__0__Impl();
@@ -48628,17 +48628,17 @@
 
 
     // $ANTLR start "rule__XCasePart__Group_3_0__0__Impl"
-    // InternalPerspectiveDsl.g:14725:1: rule__XCasePart__Group_3_0__0__Impl : ( ':' ) ;
+    // InternalPerspectiveDsl.g:14727:1: rule__XCasePart__Group_3_0__0__Impl : ( ':' ) ;
     public final void rule__XCasePart__Group_3_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14729:1: ( ( ':' ) )
-            // InternalPerspectiveDsl.g:14730:1: ( ':' )
+            // InternalPerspectiveDsl.g:14731:1: ( ( ':' ) )
+            // InternalPerspectiveDsl.g:14732:1: ( ':' )
             {
-            // InternalPerspectiveDsl.g:14730:1: ( ':' )
-            // InternalPerspectiveDsl.g:14731:2: ':'
+            // InternalPerspectiveDsl.g:14732:1: ( ':' )
+            // InternalPerspectiveDsl.g:14733:2: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0()); 
@@ -48669,14 +48669,14 @@
 
 
     // $ANTLR start "rule__XCasePart__Group_3_0__1"
-    // InternalPerspectiveDsl.g:14740:1: rule__XCasePart__Group_3_0__1 : rule__XCasePart__Group_3_0__1__Impl ;
+    // InternalPerspectiveDsl.g:14742:1: rule__XCasePart__Group_3_0__1 : rule__XCasePart__Group_3_0__1__Impl ;
     public final void rule__XCasePart__Group_3_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14744:1: ( rule__XCasePart__Group_3_0__1__Impl )
-            // InternalPerspectiveDsl.g:14745:2: rule__XCasePart__Group_3_0__1__Impl
+            // InternalPerspectiveDsl.g:14746:1: ( rule__XCasePart__Group_3_0__1__Impl )
+            // InternalPerspectiveDsl.g:14747:2: rule__XCasePart__Group_3_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XCasePart__Group_3_0__1__Impl();
@@ -48702,23 +48702,23 @@
 
 
     // $ANTLR start "rule__XCasePart__Group_3_0__1__Impl"
-    // InternalPerspectiveDsl.g:14751:1: rule__XCasePart__Group_3_0__1__Impl : ( ( rule__XCasePart__ThenAssignment_3_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:14753:1: rule__XCasePart__Group_3_0__1__Impl : ( ( rule__XCasePart__ThenAssignment_3_0_1 ) ) ;
     public final void rule__XCasePart__Group_3_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14755:1: ( ( ( rule__XCasePart__ThenAssignment_3_0_1 ) ) )
-            // InternalPerspectiveDsl.g:14756:1: ( ( rule__XCasePart__ThenAssignment_3_0_1 ) )
+            // InternalPerspectiveDsl.g:14757:1: ( ( ( rule__XCasePart__ThenAssignment_3_0_1 ) ) )
+            // InternalPerspectiveDsl.g:14758:1: ( ( rule__XCasePart__ThenAssignment_3_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:14756:1: ( ( rule__XCasePart__ThenAssignment_3_0_1 ) )
-            // InternalPerspectiveDsl.g:14757:2: ( rule__XCasePart__ThenAssignment_3_0_1 )
+            // InternalPerspectiveDsl.g:14758:1: ( ( rule__XCasePart__ThenAssignment_3_0_1 ) )
+            // InternalPerspectiveDsl.g:14759:2: ( rule__XCasePart__ThenAssignment_3_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getThenAssignment_3_0_1()); 
             }
-            // InternalPerspectiveDsl.g:14758:2: ( rule__XCasePart__ThenAssignment_3_0_1 )
-            // InternalPerspectiveDsl.g:14758:3: rule__XCasePart__ThenAssignment_3_0_1
+            // InternalPerspectiveDsl.g:14760:2: ( rule__XCasePart__ThenAssignment_3_0_1 )
+            // InternalPerspectiveDsl.g:14760:3: rule__XCasePart__ThenAssignment_3_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XCasePart__ThenAssignment_3_0_1();
@@ -48753,14 +48753,14 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group__0"
-    // InternalPerspectiveDsl.g:14767:1: rule__XForLoopExpression__Group__0 : rule__XForLoopExpression__Group__0__Impl rule__XForLoopExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:14769:1: rule__XForLoopExpression__Group__0 : rule__XForLoopExpression__Group__0__Impl rule__XForLoopExpression__Group__1 ;
     public final void rule__XForLoopExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14771:1: ( rule__XForLoopExpression__Group__0__Impl rule__XForLoopExpression__Group__1 )
-            // InternalPerspectiveDsl.g:14772:2: rule__XForLoopExpression__Group__0__Impl rule__XForLoopExpression__Group__1
+            // InternalPerspectiveDsl.g:14773:1: ( rule__XForLoopExpression__Group__0__Impl rule__XForLoopExpression__Group__1 )
+            // InternalPerspectiveDsl.g:14774:2: rule__XForLoopExpression__Group__0__Impl rule__XForLoopExpression__Group__1
             {
             pushFollow(FOLLOW_54);
             rule__XForLoopExpression__Group__0__Impl();
@@ -48791,23 +48791,23 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:14779:1: rule__XForLoopExpression__Group__0__Impl : ( ( rule__XForLoopExpression__Group_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:14781:1: rule__XForLoopExpression__Group__0__Impl : ( ( rule__XForLoopExpression__Group_0__0 ) ) ;
     public final void rule__XForLoopExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14783:1: ( ( ( rule__XForLoopExpression__Group_0__0 ) ) )
-            // InternalPerspectiveDsl.g:14784:1: ( ( rule__XForLoopExpression__Group_0__0 ) )
+            // InternalPerspectiveDsl.g:14785:1: ( ( ( rule__XForLoopExpression__Group_0__0 ) ) )
+            // InternalPerspectiveDsl.g:14786:1: ( ( rule__XForLoopExpression__Group_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:14784:1: ( ( rule__XForLoopExpression__Group_0__0 ) )
-            // InternalPerspectiveDsl.g:14785:2: ( rule__XForLoopExpression__Group_0__0 )
+            // InternalPerspectiveDsl.g:14786:1: ( ( rule__XForLoopExpression__Group_0__0 ) )
+            // InternalPerspectiveDsl.g:14787:2: ( rule__XForLoopExpression__Group_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getGroup_0()); 
             }
-            // InternalPerspectiveDsl.g:14786:2: ( rule__XForLoopExpression__Group_0__0 )
-            // InternalPerspectiveDsl.g:14786:3: rule__XForLoopExpression__Group_0__0
+            // InternalPerspectiveDsl.g:14788:2: ( rule__XForLoopExpression__Group_0__0 )
+            // InternalPerspectiveDsl.g:14788:3: rule__XForLoopExpression__Group_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XForLoopExpression__Group_0__0();
@@ -48842,14 +48842,14 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group__1"
-    // InternalPerspectiveDsl.g:14794:1: rule__XForLoopExpression__Group__1 : rule__XForLoopExpression__Group__1__Impl rule__XForLoopExpression__Group__2 ;
+    // InternalPerspectiveDsl.g:14796:1: rule__XForLoopExpression__Group__1 : rule__XForLoopExpression__Group__1__Impl rule__XForLoopExpression__Group__2 ;
     public final void rule__XForLoopExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14798:1: ( rule__XForLoopExpression__Group__1__Impl rule__XForLoopExpression__Group__2 )
-            // InternalPerspectiveDsl.g:14799:2: rule__XForLoopExpression__Group__1__Impl rule__XForLoopExpression__Group__2
+            // InternalPerspectiveDsl.g:14800:1: ( rule__XForLoopExpression__Group__1__Impl rule__XForLoopExpression__Group__2 )
+            // InternalPerspectiveDsl.g:14801:2: rule__XForLoopExpression__Group__1__Impl rule__XForLoopExpression__Group__2
             {
             pushFollow(FOLLOW_99);
             rule__XForLoopExpression__Group__1__Impl();
@@ -48880,23 +48880,23 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:14806:1: rule__XForLoopExpression__Group__1__Impl : ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) ) ;
+    // InternalPerspectiveDsl.g:14808:1: rule__XForLoopExpression__Group__1__Impl : ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) ) ;
     public final void rule__XForLoopExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14810:1: ( ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) ) )
-            // InternalPerspectiveDsl.g:14811:1: ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) )
+            // InternalPerspectiveDsl.g:14812:1: ( ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) ) )
+            // InternalPerspectiveDsl.g:14813:1: ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) )
             {
-            // InternalPerspectiveDsl.g:14811:1: ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) )
-            // InternalPerspectiveDsl.g:14812:2: ( rule__XForLoopExpression__ForExpressionAssignment_1 )
+            // InternalPerspectiveDsl.g:14813:1: ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) )
+            // InternalPerspectiveDsl.g:14814:2: ( rule__XForLoopExpression__ForExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getForExpressionAssignment_1()); 
             }
-            // InternalPerspectiveDsl.g:14813:2: ( rule__XForLoopExpression__ForExpressionAssignment_1 )
-            // InternalPerspectiveDsl.g:14813:3: rule__XForLoopExpression__ForExpressionAssignment_1
+            // InternalPerspectiveDsl.g:14815:2: ( rule__XForLoopExpression__ForExpressionAssignment_1 )
+            // InternalPerspectiveDsl.g:14815:3: rule__XForLoopExpression__ForExpressionAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__XForLoopExpression__ForExpressionAssignment_1();
@@ -48931,14 +48931,14 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group__2"
-    // InternalPerspectiveDsl.g:14821:1: rule__XForLoopExpression__Group__2 : rule__XForLoopExpression__Group__2__Impl rule__XForLoopExpression__Group__3 ;
+    // InternalPerspectiveDsl.g:14823:1: rule__XForLoopExpression__Group__2 : rule__XForLoopExpression__Group__2__Impl rule__XForLoopExpression__Group__3 ;
     public final void rule__XForLoopExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14825:1: ( rule__XForLoopExpression__Group__2__Impl rule__XForLoopExpression__Group__3 )
-            // InternalPerspectiveDsl.g:14826:2: rule__XForLoopExpression__Group__2__Impl rule__XForLoopExpression__Group__3
+            // InternalPerspectiveDsl.g:14827:1: ( rule__XForLoopExpression__Group__2__Impl rule__XForLoopExpression__Group__3 )
+            // InternalPerspectiveDsl.g:14828:2: rule__XForLoopExpression__Group__2__Impl rule__XForLoopExpression__Group__3
             {
             pushFollow(FOLLOW_54);
             rule__XForLoopExpression__Group__2__Impl();
@@ -48969,17 +48969,17 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group__2__Impl"
-    // InternalPerspectiveDsl.g:14833:1: rule__XForLoopExpression__Group__2__Impl : ( ')' ) ;
+    // InternalPerspectiveDsl.g:14835:1: rule__XForLoopExpression__Group__2__Impl : ( ')' ) ;
     public final void rule__XForLoopExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14837:1: ( ( ')' ) )
-            // InternalPerspectiveDsl.g:14838:1: ( ')' )
+            // InternalPerspectiveDsl.g:14839:1: ( ( ')' ) )
+            // InternalPerspectiveDsl.g:14840:1: ( ')' )
             {
-            // InternalPerspectiveDsl.g:14838:1: ( ')' )
-            // InternalPerspectiveDsl.g:14839:2: ')'
+            // InternalPerspectiveDsl.g:14840:1: ( ')' )
+            // InternalPerspectiveDsl.g:14841:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2()); 
@@ -49010,14 +49010,14 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group__3"
-    // InternalPerspectiveDsl.g:14848:1: rule__XForLoopExpression__Group__3 : rule__XForLoopExpression__Group__3__Impl ;
+    // InternalPerspectiveDsl.g:14850:1: rule__XForLoopExpression__Group__3 : rule__XForLoopExpression__Group__3__Impl ;
     public final void rule__XForLoopExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14852:1: ( rule__XForLoopExpression__Group__3__Impl )
-            // InternalPerspectiveDsl.g:14853:2: rule__XForLoopExpression__Group__3__Impl
+            // InternalPerspectiveDsl.g:14854:1: ( rule__XForLoopExpression__Group__3__Impl )
+            // InternalPerspectiveDsl.g:14855:2: rule__XForLoopExpression__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XForLoopExpression__Group__3__Impl();
@@ -49043,23 +49043,23 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group__3__Impl"
-    // InternalPerspectiveDsl.g:14859:1: rule__XForLoopExpression__Group__3__Impl : ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) ) ;
+    // InternalPerspectiveDsl.g:14861:1: rule__XForLoopExpression__Group__3__Impl : ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) ) ;
     public final void rule__XForLoopExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14863:1: ( ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) ) )
-            // InternalPerspectiveDsl.g:14864:1: ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) )
+            // InternalPerspectiveDsl.g:14865:1: ( ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) ) )
+            // InternalPerspectiveDsl.g:14866:1: ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) )
             {
-            // InternalPerspectiveDsl.g:14864:1: ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) )
-            // InternalPerspectiveDsl.g:14865:2: ( rule__XForLoopExpression__EachExpressionAssignment_3 )
+            // InternalPerspectiveDsl.g:14866:1: ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) )
+            // InternalPerspectiveDsl.g:14867:2: ( rule__XForLoopExpression__EachExpressionAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getEachExpressionAssignment_3()); 
             }
-            // InternalPerspectiveDsl.g:14866:2: ( rule__XForLoopExpression__EachExpressionAssignment_3 )
-            // InternalPerspectiveDsl.g:14866:3: rule__XForLoopExpression__EachExpressionAssignment_3
+            // InternalPerspectiveDsl.g:14868:2: ( rule__XForLoopExpression__EachExpressionAssignment_3 )
+            // InternalPerspectiveDsl.g:14868:3: rule__XForLoopExpression__EachExpressionAssignment_3
             {
             pushFollow(FOLLOW_2);
             rule__XForLoopExpression__EachExpressionAssignment_3();
@@ -49094,14 +49094,14 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0__0"
-    // InternalPerspectiveDsl.g:14875:1: rule__XForLoopExpression__Group_0__0 : rule__XForLoopExpression__Group_0__0__Impl ;
+    // InternalPerspectiveDsl.g:14877:1: rule__XForLoopExpression__Group_0__0 : rule__XForLoopExpression__Group_0__0__Impl ;
     public final void rule__XForLoopExpression__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14879:1: ( rule__XForLoopExpression__Group_0__0__Impl )
-            // InternalPerspectiveDsl.g:14880:2: rule__XForLoopExpression__Group_0__0__Impl
+            // InternalPerspectiveDsl.g:14881:1: ( rule__XForLoopExpression__Group_0__0__Impl )
+            // InternalPerspectiveDsl.g:14882:2: rule__XForLoopExpression__Group_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XForLoopExpression__Group_0__0__Impl();
@@ -49127,23 +49127,23 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0__0__Impl"
-    // InternalPerspectiveDsl.g:14886:1: rule__XForLoopExpression__Group_0__0__Impl : ( ( rule__XForLoopExpression__Group_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:14888:1: rule__XForLoopExpression__Group_0__0__Impl : ( ( rule__XForLoopExpression__Group_0_0__0 ) ) ;
     public final void rule__XForLoopExpression__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14890:1: ( ( ( rule__XForLoopExpression__Group_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:14891:1: ( ( rule__XForLoopExpression__Group_0_0__0 ) )
+            // InternalPerspectiveDsl.g:14892:1: ( ( ( rule__XForLoopExpression__Group_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:14893:1: ( ( rule__XForLoopExpression__Group_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:14891:1: ( ( rule__XForLoopExpression__Group_0_0__0 ) )
-            // InternalPerspectiveDsl.g:14892:2: ( rule__XForLoopExpression__Group_0_0__0 )
+            // InternalPerspectiveDsl.g:14893:1: ( ( rule__XForLoopExpression__Group_0_0__0 ) )
+            // InternalPerspectiveDsl.g:14894:2: ( rule__XForLoopExpression__Group_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getGroup_0_0()); 
             }
-            // InternalPerspectiveDsl.g:14893:2: ( rule__XForLoopExpression__Group_0_0__0 )
-            // InternalPerspectiveDsl.g:14893:3: rule__XForLoopExpression__Group_0_0__0
+            // InternalPerspectiveDsl.g:14895:2: ( rule__XForLoopExpression__Group_0_0__0 )
+            // InternalPerspectiveDsl.g:14895:3: rule__XForLoopExpression__Group_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XForLoopExpression__Group_0_0__0();
@@ -49178,14 +49178,14 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__0"
-    // InternalPerspectiveDsl.g:14902:1: rule__XForLoopExpression__Group_0_0__0 : rule__XForLoopExpression__Group_0_0__0__Impl rule__XForLoopExpression__Group_0_0__1 ;
+    // InternalPerspectiveDsl.g:14904:1: rule__XForLoopExpression__Group_0_0__0 : rule__XForLoopExpression__Group_0_0__0__Impl rule__XForLoopExpression__Group_0_0__1 ;
     public final void rule__XForLoopExpression__Group_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14906:1: ( rule__XForLoopExpression__Group_0_0__0__Impl rule__XForLoopExpression__Group_0_0__1 )
-            // InternalPerspectiveDsl.g:14907:2: rule__XForLoopExpression__Group_0_0__0__Impl rule__XForLoopExpression__Group_0_0__1
+            // InternalPerspectiveDsl.g:14908:1: ( rule__XForLoopExpression__Group_0_0__0__Impl rule__XForLoopExpression__Group_0_0__1 )
+            // InternalPerspectiveDsl.g:14909:2: rule__XForLoopExpression__Group_0_0__0__Impl rule__XForLoopExpression__Group_0_0__1
             {
             pushFollow(FOLLOW_108);
             rule__XForLoopExpression__Group_0_0__0__Impl();
@@ -49216,23 +49216,23 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:14914:1: rule__XForLoopExpression__Group_0_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:14916:1: rule__XForLoopExpression__Group_0_0__0__Impl : ( () ) ;
     public final void rule__XForLoopExpression__Group_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14918:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:14919:1: ( () )
+            // InternalPerspectiveDsl.g:14920:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:14921:1: ( () )
             {
-            // InternalPerspectiveDsl.g:14919:1: ( () )
-            // InternalPerspectiveDsl.g:14920:2: ()
+            // InternalPerspectiveDsl.g:14921:1: ( () )
+            // InternalPerspectiveDsl.g:14922:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:14921:2: ()
-            // InternalPerspectiveDsl.g:14921:3: 
+            // InternalPerspectiveDsl.g:14923:2: ()
+            // InternalPerspectiveDsl.g:14923:3: 
             {
             }
 
@@ -49257,14 +49257,14 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__1"
-    // InternalPerspectiveDsl.g:14929:1: rule__XForLoopExpression__Group_0_0__1 : rule__XForLoopExpression__Group_0_0__1__Impl rule__XForLoopExpression__Group_0_0__2 ;
+    // InternalPerspectiveDsl.g:14931:1: rule__XForLoopExpression__Group_0_0__1 : rule__XForLoopExpression__Group_0_0__1__Impl rule__XForLoopExpression__Group_0_0__2 ;
     public final void rule__XForLoopExpression__Group_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14933:1: ( rule__XForLoopExpression__Group_0_0__1__Impl rule__XForLoopExpression__Group_0_0__2 )
-            // InternalPerspectiveDsl.g:14934:2: rule__XForLoopExpression__Group_0_0__1__Impl rule__XForLoopExpression__Group_0_0__2
+            // InternalPerspectiveDsl.g:14935:1: ( rule__XForLoopExpression__Group_0_0__1__Impl rule__XForLoopExpression__Group_0_0__2 )
+            // InternalPerspectiveDsl.g:14936:2: rule__XForLoopExpression__Group_0_0__1__Impl rule__XForLoopExpression__Group_0_0__2
             {
             pushFollow(FOLLOW_50);
             rule__XForLoopExpression__Group_0_0__1__Impl();
@@ -49295,17 +49295,17 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:14941:1: rule__XForLoopExpression__Group_0_0__1__Impl : ( 'for' ) ;
+    // InternalPerspectiveDsl.g:14943:1: rule__XForLoopExpression__Group_0_0__1__Impl : ( 'for' ) ;
     public final void rule__XForLoopExpression__Group_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14945:1: ( ( 'for' ) )
-            // InternalPerspectiveDsl.g:14946:1: ( 'for' )
+            // InternalPerspectiveDsl.g:14947:1: ( ( 'for' ) )
+            // InternalPerspectiveDsl.g:14948:1: ( 'for' )
             {
-            // InternalPerspectiveDsl.g:14946:1: ( 'for' )
-            // InternalPerspectiveDsl.g:14947:2: 'for'
+            // InternalPerspectiveDsl.g:14948:1: ( 'for' )
+            // InternalPerspectiveDsl.g:14949:2: 'for'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1()); 
@@ -49336,14 +49336,14 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__2"
-    // InternalPerspectiveDsl.g:14956:1: rule__XForLoopExpression__Group_0_0__2 : rule__XForLoopExpression__Group_0_0__2__Impl rule__XForLoopExpression__Group_0_0__3 ;
+    // InternalPerspectiveDsl.g:14958:1: rule__XForLoopExpression__Group_0_0__2 : rule__XForLoopExpression__Group_0_0__2__Impl rule__XForLoopExpression__Group_0_0__3 ;
     public final void rule__XForLoopExpression__Group_0_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14960:1: ( rule__XForLoopExpression__Group_0_0__2__Impl rule__XForLoopExpression__Group_0_0__3 )
-            // InternalPerspectiveDsl.g:14961:2: rule__XForLoopExpression__Group_0_0__2__Impl rule__XForLoopExpression__Group_0_0__3
+            // InternalPerspectiveDsl.g:14962:1: ( rule__XForLoopExpression__Group_0_0__2__Impl rule__XForLoopExpression__Group_0_0__3 )
+            // InternalPerspectiveDsl.g:14963:2: rule__XForLoopExpression__Group_0_0__2__Impl rule__XForLoopExpression__Group_0_0__3
             {
             pushFollow(FOLLOW_71);
             rule__XForLoopExpression__Group_0_0__2__Impl();
@@ -49374,17 +49374,17 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__2__Impl"
-    // InternalPerspectiveDsl.g:14968:1: rule__XForLoopExpression__Group_0_0__2__Impl : ( '(' ) ;
+    // InternalPerspectiveDsl.g:14970:1: rule__XForLoopExpression__Group_0_0__2__Impl : ( '(' ) ;
     public final void rule__XForLoopExpression__Group_0_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14972:1: ( ( '(' ) )
-            // InternalPerspectiveDsl.g:14973:1: ( '(' )
+            // InternalPerspectiveDsl.g:14974:1: ( ( '(' ) )
+            // InternalPerspectiveDsl.g:14975:1: ( '(' )
             {
-            // InternalPerspectiveDsl.g:14973:1: ( '(' )
-            // InternalPerspectiveDsl.g:14974:2: '('
+            // InternalPerspectiveDsl.g:14975:1: ( '(' )
+            // InternalPerspectiveDsl.g:14976:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2()); 
@@ -49415,14 +49415,14 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__3"
-    // InternalPerspectiveDsl.g:14983:1: rule__XForLoopExpression__Group_0_0__3 : rule__XForLoopExpression__Group_0_0__3__Impl rule__XForLoopExpression__Group_0_0__4 ;
+    // InternalPerspectiveDsl.g:14985:1: rule__XForLoopExpression__Group_0_0__3 : rule__XForLoopExpression__Group_0_0__3__Impl rule__XForLoopExpression__Group_0_0__4 ;
     public final void rule__XForLoopExpression__Group_0_0__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14987:1: ( rule__XForLoopExpression__Group_0_0__3__Impl rule__XForLoopExpression__Group_0_0__4 )
-            // InternalPerspectiveDsl.g:14988:2: rule__XForLoopExpression__Group_0_0__3__Impl rule__XForLoopExpression__Group_0_0__4
+            // InternalPerspectiveDsl.g:14989:1: ( rule__XForLoopExpression__Group_0_0__3__Impl rule__XForLoopExpression__Group_0_0__4 )
+            // InternalPerspectiveDsl.g:14990:2: rule__XForLoopExpression__Group_0_0__3__Impl rule__XForLoopExpression__Group_0_0__4
             {
             pushFollow(FOLLOW_106);
             rule__XForLoopExpression__Group_0_0__3__Impl();
@@ -49453,23 +49453,23 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__3__Impl"
-    // InternalPerspectiveDsl.g:14995:1: rule__XForLoopExpression__Group_0_0__3__Impl : ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) ) ;
+    // InternalPerspectiveDsl.g:14997:1: rule__XForLoopExpression__Group_0_0__3__Impl : ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) ) ;
     public final void rule__XForLoopExpression__Group_0_0__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:14999:1: ( ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) ) )
-            // InternalPerspectiveDsl.g:15000:1: ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) )
+            // InternalPerspectiveDsl.g:15001:1: ( ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) ) )
+            // InternalPerspectiveDsl.g:15002:1: ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) )
             {
-            // InternalPerspectiveDsl.g:15000:1: ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) )
-            // InternalPerspectiveDsl.g:15001:2: ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 )
+            // InternalPerspectiveDsl.g:15002:1: ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) )
+            // InternalPerspectiveDsl.g:15003:2: ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamAssignment_0_0_3()); 
             }
-            // InternalPerspectiveDsl.g:15002:2: ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 )
-            // InternalPerspectiveDsl.g:15002:3: rule__XForLoopExpression__DeclaredParamAssignment_0_0_3
+            // InternalPerspectiveDsl.g:15004:2: ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 )
+            // InternalPerspectiveDsl.g:15004:3: rule__XForLoopExpression__DeclaredParamAssignment_0_0_3
             {
             pushFollow(FOLLOW_2);
             rule__XForLoopExpression__DeclaredParamAssignment_0_0_3();
@@ -49504,14 +49504,14 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__4"
-    // InternalPerspectiveDsl.g:15010:1: rule__XForLoopExpression__Group_0_0__4 : rule__XForLoopExpression__Group_0_0__4__Impl ;
+    // InternalPerspectiveDsl.g:15012:1: rule__XForLoopExpression__Group_0_0__4 : rule__XForLoopExpression__Group_0_0__4__Impl ;
     public final void rule__XForLoopExpression__Group_0_0__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15014:1: ( rule__XForLoopExpression__Group_0_0__4__Impl )
-            // InternalPerspectiveDsl.g:15015:2: rule__XForLoopExpression__Group_0_0__4__Impl
+            // InternalPerspectiveDsl.g:15016:1: ( rule__XForLoopExpression__Group_0_0__4__Impl )
+            // InternalPerspectiveDsl.g:15017:2: rule__XForLoopExpression__Group_0_0__4__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XForLoopExpression__Group_0_0__4__Impl();
@@ -49537,17 +49537,17 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__4__Impl"
-    // InternalPerspectiveDsl.g:15021:1: rule__XForLoopExpression__Group_0_0__4__Impl : ( ':' ) ;
+    // InternalPerspectiveDsl.g:15023:1: rule__XForLoopExpression__Group_0_0__4__Impl : ( ':' ) ;
     public final void rule__XForLoopExpression__Group_0_0__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15025:1: ( ( ':' ) )
-            // InternalPerspectiveDsl.g:15026:1: ( ':' )
+            // InternalPerspectiveDsl.g:15027:1: ( ( ':' ) )
+            // InternalPerspectiveDsl.g:15028:1: ( ':' )
             {
-            // InternalPerspectiveDsl.g:15026:1: ( ':' )
-            // InternalPerspectiveDsl.g:15027:2: ':'
+            // InternalPerspectiveDsl.g:15028:1: ( ':' )
+            // InternalPerspectiveDsl.g:15029:2: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4()); 
@@ -49578,14 +49578,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__0"
-    // InternalPerspectiveDsl.g:15037:1: rule__XBasicForLoopExpression__Group__0 : rule__XBasicForLoopExpression__Group__0__Impl rule__XBasicForLoopExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:15039:1: rule__XBasicForLoopExpression__Group__0 : rule__XBasicForLoopExpression__Group__0__Impl rule__XBasicForLoopExpression__Group__1 ;
     public final void rule__XBasicForLoopExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15041:1: ( rule__XBasicForLoopExpression__Group__0__Impl rule__XBasicForLoopExpression__Group__1 )
-            // InternalPerspectiveDsl.g:15042:2: rule__XBasicForLoopExpression__Group__0__Impl rule__XBasicForLoopExpression__Group__1
+            // InternalPerspectiveDsl.g:15043:1: ( rule__XBasicForLoopExpression__Group__0__Impl rule__XBasicForLoopExpression__Group__1 )
+            // InternalPerspectiveDsl.g:15044:2: rule__XBasicForLoopExpression__Group__0__Impl rule__XBasicForLoopExpression__Group__1
             {
             pushFollow(FOLLOW_108);
             rule__XBasicForLoopExpression__Group__0__Impl();
@@ -49616,23 +49616,23 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:15049:1: rule__XBasicForLoopExpression__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:15051:1: rule__XBasicForLoopExpression__Group__0__Impl : ( () ) ;
     public final void rule__XBasicForLoopExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15053:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:15054:1: ( () )
+            // InternalPerspectiveDsl.g:15055:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:15056:1: ( () )
             {
-            // InternalPerspectiveDsl.g:15054:1: ( () )
-            // InternalPerspectiveDsl.g:15055:2: ()
+            // InternalPerspectiveDsl.g:15056:1: ( () )
+            // InternalPerspectiveDsl.g:15057:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getXBasicForLoopExpressionAction_0()); 
             }
-            // InternalPerspectiveDsl.g:15056:2: ()
-            // InternalPerspectiveDsl.g:15056:3: 
+            // InternalPerspectiveDsl.g:15058:2: ()
+            // InternalPerspectiveDsl.g:15058:3: 
             {
             }
 
@@ -49657,14 +49657,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__1"
-    // InternalPerspectiveDsl.g:15064:1: rule__XBasicForLoopExpression__Group__1 : rule__XBasicForLoopExpression__Group__1__Impl rule__XBasicForLoopExpression__Group__2 ;
+    // InternalPerspectiveDsl.g:15066:1: rule__XBasicForLoopExpression__Group__1 : rule__XBasicForLoopExpression__Group__1__Impl rule__XBasicForLoopExpression__Group__2 ;
     public final void rule__XBasicForLoopExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15068:1: ( rule__XBasicForLoopExpression__Group__1__Impl rule__XBasicForLoopExpression__Group__2 )
-            // InternalPerspectiveDsl.g:15069:2: rule__XBasicForLoopExpression__Group__1__Impl rule__XBasicForLoopExpression__Group__2
+            // InternalPerspectiveDsl.g:15070:1: ( rule__XBasicForLoopExpression__Group__1__Impl rule__XBasicForLoopExpression__Group__2 )
+            // InternalPerspectiveDsl.g:15071:2: rule__XBasicForLoopExpression__Group__1__Impl rule__XBasicForLoopExpression__Group__2
             {
             pushFollow(FOLLOW_50);
             rule__XBasicForLoopExpression__Group__1__Impl();
@@ -49695,17 +49695,17 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:15076:1: rule__XBasicForLoopExpression__Group__1__Impl : ( 'for' ) ;
+    // InternalPerspectiveDsl.g:15078:1: rule__XBasicForLoopExpression__Group__1__Impl : ( 'for' ) ;
     public final void rule__XBasicForLoopExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15080:1: ( ( 'for' ) )
-            // InternalPerspectiveDsl.g:15081:1: ( 'for' )
+            // InternalPerspectiveDsl.g:15082:1: ( ( 'for' ) )
+            // InternalPerspectiveDsl.g:15083:1: ( 'for' )
             {
-            // InternalPerspectiveDsl.g:15081:1: ( 'for' )
-            // InternalPerspectiveDsl.g:15082:2: 'for'
+            // InternalPerspectiveDsl.g:15083:1: ( 'for' )
+            // InternalPerspectiveDsl.g:15084:2: 'for'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1()); 
@@ -49736,14 +49736,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__2"
-    // InternalPerspectiveDsl.g:15091:1: rule__XBasicForLoopExpression__Group__2 : rule__XBasicForLoopExpression__Group__2__Impl rule__XBasicForLoopExpression__Group__3 ;
+    // InternalPerspectiveDsl.g:15093:1: rule__XBasicForLoopExpression__Group__2 : rule__XBasicForLoopExpression__Group__2__Impl rule__XBasicForLoopExpression__Group__3 ;
     public final void rule__XBasicForLoopExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15095:1: ( rule__XBasicForLoopExpression__Group__2__Impl rule__XBasicForLoopExpression__Group__3 )
-            // InternalPerspectiveDsl.g:15096:2: rule__XBasicForLoopExpression__Group__2__Impl rule__XBasicForLoopExpression__Group__3
+            // InternalPerspectiveDsl.g:15097:1: ( rule__XBasicForLoopExpression__Group__2__Impl rule__XBasicForLoopExpression__Group__3 )
+            // InternalPerspectiveDsl.g:15098:2: rule__XBasicForLoopExpression__Group__2__Impl rule__XBasicForLoopExpression__Group__3
             {
             pushFollow(FOLLOW_109);
             rule__XBasicForLoopExpression__Group__2__Impl();
@@ -49774,17 +49774,17 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__2__Impl"
-    // InternalPerspectiveDsl.g:15103:1: rule__XBasicForLoopExpression__Group__2__Impl : ( '(' ) ;
+    // InternalPerspectiveDsl.g:15105:1: rule__XBasicForLoopExpression__Group__2__Impl : ( '(' ) ;
     public final void rule__XBasicForLoopExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15107:1: ( ( '(' ) )
-            // InternalPerspectiveDsl.g:15108:1: ( '(' )
+            // InternalPerspectiveDsl.g:15109:1: ( ( '(' ) )
+            // InternalPerspectiveDsl.g:15110:1: ( '(' )
             {
-            // InternalPerspectiveDsl.g:15108:1: ( '(' )
-            // InternalPerspectiveDsl.g:15109:2: '('
+            // InternalPerspectiveDsl.g:15110:1: ( '(' )
+            // InternalPerspectiveDsl.g:15111:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2()); 
@@ -49815,14 +49815,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__3"
-    // InternalPerspectiveDsl.g:15118:1: rule__XBasicForLoopExpression__Group__3 : rule__XBasicForLoopExpression__Group__3__Impl rule__XBasicForLoopExpression__Group__4 ;
+    // InternalPerspectiveDsl.g:15120:1: rule__XBasicForLoopExpression__Group__3 : rule__XBasicForLoopExpression__Group__3__Impl rule__XBasicForLoopExpression__Group__4 ;
     public final void rule__XBasicForLoopExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15122:1: ( rule__XBasicForLoopExpression__Group__3__Impl rule__XBasicForLoopExpression__Group__4 )
-            // InternalPerspectiveDsl.g:15123:2: rule__XBasicForLoopExpression__Group__3__Impl rule__XBasicForLoopExpression__Group__4
+            // InternalPerspectiveDsl.g:15124:1: ( rule__XBasicForLoopExpression__Group__3__Impl rule__XBasicForLoopExpression__Group__4 )
+            // InternalPerspectiveDsl.g:15125:2: rule__XBasicForLoopExpression__Group__3__Impl rule__XBasicForLoopExpression__Group__4
             {
             pushFollow(FOLLOW_109);
             rule__XBasicForLoopExpression__Group__3__Impl();
@@ -49853,22 +49853,22 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__3__Impl"
-    // InternalPerspectiveDsl.g:15130:1: rule__XBasicForLoopExpression__Group__3__Impl : ( ( rule__XBasicForLoopExpression__Group_3__0 )? ) ;
+    // InternalPerspectiveDsl.g:15132:1: rule__XBasicForLoopExpression__Group__3__Impl : ( ( rule__XBasicForLoopExpression__Group_3__0 )? ) ;
     public final void rule__XBasicForLoopExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15134:1: ( ( ( rule__XBasicForLoopExpression__Group_3__0 )? ) )
-            // InternalPerspectiveDsl.g:15135:1: ( ( rule__XBasicForLoopExpression__Group_3__0 )? )
+            // InternalPerspectiveDsl.g:15136:1: ( ( ( rule__XBasicForLoopExpression__Group_3__0 )? ) )
+            // InternalPerspectiveDsl.g:15137:1: ( ( rule__XBasicForLoopExpression__Group_3__0 )? )
             {
-            // InternalPerspectiveDsl.g:15135:1: ( ( rule__XBasicForLoopExpression__Group_3__0 )? )
-            // InternalPerspectiveDsl.g:15136:2: ( rule__XBasicForLoopExpression__Group_3__0 )?
+            // InternalPerspectiveDsl.g:15137:1: ( ( rule__XBasicForLoopExpression__Group_3__0 )? )
+            // InternalPerspectiveDsl.g:15138:2: ( rule__XBasicForLoopExpression__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_3()); 
             }
-            // InternalPerspectiveDsl.g:15137:2: ( rule__XBasicForLoopExpression__Group_3__0 )?
+            // InternalPerspectiveDsl.g:15139:2: ( rule__XBasicForLoopExpression__Group_3__0 )?
             int alt104=2;
             int LA104_0 = input.LA(1);
 
@@ -49877,7 +49877,7 @@
             }
             switch (alt104) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:15137:3: rule__XBasicForLoopExpression__Group_3__0
+                    // InternalPerspectiveDsl.g:15139:3: rule__XBasicForLoopExpression__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XBasicForLoopExpression__Group_3__0();
@@ -49915,14 +49915,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__4"
-    // InternalPerspectiveDsl.g:15145:1: rule__XBasicForLoopExpression__Group__4 : rule__XBasicForLoopExpression__Group__4__Impl rule__XBasicForLoopExpression__Group__5 ;
+    // InternalPerspectiveDsl.g:15147:1: rule__XBasicForLoopExpression__Group__4 : rule__XBasicForLoopExpression__Group__4__Impl rule__XBasicForLoopExpression__Group__5 ;
     public final void rule__XBasicForLoopExpression__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15149:1: ( rule__XBasicForLoopExpression__Group__4__Impl rule__XBasicForLoopExpression__Group__5 )
-            // InternalPerspectiveDsl.g:15150:2: rule__XBasicForLoopExpression__Group__4__Impl rule__XBasicForLoopExpression__Group__5
+            // InternalPerspectiveDsl.g:15151:1: ( rule__XBasicForLoopExpression__Group__4__Impl rule__XBasicForLoopExpression__Group__5 )
+            // InternalPerspectiveDsl.g:15152:2: rule__XBasicForLoopExpression__Group__4__Impl rule__XBasicForLoopExpression__Group__5
             {
             pushFollow(FOLLOW_110);
             rule__XBasicForLoopExpression__Group__4__Impl();
@@ -49953,17 +49953,17 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__4__Impl"
-    // InternalPerspectiveDsl.g:15157:1: rule__XBasicForLoopExpression__Group__4__Impl : ( ';' ) ;
+    // InternalPerspectiveDsl.g:15159:1: rule__XBasicForLoopExpression__Group__4__Impl : ( ';' ) ;
     public final void rule__XBasicForLoopExpression__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15161:1: ( ( ';' ) )
-            // InternalPerspectiveDsl.g:15162:1: ( ';' )
+            // InternalPerspectiveDsl.g:15163:1: ( ( ';' ) )
+            // InternalPerspectiveDsl.g:15164:1: ( ';' )
             {
-            // InternalPerspectiveDsl.g:15162:1: ( ';' )
-            // InternalPerspectiveDsl.g:15163:2: ';'
+            // InternalPerspectiveDsl.g:15164:1: ( ';' )
+            // InternalPerspectiveDsl.g:15165:2: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4()); 
@@ -49994,14 +49994,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__5"
-    // InternalPerspectiveDsl.g:15172:1: rule__XBasicForLoopExpression__Group__5 : rule__XBasicForLoopExpression__Group__5__Impl rule__XBasicForLoopExpression__Group__6 ;
+    // InternalPerspectiveDsl.g:15174:1: rule__XBasicForLoopExpression__Group__5 : rule__XBasicForLoopExpression__Group__5__Impl rule__XBasicForLoopExpression__Group__6 ;
     public final void rule__XBasicForLoopExpression__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15176:1: ( rule__XBasicForLoopExpression__Group__5__Impl rule__XBasicForLoopExpression__Group__6 )
-            // InternalPerspectiveDsl.g:15177:2: rule__XBasicForLoopExpression__Group__5__Impl rule__XBasicForLoopExpression__Group__6
+            // InternalPerspectiveDsl.g:15178:1: ( rule__XBasicForLoopExpression__Group__5__Impl rule__XBasicForLoopExpression__Group__6 )
+            // InternalPerspectiveDsl.g:15179:2: rule__XBasicForLoopExpression__Group__5__Impl rule__XBasicForLoopExpression__Group__6
             {
             pushFollow(FOLLOW_110);
             rule__XBasicForLoopExpression__Group__5__Impl();
@@ -50032,22 +50032,22 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__5__Impl"
-    // InternalPerspectiveDsl.g:15184:1: rule__XBasicForLoopExpression__Group__5__Impl : ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? ) ;
+    // InternalPerspectiveDsl.g:15186:1: rule__XBasicForLoopExpression__Group__5__Impl : ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? ) ;
     public final void rule__XBasicForLoopExpression__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15188:1: ( ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? ) )
-            // InternalPerspectiveDsl.g:15189:1: ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? )
+            // InternalPerspectiveDsl.g:15190:1: ( ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? ) )
+            // InternalPerspectiveDsl.g:15191:1: ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? )
             {
-            // InternalPerspectiveDsl.g:15189:1: ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? )
-            // InternalPerspectiveDsl.g:15190:2: ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )?
+            // InternalPerspectiveDsl.g:15191:1: ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? )
+            // InternalPerspectiveDsl.g:15192:2: ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionAssignment_5()); 
             }
-            // InternalPerspectiveDsl.g:15191:2: ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )?
+            // InternalPerspectiveDsl.g:15193:2: ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )?
             int alt105=2;
             int LA105_0 = input.LA(1);
 
@@ -50056,7 +50056,7 @@
             }
             switch (alt105) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:15191:3: rule__XBasicForLoopExpression__ExpressionAssignment_5
+                    // InternalPerspectiveDsl.g:15193:3: rule__XBasicForLoopExpression__ExpressionAssignment_5
                     {
                     pushFollow(FOLLOW_2);
                     rule__XBasicForLoopExpression__ExpressionAssignment_5();
@@ -50094,14 +50094,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__6"
-    // InternalPerspectiveDsl.g:15199:1: rule__XBasicForLoopExpression__Group__6 : rule__XBasicForLoopExpression__Group__6__Impl rule__XBasicForLoopExpression__Group__7 ;
+    // InternalPerspectiveDsl.g:15201:1: rule__XBasicForLoopExpression__Group__6 : rule__XBasicForLoopExpression__Group__6__Impl rule__XBasicForLoopExpression__Group__7 ;
     public final void rule__XBasicForLoopExpression__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15203:1: ( rule__XBasicForLoopExpression__Group__6__Impl rule__XBasicForLoopExpression__Group__7 )
-            // InternalPerspectiveDsl.g:15204:2: rule__XBasicForLoopExpression__Group__6__Impl rule__XBasicForLoopExpression__Group__7
+            // InternalPerspectiveDsl.g:15205:1: ( rule__XBasicForLoopExpression__Group__6__Impl rule__XBasicForLoopExpression__Group__7 )
+            // InternalPerspectiveDsl.g:15206:2: rule__XBasicForLoopExpression__Group__6__Impl rule__XBasicForLoopExpression__Group__7
             {
             pushFollow(FOLLOW_51);
             rule__XBasicForLoopExpression__Group__6__Impl();
@@ -50132,17 +50132,17 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__6__Impl"
-    // InternalPerspectiveDsl.g:15211:1: rule__XBasicForLoopExpression__Group__6__Impl : ( ';' ) ;
+    // InternalPerspectiveDsl.g:15213:1: rule__XBasicForLoopExpression__Group__6__Impl : ( ';' ) ;
     public final void rule__XBasicForLoopExpression__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15215:1: ( ( ';' ) )
-            // InternalPerspectiveDsl.g:15216:1: ( ';' )
+            // InternalPerspectiveDsl.g:15217:1: ( ( ';' ) )
+            // InternalPerspectiveDsl.g:15218:1: ( ';' )
             {
-            // InternalPerspectiveDsl.g:15216:1: ( ';' )
-            // InternalPerspectiveDsl.g:15217:2: ';'
+            // InternalPerspectiveDsl.g:15218:1: ( ';' )
+            // InternalPerspectiveDsl.g:15219:2: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6()); 
@@ -50173,14 +50173,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__7"
-    // InternalPerspectiveDsl.g:15226:1: rule__XBasicForLoopExpression__Group__7 : rule__XBasicForLoopExpression__Group__7__Impl rule__XBasicForLoopExpression__Group__8 ;
+    // InternalPerspectiveDsl.g:15228:1: rule__XBasicForLoopExpression__Group__7 : rule__XBasicForLoopExpression__Group__7__Impl rule__XBasicForLoopExpression__Group__8 ;
     public final void rule__XBasicForLoopExpression__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15230:1: ( rule__XBasicForLoopExpression__Group__7__Impl rule__XBasicForLoopExpression__Group__8 )
-            // InternalPerspectiveDsl.g:15231:2: rule__XBasicForLoopExpression__Group__7__Impl rule__XBasicForLoopExpression__Group__8
+            // InternalPerspectiveDsl.g:15232:1: ( rule__XBasicForLoopExpression__Group__7__Impl rule__XBasicForLoopExpression__Group__8 )
+            // InternalPerspectiveDsl.g:15233:2: rule__XBasicForLoopExpression__Group__7__Impl rule__XBasicForLoopExpression__Group__8
             {
             pushFollow(FOLLOW_51);
             rule__XBasicForLoopExpression__Group__7__Impl();
@@ -50211,22 +50211,22 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__7__Impl"
-    // InternalPerspectiveDsl.g:15238:1: rule__XBasicForLoopExpression__Group__7__Impl : ( ( rule__XBasicForLoopExpression__Group_7__0 )? ) ;
+    // InternalPerspectiveDsl.g:15240:1: rule__XBasicForLoopExpression__Group__7__Impl : ( ( rule__XBasicForLoopExpression__Group_7__0 )? ) ;
     public final void rule__XBasicForLoopExpression__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15242:1: ( ( ( rule__XBasicForLoopExpression__Group_7__0 )? ) )
-            // InternalPerspectiveDsl.g:15243:1: ( ( rule__XBasicForLoopExpression__Group_7__0 )? )
+            // InternalPerspectiveDsl.g:15244:1: ( ( ( rule__XBasicForLoopExpression__Group_7__0 )? ) )
+            // InternalPerspectiveDsl.g:15245:1: ( ( rule__XBasicForLoopExpression__Group_7__0 )? )
             {
-            // InternalPerspectiveDsl.g:15243:1: ( ( rule__XBasicForLoopExpression__Group_7__0 )? )
-            // InternalPerspectiveDsl.g:15244:2: ( rule__XBasicForLoopExpression__Group_7__0 )?
+            // InternalPerspectiveDsl.g:15245:1: ( ( rule__XBasicForLoopExpression__Group_7__0 )? )
+            // InternalPerspectiveDsl.g:15246:2: ( rule__XBasicForLoopExpression__Group_7__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_7()); 
             }
-            // InternalPerspectiveDsl.g:15245:2: ( rule__XBasicForLoopExpression__Group_7__0 )?
+            // InternalPerspectiveDsl.g:15247:2: ( rule__XBasicForLoopExpression__Group_7__0 )?
             int alt106=2;
             int LA106_0 = input.LA(1);
 
@@ -50235,7 +50235,7 @@
             }
             switch (alt106) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:15245:3: rule__XBasicForLoopExpression__Group_7__0
+                    // InternalPerspectiveDsl.g:15247:3: rule__XBasicForLoopExpression__Group_7__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XBasicForLoopExpression__Group_7__0();
@@ -50273,14 +50273,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__8"
-    // InternalPerspectiveDsl.g:15253:1: rule__XBasicForLoopExpression__Group__8 : rule__XBasicForLoopExpression__Group__8__Impl rule__XBasicForLoopExpression__Group__9 ;
+    // InternalPerspectiveDsl.g:15255:1: rule__XBasicForLoopExpression__Group__8 : rule__XBasicForLoopExpression__Group__8__Impl rule__XBasicForLoopExpression__Group__9 ;
     public final void rule__XBasicForLoopExpression__Group__8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15257:1: ( rule__XBasicForLoopExpression__Group__8__Impl rule__XBasicForLoopExpression__Group__9 )
-            // InternalPerspectiveDsl.g:15258:2: rule__XBasicForLoopExpression__Group__8__Impl rule__XBasicForLoopExpression__Group__9
+            // InternalPerspectiveDsl.g:15259:1: ( rule__XBasicForLoopExpression__Group__8__Impl rule__XBasicForLoopExpression__Group__9 )
+            // InternalPerspectiveDsl.g:15260:2: rule__XBasicForLoopExpression__Group__8__Impl rule__XBasicForLoopExpression__Group__9
             {
             pushFollow(FOLLOW_54);
             rule__XBasicForLoopExpression__Group__8__Impl();
@@ -50311,17 +50311,17 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__8__Impl"
-    // InternalPerspectiveDsl.g:15265:1: rule__XBasicForLoopExpression__Group__8__Impl : ( ')' ) ;
+    // InternalPerspectiveDsl.g:15267:1: rule__XBasicForLoopExpression__Group__8__Impl : ( ')' ) ;
     public final void rule__XBasicForLoopExpression__Group__8__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15269:1: ( ( ')' ) )
-            // InternalPerspectiveDsl.g:15270:1: ( ')' )
+            // InternalPerspectiveDsl.g:15271:1: ( ( ')' ) )
+            // InternalPerspectiveDsl.g:15272:1: ( ')' )
             {
-            // InternalPerspectiveDsl.g:15270:1: ( ')' )
-            // InternalPerspectiveDsl.g:15271:2: ')'
+            // InternalPerspectiveDsl.g:15272:1: ( ')' )
+            // InternalPerspectiveDsl.g:15273:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8()); 
@@ -50352,14 +50352,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__9"
-    // InternalPerspectiveDsl.g:15280:1: rule__XBasicForLoopExpression__Group__9 : rule__XBasicForLoopExpression__Group__9__Impl ;
+    // InternalPerspectiveDsl.g:15282:1: rule__XBasicForLoopExpression__Group__9 : rule__XBasicForLoopExpression__Group__9__Impl ;
     public final void rule__XBasicForLoopExpression__Group__9() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15284:1: ( rule__XBasicForLoopExpression__Group__9__Impl )
-            // InternalPerspectiveDsl.g:15285:2: rule__XBasicForLoopExpression__Group__9__Impl
+            // InternalPerspectiveDsl.g:15286:1: ( rule__XBasicForLoopExpression__Group__9__Impl )
+            // InternalPerspectiveDsl.g:15287:2: rule__XBasicForLoopExpression__Group__9__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__Group__9__Impl();
@@ -50385,23 +50385,23 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__9__Impl"
-    // InternalPerspectiveDsl.g:15291:1: rule__XBasicForLoopExpression__Group__9__Impl : ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) ) ;
+    // InternalPerspectiveDsl.g:15293:1: rule__XBasicForLoopExpression__Group__9__Impl : ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) ) ;
     public final void rule__XBasicForLoopExpression__Group__9__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15295:1: ( ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) ) )
-            // InternalPerspectiveDsl.g:15296:1: ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) )
+            // InternalPerspectiveDsl.g:15297:1: ( ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) ) )
+            // InternalPerspectiveDsl.g:15298:1: ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) )
             {
-            // InternalPerspectiveDsl.g:15296:1: ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) )
-            // InternalPerspectiveDsl.g:15297:2: ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 )
+            // InternalPerspectiveDsl.g:15298:1: ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) )
+            // InternalPerspectiveDsl.g:15299:2: ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionAssignment_9()); 
             }
-            // InternalPerspectiveDsl.g:15298:2: ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 )
-            // InternalPerspectiveDsl.g:15298:3: rule__XBasicForLoopExpression__EachExpressionAssignment_9
+            // InternalPerspectiveDsl.g:15300:2: ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 )
+            // InternalPerspectiveDsl.g:15300:3: rule__XBasicForLoopExpression__EachExpressionAssignment_9
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__EachExpressionAssignment_9();
@@ -50436,14 +50436,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_3__0"
-    // InternalPerspectiveDsl.g:15307:1: rule__XBasicForLoopExpression__Group_3__0 : rule__XBasicForLoopExpression__Group_3__0__Impl rule__XBasicForLoopExpression__Group_3__1 ;
+    // InternalPerspectiveDsl.g:15309:1: rule__XBasicForLoopExpression__Group_3__0 : rule__XBasicForLoopExpression__Group_3__0__Impl rule__XBasicForLoopExpression__Group_3__1 ;
     public final void rule__XBasicForLoopExpression__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15311:1: ( rule__XBasicForLoopExpression__Group_3__0__Impl rule__XBasicForLoopExpression__Group_3__1 )
-            // InternalPerspectiveDsl.g:15312:2: rule__XBasicForLoopExpression__Group_3__0__Impl rule__XBasicForLoopExpression__Group_3__1
+            // InternalPerspectiveDsl.g:15313:1: ( rule__XBasicForLoopExpression__Group_3__0__Impl rule__XBasicForLoopExpression__Group_3__1 )
+            // InternalPerspectiveDsl.g:15314:2: rule__XBasicForLoopExpression__Group_3__0__Impl rule__XBasicForLoopExpression__Group_3__1
             {
             pushFollow(FOLLOW_52);
             rule__XBasicForLoopExpression__Group_3__0__Impl();
@@ -50474,23 +50474,23 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_3__0__Impl"
-    // InternalPerspectiveDsl.g:15319:1: rule__XBasicForLoopExpression__Group_3__0__Impl : ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) ) ;
+    // InternalPerspectiveDsl.g:15321:1: rule__XBasicForLoopExpression__Group_3__0__Impl : ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) ) ;
     public final void rule__XBasicForLoopExpression__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15323:1: ( ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) ) )
-            // InternalPerspectiveDsl.g:15324:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) )
+            // InternalPerspectiveDsl.g:15325:1: ( ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) ) )
+            // InternalPerspectiveDsl.g:15326:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) )
             {
-            // InternalPerspectiveDsl.g:15324:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) )
-            // InternalPerspectiveDsl.g:15325:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 )
+            // InternalPerspectiveDsl.g:15326:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) )
+            // InternalPerspectiveDsl.g:15327:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsAssignment_3_0()); 
             }
-            // InternalPerspectiveDsl.g:15326:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 )
-            // InternalPerspectiveDsl.g:15326:3: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0
+            // InternalPerspectiveDsl.g:15328:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 )
+            // InternalPerspectiveDsl.g:15328:3: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0();
@@ -50525,14 +50525,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_3__1"
-    // InternalPerspectiveDsl.g:15334:1: rule__XBasicForLoopExpression__Group_3__1 : rule__XBasicForLoopExpression__Group_3__1__Impl ;
+    // InternalPerspectiveDsl.g:15336:1: rule__XBasicForLoopExpression__Group_3__1 : rule__XBasicForLoopExpression__Group_3__1__Impl ;
     public final void rule__XBasicForLoopExpression__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15338:1: ( rule__XBasicForLoopExpression__Group_3__1__Impl )
-            // InternalPerspectiveDsl.g:15339:2: rule__XBasicForLoopExpression__Group_3__1__Impl
+            // InternalPerspectiveDsl.g:15340:1: ( rule__XBasicForLoopExpression__Group_3__1__Impl )
+            // InternalPerspectiveDsl.g:15341:2: rule__XBasicForLoopExpression__Group_3__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__Group_3__1__Impl();
@@ -50558,22 +50558,22 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_3__1__Impl"
-    // InternalPerspectiveDsl.g:15345:1: rule__XBasicForLoopExpression__Group_3__1__Impl : ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:15347:1: rule__XBasicForLoopExpression__Group_3__1__Impl : ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* ) ;
     public final void rule__XBasicForLoopExpression__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15349:1: ( ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* ) )
-            // InternalPerspectiveDsl.g:15350:1: ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* )
+            // InternalPerspectiveDsl.g:15351:1: ( ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* ) )
+            // InternalPerspectiveDsl.g:15352:1: ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:15350:1: ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* )
-            // InternalPerspectiveDsl.g:15351:2: ( rule__XBasicForLoopExpression__Group_3_1__0 )*
+            // InternalPerspectiveDsl.g:15352:1: ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* )
+            // InternalPerspectiveDsl.g:15353:2: ( rule__XBasicForLoopExpression__Group_3_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_3_1()); 
             }
-            // InternalPerspectiveDsl.g:15352:2: ( rule__XBasicForLoopExpression__Group_3_1__0 )*
+            // InternalPerspectiveDsl.g:15354:2: ( rule__XBasicForLoopExpression__Group_3_1__0 )*
             loop107:
             do {
                 int alt107=2;
@@ -50586,7 +50586,7 @@
 
                 switch (alt107) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:15352:3: rule__XBasicForLoopExpression__Group_3_1__0
+            	    // InternalPerspectiveDsl.g:15354:3: rule__XBasicForLoopExpression__Group_3_1__0
             	    {
             	    pushFollow(FOLLOW_53);
             	    rule__XBasicForLoopExpression__Group_3_1__0();
@@ -50627,14 +50627,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_3_1__0"
-    // InternalPerspectiveDsl.g:15361:1: rule__XBasicForLoopExpression__Group_3_1__0 : rule__XBasicForLoopExpression__Group_3_1__0__Impl rule__XBasicForLoopExpression__Group_3_1__1 ;
+    // InternalPerspectiveDsl.g:15363:1: rule__XBasicForLoopExpression__Group_3_1__0 : rule__XBasicForLoopExpression__Group_3_1__0__Impl rule__XBasicForLoopExpression__Group_3_1__1 ;
     public final void rule__XBasicForLoopExpression__Group_3_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15365:1: ( rule__XBasicForLoopExpression__Group_3_1__0__Impl rule__XBasicForLoopExpression__Group_3_1__1 )
-            // InternalPerspectiveDsl.g:15366:2: rule__XBasicForLoopExpression__Group_3_1__0__Impl rule__XBasicForLoopExpression__Group_3_1__1
+            // InternalPerspectiveDsl.g:15367:1: ( rule__XBasicForLoopExpression__Group_3_1__0__Impl rule__XBasicForLoopExpression__Group_3_1__1 )
+            // InternalPerspectiveDsl.g:15368:2: rule__XBasicForLoopExpression__Group_3_1__0__Impl rule__XBasicForLoopExpression__Group_3_1__1
             {
             pushFollow(FOLLOW_111);
             rule__XBasicForLoopExpression__Group_3_1__0__Impl();
@@ -50665,17 +50665,17 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_3_1__0__Impl"
-    // InternalPerspectiveDsl.g:15373:1: rule__XBasicForLoopExpression__Group_3_1__0__Impl : ( ',' ) ;
+    // InternalPerspectiveDsl.g:15375:1: rule__XBasicForLoopExpression__Group_3_1__0__Impl : ( ',' ) ;
     public final void rule__XBasicForLoopExpression__Group_3_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15377:1: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:15378:1: ( ',' )
+            // InternalPerspectiveDsl.g:15379:1: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:15380:1: ( ',' )
             {
-            // InternalPerspectiveDsl.g:15378:1: ( ',' )
-            // InternalPerspectiveDsl.g:15379:2: ','
+            // InternalPerspectiveDsl.g:15380:1: ( ',' )
+            // InternalPerspectiveDsl.g:15381:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0()); 
@@ -50706,14 +50706,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_3_1__1"
-    // InternalPerspectiveDsl.g:15388:1: rule__XBasicForLoopExpression__Group_3_1__1 : rule__XBasicForLoopExpression__Group_3_1__1__Impl ;
+    // InternalPerspectiveDsl.g:15390:1: rule__XBasicForLoopExpression__Group_3_1__1 : rule__XBasicForLoopExpression__Group_3_1__1__Impl ;
     public final void rule__XBasicForLoopExpression__Group_3_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15392:1: ( rule__XBasicForLoopExpression__Group_3_1__1__Impl )
-            // InternalPerspectiveDsl.g:15393:2: rule__XBasicForLoopExpression__Group_3_1__1__Impl
+            // InternalPerspectiveDsl.g:15394:1: ( rule__XBasicForLoopExpression__Group_3_1__1__Impl )
+            // InternalPerspectiveDsl.g:15395:2: rule__XBasicForLoopExpression__Group_3_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__Group_3_1__1__Impl();
@@ -50739,23 +50739,23 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_3_1__1__Impl"
-    // InternalPerspectiveDsl.g:15399:1: rule__XBasicForLoopExpression__Group_3_1__1__Impl : ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:15401:1: rule__XBasicForLoopExpression__Group_3_1__1__Impl : ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) ) ;
     public final void rule__XBasicForLoopExpression__Group_3_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15403:1: ( ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) ) )
-            // InternalPerspectiveDsl.g:15404:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) )
+            // InternalPerspectiveDsl.g:15405:1: ( ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) ) )
+            // InternalPerspectiveDsl.g:15406:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:15404:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) )
-            // InternalPerspectiveDsl.g:15405:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 )
+            // InternalPerspectiveDsl.g:15406:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) )
+            // InternalPerspectiveDsl.g:15407:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsAssignment_3_1_1()); 
             }
-            // InternalPerspectiveDsl.g:15406:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 )
-            // InternalPerspectiveDsl.g:15406:3: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1
+            // InternalPerspectiveDsl.g:15408:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 )
+            // InternalPerspectiveDsl.g:15408:3: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1();
@@ -50790,14 +50790,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_7__0"
-    // InternalPerspectiveDsl.g:15415:1: rule__XBasicForLoopExpression__Group_7__0 : rule__XBasicForLoopExpression__Group_7__0__Impl rule__XBasicForLoopExpression__Group_7__1 ;
+    // InternalPerspectiveDsl.g:15417:1: rule__XBasicForLoopExpression__Group_7__0 : rule__XBasicForLoopExpression__Group_7__0__Impl rule__XBasicForLoopExpression__Group_7__1 ;
     public final void rule__XBasicForLoopExpression__Group_7__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15419:1: ( rule__XBasicForLoopExpression__Group_7__0__Impl rule__XBasicForLoopExpression__Group_7__1 )
-            // InternalPerspectiveDsl.g:15420:2: rule__XBasicForLoopExpression__Group_7__0__Impl rule__XBasicForLoopExpression__Group_7__1
+            // InternalPerspectiveDsl.g:15421:1: ( rule__XBasicForLoopExpression__Group_7__0__Impl rule__XBasicForLoopExpression__Group_7__1 )
+            // InternalPerspectiveDsl.g:15422:2: rule__XBasicForLoopExpression__Group_7__0__Impl rule__XBasicForLoopExpression__Group_7__1
             {
             pushFollow(FOLLOW_52);
             rule__XBasicForLoopExpression__Group_7__0__Impl();
@@ -50828,23 +50828,23 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_7__0__Impl"
-    // InternalPerspectiveDsl.g:15427:1: rule__XBasicForLoopExpression__Group_7__0__Impl : ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) ) ;
+    // InternalPerspectiveDsl.g:15429:1: rule__XBasicForLoopExpression__Group_7__0__Impl : ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) ) ;
     public final void rule__XBasicForLoopExpression__Group_7__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15431:1: ( ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) ) )
-            // InternalPerspectiveDsl.g:15432:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) )
+            // InternalPerspectiveDsl.g:15433:1: ( ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) ) )
+            // InternalPerspectiveDsl.g:15434:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) )
             {
-            // InternalPerspectiveDsl.g:15432:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) )
-            // InternalPerspectiveDsl.g:15433:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 )
+            // InternalPerspectiveDsl.g:15434:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) )
+            // InternalPerspectiveDsl.g:15435:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsAssignment_7_0()); 
             }
-            // InternalPerspectiveDsl.g:15434:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 )
-            // InternalPerspectiveDsl.g:15434:3: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0
+            // InternalPerspectiveDsl.g:15436:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 )
+            // InternalPerspectiveDsl.g:15436:3: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0();
@@ -50879,14 +50879,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_7__1"
-    // InternalPerspectiveDsl.g:15442:1: rule__XBasicForLoopExpression__Group_7__1 : rule__XBasicForLoopExpression__Group_7__1__Impl ;
+    // InternalPerspectiveDsl.g:15444:1: rule__XBasicForLoopExpression__Group_7__1 : rule__XBasicForLoopExpression__Group_7__1__Impl ;
     public final void rule__XBasicForLoopExpression__Group_7__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15446:1: ( rule__XBasicForLoopExpression__Group_7__1__Impl )
-            // InternalPerspectiveDsl.g:15447:2: rule__XBasicForLoopExpression__Group_7__1__Impl
+            // InternalPerspectiveDsl.g:15448:1: ( rule__XBasicForLoopExpression__Group_7__1__Impl )
+            // InternalPerspectiveDsl.g:15449:2: rule__XBasicForLoopExpression__Group_7__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__Group_7__1__Impl();
@@ -50912,22 +50912,22 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_7__1__Impl"
-    // InternalPerspectiveDsl.g:15453:1: rule__XBasicForLoopExpression__Group_7__1__Impl : ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:15455:1: rule__XBasicForLoopExpression__Group_7__1__Impl : ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* ) ;
     public final void rule__XBasicForLoopExpression__Group_7__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15457:1: ( ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* ) )
-            // InternalPerspectiveDsl.g:15458:1: ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* )
+            // InternalPerspectiveDsl.g:15459:1: ( ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* ) )
+            // InternalPerspectiveDsl.g:15460:1: ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:15458:1: ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* )
-            // InternalPerspectiveDsl.g:15459:2: ( rule__XBasicForLoopExpression__Group_7_1__0 )*
+            // InternalPerspectiveDsl.g:15460:1: ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* )
+            // InternalPerspectiveDsl.g:15461:2: ( rule__XBasicForLoopExpression__Group_7_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_7_1()); 
             }
-            // InternalPerspectiveDsl.g:15460:2: ( rule__XBasicForLoopExpression__Group_7_1__0 )*
+            // InternalPerspectiveDsl.g:15462:2: ( rule__XBasicForLoopExpression__Group_7_1__0 )*
             loop108:
             do {
                 int alt108=2;
@@ -50940,7 +50940,7 @@
 
                 switch (alt108) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:15460:3: rule__XBasicForLoopExpression__Group_7_1__0
+            	    // InternalPerspectiveDsl.g:15462:3: rule__XBasicForLoopExpression__Group_7_1__0
             	    {
             	    pushFollow(FOLLOW_53);
             	    rule__XBasicForLoopExpression__Group_7_1__0();
@@ -50981,14 +50981,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_7_1__0"
-    // InternalPerspectiveDsl.g:15469:1: rule__XBasicForLoopExpression__Group_7_1__0 : rule__XBasicForLoopExpression__Group_7_1__0__Impl rule__XBasicForLoopExpression__Group_7_1__1 ;
+    // InternalPerspectiveDsl.g:15471:1: rule__XBasicForLoopExpression__Group_7_1__0 : rule__XBasicForLoopExpression__Group_7_1__0__Impl rule__XBasicForLoopExpression__Group_7_1__1 ;
     public final void rule__XBasicForLoopExpression__Group_7_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15473:1: ( rule__XBasicForLoopExpression__Group_7_1__0__Impl rule__XBasicForLoopExpression__Group_7_1__1 )
-            // InternalPerspectiveDsl.g:15474:2: rule__XBasicForLoopExpression__Group_7_1__0__Impl rule__XBasicForLoopExpression__Group_7_1__1
+            // InternalPerspectiveDsl.g:15475:1: ( rule__XBasicForLoopExpression__Group_7_1__0__Impl rule__XBasicForLoopExpression__Group_7_1__1 )
+            // InternalPerspectiveDsl.g:15476:2: rule__XBasicForLoopExpression__Group_7_1__0__Impl rule__XBasicForLoopExpression__Group_7_1__1
             {
             pushFollow(FOLLOW_54);
             rule__XBasicForLoopExpression__Group_7_1__0__Impl();
@@ -51019,17 +51019,17 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_7_1__0__Impl"
-    // InternalPerspectiveDsl.g:15481:1: rule__XBasicForLoopExpression__Group_7_1__0__Impl : ( ',' ) ;
+    // InternalPerspectiveDsl.g:15483:1: rule__XBasicForLoopExpression__Group_7_1__0__Impl : ( ',' ) ;
     public final void rule__XBasicForLoopExpression__Group_7_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15485:1: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:15486:1: ( ',' )
+            // InternalPerspectiveDsl.g:15487:1: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:15488:1: ( ',' )
             {
-            // InternalPerspectiveDsl.g:15486:1: ( ',' )
-            // InternalPerspectiveDsl.g:15487:2: ','
+            // InternalPerspectiveDsl.g:15488:1: ( ',' )
+            // InternalPerspectiveDsl.g:15489:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0()); 
@@ -51060,14 +51060,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_7_1__1"
-    // InternalPerspectiveDsl.g:15496:1: rule__XBasicForLoopExpression__Group_7_1__1 : rule__XBasicForLoopExpression__Group_7_1__1__Impl ;
+    // InternalPerspectiveDsl.g:15498:1: rule__XBasicForLoopExpression__Group_7_1__1 : rule__XBasicForLoopExpression__Group_7_1__1__Impl ;
     public final void rule__XBasicForLoopExpression__Group_7_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15500:1: ( rule__XBasicForLoopExpression__Group_7_1__1__Impl )
-            // InternalPerspectiveDsl.g:15501:2: rule__XBasicForLoopExpression__Group_7_1__1__Impl
+            // InternalPerspectiveDsl.g:15502:1: ( rule__XBasicForLoopExpression__Group_7_1__1__Impl )
+            // InternalPerspectiveDsl.g:15503:2: rule__XBasicForLoopExpression__Group_7_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__Group_7_1__1__Impl();
@@ -51093,23 +51093,23 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_7_1__1__Impl"
-    // InternalPerspectiveDsl.g:15507:1: rule__XBasicForLoopExpression__Group_7_1__1__Impl : ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:15509:1: rule__XBasicForLoopExpression__Group_7_1__1__Impl : ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) ) ;
     public final void rule__XBasicForLoopExpression__Group_7_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15511:1: ( ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) ) )
-            // InternalPerspectiveDsl.g:15512:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) )
+            // InternalPerspectiveDsl.g:15513:1: ( ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) ) )
+            // InternalPerspectiveDsl.g:15514:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:15512:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) )
-            // InternalPerspectiveDsl.g:15513:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 )
+            // InternalPerspectiveDsl.g:15514:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) )
+            // InternalPerspectiveDsl.g:15515:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsAssignment_7_1_1()); 
             }
-            // InternalPerspectiveDsl.g:15514:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 )
-            // InternalPerspectiveDsl.g:15514:3: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1
+            // InternalPerspectiveDsl.g:15516:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 )
+            // InternalPerspectiveDsl.g:15516:3: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1();
@@ -51144,14 +51144,14 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__0"
-    // InternalPerspectiveDsl.g:15523:1: rule__XWhileExpression__Group__0 : rule__XWhileExpression__Group__0__Impl rule__XWhileExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:15525:1: rule__XWhileExpression__Group__0 : rule__XWhileExpression__Group__0__Impl rule__XWhileExpression__Group__1 ;
     public final void rule__XWhileExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15527:1: ( rule__XWhileExpression__Group__0__Impl rule__XWhileExpression__Group__1 )
-            // InternalPerspectiveDsl.g:15528:2: rule__XWhileExpression__Group__0__Impl rule__XWhileExpression__Group__1
+            // InternalPerspectiveDsl.g:15529:1: ( rule__XWhileExpression__Group__0__Impl rule__XWhileExpression__Group__1 )
+            // InternalPerspectiveDsl.g:15530:2: rule__XWhileExpression__Group__0__Impl rule__XWhileExpression__Group__1
             {
             pushFollow(FOLLOW_112);
             rule__XWhileExpression__Group__0__Impl();
@@ -51182,23 +51182,23 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:15535:1: rule__XWhileExpression__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:15537:1: rule__XWhileExpression__Group__0__Impl : ( () ) ;
     public final void rule__XWhileExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15539:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:15540:1: ( () )
+            // InternalPerspectiveDsl.g:15541:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:15542:1: ( () )
             {
-            // InternalPerspectiveDsl.g:15540:1: ( () )
-            // InternalPerspectiveDsl.g:15541:2: ()
+            // InternalPerspectiveDsl.g:15542:1: ( () )
+            // InternalPerspectiveDsl.g:15543:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionAccess().getXWhileExpressionAction_0()); 
             }
-            // InternalPerspectiveDsl.g:15542:2: ()
-            // InternalPerspectiveDsl.g:15542:3: 
+            // InternalPerspectiveDsl.g:15544:2: ()
+            // InternalPerspectiveDsl.g:15544:3: 
             {
             }
 
@@ -51223,14 +51223,14 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__1"
-    // InternalPerspectiveDsl.g:15550:1: rule__XWhileExpression__Group__1 : rule__XWhileExpression__Group__1__Impl rule__XWhileExpression__Group__2 ;
+    // InternalPerspectiveDsl.g:15552:1: rule__XWhileExpression__Group__1 : rule__XWhileExpression__Group__1__Impl rule__XWhileExpression__Group__2 ;
     public final void rule__XWhileExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15554:1: ( rule__XWhileExpression__Group__1__Impl rule__XWhileExpression__Group__2 )
-            // InternalPerspectiveDsl.g:15555:2: rule__XWhileExpression__Group__1__Impl rule__XWhileExpression__Group__2
+            // InternalPerspectiveDsl.g:15556:1: ( rule__XWhileExpression__Group__1__Impl rule__XWhileExpression__Group__2 )
+            // InternalPerspectiveDsl.g:15557:2: rule__XWhileExpression__Group__1__Impl rule__XWhileExpression__Group__2
             {
             pushFollow(FOLLOW_50);
             rule__XWhileExpression__Group__1__Impl();
@@ -51261,17 +51261,17 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:15562:1: rule__XWhileExpression__Group__1__Impl : ( 'while' ) ;
+    // InternalPerspectiveDsl.g:15564:1: rule__XWhileExpression__Group__1__Impl : ( 'while' ) ;
     public final void rule__XWhileExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15566:1: ( ( 'while' ) )
-            // InternalPerspectiveDsl.g:15567:1: ( 'while' )
+            // InternalPerspectiveDsl.g:15568:1: ( ( 'while' ) )
+            // InternalPerspectiveDsl.g:15569:1: ( 'while' )
             {
-            // InternalPerspectiveDsl.g:15567:1: ( 'while' )
-            // InternalPerspectiveDsl.g:15568:2: 'while'
+            // InternalPerspectiveDsl.g:15569:1: ( 'while' )
+            // InternalPerspectiveDsl.g:15570:2: 'while'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1()); 
@@ -51302,14 +51302,14 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__2"
-    // InternalPerspectiveDsl.g:15577:1: rule__XWhileExpression__Group__2 : rule__XWhileExpression__Group__2__Impl rule__XWhileExpression__Group__3 ;
+    // InternalPerspectiveDsl.g:15579:1: rule__XWhileExpression__Group__2 : rule__XWhileExpression__Group__2__Impl rule__XWhileExpression__Group__3 ;
     public final void rule__XWhileExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15581:1: ( rule__XWhileExpression__Group__2__Impl rule__XWhileExpression__Group__3 )
-            // InternalPerspectiveDsl.g:15582:2: rule__XWhileExpression__Group__2__Impl rule__XWhileExpression__Group__3
+            // InternalPerspectiveDsl.g:15583:1: ( rule__XWhileExpression__Group__2__Impl rule__XWhileExpression__Group__3 )
+            // InternalPerspectiveDsl.g:15584:2: rule__XWhileExpression__Group__2__Impl rule__XWhileExpression__Group__3
             {
             pushFollow(FOLLOW_54);
             rule__XWhileExpression__Group__2__Impl();
@@ -51340,17 +51340,17 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__2__Impl"
-    // InternalPerspectiveDsl.g:15589:1: rule__XWhileExpression__Group__2__Impl : ( '(' ) ;
+    // InternalPerspectiveDsl.g:15591:1: rule__XWhileExpression__Group__2__Impl : ( '(' ) ;
     public final void rule__XWhileExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15593:1: ( ( '(' ) )
-            // InternalPerspectiveDsl.g:15594:1: ( '(' )
+            // InternalPerspectiveDsl.g:15595:1: ( ( '(' ) )
+            // InternalPerspectiveDsl.g:15596:1: ( '(' )
             {
-            // InternalPerspectiveDsl.g:15594:1: ( '(' )
-            // InternalPerspectiveDsl.g:15595:2: '('
+            // InternalPerspectiveDsl.g:15596:1: ( '(' )
+            // InternalPerspectiveDsl.g:15597:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2()); 
@@ -51381,14 +51381,14 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__3"
-    // InternalPerspectiveDsl.g:15604:1: rule__XWhileExpression__Group__3 : rule__XWhileExpression__Group__3__Impl rule__XWhileExpression__Group__4 ;
+    // InternalPerspectiveDsl.g:15606:1: rule__XWhileExpression__Group__3 : rule__XWhileExpression__Group__3__Impl rule__XWhileExpression__Group__4 ;
     public final void rule__XWhileExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15608:1: ( rule__XWhileExpression__Group__3__Impl rule__XWhileExpression__Group__4 )
-            // InternalPerspectiveDsl.g:15609:2: rule__XWhileExpression__Group__3__Impl rule__XWhileExpression__Group__4
+            // InternalPerspectiveDsl.g:15610:1: ( rule__XWhileExpression__Group__3__Impl rule__XWhileExpression__Group__4 )
+            // InternalPerspectiveDsl.g:15611:2: rule__XWhileExpression__Group__3__Impl rule__XWhileExpression__Group__4
             {
             pushFollow(FOLLOW_99);
             rule__XWhileExpression__Group__3__Impl();
@@ -51419,23 +51419,23 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__3__Impl"
-    // InternalPerspectiveDsl.g:15616:1: rule__XWhileExpression__Group__3__Impl : ( ( rule__XWhileExpression__PredicateAssignment_3 ) ) ;
+    // InternalPerspectiveDsl.g:15618:1: rule__XWhileExpression__Group__3__Impl : ( ( rule__XWhileExpression__PredicateAssignment_3 ) ) ;
     public final void rule__XWhileExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15620:1: ( ( ( rule__XWhileExpression__PredicateAssignment_3 ) ) )
-            // InternalPerspectiveDsl.g:15621:1: ( ( rule__XWhileExpression__PredicateAssignment_3 ) )
+            // InternalPerspectiveDsl.g:15622:1: ( ( ( rule__XWhileExpression__PredicateAssignment_3 ) ) )
+            // InternalPerspectiveDsl.g:15623:1: ( ( rule__XWhileExpression__PredicateAssignment_3 ) )
             {
-            // InternalPerspectiveDsl.g:15621:1: ( ( rule__XWhileExpression__PredicateAssignment_3 ) )
-            // InternalPerspectiveDsl.g:15622:2: ( rule__XWhileExpression__PredicateAssignment_3 )
+            // InternalPerspectiveDsl.g:15623:1: ( ( rule__XWhileExpression__PredicateAssignment_3 ) )
+            // InternalPerspectiveDsl.g:15624:2: ( rule__XWhileExpression__PredicateAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionAccess().getPredicateAssignment_3()); 
             }
-            // InternalPerspectiveDsl.g:15623:2: ( rule__XWhileExpression__PredicateAssignment_3 )
-            // InternalPerspectiveDsl.g:15623:3: rule__XWhileExpression__PredicateAssignment_3
+            // InternalPerspectiveDsl.g:15625:2: ( rule__XWhileExpression__PredicateAssignment_3 )
+            // InternalPerspectiveDsl.g:15625:3: rule__XWhileExpression__PredicateAssignment_3
             {
             pushFollow(FOLLOW_2);
             rule__XWhileExpression__PredicateAssignment_3();
@@ -51470,14 +51470,14 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__4"
-    // InternalPerspectiveDsl.g:15631:1: rule__XWhileExpression__Group__4 : rule__XWhileExpression__Group__4__Impl rule__XWhileExpression__Group__5 ;
+    // InternalPerspectiveDsl.g:15633:1: rule__XWhileExpression__Group__4 : rule__XWhileExpression__Group__4__Impl rule__XWhileExpression__Group__5 ;
     public final void rule__XWhileExpression__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15635:1: ( rule__XWhileExpression__Group__4__Impl rule__XWhileExpression__Group__5 )
-            // InternalPerspectiveDsl.g:15636:2: rule__XWhileExpression__Group__4__Impl rule__XWhileExpression__Group__5
+            // InternalPerspectiveDsl.g:15637:1: ( rule__XWhileExpression__Group__4__Impl rule__XWhileExpression__Group__5 )
+            // InternalPerspectiveDsl.g:15638:2: rule__XWhileExpression__Group__4__Impl rule__XWhileExpression__Group__5
             {
             pushFollow(FOLLOW_54);
             rule__XWhileExpression__Group__4__Impl();
@@ -51508,17 +51508,17 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__4__Impl"
-    // InternalPerspectiveDsl.g:15643:1: rule__XWhileExpression__Group__4__Impl : ( ')' ) ;
+    // InternalPerspectiveDsl.g:15645:1: rule__XWhileExpression__Group__4__Impl : ( ')' ) ;
     public final void rule__XWhileExpression__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15647:1: ( ( ')' ) )
-            // InternalPerspectiveDsl.g:15648:1: ( ')' )
+            // InternalPerspectiveDsl.g:15649:1: ( ( ')' ) )
+            // InternalPerspectiveDsl.g:15650:1: ( ')' )
             {
-            // InternalPerspectiveDsl.g:15648:1: ( ')' )
-            // InternalPerspectiveDsl.g:15649:2: ')'
+            // InternalPerspectiveDsl.g:15650:1: ( ')' )
+            // InternalPerspectiveDsl.g:15651:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4()); 
@@ -51549,14 +51549,14 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__5"
-    // InternalPerspectiveDsl.g:15658:1: rule__XWhileExpression__Group__5 : rule__XWhileExpression__Group__5__Impl ;
+    // InternalPerspectiveDsl.g:15660:1: rule__XWhileExpression__Group__5 : rule__XWhileExpression__Group__5__Impl ;
     public final void rule__XWhileExpression__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15662:1: ( rule__XWhileExpression__Group__5__Impl )
-            // InternalPerspectiveDsl.g:15663:2: rule__XWhileExpression__Group__5__Impl
+            // InternalPerspectiveDsl.g:15664:1: ( rule__XWhileExpression__Group__5__Impl )
+            // InternalPerspectiveDsl.g:15665:2: rule__XWhileExpression__Group__5__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XWhileExpression__Group__5__Impl();
@@ -51582,23 +51582,23 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__5__Impl"
-    // InternalPerspectiveDsl.g:15669:1: rule__XWhileExpression__Group__5__Impl : ( ( rule__XWhileExpression__BodyAssignment_5 ) ) ;
+    // InternalPerspectiveDsl.g:15671:1: rule__XWhileExpression__Group__5__Impl : ( ( rule__XWhileExpression__BodyAssignment_5 ) ) ;
     public final void rule__XWhileExpression__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15673:1: ( ( ( rule__XWhileExpression__BodyAssignment_5 ) ) )
-            // InternalPerspectiveDsl.g:15674:1: ( ( rule__XWhileExpression__BodyAssignment_5 ) )
+            // InternalPerspectiveDsl.g:15675:1: ( ( ( rule__XWhileExpression__BodyAssignment_5 ) ) )
+            // InternalPerspectiveDsl.g:15676:1: ( ( rule__XWhileExpression__BodyAssignment_5 ) )
             {
-            // InternalPerspectiveDsl.g:15674:1: ( ( rule__XWhileExpression__BodyAssignment_5 ) )
-            // InternalPerspectiveDsl.g:15675:2: ( rule__XWhileExpression__BodyAssignment_5 )
+            // InternalPerspectiveDsl.g:15676:1: ( ( rule__XWhileExpression__BodyAssignment_5 ) )
+            // InternalPerspectiveDsl.g:15677:2: ( rule__XWhileExpression__BodyAssignment_5 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionAccess().getBodyAssignment_5()); 
             }
-            // InternalPerspectiveDsl.g:15676:2: ( rule__XWhileExpression__BodyAssignment_5 )
-            // InternalPerspectiveDsl.g:15676:3: rule__XWhileExpression__BodyAssignment_5
+            // InternalPerspectiveDsl.g:15678:2: ( rule__XWhileExpression__BodyAssignment_5 )
+            // InternalPerspectiveDsl.g:15678:3: rule__XWhileExpression__BodyAssignment_5
             {
             pushFollow(FOLLOW_2);
             rule__XWhileExpression__BodyAssignment_5();
@@ -51633,14 +51633,14 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__0"
-    // InternalPerspectiveDsl.g:15685:1: rule__XDoWhileExpression__Group__0 : rule__XDoWhileExpression__Group__0__Impl rule__XDoWhileExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:15687:1: rule__XDoWhileExpression__Group__0 : rule__XDoWhileExpression__Group__0__Impl rule__XDoWhileExpression__Group__1 ;
     public final void rule__XDoWhileExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15689:1: ( rule__XDoWhileExpression__Group__0__Impl rule__XDoWhileExpression__Group__1 )
-            // InternalPerspectiveDsl.g:15690:2: rule__XDoWhileExpression__Group__0__Impl rule__XDoWhileExpression__Group__1
+            // InternalPerspectiveDsl.g:15691:1: ( rule__XDoWhileExpression__Group__0__Impl rule__XDoWhileExpression__Group__1 )
+            // InternalPerspectiveDsl.g:15692:2: rule__XDoWhileExpression__Group__0__Impl rule__XDoWhileExpression__Group__1
             {
             pushFollow(FOLLOW_113);
             rule__XDoWhileExpression__Group__0__Impl();
@@ -51671,23 +51671,23 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:15697:1: rule__XDoWhileExpression__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:15699:1: rule__XDoWhileExpression__Group__0__Impl : ( () ) ;
     public final void rule__XDoWhileExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15701:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:15702:1: ( () )
+            // InternalPerspectiveDsl.g:15703:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:15704:1: ( () )
             {
-            // InternalPerspectiveDsl.g:15702:1: ( () )
-            // InternalPerspectiveDsl.g:15703:2: ()
+            // InternalPerspectiveDsl.g:15704:1: ( () )
+            // InternalPerspectiveDsl.g:15705:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0()); 
             }
-            // InternalPerspectiveDsl.g:15704:2: ()
-            // InternalPerspectiveDsl.g:15704:3: 
+            // InternalPerspectiveDsl.g:15706:2: ()
+            // InternalPerspectiveDsl.g:15706:3: 
             {
             }
 
@@ -51712,14 +51712,14 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__1"
-    // InternalPerspectiveDsl.g:15712:1: rule__XDoWhileExpression__Group__1 : rule__XDoWhileExpression__Group__1__Impl rule__XDoWhileExpression__Group__2 ;
+    // InternalPerspectiveDsl.g:15714:1: rule__XDoWhileExpression__Group__1 : rule__XDoWhileExpression__Group__1__Impl rule__XDoWhileExpression__Group__2 ;
     public final void rule__XDoWhileExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15716:1: ( rule__XDoWhileExpression__Group__1__Impl rule__XDoWhileExpression__Group__2 )
-            // InternalPerspectiveDsl.g:15717:2: rule__XDoWhileExpression__Group__1__Impl rule__XDoWhileExpression__Group__2
+            // InternalPerspectiveDsl.g:15718:1: ( rule__XDoWhileExpression__Group__1__Impl rule__XDoWhileExpression__Group__2 )
+            // InternalPerspectiveDsl.g:15719:2: rule__XDoWhileExpression__Group__1__Impl rule__XDoWhileExpression__Group__2
             {
             pushFollow(FOLLOW_54);
             rule__XDoWhileExpression__Group__1__Impl();
@@ -51750,17 +51750,17 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:15724:1: rule__XDoWhileExpression__Group__1__Impl : ( 'do' ) ;
+    // InternalPerspectiveDsl.g:15726:1: rule__XDoWhileExpression__Group__1__Impl : ( 'do' ) ;
     public final void rule__XDoWhileExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15728:1: ( ( 'do' ) )
-            // InternalPerspectiveDsl.g:15729:1: ( 'do' )
+            // InternalPerspectiveDsl.g:15730:1: ( ( 'do' ) )
+            // InternalPerspectiveDsl.g:15731:1: ( 'do' )
             {
-            // InternalPerspectiveDsl.g:15729:1: ( 'do' )
-            // InternalPerspectiveDsl.g:15730:2: 'do'
+            // InternalPerspectiveDsl.g:15731:1: ( 'do' )
+            // InternalPerspectiveDsl.g:15732:2: 'do'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1()); 
@@ -51791,14 +51791,14 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__2"
-    // InternalPerspectiveDsl.g:15739:1: rule__XDoWhileExpression__Group__2 : rule__XDoWhileExpression__Group__2__Impl rule__XDoWhileExpression__Group__3 ;
+    // InternalPerspectiveDsl.g:15741:1: rule__XDoWhileExpression__Group__2 : rule__XDoWhileExpression__Group__2__Impl rule__XDoWhileExpression__Group__3 ;
     public final void rule__XDoWhileExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15743:1: ( rule__XDoWhileExpression__Group__2__Impl rule__XDoWhileExpression__Group__3 )
-            // InternalPerspectiveDsl.g:15744:2: rule__XDoWhileExpression__Group__2__Impl rule__XDoWhileExpression__Group__3
+            // InternalPerspectiveDsl.g:15745:1: ( rule__XDoWhileExpression__Group__2__Impl rule__XDoWhileExpression__Group__3 )
+            // InternalPerspectiveDsl.g:15746:2: rule__XDoWhileExpression__Group__2__Impl rule__XDoWhileExpression__Group__3
             {
             pushFollow(FOLLOW_112);
             rule__XDoWhileExpression__Group__2__Impl();
@@ -51829,23 +51829,23 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__2__Impl"
-    // InternalPerspectiveDsl.g:15751:1: rule__XDoWhileExpression__Group__2__Impl : ( ( rule__XDoWhileExpression__BodyAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:15753:1: rule__XDoWhileExpression__Group__2__Impl : ( ( rule__XDoWhileExpression__BodyAssignment_2 ) ) ;
     public final void rule__XDoWhileExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15755:1: ( ( ( rule__XDoWhileExpression__BodyAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:15756:1: ( ( rule__XDoWhileExpression__BodyAssignment_2 ) )
+            // InternalPerspectiveDsl.g:15757:1: ( ( ( rule__XDoWhileExpression__BodyAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:15758:1: ( ( rule__XDoWhileExpression__BodyAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:15756:1: ( ( rule__XDoWhileExpression__BodyAssignment_2 ) )
-            // InternalPerspectiveDsl.g:15757:2: ( rule__XDoWhileExpression__BodyAssignment_2 )
+            // InternalPerspectiveDsl.g:15758:1: ( ( rule__XDoWhileExpression__BodyAssignment_2 ) )
+            // InternalPerspectiveDsl.g:15759:2: ( rule__XDoWhileExpression__BodyAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getBodyAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:15758:2: ( rule__XDoWhileExpression__BodyAssignment_2 )
-            // InternalPerspectiveDsl.g:15758:3: rule__XDoWhileExpression__BodyAssignment_2
+            // InternalPerspectiveDsl.g:15760:2: ( rule__XDoWhileExpression__BodyAssignment_2 )
+            // InternalPerspectiveDsl.g:15760:3: rule__XDoWhileExpression__BodyAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__XDoWhileExpression__BodyAssignment_2();
@@ -51880,14 +51880,14 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__3"
-    // InternalPerspectiveDsl.g:15766:1: rule__XDoWhileExpression__Group__3 : rule__XDoWhileExpression__Group__3__Impl rule__XDoWhileExpression__Group__4 ;
+    // InternalPerspectiveDsl.g:15768:1: rule__XDoWhileExpression__Group__3 : rule__XDoWhileExpression__Group__3__Impl rule__XDoWhileExpression__Group__4 ;
     public final void rule__XDoWhileExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15770:1: ( rule__XDoWhileExpression__Group__3__Impl rule__XDoWhileExpression__Group__4 )
-            // InternalPerspectiveDsl.g:15771:2: rule__XDoWhileExpression__Group__3__Impl rule__XDoWhileExpression__Group__4
+            // InternalPerspectiveDsl.g:15772:1: ( rule__XDoWhileExpression__Group__3__Impl rule__XDoWhileExpression__Group__4 )
+            // InternalPerspectiveDsl.g:15773:2: rule__XDoWhileExpression__Group__3__Impl rule__XDoWhileExpression__Group__4
             {
             pushFollow(FOLLOW_50);
             rule__XDoWhileExpression__Group__3__Impl();
@@ -51918,17 +51918,17 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__3__Impl"
-    // InternalPerspectiveDsl.g:15778:1: rule__XDoWhileExpression__Group__3__Impl : ( 'while' ) ;
+    // InternalPerspectiveDsl.g:15780:1: rule__XDoWhileExpression__Group__3__Impl : ( 'while' ) ;
     public final void rule__XDoWhileExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15782:1: ( ( 'while' ) )
-            // InternalPerspectiveDsl.g:15783:1: ( 'while' )
+            // InternalPerspectiveDsl.g:15784:1: ( ( 'while' ) )
+            // InternalPerspectiveDsl.g:15785:1: ( 'while' )
             {
-            // InternalPerspectiveDsl.g:15783:1: ( 'while' )
-            // InternalPerspectiveDsl.g:15784:2: 'while'
+            // InternalPerspectiveDsl.g:15785:1: ( 'while' )
+            // InternalPerspectiveDsl.g:15786:2: 'while'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3()); 
@@ -51959,14 +51959,14 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__4"
-    // InternalPerspectiveDsl.g:15793:1: rule__XDoWhileExpression__Group__4 : rule__XDoWhileExpression__Group__4__Impl rule__XDoWhileExpression__Group__5 ;
+    // InternalPerspectiveDsl.g:15795:1: rule__XDoWhileExpression__Group__4 : rule__XDoWhileExpression__Group__4__Impl rule__XDoWhileExpression__Group__5 ;
     public final void rule__XDoWhileExpression__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15797:1: ( rule__XDoWhileExpression__Group__4__Impl rule__XDoWhileExpression__Group__5 )
-            // InternalPerspectiveDsl.g:15798:2: rule__XDoWhileExpression__Group__4__Impl rule__XDoWhileExpression__Group__5
+            // InternalPerspectiveDsl.g:15799:1: ( rule__XDoWhileExpression__Group__4__Impl rule__XDoWhileExpression__Group__5 )
+            // InternalPerspectiveDsl.g:15800:2: rule__XDoWhileExpression__Group__4__Impl rule__XDoWhileExpression__Group__5
             {
             pushFollow(FOLLOW_54);
             rule__XDoWhileExpression__Group__4__Impl();
@@ -51997,17 +51997,17 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__4__Impl"
-    // InternalPerspectiveDsl.g:15805:1: rule__XDoWhileExpression__Group__4__Impl : ( '(' ) ;
+    // InternalPerspectiveDsl.g:15807:1: rule__XDoWhileExpression__Group__4__Impl : ( '(' ) ;
     public final void rule__XDoWhileExpression__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15809:1: ( ( '(' ) )
-            // InternalPerspectiveDsl.g:15810:1: ( '(' )
+            // InternalPerspectiveDsl.g:15811:1: ( ( '(' ) )
+            // InternalPerspectiveDsl.g:15812:1: ( '(' )
             {
-            // InternalPerspectiveDsl.g:15810:1: ( '(' )
-            // InternalPerspectiveDsl.g:15811:2: '('
+            // InternalPerspectiveDsl.g:15812:1: ( '(' )
+            // InternalPerspectiveDsl.g:15813:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4()); 
@@ -52038,14 +52038,14 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__5"
-    // InternalPerspectiveDsl.g:15820:1: rule__XDoWhileExpression__Group__5 : rule__XDoWhileExpression__Group__5__Impl rule__XDoWhileExpression__Group__6 ;
+    // InternalPerspectiveDsl.g:15822:1: rule__XDoWhileExpression__Group__5 : rule__XDoWhileExpression__Group__5__Impl rule__XDoWhileExpression__Group__6 ;
     public final void rule__XDoWhileExpression__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15824:1: ( rule__XDoWhileExpression__Group__5__Impl rule__XDoWhileExpression__Group__6 )
-            // InternalPerspectiveDsl.g:15825:2: rule__XDoWhileExpression__Group__5__Impl rule__XDoWhileExpression__Group__6
+            // InternalPerspectiveDsl.g:15826:1: ( rule__XDoWhileExpression__Group__5__Impl rule__XDoWhileExpression__Group__6 )
+            // InternalPerspectiveDsl.g:15827:2: rule__XDoWhileExpression__Group__5__Impl rule__XDoWhileExpression__Group__6
             {
             pushFollow(FOLLOW_99);
             rule__XDoWhileExpression__Group__5__Impl();
@@ -52076,23 +52076,23 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__5__Impl"
-    // InternalPerspectiveDsl.g:15832:1: rule__XDoWhileExpression__Group__5__Impl : ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) ) ;
+    // InternalPerspectiveDsl.g:15834:1: rule__XDoWhileExpression__Group__5__Impl : ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) ) ;
     public final void rule__XDoWhileExpression__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15836:1: ( ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) ) )
-            // InternalPerspectiveDsl.g:15837:1: ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) )
+            // InternalPerspectiveDsl.g:15838:1: ( ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) ) )
+            // InternalPerspectiveDsl.g:15839:1: ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) )
             {
-            // InternalPerspectiveDsl.g:15837:1: ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) )
-            // InternalPerspectiveDsl.g:15838:2: ( rule__XDoWhileExpression__PredicateAssignment_5 )
+            // InternalPerspectiveDsl.g:15839:1: ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) )
+            // InternalPerspectiveDsl.g:15840:2: ( rule__XDoWhileExpression__PredicateAssignment_5 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getPredicateAssignment_5()); 
             }
-            // InternalPerspectiveDsl.g:15839:2: ( rule__XDoWhileExpression__PredicateAssignment_5 )
-            // InternalPerspectiveDsl.g:15839:3: rule__XDoWhileExpression__PredicateAssignment_5
+            // InternalPerspectiveDsl.g:15841:2: ( rule__XDoWhileExpression__PredicateAssignment_5 )
+            // InternalPerspectiveDsl.g:15841:3: rule__XDoWhileExpression__PredicateAssignment_5
             {
             pushFollow(FOLLOW_2);
             rule__XDoWhileExpression__PredicateAssignment_5();
@@ -52127,14 +52127,14 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__6"
-    // InternalPerspectiveDsl.g:15847:1: rule__XDoWhileExpression__Group__6 : rule__XDoWhileExpression__Group__6__Impl ;
+    // InternalPerspectiveDsl.g:15849:1: rule__XDoWhileExpression__Group__6 : rule__XDoWhileExpression__Group__6__Impl ;
     public final void rule__XDoWhileExpression__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15851:1: ( rule__XDoWhileExpression__Group__6__Impl )
-            // InternalPerspectiveDsl.g:15852:2: rule__XDoWhileExpression__Group__6__Impl
+            // InternalPerspectiveDsl.g:15853:1: ( rule__XDoWhileExpression__Group__6__Impl )
+            // InternalPerspectiveDsl.g:15854:2: rule__XDoWhileExpression__Group__6__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XDoWhileExpression__Group__6__Impl();
@@ -52160,17 +52160,17 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__6__Impl"
-    // InternalPerspectiveDsl.g:15858:1: rule__XDoWhileExpression__Group__6__Impl : ( ')' ) ;
+    // InternalPerspectiveDsl.g:15860:1: rule__XDoWhileExpression__Group__6__Impl : ( ')' ) ;
     public final void rule__XDoWhileExpression__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15862:1: ( ( ')' ) )
-            // InternalPerspectiveDsl.g:15863:1: ( ')' )
+            // InternalPerspectiveDsl.g:15864:1: ( ( ')' ) )
+            // InternalPerspectiveDsl.g:15865:1: ( ')' )
             {
-            // InternalPerspectiveDsl.g:15863:1: ( ')' )
-            // InternalPerspectiveDsl.g:15864:2: ')'
+            // InternalPerspectiveDsl.g:15865:1: ( ')' )
+            // InternalPerspectiveDsl.g:15866:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getRightParenthesisKeyword_6()); 
@@ -52201,14 +52201,14 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group__0"
-    // InternalPerspectiveDsl.g:15874:1: rule__XBlockExpression__Group__0 : rule__XBlockExpression__Group__0__Impl rule__XBlockExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:15876:1: rule__XBlockExpression__Group__0 : rule__XBlockExpression__Group__0__Impl rule__XBlockExpression__Group__1 ;
     public final void rule__XBlockExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15878:1: ( rule__XBlockExpression__Group__0__Impl rule__XBlockExpression__Group__1 )
-            // InternalPerspectiveDsl.g:15879:2: rule__XBlockExpression__Group__0__Impl rule__XBlockExpression__Group__1
+            // InternalPerspectiveDsl.g:15880:1: ( rule__XBlockExpression__Group__0__Impl rule__XBlockExpression__Group__1 )
+            // InternalPerspectiveDsl.g:15881:2: rule__XBlockExpression__Group__0__Impl rule__XBlockExpression__Group__1
             {
             pushFollow(FOLLOW_8);
             rule__XBlockExpression__Group__0__Impl();
@@ -52239,23 +52239,23 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:15886:1: rule__XBlockExpression__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:15888:1: rule__XBlockExpression__Group__0__Impl : ( () ) ;
     public final void rule__XBlockExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15890:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:15891:1: ( () )
+            // InternalPerspectiveDsl.g:15892:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:15893:1: ( () )
             {
-            // InternalPerspectiveDsl.g:15891:1: ( () )
-            // InternalPerspectiveDsl.g:15892:2: ()
+            // InternalPerspectiveDsl.g:15893:1: ( () )
+            // InternalPerspectiveDsl.g:15894:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBlockExpressionAccess().getXBlockExpressionAction_0()); 
             }
-            // InternalPerspectiveDsl.g:15893:2: ()
-            // InternalPerspectiveDsl.g:15893:3: 
+            // InternalPerspectiveDsl.g:15895:2: ()
+            // InternalPerspectiveDsl.g:15895:3: 
             {
             }
 
@@ -52280,14 +52280,14 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group__1"
-    // InternalPerspectiveDsl.g:15901:1: rule__XBlockExpression__Group__1 : rule__XBlockExpression__Group__1__Impl rule__XBlockExpression__Group__2 ;
+    // InternalPerspectiveDsl.g:15903:1: rule__XBlockExpression__Group__1 : rule__XBlockExpression__Group__1__Impl rule__XBlockExpression__Group__2 ;
     public final void rule__XBlockExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15905:1: ( rule__XBlockExpression__Group__1__Impl rule__XBlockExpression__Group__2 )
-            // InternalPerspectiveDsl.g:15906:2: rule__XBlockExpression__Group__1__Impl rule__XBlockExpression__Group__2
+            // InternalPerspectiveDsl.g:15907:1: ( rule__XBlockExpression__Group__1__Impl rule__XBlockExpression__Group__2 )
+            // InternalPerspectiveDsl.g:15908:2: rule__XBlockExpression__Group__1__Impl rule__XBlockExpression__Group__2
             {
             pushFollow(FOLLOW_114);
             rule__XBlockExpression__Group__1__Impl();
@@ -52318,17 +52318,17 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:15913:1: rule__XBlockExpression__Group__1__Impl : ( '{' ) ;
+    // InternalPerspectiveDsl.g:15915:1: rule__XBlockExpression__Group__1__Impl : ( '{' ) ;
     public final void rule__XBlockExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15917:1: ( ( '{' ) )
-            // InternalPerspectiveDsl.g:15918:1: ( '{' )
+            // InternalPerspectiveDsl.g:15919:1: ( ( '{' ) )
+            // InternalPerspectiveDsl.g:15920:1: ( '{' )
             {
-            // InternalPerspectiveDsl.g:15918:1: ( '{' )
-            // InternalPerspectiveDsl.g:15919:2: '{'
+            // InternalPerspectiveDsl.g:15920:1: ( '{' )
+            // InternalPerspectiveDsl.g:15921:2: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1()); 
@@ -52359,14 +52359,14 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group__2"
-    // InternalPerspectiveDsl.g:15928:1: rule__XBlockExpression__Group__2 : rule__XBlockExpression__Group__2__Impl rule__XBlockExpression__Group__3 ;
+    // InternalPerspectiveDsl.g:15930:1: rule__XBlockExpression__Group__2 : rule__XBlockExpression__Group__2__Impl rule__XBlockExpression__Group__3 ;
     public final void rule__XBlockExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15932:1: ( rule__XBlockExpression__Group__2__Impl rule__XBlockExpression__Group__3 )
-            // InternalPerspectiveDsl.g:15933:2: rule__XBlockExpression__Group__2__Impl rule__XBlockExpression__Group__3
+            // InternalPerspectiveDsl.g:15934:1: ( rule__XBlockExpression__Group__2__Impl rule__XBlockExpression__Group__3 )
+            // InternalPerspectiveDsl.g:15935:2: rule__XBlockExpression__Group__2__Impl rule__XBlockExpression__Group__3
             {
             pushFollow(FOLLOW_114);
             rule__XBlockExpression__Group__2__Impl();
@@ -52397,22 +52397,22 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group__2__Impl"
-    // InternalPerspectiveDsl.g:15940:1: rule__XBlockExpression__Group__2__Impl : ( ( rule__XBlockExpression__Group_2__0 )* ) ;
+    // InternalPerspectiveDsl.g:15942:1: rule__XBlockExpression__Group__2__Impl : ( ( rule__XBlockExpression__Group_2__0 )* ) ;
     public final void rule__XBlockExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15944:1: ( ( ( rule__XBlockExpression__Group_2__0 )* ) )
-            // InternalPerspectiveDsl.g:15945:1: ( ( rule__XBlockExpression__Group_2__0 )* )
+            // InternalPerspectiveDsl.g:15946:1: ( ( ( rule__XBlockExpression__Group_2__0 )* ) )
+            // InternalPerspectiveDsl.g:15947:1: ( ( rule__XBlockExpression__Group_2__0 )* )
             {
-            // InternalPerspectiveDsl.g:15945:1: ( ( rule__XBlockExpression__Group_2__0 )* )
-            // InternalPerspectiveDsl.g:15946:2: ( rule__XBlockExpression__Group_2__0 )*
+            // InternalPerspectiveDsl.g:15947:1: ( ( rule__XBlockExpression__Group_2__0 )* )
+            // InternalPerspectiveDsl.g:15948:2: ( rule__XBlockExpression__Group_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBlockExpressionAccess().getGroup_2()); 
             }
-            // InternalPerspectiveDsl.g:15947:2: ( rule__XBlockExpression__Group_2__0 )*
+            // InternalPerspectiveDsl.g:15949:2: ( rule__XBlockExpression__Group_2__0 )*
             loop109:
             do {
                 int alt109=2;
@@ -52425,7 +52425,7 @@
 
                 switch (alt109) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:15947:3: rule__XBlockExpression__Group_2__0
+            	    // InternalPerspectiveDsl.g:15949:3: rule__XBlockExpression__Group_2__0
             	    {
             	    pushFollow(FOLLOW_98);
             	    rule__XBlockExpression__Group_2__0();
@@ -52466,14 +52466,14 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group__3"
-    // InternalPerspectiveDsl.g:15955:1: rule__XBlockExpression__Group__3 : rule__XBlockExpression__Group__3__Impl ;
+    // InternalPerspectiveDsl.g:15957:1: rule__XBlockExpression__Group__3 : rule__XBlockExpression__Group__3__Impl ;
     public final void rule__XBlockExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15959:1: ( rule__XBlockExpression__Group__3__Impl )
-            // InternalPerspectiveDsl.g:15960:2: rule__XBlockExpression__Group__3__Impl
+            // InternalPerspectiveDsl.g:15961:1: ( rule__XBlockExpression__Group__3__Impl )
+            // InternalPerspectiveDsl.g:15962:2: rule__XBlockExpression__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XBlockExpression__Group__3__Impl();
@@ -52499,17 +52499,17 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group__3__Impl"
-    // InternalPerspectiveDsl.g:15966:1: rule__XBlockExpression__Group__3__Impl : ( '}' ) ;
+    // InternalPerspectiveDsl.g:15968:1: rule__XBlockExpression__Group__3__Impl : ( '}' ) ;
     public final void rule__XBlockExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15970:1: ( ( '}' ) )
-            // InternalPerspectiveDsl.g:15971:1: ( '}' )
+            // InternalPerspectiveDsl.g:15972:1: ( ( '}' ) )
+            // InternalPerspectiveDsl.g:15973:1: ( '}' )
             {
-            // InternalPerspectiveDsl.g:15971:1: ( '}' )
-            // InternalPerspectiveDsl.g:15972:2: '}'
+            // InternalPerspectiveDsl.g:15973:1: ( '}' )
+            // InternalPerspectiveDsl.g:15974:2: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBlockExpressionAccess().getRightCurlyBracketKeyword_3()); 
@@ -52540,14 +52540,14 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group_2__0"
-    // InternalPerspectiveDsl.g:15982:1: rule__XBlockExpression__Group_2__0 : rule__XBlockExpression__Group_2__0__Impl rule__XBlockExpression__Group_2__1 ;
+    // InternalPerspectiveDsl.g:15984:1: rule__XBlockExpression__Group_2__0 : rule__XBlockExpression__Group_2__0__Impl rule__XBlockExpression__Group_2__1 ;
     public final void rule__XBlockExpression__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15986:1: ( rule__XBlockExpression__Group_2__0__Impl rule__XBlockExpression__Group_2__1 )
-            // InternalPerspectiveDsl.g:15987:2: rule__XBlockExpression__Group_2__0__Impl rule__XBlockExpression__Group_2__1
+            // InternalPerspectiveDsl.g:15988:1: ( rule__XBlockExpression__Group_2__0__Impl rule__XBlockExpression__Group_2__1 )
+            // InternalPerspectiveDsl.g:15989:2: rule__XBlockExpression__Group_2__0__Impl rule__XBlockExpression__Group_2__1
             {
             pushFollow(FOLLOW_46);
             rule__XBlockExpression__Group_2__0__Impl();
@@ -52578,23 +52578,23 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group_2__0__Impl"
-    // InternalPerspectiveDsl.g:15994:1: rule__XBlockExpression__Group_2__0__Impl : ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) ) ;
+    // InternalPerspectiveDsl.g:15996:1: rule__XBlockExpression__Group_2__0__Impl : ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) ) ;
     public final void rule__XBlockExpression__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:15998:1: ( ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) ) )
-            // InternalPerspectiveDsl.g:15999:1: ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) )
+            // InternalPerspectiveDsl.g:16000:1: ( ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) ) )
+            // InternalPerspectiveDsl.g:16001:1: ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) )
             {
-            // InternalPerspectiveDsl.g:15999:1: ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) )
-            // InternalPerspectiveDsl.g:16000:2: ( rule__XBlockExpression__ExpressionsAssignment_2_0 )
+            // InternalPerspectiveDsl.g:16001:1: ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) )
+            // InternalPerspectiveDsl.g:16002:2: ( rule__XBlockExpression__ExpressionsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBlockExpressionAccess().getExpressionsAssignment_2_0()); 
             }
-            // InternalPerspectiveDsl.g:16001:2: ( rule__XBlockExpression__ExpressionsAssignment_2_0 )
-            // InternalPerspectiveDsl.g:16001:3: rule__XBlockExpression__ExpressionsAssignment_2_0
+            // InternalPerspectiveDsl.g:16003:2: ( rule__XBlockExpression__ExpressionsAssignment_2_0 )
+            // InternalPerspectiveDsl.g:16003:3: rule__XBlockExpression__ExpressionsAssignment_2_0
             {
             pushFollow(FOLLOW_2);
             rule__XBlockExpression__ExpressionsAssignment_2_0();
@@ -52629,14 +52629,14 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group_2__1"
-    // InternalPerspectiveDsl.g:16009:1: rule__XBlockExpression__Group_2__1 : rule__XBlockExpression__Group_2__1__Impl ;
+    // InternalPerspectiveDsl.g:16011:1: rule__XBlockExpression__Group_2__1 : rule__XBlockExpression__Group_2__1__Impl ;
     public final void rule__XBlockExpression__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16013:1: ( rule__XBlockExpression__Group_2__1__Impl )
-            // InternalPerspectiveDsl.g:16014:2: rule__XBlockExpression__Group_2__1__Impl
+            // InternalPerspectiveDsl.g:16015:1: ( rule__XBlockExpression__Group_2__1__Impl )
+            // InternalPerspectiveDsl.g:16016:2: rule__XBlockExpression__Group_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XBlockExpression__Group_2__1__Impl();
@@ -52662,22 +52662,22 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group_2__1__Impl"
-    // InternalPerspectiveDsl.g:16020:1: rule__XBlockExpression__Group_2__1__Impl : ( ( ';' )? ) ;
+    // InternalPerspectiveDsl.g:16022:1: rule__XBlockExpression__Group_2__1__Impl : ( ( ';' )? ) ;
     public final void rule__XBlockExpression__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16024:1: ( ( ( ';' )? ) )
-            // InternalPerspectiveDsl.g:16025:1: ( ( ';' )? )
+            // InternalPerspectiveDsl.g:16026:1: ( ( ( ';' )? ) )
+            // InternalPerspectiveDsl.g:16027:1: ( ( ';' )? )
             {
-            // InternalPerspectiveDsl.g:16025:1: ( ( ';' )? )
-            // InternalPerspectiveDsl.g:16026:2: ( ';' )?
+            // InternalPerspectiveDsl.g:16027:1: ( ( ';' )? )
+            // InternalPerspectiveDsl.g:16028:2: ( ';' )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1()); 
             }
-            // InternalPerspectiveDsl.g:16027:2: ( ';' )?
+            // InternalPerspectiveDsl.g:16029:2: ( ';' )?
             int alt110=2;
             int LA110_0 = input.LA(1);
 
@@ -52686,7 +52686,7 @@
             }
             switch (alt110) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:16027:3: ';'
+                    // InternalPerspectiveDsl.g:16029:3: ';'
                     {
                     match(input,89,FOLLOW_2); if (state.failed) return ;
 
@@ -52720,14 +52720,14 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group__0"
-    // InternalPerspectiveDsl.g:16036:1: rule__XVariableDeclaration__Group__0 : rule__XVariableDeclaration__Group__0__Impl rule__XVariableDeclaration__Group__1 ;
+    // InternalPerspectiveDsl.g:16038:1: rule__XVariableDeclaration__Group__0 : rule__XVariableDeclaration__Group__0__Impl rule__XVariableDeclaration__Group__1 ;
     public final void rule__XVariableDeclaration__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16040:1: ( rule__XVariableDeclaration__Group__0__Impl rule__XVariableDeclaration__Group__1 )
-            // InternalPerspectiveDsl.g:16041:2: rule__XVariableDeclaration__Group__0__Impl rule__XVariableDeclaration__Group__1
+            // InternalPerspectiveDsl.g:16042:1: ( rule__XVariableDeclaration__Group__0__Impl rule__XVariableDeclaration__Group__1 )
+            // InternalPerspectiveDsl.g:16043:2: rule__XVariableDeclaration__Group__0__Impl rule__XVariableDeclaration__Group__1
             {
             pushFollow(FOLLOW_115);
             rule__XVariableDeclaration__Group__0__Impl();
@@ -52758,23 +52758,23 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group__0__Impl"
-    // InternalPerspectiveDsl.g:16048:1: rule__XVariableDeclaration__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:16050:1: rule__XVariableDeclaration__Group__0__Impl : ( () ) ;
     public final void rule__XVariableDeclaration__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16052:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:16053:1: ( () )
+            // InternalPerspectiveDsl.g:16054:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:16055:1: ( () )
             {
-            // InternalPerspectiveDsl.g:16053:1: ( () )
-            // InternalPerspectiveDsl.g:16054:2: ()
+            // InternalPerspectiveDsl.g:16055:1: ( () )
+            // InternalPerspectiveDsl.g:16056:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getXVariableDeclarationAction_0()); 
             }
-            // InternalPerspectiveDsl.g:16055:2: ()
-            // InternalPerspectiveDsl.g:16055:3: 
+            // InternalPerspectiveDsl.g:16057:2: ()
+            // InternalPerspectiveDsl.g:16057:3: 
             {
             }
 
@@ -52799,14 +52799,14 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group__1"
-    // InternalPerspectiveDsl.g:16063:1: rule__XVariableDeclaration__Group__1 : rule__XVariableDeclaration__Group__1__Impl rule__XVariableDeclaration__Group__2 ;
+    // InternalPerspectiveDsl.g:16065:1: rule__XVariableDeclaration__Group__1 : rule__XVariableDeclaration__Group__1__Impl rule__XVariableDeclaration__Group__2 ;
     public final void rule__XVariableDeclaration__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16067:1: ( rule__XVariableDeclaration__Group__1__Impl rule__XVariableDeclaration__Group__2 )
-            // InternalPerspectiveDsl.g:16068:2: rule__XVariableDeclaration__Group__1__Impl rule__XVariableDeclaration__Group__2
+            // InternalPerspectiveDsl.g:16069:1: ( rule__XVariableDeclaration__Group__1__Impl rule__XVariableDeclaration__Group__2 )
+            // InternalPerspectiveDsl.g:16070:2: rule__XVariableDeclaration__Group__1__Impl rule__XVariableDeclaration__Group__2
             {
             pushFollow(FOLLOW_71);
             rule__XVariableDeclaration__Group__1__Impl();
@@ -52837,23 +52837,23 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group__1__Impl"
-    // InternalPerspectiveDsl.g:16075:1: rule__XVariableDeclaration__Group__1__Impl : ( ( rule__XVariableDeclaration__Alternatives_1 ) ) ;
+    // InternalPerspectiveDsl.g:16077:1: rule__XVariableDeclaration__Group__1__Impl : ( ( rule__XVariableDeclaration__Alternatives_1 ) ) ;
     public final void rule__XVariableDeclaration__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16079:1: ( ( ( rule__XVariableDeclaration__Alternatives_1 ) ) )
-            // InternalPerspectiveDsl.g:16080:1: ( ( rule__XVariableDeclaration__Alternatives_1 ) )
+            // InternalPerspectiveDsl.g:16081:1: ( ( ( rule__XVariableDeclaration__Alternatives_1 ) ) )
+            // InternalPerspectiveDsl.g:16082:1: ( ( rule__XVariableDeclaration__Alternatives_1 ) )
             {
-            // InternalPerspectiveDsl.g:16080:1: ( ( rule__XVariableDeclaration__Alternatives_1 ) )
-            // InternalPerspectiveDsl.g:16081:2: ( rule__XVariableDeclaration__Alternatives_1 )
+            // InternalPerspectiveDsl.g:16082:1: ( ( rule__XVariableDeclaration__Alternatives_1 ) )
+            // InternalPerspectiveDsl.g:16083:2: ( rule__XVariableDeclaration__Alternatives_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getAlternatives_1()); 
             }
-            // InternalPerspectiveDsl.g:16082:2: ( rule__XVariableDeclaration__Alternatives_1 )
-            // InternalPerspectiveDsl.g:16082:3: rule__XVariableDeclaration__Alternatives_1
+            // InternalPerspectiveDsl.g:16084:2: ( rule__XVariableDeclaration__Alternatives_1 )
+            // InternalPerspectiveDsl.g:16084:3: rule__XVariableDeclaration__Alternatives_1
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__Alternatives_1();
@@ -52888,14 +52888,14 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group__2"
-    // InternalPerspectiveDsl.g:16090:1: rule__XVariableDeclaration__Group__2 : rule__XVariableDeclaration__Group__2__Impl rule__XVariableDeclaration__Group__3 ;
+    // InternalPerspectiveDsl.g:16092:1: rule__XVariableDeclaration__Group__2 : rule__XVariableDeclaration__Group__2__Impl rule__XVariableDeclaration__Group__3 ;
     public final void rule__XVariableDeclaration__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16094:1: ( rule__XVariableDeclaration__Group__2__Impl rule__XVariableDeclaration__Group__3 )
-            // InternalPerspectiveDsl.g:16095:2: rule__XVariableDeclaration__Group__2__Impl rule__XVariableDeclaration__Group__3
+            // InternalPerspectiveDsl.g:16096:1: ( rule__XVariableDeclaration__Group__2__Impl rule__XVariableDeclaration__Group__3 )
+            // InternalPerspectiveDsl.g:16097:2: rule__XVariableDeclaration__Group__2__Impl rule__XVariableDeclaration__Group__3
             {
             pushFollow(FOLLOW_55);
             rule__XVariableDeclaration__Group__2__Impl();
@@ -52926,23 +52926,23 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group__2__Impl"
-    // InternalPerspectiveDsl.g:16102:1: rule__XVariableDeclaration__Group__2__Impl : ( ( rule__XVariableDeclaration__Alternatives_2 ) ) ;
+    // InternalPerspectiveDsl.g:16104:1: rule__XVariableDeclaration__Group__2__Impl : ( ( rule__XVariableDeclaration__Alternatives_2 ) ) ;
     public final void rule__XVariableDeclaration__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16106:1: ( ( ( rule__XVariableDeclaration__Alternatives_2 ) ) )
-            // InternalPerspectiveDsl.g:16107:1: ( ( rule__XVariableDeclaration__Alternatives_2 ) )
+            // InternalPerspectiveDsl.g:16108:1: ( ( ( rule__XVariableDeclaration__Alternatives_2 ) ) )
+            // InternalPerspectiveDsl.g:16109:1: ( ( rule__XVariableDeclaration__Alternatives_2 ) )
             {
-            // InternalPerspectiveDsl.g:16107:1: ( ( rule__XVariableDeclaration__Alternatives_2 ) )
-            // InternalPerspectiveDsl.g:16108:2: ( rule__XVariableDeclaration__Alternatives_2 )
+            // InternalPerspectiveDsl.g:16109:1: ( ( rule__XVariableDeclaration__Alternatives_2 ) )
+            // InternalPerspectiveDsl.g:16110:2: ( rule__XVariableDeclaration__Alternatives_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getAlternatives_2()); 
             }
-            // InternalPerspectiveDsl.g:16109:2: ( rule__XVariableDeclaration__Alternatives_2 )
-            // InternalPerspectiveDsl.g:16109:3: rule__XVariableDeclaration__Alternatives_2
+            // InternalPerspectiveDsl.g:16111:2: ( rule__XVariableDeclaration__Alternatives_2 )
+            // InternalPerspectiveDsl.g:16111:3: rule__XVariableDeclaration__Alternatives_2
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__Alternatives_2();
@@ -52977,14 +52977,14 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group__3"
-    // InternalPerspectiveDsl.g:16117:1: rule__XVariableDeclaration__Group__3 : rule__XVariableDeclaration__Group__3__Impl ;
+    // InternalPerspectiveDsl.g:16119:1: rule__XVariableDeclaration__Group__3 : rule__XVariableDeclaration__Group__3__Impl ;
     public final void rule__XVariableDeclaration__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16121:1: ( rule__XVariableDeclaration__Group__3__Impl )
-            // InternalPerspectiveDsl.g:16122:2: rule__XVariableDeclaration__Group__3__Impl
+            // InternalPerspectiveDsl.g:16123:1: ( rule__XVariableDeclaration__Group__3__Impl )
+            // InternalPerspectiveDsl.g:16124:2: rule__XVariableDeclaration__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__Group__3__Impl();
@@ -53010,22 +53010,22 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group__3__Impl"
-    // InternalPerspectiveDsl.g:16128:1: rule__XVariableDeclaration__Group__3__Impl : ( ( rule__XVariableDeclaration__Group_3__0 )? ) ;
+    // InternalPerspectiveDsl.g:16130:1: rule__XVariableDeclaration__Group__3__Impl : ( ( rule__XVariableDeclaration__Group_3__0 )? ) ;
     public final void rule__XVariableDeclaration__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16132:1: ( ( ( rule__XVariableDeclaration__Group_3__0 )? ) )
-            // InternalPerspectiveDsl.g:16133:1: ( ( rule__XVariableDeclaration__Group_3__0 )? )
+            // InternalPerspectiveDsl.g:16134:1: ( ( ( rule__XVariableDeclaration__Group_3__0 )? ) )
+            // InternalPerspectiveDsl.g:16135:1: ( ( rule__XVariableDeclaration__Group_3__0 )? )
             {
-            // InternalPerspectiveDsl.g:16133:1: ( ( rule__XVariableDeclaration__Group_3__0 )? )
-            // InternalPerspectiveDsl.g:16134:2: ( rule__XVariableDeclaration__Group_3__0 )?
+            // InternalPerspectiveDsl.g:16135:1: ( ( rule__XVariableDeclaration__Group_3__0 )? )
+            // InternalPerspectiveDsl.g:16136:2: ( rule__XVariableDeclaration__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getGroup_3()); 
             }
-            // InternalPerspectiveDsl.g:16135:2: ( rule__XVariableDeclaration__Group_3__0 )?
+            // InternalPerspectiveDsl.g:16137:2: ( rule__XVariableDeclaration__Group_3__0 )?
             int alt111=2;
             int LA111_0 = input.LA(1);
 
@@ -53034,7 +53034,7 @@
             }
             switch (alt111) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:16135:3: rule__XVariableDeclaration__Group_3__0
+                    // InternalPerspectiveDsl.g:16137:3: rule__XVariableDeclaration__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XVariableDeclaration__Group_3__0();
@@ -53072,14 +53072,14 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_2_0__0"
-    // InternalPerspectiveDsl.g:16144:1: rule__XVariableDeclaration__Group_2_0__0 : rule__XVariableDeclaration__Group_2_0__0__Impl ;
+    // InternalPerspectiveDsl.g:16146:1: rule__XVariableDeclaration__Group_2_0__0 : rule__XVariableDeclaration__Group_2_0__0__Impl ;
     public final void rule__XVariableDeclaration__Group_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16148:1: ( rule__XVariableDeclaration__Group_2_0__0__Impl )
-            // InternalPerspectiveDsl.g:16149:2: rule__XVariableDeclaration__Group_2_0__0__Impl
+            // InternalPerspectiveDsl.g:16150:1: ( rule__XVariableDeclaration__Group_2_0__0__Impl )
+            // InternalPerspectiveDsl.g:16151:2: rule__XVariableDeclaration__Group_2_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__Group_2_0__0__Impl();
@@ -53105,23 +53105,23 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_2_0__0__Impl"
-    // InternalPerspectiveDsl.g:16155:1: rule__XVariableDeclaration__Group_2_0__0__Impl : ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:16157:1: rule__XVariableDeclaration__Group_2_0__0__Impl : ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) ) ;
     public final void rule__XVariableDeclaration__Group_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16159:1: ( ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:16160:1: ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) )
+            // InternalPerspectiveDsl.g:16161:1: ( ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:16162:1: ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:16160:1: ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) )
-            // InternalPerspectiveDsl.g:16161:2: ( rule__XVariableDeclaration__Group_2_0_0__0 )
+            // InternalPerspectiveDsl.g:16162:1: ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) )
+            // InternalPerspectiveDsl.g:16163:2: ( rule__XVariableDeclaration__Group_2_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0_0()); 
             }
-            // InternalPerspectiveDsl.g:16162:2: ( rule__XVariableDeclaration__Group_2_0_0__0 )
-            // InternalPerspectiveDsl.g:16162:3: rule__XVariableDeclaration__Group_2_0_0__0
+            // InternalPerspectiveDsl.g:16164:2: ( rule__XVariableDeclaration__Group_2_0_0__0 )
+            // InternalPerspectiveDsl.g:16164:3: rule__XVariableDeclaration__Group_2_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__Group_2_0_0__0();
@@ -53156,14 +53156,14 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_2_0_0__0"
-    // InternalPerspectiveDsl.g:16171:1: rule__XVariableDeclaration__Group_2_0_0__0 : rule__XVariableDeclaration__Group_2_0_0__0__Impl rule__XVariableDeclaration__Group_2_0_0__1 ;
+    // InternalPerspectiveDsl.g:16173:1: rule__XVariableDeclaration__Group_2_0_0__0 : rule__XVariableDeclaration__Group_2_0_0__0__Impl rule__XVariableDeclaration__Group_2_0_0__1 ;
     public final void rule__XVariableDeclaration__Group_2_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16175:1: ( rule__XVariableDeclaration__Group_2_0_0__0__Impl rule__XVariableDeclaration__Group_2_0_0__1 )
-            // InternalPerspectiveDsl.g:16176:2: rule__XVariableDeclaration__Group_2_0_0__0__Impl rule__XVariableDeclaration__Group_2_0_0__1
+            // InternalPerspectiveDsl.g:16177:1: ( rule__XVariableDeclaration__Group_2_0_0__0__Impl rule__XVariableDeclaration__Group_2_0_0__1 )
+            // InternalPerspectiveDsl.g:16178:2: rule__XVariableDeclaration__Group_2_0_0__0__Impl rule__XVariableDeclaration__Group_2_0_0__1
             {
             pushFollow(FOLLOW_7);
             rule__XVariableDeclaration__Group_2_0_0__0__Impl();
@@ -53194,23 +53194,23 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_2_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:16183:1: rule__XVariableDeclaration__Group_2_0_0__0__Impl : ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) ) ;
+    // InternalPerspectiveDsl.g:16185:1: rule__XVariableDeclaration__Group_2_0_0__0__Impl : ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) ) ;
     public final void rule__XVariableDeclaration__Group_2_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16187:1: ( ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) ) )
-            // InternalPerspectiveDsl.g:16188:1: ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) )
+            // InternalPerspectiveDsl.g:16189:1: ( ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) ) )
+            // InternalPerspectiveDsl.g:16190:1: ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) )
             {
-            // InternalPerspectiveDsl.g:16188:1: ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) )
-            // InternalPerspectiveDsl.g:16189:2: ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 )
+            // InternalPerspectiveDsl.g:16190:1: ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) )
+            // InternalPerspectiveDsl.g:16191:2: ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getTypeAssignment_2_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:16190:2: ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 )
-            // InternalPerspectiveDsl.g:16190:3: rule__XVariableDeclaration__TypeAssignment_2_0_0_0
+            // InternalPerspectiveDsl.g:16192:2: ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 )
+            // InternalPerspectiveDsl.g:16192:3: rule__XVariableDeclaration__TypeAssignment_2_0_0_0
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__TypeAssignment_2_0_0_0();
@@ -53245,14 +53245,14 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_2_0_0__1"
-    // InternalPerspectiveDsl.g:16198:1: rule__XVariableDeclaration__Group_2_0_0__1 : rule__XVariableDeclaration__Group_2_0_0__1__Impl ;
+    // InternalPerspectiveDsl.g:16200:1: rule__XVariableDeclaration__Group_2_0_0__1 : rule__XVariableDeclaration__Group_2_0_0__1__Impl ;
     public final void rule__XVariableDeclaration__Group_2_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16202:1: ( rule__XVariableDeclaration__Group_2_0_0__1__Impl )
-            // InternalPerspectiveDsl.g:16203:2: rule__XVariableDeclaration__Group_2_0_0__1__Impl
+            // InternalPerspectiveDsl.g:16204:1: ( rule__XVariableDeclaration__Group_2_0_0__1__Impl )
+            // InternalPerspectiveDsl.g:16205:2: rule__XVariableDeclaration__Group_2_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__Group_2_0_0__1__Impl();
@@ -53278,23 +53278,23 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_2_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:16209:1: rule__XVariableDeclaration__Group_2_0_0__1__Impl : ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) ) ;
+    // InternalPerspectiveDsl.g:16211:1: rule__XVariableDeclaration__Group_2_0_0__1__Impl : ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) ) ;
     public final void rule__XVariableDeclaration__Group_2_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16213:1: ( ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) ) )
-            // InternalPerspectiveDsl.g:16214:1: ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) )
+            // InternalPerspectiveDsl.g:16215:1: ( ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) ) )
+            // InternalPerspectiveDsl.g:16216:1: ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) )
             {
-            // InternalPerspectiveDsl.g:16214:1: ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) )
-            // InternalPerspectiveDsl.g:16215:2: ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 )
+            // InternalPerspectiveDsl.g:16216:1: ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) )
+            // InternalPerspectiveDsl.g:16217:2: ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_0_0_1()); 
             }
-            // InternalPerspectiveDsl.g:16216:2: ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 )
-            // InternalPerspectiveDsl.g:16216:3: rule__XVariableDeclaration__NameAssignment_2_0_0_1
+            // InternalPerspectiveDsl.g:16218:2: ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 )
+            // InternalPerspectiveDsl.g:16218:3: rule__XVariableDeclaration__NameAssignment_2_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__NameAssignment_2_0_0_1();
@@ -53329,14 +53329,14 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_3__0"
-    // InternalPerspectiveDsl.g:16225:1: rule__XVariableDeclaration__Group_3__0 : rule__XVariableDeclaration__Group_3__0__Impl rule__XVariableDeclaration__Group_3__1 ;
+    // InternalPerspectiveDsl.g:16227:1: rule__XVariableDeclaration__Group_3__0 : rule__XVariableDeclaration__Group_3__0__Impl rule__XVariableDeclaration__Group_3__1 ;
     public final void rule__XVariableDeclaration__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16229:1: ( rule__XVariableDeclaration__Group_3__0__Impl rule__XVariableDeclaration__Group_3__1 )
-            // InternalPerspectiveDsl.g:16230:2: rule__XVariableDeclaration__Group_3__0__Impl rule__XVariableDeclaration__Group_3__1
+            // InternalPerspectiveDsl.g:16231:1: ( rule__XVariableDeclaration__Group_3__0__Impl rule__XVariableDeclaration__Group_3__1 )
+            // InternalPerspectiveDsl.g:16232:2: rule__XVariableDeclaration__Group_3__0__Impl rule__XVariableDeclaration__Group_3__1
             {
             pushFollow(FOLLOW_54);
             rule__XVariableDeclaration__Group_3__0__Impl();
@@ -53367,17 +53367,17 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_3__0__Impl"
-    // InternalPerspectiveDsl.g:16237:1: rule__XVariableDeclaration__Group_3__0__Impl : ( '=' ) ;
+    // InternalPerspectiveDsl.g:16239:1: rule__XVariableDeclaration__Group_3__0__Impl : ( '=' ) ;
     public final void rule__XVariableDeclaration__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16241:1: ( ( '=' ) )
-            // InternalPerspectiveDsl.g:16242:1: ( '=' )
+            // InternalPerspectiveDsl.g:16243:1: ( ( '=' ) )
+            // InternalPerspectiveDsl.g:16244:1: ( '=' )
             {
-            // InternalPerspectiveDsl.g:16242:1: ( '=' )
-            // InternalPerspectiveDsl.g:16243:2: '='
+            // InternalPerspectiveDsl.g:16244:1: ( '=' )
+            // InternalPerspectiveDsl.g:16245:2: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0()); 
@@ -53408,14 +53408,14 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_3__1"
-    // InternalPerspectiveDsl.g:16252:1: rule__XVariableDeclaration__Group_3__1 : rule__XVariableDeclaration__Group_3__1__Impl ;
+    // InternalPerspectiveDsl.g:16254:1: rule__XVariableDeclaration__Group_3__1 : rule__XVariableDeclaration__Group_3__1__Impl ;
     public final void rule__XVariableDeclaration__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16256:1: ( rule__XVariableDeclaration__Group_3__1__Impl )
-            // InternalPerspectiveDsl.g:16257:2: rule__XVariableDeclaration__Group_3__1__Impl
+            // InternalPerspectiveDsl.g:16258:1: ( rule__XVariableDeclaration__Group_3__1__Impl )
+            // InternalPerspectiveDsl.g:16259:2: rule__XVariableDeclaration__Group_3__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__Group_3__1__Impl();
@@ -53441,23 +53441,23 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_3__1__Impl"
-    // InternalPerspectiveDsl.g:16263:1: rule__XVariableDeclaration__Group_3__1__Impl : ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) ) ;
+    // InternalPerspectiveDsl.g:16265:1: rule__XVariableDeclaration__Group_3__1__Impl : ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) ) ;
     public final void rule__XVariableDeclaration__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16267:1: ( ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) ) )
-            // InternalPerspectiveDsl.g:16268:1: ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) )
+            // InternalPerspectiveDsl.g:16269:1: ( ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) ) )
+            // InternalPerspectiveDsl.g:16270:1: ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) )
             {
-            // InternalPerspectiveDsl.g:16268:1: ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) )
-            // InternalPerspectiveDsl.g:16269:2: ( rule__XVariableDeclaration__RightAssignment_3_1 )
+            // InternalPerspectiveDsl.g:16270:1: ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) )
+            // InternalPerspectiveDsl.g:16271:2: ( rule__XVariableDeclaration__RightAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getRightAssignment_3_1()); 
             }
-            // InternalPerspectiveDsl.g:16270:2: ( rule__XVariableDeclaration__RightAssignment_3_1 )
-            // InternalPerspectiveDsl.g:16270:3: rule__XVariableDeclaration__RightAssignment_3_1
+            // InternalPerspectiveDsl.g:16272:2: ( rule__XVariableDeclaration__RightAssignment_3_1 )
+            // InternalPerspectiveDsl.g:16272:3: rule__XVariableDeclaration__RightAssignment_3_1
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__RightAssignment_3_1();
@@ -53492,14 +53492,14 @@
 
 
     // $ANTLR start "rule__JvmFormalParameter__Group__0"
-    // InternalPerspectiveDsl.g:16279:1: rule__JvmFormalParameter__Group__0 : rule__JvmFormalParameter__Group__0__Impl rule__JvmFormalParameter__Group__1 ;
+    // InternalPerspectiveDsl.g:16281:1: rule__JvmFormalParameter__Group__0 : rule__JvmFormalParameter__Group__0__Impl rule__JvmFormalParameter__Group__1 ;
     public final void rule__JvmFormalParameter__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16283:1: ( rule__JvmFormalParameter__Group__0__Impl rule__JvmFormalParameter__Group__1 )
-            // InternalPerspectiveDsl.g:16284:2: rule__JvmFormalParameter__Group__0__Impl rule__JvmFormalParameter__Group__1
+            // InternalPerspectiveDsl.g:16285:1: ( rule__JvmFormalParameter__Group__0__Impl rule__JvmFormalParameter__Group__1 )
+            // InternalPerspectiveDsl.g:16286:2: rule__JvmFormalParameter__Group__0__Impl rule__JvmFormalParameter__Group__1
             {
             pushFollow(FOLLOW_71);
             rule__JvmFormalParameter__Group__0__Impl();
@@ -53530,22 +53530,22 @@
 
 
     // $ANTLR start "rule__JvmFormalParameter__Group__0__Impl"
-    // InternalPerspectiveDsl.g:16291:1: rule__JvmFormalParameter__Group__0__Impl : ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? ) ;
+    // InternalPerspectiveDsl.g:16293:1: rule__JvmFormalParameter__Group__0__Impl : ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? ) ;
     public final void rule__JvmFormalParameter__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16295:1: ( ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? ) )
-            // InternalPerspectiveDsl.g:16296:1: ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? )
+            // InternalPerspectiveDsl.g:16297:1: ( ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? ) )
+            // InternalPerspectiveDsl.g:16298:1: ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? )
             {
-            // InternalPerspectiveDsl.g:16296:1: ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? )
-            // InternalPerspectiveDsl.g:16297:2: ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )?
+            // InternalPerspectiveDsl.g:16298:1: ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? )
+            // InternalPerspectiveDsl.g:16299:2: ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmFormalParameterAccess().getParameterTypeAssignment_0()); 
             }
-            // InternalPerspectiveDsl.g:16298:2: ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )?
+            // InternalPerspectiveDsl.g:16300:2: ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )?
             int alt112=2;
             int LA112_0 = input.LA(1);
 
@@ -53561,7 +53561,7 @@
             }
             switch (alt112) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:16298:3: rule__JvmFormalParameter__ParameterTypeAssignment_0
+                    // InternalPerspectiveDsl.g:16300:3: rule__JvmFormalParameter__ParameterTypeAssignment_0
                     {
                     pushFollow(FOLLOW_2);
                     rule__JvmFormalParameter__ParameterTypeAssignment_0();
@@ -53599,14 +53599,14 @@
 
 
     // $ANTLR start "rule__JvmFormalParameter__Group__1"
-    // InternalPerspectiveDsl.g:16306:1: rule__JvmFormalParameter__Group__1 : rule__JvmFormalParameter__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:16308:1: rule__JvmFormalParameter__Group__1 : rule__JvmFormalParameter__Group__1__Impl ;
     public final void rule__JvmFormalParameter__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16310:1: ( rule__JvmFormalParameter__Group__1__Impl )
-            // InternalPerspectiveDsl.g:16311:2: rule__JvmFormalParameter__Group__1__Impl
+            // InternalPerspectiveDsl.g:16312:1: ( rule__JvmFormalParameter__Group__1__Impl )
+            // InternalPerspectiveDsl.g:16313:2: rule__JvmFormalParameter__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmFormalParameter__Group__1__Impl();
@@ -53632,23 +53632,23 @@
 
 
     // $ANTLR start "rule__JvmFormalParameter__Group__1__Impl"
-    // InternalPerspectiveDsl.g:16317:1: rule__JvmFormalParameter__Group__1__Impl : ( ( rule__JvmFormalParameter__NameAssignment_1 ) ) ;
+    // InternalPerspectiveDsl.g:16319:1: rule__JvmFormalParameter__Group__1__Impl : ( ( rule__JvmFormalParameter__NameAssignment_1 ) ) ;
     public final void rule__JvmFormalParameter__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16321:1: ( ( ( rule__JvmFormalParameter__NameAssignment_1 ) ) )
-            // InternalPerspectiveDsl.g:16322:1: ( ( rule__JvmFormalParameter__NameAssignment_1 ) )
+            // InternalPerspectiveDsl.g:16323:1: ( ( ( rule__JvmFormalParameter__NameAssignment_1 ) ) )
+            // InternalPerspectiveDsl.g:16324:1: ( ( rule__JvmFormalParameter__NameAssignment_1 ) )
             {
-            // InternalPerspectiveDsl.g:16322:1: ( ( rule__JvmFormalParameter__NameAssignment_1 ) )
-            // InternalPerspectiveDsl.g:16323:2: ( rule__JvmFormalParameter__NameAssignment_1 )
+            // InternalPerspectiveDsl.g:16324:1: ( ( rule__JvmFormalParameter__NameAssignment_1 ) )
+            // InternalPerspectiveDsl.g:16325:2: ( rule__JvmFormalParameter__NameAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmFormalParameterAccess().getNameAssignment_1()); 
             }
-            // InternalPerspectiveDsl.g:16324:2: ( rule__JvmFormalParameter__NameAssignment_1 )
-            // InternalPerspectiveDsl.g:16324:3: rule__JvmFormalParameter__NameAssignment_1
+            // InternalPerspectiveDsl.g:16326:2: ( rule__JvmFormalParameter__NameAssignment_1 )
+            // InternalPerspectiveDsl.g:16326:3: rule__JvmFormalParameter__NameAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmFormalParameter__NameAssignment_1();
@@ -53683,14 +53683,14 @@
 
 
     // $ANTLR start "rule__FullJvmFormalParameter__Group__0"
-    // InternalPerspectiveDsl.g:16333:1: rule__FullJvmFormalParameter__Group__0 : rule__FullJvmFormalParameter__Group__0__Impl rule__FullJvmFormalParameter__Group__1 ;
+    // InternalPerspectiveDsl.g:16335:1: rule__FullJvmFormalParameter__Group__0 : rule__FullJvmFormalParameter__Group__0__Impl rule__FullJvmFormalParameter__Group__1 ;
     public final void rule__FullJvmFormalParameter__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16337:1: ( rule__FullJvmFormalParameter__Group__0__Impl rule__FullJvmFormalParameter__Group__1 )
-            // InternalPerspectiveDsl.g:16338:2: rule__FullJvmFormalParameter__Group__0__Impl rule__FullJvmFormalParameter__Group__1
+            // InternalPerspectiveDsl.g:16339:1: ( rule__FullJvmFormalParameter__Group__0__Impl rule__FullJvmFormalParameter__Group__1 )
+            // InternalPerspectiveDsl.g:16340:2: rule__FullJvmFormalParameter__Group__0__Impl rule__FullJvmFormalParameter__Group__1
             {
             pushFollow(FOLLOW_7);
             rule__FullJvmFormalParameter__Group__0__Impl();
@@ -53721,23 +53721,23 @@
 
 
     // $ANTLR start "rule__FullJvmFormalParameter__Group__0__Impl"
-    // InternalPerspectiveDsl.g:16345:1: rule__FullJvmFormalParameter__Group__0__Impl : ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) ) ;
+    // InternalPerspectiveDsl.g:16347:1: rule__FullJvmFormalParameter__Group__0__Impl : ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) ) ;
     public final void rule__FullJvmFormalParameter__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16349:1: ( ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) ) )
-            // InternalPerspectiveDsl.g:16350:1: ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) )
+            // InternalPerspectiveDsl.g:16351:1: ( ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) ) )
+            // InternalPerspectiveDsl.g:16352:1: ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) )
             {
-            // InternalPerspectiveDsl.g:16350:1: ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) )
-            // InternalPerspectiveDsl.g:16351:2: ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 )
+            // InternalPerspectiveDsl.g:16352:1: ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) )
+            // InternalPerspectiveDsl.g:16353:2: ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeAssignment_0()); 
             }
-            // InternalPerspectiveDsl.g:16352:2: ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 )
-            // InternalPerspectiveDsl.g:16352:3: rule__FullJvmFormalParameter__ParameterTypeAssignment_0
+            // InternalPerspectiveDsl.g:16354:2: ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 )
+            // InternalPerspectiveDsl.g:16354:3: rule__FullJvmFormalParameter__ParameterTypeAssignment_0
             {
             pushFollow(FOLLOW_2);
             rule__FullJvmFormalParameter__ParameterTypeAssignment_0();
@@ -53772,14 +53772,14 @@
 
 
     // $ANTLR start "rule__FullJvmFormalParameter__Group__1"
-    // InternalPerspectiveDsl.g:16360:1: rule__FullJvmFormalParameter__Group__1 : rule__FullJvmFormalParameter__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:16362:1: rule__FullJvmFormalParameter__Group__1 : rule__FullJvmFormalParameter__Group__1__Impl ;
     public final void rule__FullJvmFormalParameter__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16364:1: ( rule__FullJvmFormalParameter__Group__1__Impl )
-            // InternalPerspectiveDsl.g:16365:2: rule__FullJvmFormalParameter__Group__1__Impl
+            // InternalPerspectiveDsl.g:16366:1: ( rule__FullJvmFormalParameter__Group__1__Impl )
+            // InternalPerspectiveDsl.g:16367:2: rule__FullJvmFormalParameter__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__FullJvmFormalParameter__Group__1__Impl();
@@ -53805,23 +53805,23 @@
 
 
     // $ANTLR start "rule__FullJvmFormalParameter__Group__1__Impl"
-    // InternalPerspectiveDsl.g:16371:1: rule__FullJvmFormalParameter__Group__1__Impl : ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) ) ;
+    // InternalPerspectiveDsl.g:16373:1: rule__FullJvmFormalParameter__Group__1__Impl : ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) ) ;
     public final void rule__FullJvmFormalParameter__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16375:1: ( ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) ) )
-            // InternalPerspectiveDsl.g:16376:1: ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) )
+            // InternalPerspectiveDsl.g:16377:1: ( ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) ) )
+            // InternalPerspectiveDsl.g:16378:1: ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) )
             {
-            // InternalPerspectiveDsl.g:16376:1: ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) )
-            // InternalPerspectiveDsl.g:16377:2: ( rule__FullJvmFormalParameter__NameAssignment_1 )
+            // InternalPerspectiveDsl.g:16378:1: ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) )
+            // InternalPerspectiveDsl.g:16379:2: ( rule__FullJvmFormalParameter__NameAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFullJvmFormalParameterAccess().getNameAssignment_1()); 
             }
-            // InternalPerspectiveDsl.g:16378:2: ( rule__FullJvmFormalParameter__NameAssignment_1 )
-            // InternalPerspectiveDsl.g:16378:3: rule__FullJvmFormalParameter__NameAssignment_1
+            // InternalPerspectiveDsl.g:16380:2: ( rule__FullJvmFormalParameter__NameAssignment_1 )
+            // InternalPerspectiveDsl.g:16380:3: rule__FullJvmFormalParameter__NameAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__FullJvmFormalParameter__NameAssignment_1();
@@ -53856,14 +53856,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__0"
-    // InternalPerspectiveDsl.g:16387:1: rule__XFeatureCall__Group__0 : rule__XFeatureCall__Group__0__Impl rule__XFeatureCall__Group__1 ;
+    // InternalPerspectiveDsl.g:16389:1: rule__XFeatureCall__Group__0 : rule__XFeatureCall__Group__0__Impl rule__XFeatureCall__Group__1 ;
     public final void rule__XFeatureCall__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16391:1: ( rule__XFeatureCall__Group__0__Impl rule__XFeatureCall__Group__1 )
-            // InternalPerspectiveDsl.g:16392:2: rule__XFeatureCall__Group__0__Impl rule__XFeatureCall__Group__1
+            // InternalPerspectiveDsl.g:16393:1: ( rule__XFeatureCall__Group__0__Impl rule__XFeatureCall__Group__1 )
+            // InternalPerspectiveDsl.g:16394:2: rule__XFeatureCall__Group__0__Impl rule__XFeatureCall__Group__1
             {
             pushFollow(FOLLOW_89);
             rule__XFeatureCall__Group__0__Impl();
@@ -53894,23 +53894,23 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__0__Impl"
-    // InternalPerspectiveDsl.g:16399:1: rule__XFeatureCall__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:16401:1: rule__XFeatureCall__Group__0__Impl : ( () ) ;
     public final void rule__XFeatureCall__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16403:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:16404:1: ( () )
+            // InternalPerspectiveDsl.g:16405:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:16406:1: ( () )
             {
-            // InternalPerspectiveDsl.g:16404:1: ( () )
-            // InternalPerspectiveDsl.g:16405:2: ()
+            // InternalPerspectiveDsl.g:16406:1: ( () )
+            // InternalPerspectiveDsl.g:16407:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0()); 
             }
-            // InternalPerspectiveDsl.g:16406:2: ()
-            // InternalPerspectiveDsl.g:16406:3: 
+            // InternalPerspectiveDsl.g:16408:2: ()
+            // InternalPerspectiveDsl.g:16408:3: 
             {
             }
 
@@ -53935,14 +53935,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__1"
-    // InternalPerspectiveDsl.g:16414:1: rule__XFeatureCall__Group__1 : rule__XFeatureCall__Group__1__Impl rule__XFeatureCall__Group__2 ;
+    // InternalPerspectiveDsl.g:16416:1: rule__XFeatureCall__Group__1 : rule__XFeatureCall__Group__1__Impl rule__XFeatureCall__Group__2 ;
     public final void rule__XFeatureCall__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16418:1: ( rule__XFeatureCall__Group__1__Impl rule__XFeatureCall__Group__2 )
-            // InternalPerspectiveDsl.g:16419:2: rule__XFeatureCall__Group__1__Impl rule__XFeatureCall__Group__2
+            // InternalPerspectiveDsl.g:16420:1: ( rule__XFeatureCall__Group__1__Impl rule__XFeatureCall__Group__2 )
+            // InternalPerspectiveDsl.g:16421:2: rule__XFeatureCall__Group__1__Impl rule__XFeatureCall__Group__2
             {
             pushFollow(FOLLOW_89);
             rule__XFeatureCall__Group__1__Impl();
@@ -53973,22 +53973,22 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__1__Impl"
-    // InternalPerspectiveDsl.g:16426:1: rule__XFeatureCall__Group__1__Impl : ( ( rule__XFeatureCall__Group_1__0 )? ) ;
+    // InternalPerspectiveDsl.g:16428:1: rule__XFeatureCall__Group__1__Impl : ( ( rule__XFeatureCall__Group_1__0 )? ) ;
     public final void rule__XFeatureCall__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16430:1: ( ( ( rule__XFeatureCall__Group_1__0 )? ) )
-            // InternalPerspectiveDsl.g:16431:1: ( ( rule__XFeatureCall__Group_1__0 )? )
+            // InternalPerspectiveDsl.g:16432:1: ( ( ( rule__XFeatureCall__Group_1__0 )? ) )
+            // InternalPerspectiveDsl.g:16433:1: ( ( rule__XFeatureCall__Group_1__0 )? )
             {
-            // InternalPerspectiveDsl.g:16431:1: ( ( rule__XFeatureCall__Group_1__0 )? )
-            // InternalPerspectiveDsl.g:16432:2: ( rule__XFeatureCall__Group_1__0 )?
+            // InternalPerspectiveDsl.g:16433:1: ( ( rule__XFeatureCall__Group_1__0 )? )
+            // InternalPerspectiveDsl.g:16434:2: ( rule__XFeatureCall__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getGroup_1()); 
             }
-            // InternalPerspectiveDsl.g:16433:2: ( rule__XFeatureCall__Group_1__0 )?
+            // InternalPerspectiveDsl.g:16435:2: ( rule__XFeatureCall__Group_1__0 )?
             int alt113=2;
             int LA113_0 = input.LA(1);
 
@@ -53997,7 +53997,7 @@
             }
             switch (alt113) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:16433:3: rule__XFeatureCall__Group_1__0
+                    // InternalPerspectiveDsl.g:16435:3: rule__XFeatureCall__Group_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XFeatureCall__Group_1__0();
@@ -54035,14 +54035,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__2"
-    // InternalPerspectiveDsl.g:16441:1: rule__XFeatureCall__Group__2 : rule__XFeatureCall__Group__2__Impl rule__XFeatureCall__Group__3 ;
+    // InternalPerspectiveDsl.g:16443:1: rule__XFeatureCall__Group__2 : rule__XFeatureCall__Group__2__Impl rule__XFeatureCall__Group__3 ;
     public final void rule__XFeatureCall__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16445:1: ( rule__XFeatureCall__Group__2__Impl rule__XFeatureCall__Group__3 )
-            // InternalPerspectiveDsl.g:16446:2: rule__XFeatureCall__Group__2__Impl rule__XFeatureCall__Group__3
+            // InternalPerspectiveDsl.g:16447:1: ( rule__XFeatureCall__Group__2__Impl rule__XFeatureCall__Group__3 )
+            // InternalPerspectiveDsl.g:16448:2: rule__XFeatureCall__Group__2__Impl rule__XFeatureCall__Group__3
             {
             pushFollow(FOLLOW_90);
             rule__XFeatureCall__Group__2__Impl();
@@ -54073,23 +54073,23 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__2__Impl"
-    // InternalPerspectiveDsl.g:16453:1: rule__XFeatureCall__Group__2__Impl : ( ( rule__XFeatureCall__FeatureAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:16455:1: rule__XFeatureCall__Group__2__Impl : ( ( rule__XFeatureCall__FeatureAssignment_2 ) ) ;
     public final void rule__XFeatureCall__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16457:1: ( ( ( rule__XFeatureCall__FeatureAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:16458:1: ( ( rule__XFeatureCall__FeatureAssignment_2 ) )
+            // InternalPerspectiveDsl.g:16459:1: ( ( ( rule__XFeatureCall__FeatureAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:16460:1: ( ( rule__XFeatureCall__FeatureAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:16458:1: ( ( rule__XFeatureCall__FeatureAssignment_2 ) )
-            // InternalPerspectiveDsl.g:16459:2: ( rule__XFeatureCall__FeatureAssignment_2 )
+            // InternalPerspectiveDsl.g:16460:1: ( ( rule__XFeatureCall__FeatureAssignment_2 ) )
+            // InternalPerspectiveDsl.g:16461:2: ( rule__XFeatureCall__FeatureAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:16460:2: ( rule__XFeatureCall__FeatureAssignment_2 )
-            // InternalPerspectiveDsl.g:16460:3: rule__XFeatureCall__FeatureAssignment_2
+            // InternalPerspectiveDsl.g:16462:2: ( rule__XFeatureCall__FeatureAssignment_2 )
+            // InternalPerspectiveDsl.g:16462:3: rule__XFeatureCall__FeatureAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__FeatureAssignment_2();
@@ -54124,14 +54124,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__3"
-    // InternalPerspectiveDsl.g:16468:1: rule__XFeatureCall__Group__3 : rule__XFeatureCall__Group__3__Impl rule__XFeatureCall__Group__4 ;
+    // InternalPerspectiveDsl.g:16470:1: rule__XFeatureCall__Group__3 : rule__XFeatureCall__Group__3__Impl rule__XFeatureCall__Group__4 ;
     public final void rule__XFeatureCall__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16472:1: ( rule__XFeatureCall__Group__3__Impl rule__XFeatureCall__Group__4 )
-            // InternalPerspectiveDsl.g:16473:2: rule__XFeatureCall__Group__3__Impl rule__XFeatureCall__Group__4
+            // InternalPerspectiveDsl.g:16474:1: ( rule__XFeatureCall__Group__3__Impl rule__XFeatureCall__Group__4 )
+            // InternalPerspectiveDsl.g:16475:2: rule__XFeatureCall__Group__3__Impl rule__XFeatureCall__Group__4
             {
             pushFollow(FOLLOW_90);
             rule__XFeatureCall__Group__3__Impl();
@@ -54162,27 +54162,27 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__3__Impl"
-    // InternalPerspectiveDsl.g:16480:1: rule__XFeatureCall__Group__3__Impl : ( ( rule__XFeatureCall__Group_3__0 )? ) ;
+    // InternalPerspectiveDsl.g:16482:1: rule__XFeatureCall__Group__3__Impl : ( ( rule__XFeatureCall__Group_3__0 )? ) ;
     public final void rule__XFeatureCall__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16484:1: ( ( ( rule__XFeatureCall__Group_3__0 )? ) )
-            // InternalPerspectiveDsl.g:16485:1: ( ( rule__XFeatureCall__Group_3__0 )? )
+            // InternalPerspectiveDsl.g:16486:1: ( ( ( rule__XFeatureCall__Group_3__0 )? ) )
+            // InternalPerspectiveDsl.g:16487:1: ( ( rule__XFeatureCall__Group_3__0 )? )
             {
-            // InternalPerspectiveDsl.g:16485:1: ( ( rule__XFeatureCall__Group_3__0 )? )
-            // InternalPerspectiveDsl.g:16486:2: ( rule__XFeatureCall__Group_3__0 )?
+            // InternalPerspectiveDsl.g:16487:1: ( ( rule__XFeatureCall__Group_3__0 )? )
+            // InternalPerspectiveDsl.g:16488:2: ( rule__XFeatureCall__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getGroup_3()); 
             }
-            // InternalPerspectiveDsl.g:16487:2: ( rule__XFeatureCall__Group_3__0 )?
+            // InternalPerspectiveDsl.g:16489:2: ( rule__XFeatureCall__Group_3__0 )?
             int alt114=2;
             alt114 = dfa114.predict(input);
             switch (alt114) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:16487:3: rule__XFeatureCall__Group_3__0
+                    // InternalPerspectiveDsl.g:16489:3: rule__XFeatureCall__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XFeatureCall__Group_3__0();
@@ -54220,14 +54220,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__4"
-    // InternalPerspectiveDsl.g:16495:1: rule__XFeatureCall__Group__4 : rule__XFeatureCall__Group__4__Impl ;
+    // InternalPerspectiveDsl.g:16497:1: rule__XFeatureCall__Group__4 : rule__XFeatureCall__Group__4__Impl ;
     public final void rule__XFeatureCall__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16499:1: ( rule__XFeatureCall__Group__4__Impl )
-            // InternalPerspectiveDsl.g:16500:2: rule__XFeatureCall__Group__4__Impl
+            // InternalPerspectiveDsl.g:16501:1: ( rule__XFeatureCall__Group__4__Impl )
+            // InternalPerspectiveDsl.g:16502:2: rule__XFeatureCall__Group__4__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__Group__4__Impl();
@@ -54253,27 +54253,27 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__4__Impl"
-    // InternalPerspectiveDsl.g:16506:1: rule__XFeatureCall__Group__4__Impl : ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? ) ;
+    // InternalPerspectiveDsl.g:16508:1: rule__XFeatureCall__Group__4__Impl : ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? ) ;
     public final void rule__XFeatureCall__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16510:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? ) )
-            // InternalPerspectiveDsl.g:16511:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? )
+            // InternalPerspectiveDsl.g:16512:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? ) )
+            // InternalPerspectiveDsl.g:16513:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? )
             {
-            // InternalPerspectiveDsl.g:16511:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? )
-            // InternalPerspectiveDsl.g:16512:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )?
+            // InternalPerspectiveDsl.g:16513:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? )
+            // InternalPerspectiveDsl.g:16514:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_4()); 
             }
-            // InternalPerspectiveDsl.g:16513:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )?
+            // InternalPerspectiveDsl.g:16515:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )?
             int alt115=2;
             alt115 = dfa115.predict(input);
             switch (alt115) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:16513:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_4
+                    // InternalPerspectiveDsl.g:16515:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_4
                     {
                     pushFollow(FOLLOW_2);
                     rule__XFeatureCall__FeatureCallArgumentsAssignment_4();
@@ -54311,14 +54311,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1__0"
-    // InternalPerspectiveDsl.g:16522:1: rule__XFeatureCall__Group_1__0 : rule__XFeatureCall__Group_1__0__Impl rule__XFeatureCall__Group_1__1 ;
+    // InternalPerspectiveDsl.g:16524:1: rule__XFeatureCall__Group_1__0 : rule__XFeatureCall__Group_1__0__Impl rule__XFeatureCall__Group_1__1 ;
     public final void rule__XFeatureCall__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16526:1: ( rule__XFeatureCall__Group_1__0__Impl rule__XFeatureCall__Group_1__1 )
-            // InternalPerspectiveDsl.g:16527:2: rule__XFeatureCall__Group_1__0__Impl rule__XFeatureCall__Group_1__1
+            // InternalPerspectiveDsl.g:16528:1: ( rule__XFeatureCall__Group_1__0__Impl rule__XFeatureCall__Group_1__1 )
+            // InternalPerspectiveDsl.g:16529:2: rule__XFeatureCall__Group_1__0__Impl rule__XFeatureCall__Group_1__1
             {
             pushFollow(FOLLOW_91);
             rule__XFeatureCall__Group_1__0__Impl();
@@ -54349,17 +54349,17 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1__0__Impl"
-    // InternalPerspectiveDsl.g:16534:1: rule__XFeatureCall__Group_1__0__Impl : ( '<' ) ;
+    // InternalPerspectiveDsl.g:16536:1: rule__XFeatureCall__Group_1__0__Impl : ( '<' ) ;
     public final void rule__XFeatureCall__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16538:1: ( ( '<' ) )
-            // InternalPerspectiveDsl.g:16539:1: ( '<' )
+            // InternalPerspectiveDsl.g:16540:1: ( ( '<' ) )
+            // InternalPerspectiveDsl.g:16541:1: ( '<' )
             {
-            // InternalPerspectiveDsl.g:16539:1: ( '<' )
-            // InternalPerspectiveDsl.g:16540:2: '<'
+            // InternalPerspectiveDsl.g:16541:1: ( '<' )
+            // InternalPerspectiveDsl.g:16542:2: '<'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0()); 
@@ -54390,14 +54390,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1__1"
-    // InternalPerspectiveDsl.g:16549:1: rule__XFeatureCall__Group_1__1 : rule__XFeatureCall__Group_1__1__Impl rule__XFeatureCall__Group_1__2 ;
+    // InternalPerspectiveDsl.g:16551:1: rule__XFeatureCall__Group_1__1 : rule__XFeatureCall__Group_1__1__Impl rule__XFeatureCall__Group_1__2 ;
     public final void rule__XFeatureCall__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16553:1: ( rule__XFeatureCall__Group_1__1__Impl rule__XFeatureCall__Group_1__2 )
-            // InternalPerspectiveDsl.g:16554:2: rule__XFeatureCall__Group_1__1__Impl rule__XFeatureCall__Group_1__2
+            // InternalPerspectiveDsl.g:16555:1: ( rule__XFeatureCall__Group_1__1__Impl rule__XFeatureCall__Group_1__2 )
+            // InternalPerspectiveDsl.g:16556:2: rule__XFeatureCall__Group_1__1__Impl rule__XFeatureCall__Group_1__2
             {
             pushFollow(FOLLOW_92);
             rule__XFeatureCall__Group_1__1__Impl();
@@ -54428,23 +54428,23 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1__1__Impl"
-    // InternalPerspectiveDsl.g:16561:1: rule__XFeatureCall__Group_1__1__Impl : ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:16563:1: rule__XFeatureCall__Group_1__1__Impl : ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) ) ;
     public final void rule__XFeatureCall__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16565:1: ( ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) ) )
-            // InternalPerspectiveDsl.g:16566:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) )
+            // InternalPerspectiveDsl.g:16567:1: ( ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) ) )
+            // InternalPerspectiveDsl.g:16568:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:16566:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) )
-            // InternalPerspectiveDsl.g:16567:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 )
+            // InternalPerspectiveDsl.g:16568:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) )
+            // InternalPerspectiveDsl.g:16569:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getTypeArgumentsAssignment_1_1()); 
             }
-            // InternalPerspectiveDsl.g:16568:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 )
-            // InternalPerspectiveDsl.g:16568:3: rule__XFeatureCall__TypeArgumentsAssignment_1_1
+            // InternalPerspectiveDsl.g:16570:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 )
+            // InternalPerspectiveDsl.g:16570:3: rule__XFeatureCall__TypeArgumentsAssignment_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__TypeArgumentsAssignment_1_1();
@@ -54479,14 +54479,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1__2"
-    // InternalPerspectiveDsl.g:16576:1: rule__XFeatureCall__Group_1__2 : rule__XFeatureCall__Group_1__2__Impl rule__XFeatureCall__Group_1__3 ;
+    // InternalPerspectiveDsl.g:16578:1: rule__XFeatureCall__Group_1__2 : rule__XFeatureCall__Group_1__2__Impl rule__XFeatureCall__Group_1__3 ;
     public final void rule__XFeatureCall__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16580:1: ( rule__XFeatureCall__Group_1__2__Impl rule__XFeatureCall__Group_1__3 )
-            // InternalPerspectiveDsl.g:16581:2: rule__XFeatureCall__Group_1__2__Impl rule__XFeatureCall__Group_1__3
+            // InternalPerspectiveDsl.g:16582:1: ( rule__XFeatureCall__Group_1__2__Impl rule__XFeatureCall__Group_1__3 )
+            // InternalPerspectiveDsl.g:16583:2: rule__XFeatureCall__Group_1__2__Impl rule__XFeatureCall__Group_1__3
             {
             pushFollow(FOLLOW_92);
             rule__XFeatureCall__Group_1__2__Impl();
@@ -54517,22 +54517,22 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1__2__Impl"
-    // InternalPerspectiveDsl.g:16588:1: rule__XFeatureCall__Group_1__2__Impl : ( ( rule__XFeatureCall__Group_1_2__0 )* ) ;
+    // InternalPerspectiveDsl.g:16590:1: rule__XFeatureCall__Group_1__2__Impl : ( ( rule__XFeatureCall__Group_1_2__0 )* ) ;
     public final void rule__XFeatureCall__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16592:1: ( ( ( rule__XFeatureCall__Group_1_2__0 )* ) )
-            // InternalPerspectiveDsl.g:16593:1: ( ( rule__XFeatureCall__Group_1_2__0 )* )
+            // InternalPerspectiveDsl.g:16594:1: ( ( ( rule__XFeatureCall__Group_1_2__0 )* ) )
+            // InternalPerspectiveDsl.g:16595:1: ( ( rule__XFeatureCall__Group_1_2__0 )* )
             {
-            // InternalPerspectiveDsl.g:16593:1: ( ( rule__XFeatureCall__Group_1_2__0 )* )
-            // InternalPerspectiveDsl.g:16594:2: ( rule__XFeatureCall__Group_1_2__0 )*
+            // InternalPerspectiveDsl.g:16595:1: ( ( rule__XFeatureCall__Group_1_2__0 )* )
+            // InternalPerspectiveDsl.g:16596:2: ( rule__XFeatureCall__Group_1_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getGroup_1_2()); 
             }
-            // InternalPerspectiveDsl.g:16595:2: ( rule__XFeatureCall__Group_1_2__0 )*
+            // InternalPerspectiveDsl.g:16597:2: ( rule__XFeatureCall__Group_1_2__0 )*
             loop116:
             do {
                 int alt116=2;
@@ -54545,7 +54545,7 @@
 
                 switch (alt116) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:16595:3: rule__XFeatureCall__Group_1_2__0
+            	    // InternalPerspectiveDsl.g:16597:3: rule__XFeatureCall__Group_1_2__0
             	    {
             	    pushFollow(FOLLOW_53);
             	    rule__XFeatureCall__Group_1_2__0();
@@ -54586,14 +54586,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1__3"
-    // InternalPerspectiveDsl.g:16603:1: rule__XFeatureCall__Group_1__3 : rule__XFeatureCall__Group_1__3__Impl ;
+    // InternalPerspectiveDsl.g:16605:1: rule__XFeatureCall__Group_1__3 : rule__XFeatureCall__Group_1__3__Impl ;
     public final void rule__XFeatureCall__Group_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16607:1: ( rule__XFeatureCall__Group_1__3__Impl )
-            // InternalPerspectiveDsl.g:16608:2: rule__XFeatureCall__Group_1__3__Impl
+            // InternalPerspectiveDsl.g:16609:1: ( rule__XFeatureCall__Group_1__3__Impl )
+            // InternalPerspectiveDsl.g:16610:2: rule__XFeatureCall__Group_1__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__Group_1__3__Impl();
@@ -54619,17 +54619,17 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1__3__Impl"
-    // InternalPerspectiveDsl.g:16614:1: rule__XFeatureCall__Group_1__3__Impl : ( '>' ) ;
+    // InternalPerspectiveDsl.g:16616:1: rule__XFeatureCall__Group_1__3__Impl : ( '>' ) ;
     public final void rule__XFeatureCall__Group_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16618:1: ( ( '>' ) )
-            // InternalPerspectiveDsl.g:16619:1: ( '>' )
+            // InternalPerspectiveDsl.g:16620:1: ( ( '>' ) )
+            // InternalPerspectiveDsl.g:16621:1: ( '>' )
             {
-            // InternalPerspectiveDsl.g:16619:1: ( '>' )
-            // InternalPerspectiveDsl.g:16620:2: '>'
+            // InternalPerspectiveDsl.g:16621:1: ( '>' )
+            // InternalPerspectiveDsl.g:16622:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3()); 
@@ -54660,14 +54660,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1_2__0"
-    // InternalPerspectiveDsl.g:16630:1: rule__XFeatureCall__Group_1_2__0 : rule__XFeatureCall__Group_1_2__0__Impl rule__XFeatureCall__Group_1_2__1 ;
+    // InternalPerspectiveDsl.g:16632:1: rule__XFeatureCall__Group_1_2__0 : rule__XFeatureCall__Group_1_2__0__Impl rule__XFeatureCall__Group_1_2__1 ;
     public final void rule__XFeatureCall__Group_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16634:1: ( rule__XFeatureCall__Group_1_2__0__Impl rule__XFeatureCall__Group_1_2__1 )
-            // InternalPerspectiveDsl.g:16635:2: rule__XFeatureCall__Group_1_2__0__Impl rule__XFeatureCall__Group_1_2__1
+            // InternalPerspectiveDsl.g:16636:1: ( rule__XFeatureCall__Group_1_2__0__Impl rule__XFeatureCall__Group_1_2__1 )
+            // InternalPerspectiveDsl.g:16637:2: rule__XFeatureCall__Group_1_2__0__Impl rule__XFeatureCall__Group_1_2__1
             {
             pushFollow(FOLLOW_91);
             rule__XFeatureCall__Group_1_2__0__Impl();
@@ -54698,17 +54698,17 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1_2__0__Impl"
-    // InternalPerspectiveDsl.g:16642:1: rule__XFeatureCall__Group_1_2__0__Impl : ( ',' ) ;
+    // InternalPerspectiveDsl.g:16644:1: rule__XFeatureCall__Group_1_2__0__Impl : ( ',' ) ;
     public final void rule__XFeatureCall__Group_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16646:1: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:16647:1: ( ',' )
+            // InternalPerspectiveDsl.g:16648:1: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:16649:1: ( ',' )
             {
-            // InternalPerspectiveDsl.g:16647:1: ( ',' )
-            // InternalPerspectiveDsl.g:16648:2: ','
+            // InternalPerspectiveDsl.g:16649:1: ( ',' )
+            // InternalPerspectiveDsl.g:16650:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0()); 
@@ -54739,14 +54739,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1_2__1"
-    // InternalPerspectiveDsl.g:16657:1: rule__XFeatureCall__Group_1_2__1 : rule__XFeatureCall__Group_1_2__1__Impl ;
+    // InternalPerspectiveDsl.g:16659:1: rule__XFeatureCall__Group_1_2__1 : rule__XFeatureCall__Group_1_2__1__Impl ;
     public final void rule__XFeatureCall__Group_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16661:1: ( rule__XFeatureCall__Group_1_2__1__Impl )
-            // InternalPerspectiveDsl.g:16662:2: rule__XFeatureCall__Group_1_2__1__Impl
+            // InternalPerspectiveDsl.g:16663:1: ( rule__XFeatureCall__Group_1_2__1__Impl )
+            // InternalPerspectiveDsl.g:16664:2: rule__XFeatureCall__Group_1_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__Group_1_2__1__Impl();
@@ -54772,23 +54772,23 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1_2__1__Impl"
-    // InternalPerspectiveDsl.g:16668:1: rule__XFeatureCall__Group_1_2__1__Impl : ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) ) ;
+    // InternalPerspectiveDsl.g:16670:1: rule__XFeatureCall__Group_1_2__1__Impl : ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) ) ;
     public final void rule__XFeatureCall__Group_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16672:1: ( ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) ) )
-            // InternalPerspectiveDsl.g:16673:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) )
+            // InternalPerspectiveDsl.g:16674:1: ( ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) ) )
+            // InternalPerspectiveDsl.g:16675:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) )
             {
-            // InternalPerspectiveDsl.g:16673:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) )
-            // InternalPerspectiveDsl.g:16674:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 )
+            // InternalPerspectiveDsl.g:16675:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) )
+            // InternalPerspectiveDsl.g:16676:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getTypeArgumentsAssignment_1_2_1()); 
             }
-            // InternalPerspectiveDsl.g:16675:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 )
-            // InternalPerspectiveDsl.g:16675:3: rule__XFeatureCall__TypeArgumentsAssignment_1_2_1
+            // InternalPerspectiveDsl.g:16677:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 )
+            // InternalPerspectiveDsl.g:16677:3: rule__XFeatureCall__TypeArgumentsAssignment_1_2_1
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__TypeArgumentsAssignment_1_2_1();
@@ -54823,14 +54823,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3__0"
-    // InternalPerspectiveDsl.g:16684:1: rule__XFeatureCall__Group_3__0 : rule__XFeatureCall__Group_3__0__Impl rule__XFeatureCall__Group_3__1 ;
+    // InternalPerspectiveDsl.g:16686:1: rule__XFeatureCall__Group_3__0 : rule__XFeatureCall__Group_3__0__Impl rule__XFeatureCall__Group_3__1 ;
     public final void rule__XFeatureCall__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16688:1: ( rule__XFeatureCall__Group_3__0__Impl rule__XFeatureCall__Group_3__1 )
-            // InternalPerspectiveDsl.g:16689:2: rule__XFeatureCall__Group_3__0__Impl rule__XFeatureCall__Group_3__1
+            // InternalPerspectiveDsl.g:16690:1: ( rule__XFeatureCall__Group_3__0__Impl rule__XFeatureCall__Group_3__1 )
+            // InternalPerspectiveDsl.g:16691:2: rule__XFeatureCall__Group_3__0__Impl rule__XFeatureCall__Group_3__1
             {
             pushFollow(FOLLOW_93);
             rule__XFeatureCall__Group_3__0__Impl();
@@ -54861,23 +54861,23 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3__0__Impl"
-    // InternalPerspectiveDsl.g:16696:1: rule__XFeatureCall__Group_3__0__Impl : ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) ) ;
+    // InternalPerspectiveDsl.g:16698:1: rule__XFeatureCall__Group_3__0__Impl : ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) ) ;
     public final void rule__XFeatureCall__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16700:1: ( ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) ) )
-            // InternalPerspectiveDsl.g:16701:1: ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) )
+            // InternalPerspectiveDsl.g:16702:1: ( ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) ) )
+            // InternalPerspectiveDsl.g:16703:1: ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) )
             {
-            // InternalPerspectiveDsl.g:16701:1: ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) )
-            // InternalPerspectiveDsl.g:16702:2: ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 )
+            // InternalPerspectiveDsl.g:16703:1: ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) )
+            // InternalPerspectiveDsl.g:16704:2: ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallAssignment_3_0()); 
             }
-            // InternalPerspectiveDsl.g:16703:2: ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 )
-            // InternalPerspectiveDsl.g:16703:3: rule__XFeatureCall__ExplicitOperationCallAssignment_3_0
+            // InternalPerspectiveDsl.g:16705:2: ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 )
+            // InternalPerspectiveDsl.g:16705:3: rule__XFeatureCall__ExplicitOperationCallAssignment_3_0
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__ExplicitOperationCallAssignment_3_0();
@@ -54912,14 +54912,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3__1"
-    // InternalPerspectiveDsl.g:16711:1: rule__XFeatureCall__Group_3__1 : rule__XFeatureCall__Group_3__1__Impl rule__XFeatureCall__Group_3__2 ;
+    // InternalPerspectiveDsl.g:16713:1: rule__XFeatureCall__Group_3__1 : rule__XFeatureCall__Group_3__1__Impl rule__XFeatureCall__Group_3__2 ;
     public final void rule__XFeatureCall__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16715:1: ( rule__XFeatureCall__Group_3__1__Impl rule__XFeatureCall__Group_3__2 )
-            // InternalPerspectiveDsl.g:16716:2: rule__XFeatureCall__Group_3__1__Impl rule__XFeatureCall__Group_3__2
+            // InternalPerspectiveDsl.g:16717:1: ( rule__XFeatureCall__Group_3__1__Impl rule__XFeatureCall__Group_3__2 )
+            // InternalPerspectiveDsl.g:16718:2: rule__XFeatureCall__Group_3__1__Impl rule__XFeatureCall__Group_3__2
             {
             pushFollow(FOLLOW_93);
             rule__XFeatureCall__Group_3__1__Impl();
@@ -54950,22 +54950,22 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3__1__Impl"
-    // InternalPerspectiveDsl.g:16723:1: rule__XFeatureCall__Group_3__1__Impl : ( ( rule__XFeatureCall__Alternatives_3_1 )? ) ;
+    // InternalPerspectiveDsl.g:16725:1: rule__XFeatureCall__Group_3__1__Impl : ( ( rule__XFeatureCall__Alternatives_3_1 )? ) ;
     public final void rule__XFeatureCall__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16727:1: ( ( ( rule__XFeatureCall__Alternatives_3_1 )? ) )
-            // InternalPerspectiveDsl.g:16728:1: ( ( rule__XFeatureCall__Alternatives_3_1 )? )
+            // InternalPerspectiveDsl.g:16729:1: ( ( ( rule__XFeatureCall__Alternatives_3_1 )? ) )
+            // InternalPerspectiveDsl.g:16730:1: ( ( rule__XFeatureCall__Alternatives_3_1 )? )
             {
-            // InternalPerspectiveDsl.g:16728:1: ( ( rule__XFeatureCall__Alternatives_3_1 )? )
-            // InternalPerspectiveDsl.g:16729:2: ( rule__XFeatureCall__Alternatives_3_1 )?
+            // InternalPerspectiveDsl.g:16730:1: ( ( rule__XFeatureCall__Alternatives_3_1 )? )
+            // InternalPerspectiveDsl.g:16731:2: ( rule__XFeatureCall__Alternatives_3_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getAlternatives_3_1()); 
             }
-            // InternalPerspectiveDsl.g:16730:2: ( rule__XFeatureCall__Alternatives_3_1 )?
+            // InternalPerspectiveDsl.g:16732:2: ( rule__XFeatureCall__Alternatives_3_1 )?
             int alt117=2;
             int LA117_0 = input.LA(1);
 
@@ -54974,7 +54974,7 @@
             }
             switch (alt117) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:16730:3: rule__XFeatureCall__Alternatives_3_1
+                    // InternalPerspectiveDsl.g:16732:3: rule__XFeatureCall__Alternatives_3_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XFeatureCall__Alternatives_3_1();
@@ -55012,14 +55012,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3__2"
-    // InternalPerspectiveDsl.g:16738:1: rule__XFeatureCall__Group_3__2 : rule__XFeatureCall__Group_3__2__Impl ;
+    // InternalPerspectiveDsl.g:16740:1: rule__XFeatureCall__Group_3__2 : rule__XFeatureCall__Group_3__2__Impl ;
     public final void rule__XFeatureCall__Group_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16742:1: ( rule__XFeatureCall__Group_3__2__Impl )
-            // InternalPerspectiveDsl.g:16743:2: rule__XFeatureCall__Group_3__2__Impl
+            // InternalPerspectiveDsl.g:16744:1: ( rule__XFeatureCall__Group_3__2__Impl )
+            // InternalPerspectiveDsl.g:16745:2: rule__XFeatureCall__Group_3__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__Group_3__2__Impl();
@@ -55045,17 +55045,17 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3__2__Impl"
-    // InternalPerspectiveDsl.g:16749:1: rule__XFeatureCall__Group_3__2__Impl : ( ')' ) ;
+    // InternalPerspectiveDsl.g:16751:1: rule__XFeatureCall__Group_3__2__Impl : ( ')' ) ;
     public final void rule__XFeatureCall__Group_3__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16753:1: ( ( ')' ) )
-            // InternalPerspectiveDsl.g:16754:1: ( ')' )
+            // InternalPerspectiveDsl.g:16755:1: ( ( ')' ) )
+            // InternalPerspectiveDsl.g:16756:1: ( ')' )
             {
-            // InternalPerspectiveDsl.g:16754:1: ( ')' )
-            // InternalPerspectiveDsl.g:16755:2: ')'
+            // InternalPerspectiveDsl.g:16756:1: ( ')' )
+            // InternalPerspectiveDsl.g:16757:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2()); 
@@ -55086,14 +55086,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3_1_1__0"
-    // InternalPerspectiveDsl.g:16765:1: rule__XFeatureCall__Group_3_1_1__0 : rule__XFeatureCall__Group_3_1_1__0__Impl rule__XFeatureCall__Group_3_1_1__1 ;
+    // InternalPerspectiveDsl.g:16767:1: rule__XFeatureCall__Group_3_1_1__0 : rule__XFeatureCall__Group_3_1_1__0__Impl rule__XFeatureCall__Group_3_1_1__1 ;
     public final void rule__XFeatureCall__Group_3_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16769:1: ( rule__XFeatureCall__Group_3_1_1__0__Impl rule__XFeatureCall__Group_3_1_1__1 )
-            // InternalPerspectiveDsl.g:16770:2: rule__XFeatureCall__Group_3_1_1__0__Impl rule__XFeatureCall__Group_3_1_1__1
+            // InternalPerspectiveDsl.g:16771:1: ( rule__XFeatureCall__Group_3_1_1__0__Impl rule__XFeatureCall__Group_3_1_1__1 )
+            // InternalPerspectiveDsl.g:16772:2: rule__XFeatureCall__Group_3_1_1__0__Impl rule__XFeatureCall__Group_3_1_1__1
             {
             pushFollow(FOLLOW_52);
             rule__XFeatureCall__Group_3_1_1__0__Impl();
@@ -55124,23 +55124,23 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3_1_1__0__Impl"
-    // InternalPerspectiveDsl.g:16777:1: rule__XFeatureCall__Group_3_1_1__0__Impl : ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) ) ;
+    // InternalPerspectiveDsl.g:16779:1: rule__XFeatureCall__Group_3_1_1__0__Impl : ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) ) ;
     public final void rule__XFeatureCall__Group_3_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16781:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) ) )
-            // InternalPerspectiveDsl.g:16782:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) )
+            // InternalPerspectiveDsl.g:16783:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) ) )
+            // InternalPerspectiveDsl.g:16784:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) )
             {
-            // InternalPerspectiveDsl.g:16782:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) )
-            // InternalPerspectiveDsl.g:16783:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 )
+            // InternalPerspectiveDsl.g:16784:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) )
+            // InternalPerspectiveDsl.g:16785:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_1_0()); 
             }
-            // InternalPerspectiveDsl.g:16784:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 )
-            // InternalPerspectiveDsl.g:16784:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0
+            // InternalPerspectiveDsl.g:16786:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 )
+            // InternalPerspectiveDsl.g:16786:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0();
@@ -55175,14 +55175,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3_1_1__1"
-    // InternalPerspectiveDsl.g:16792:1: rule__XFeatureCall__Group_3_1_1__1 : rule__XFeatureCall__Group_3_1_1__1__Impl ;
+    // InternalPerspectiveDsl.g:16794:1: rule__XFeatureCall__Group_3_1_1__1 : rule__XFeatureCall__Group_3_1_1__1__Impl ;
     public final void rule__XFeatureCall__Group_3_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16796:1: ( rule__XFeatureCall__Group_3_1_1__1__Impl )
-            // InternalPerspectiveDsl.g:16797:2: rule__XFeatureCall__Group_3_1_1__1__Impl
+            // InternalPerspectiveDsl.g:16798:1: ( rule__XFeatureCall__Group_3_1_1__1__Impl )
+            // InternalPerspectiveDsl.g:16799:2: rule__XFeatureCall__Group_3_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__Group_3_1_1__1__Impl();
@@ -55208,22 +55208,22 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3_1_1__1__Impl"
-    // InternalPerspectiveDsl.g:16803:1: rule__XFeatureCall__Group_3_1_1__1__Impl : ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:16805:1: rule__XFeatureCall__Group_3_1_1__1__Impl : ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* ) ;
     public final void rule__XFeatureCall__Group_3_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16807:1: ( ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* ) )
-            // InternalPerspectiveDsl.g:16808:1: ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* )
+            // InternalPerspectiveDsl.g:16809:1: ( ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* ) )
+            // InternalPerspectiveDsl.g:16810:1: ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:16808:1: ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* )
-            // InternalPerspectiveDsl.g:16809:2: ( rule__XFeatureCall__Group_3_1_1_1__0 )*
+            // InternalPerspectiveDsl.g:16810:1: ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* )
+            // InternalPerspectiveDsl.g:16811:2: ( rule__XFeatureCall__Group_3_1_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1_1()); 
             }
-            // InternalPerspectiveDsl.g:16810:2: ( rule__XFeatureCall__Group_3_1_1_1__0 )*
+            // InternalPerspectiveDsl.g:16812:2: ( rule__XFeatureCall__Group_3_1_1_1__0 )*
             loop118:
             do {
                 int alt118=2;
@@ -55236,7 +55236,7 @@
 
                 switch (alt118) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:16810:3: rule__XFeatureCall__Group_3_1_1_1__0
+            	    // InternalPerspectiveDsl.g:16812:3: rule__XFeatureCall__Group_3_1_1_1__0
             	    {
             	    pushFollow(FOLLOW_53);
             	    rule__XFeatureCall__Group_3_1_1_1__0();
@@ -55277,14 +55277,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3_1_1_1__0"
-    // InternalPerspectiveDsl.g:16819:1: rule__XFeatureCall__Group_3_1_1_1__0 : rule__XFeatureCall__Group_3_1_1_1__0__Impl rule__XFeatureCall__Group_3_1_1_1__1 ;
+    // InternalPerspectiveDsl.g:16821:1: rule__XFeatureCall__Group_3_1_1_1__0 : rule__XFeatureCall__Group_3_1_1_1__0__Impl rule__XFeatureCall__Group_3_1_1_1__1 ;
     public final void rule__XFeatureCall__Group_3_1_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16823:1: ( rule__XFeatureCall__Group_3_1_1_1__0__Impl rule__XFeatureCall__Group_3_1_1_1__1 )
-            // InternalPerspectiveDsl.g:16824:2: rule__XFeatureCall__Group_3_1_1_1__0__Impl rule__XFeatureCall__Group_3_1_1_1__1
+            // InternalPerspectiveDsl.g:16825:1: ( rule__XFeatureCall__Group_3_1_1_1__0__Impl rule__XFeatureCall__Group_3_1_1_1__1 )
+            // InternalPerspectiveDsl.g:16826:2: rule__XFeatureCall__Group_3_1_1_1__0__Impl rule__XFeatureCall__Group_3_1_1_1__1
             {
             pushFollow(FOLLOW_54);
             rule__XFeatureCall__Group_3_1_1_1__0__Impl();
@@ -55315,17 +55315,17 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3_1_1_1__0__Impl"
-    // InternalPerspectiveDsl.g:16831:1: rule__XFeatureCall__Group_3_1_1_1__0__Impl : ( ',' ) ;
+    // InternalPerspectiveDsl.g:16833:1: rule__XFeatureCall__Group_3_1_1_1__0__Impl : ( ',' ) ;
     public final void rule__XFeatureCall__Group_3_1_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16835:1: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:16836:1: ( ',' )
+            // InternalPerspectiveDsl.g:16837:1: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:16838:1: ( ',' )
             {
-            // InternalPerspectiveDsl.g:16836:1: ( ',' )
-            // InternalPerspectiveDsl.g:16837:2: ','
+            // InternalPerspectiveDsl.g:16838:1: ( ',' )
+            // InternalPerspectiveDsl.g:16839:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0()); 
@@ -55356,14 +55356,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3_1_1_1__1"
-    // InternalPerspectiveDsl.g:16846:1: rule__XFeatureCall__Group_3_1_1_1__1 : rule__XFeatureCall__Group_3_1_1_1__1__Impl ;
+    // InternalPerspectiveDsl.g:16848:1: rule__XFeatureCall__Group_3_1_1_1__1 : rule__XFeatureCall__Group_3_1_1_1__1__Impl ;
     public final void rule__XFeatureCall__Group_3_1_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16850:1: ( rule__XFeatureCall__Group_3_1_1_1__1__Impl )
-            // InternalPerspectiveDsl.g:16851:2: rule__XFeatureCall__Group_3_1_1_1__1__Impl
+            // InternalPerspectiveDsl.g:16852:1: ( rule__XFeatureCall__Group_3_1_1_1__1__Impl )
+            // InternalPerspectiveDsl.g:16853:2: rule__XFeatureCall__Group_3_1_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__Group_3_1_1_1__1__Impl();
@@ -55389,23 +55389,23 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3_1_1_1__1__Impl"
-    // InternalPerspectiveDsl.g:16857:1: rule__XFeatureCall__Group_3_1_1_1__1__Impl : ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:16859:1: rule__XFeatureCall__Group_3_1_1_1__1__Impl : ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) ) ;
     public final void rule__XFeatureCall__Group_3_1_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16861:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) ) )
-            // InternalPerspectiveDsl.g:16862:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) )
+            // InternalPerspectiveDsl.g:16863:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) ) )
+            // InternalPerspectiveDsl.g:16864:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:16862:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) )
-            // InternalPerspectiveDsl.g:16863:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 )
+            // InternalPerspectiveDsl.g:16864:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) )
+            // InternalPerspectiveDsl.g:16865:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_1_1_1()); 
             }
-            // InternalPerspectiveDsl.g:16864:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 )
-            // InternalPerspectiveDsl.g:16864:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1
+            // InternalPerspectiveDsl.g:16866:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 )
+            // InternalPerspectiveDsl.g:16866:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1();
@@ -55440,14 +55440,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__0"
-    // InternalPerspectiveDsl.g:16873:1: rule__XConstructorCall__Group__0 : rule__XConstructorCall__Group__0__Impl rule__XConstructorCall__Group__1 ;
+    // InternalPerspectiveDsl.g:16875:1: rule__XConstructorCall__Group__0 : rule__XConstructorCall__Group__0__Impl rule__XConstructorCall__Group__1 ;
     public final void rule__XConstructorCall__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16877:1: ( rule__XConstructorCall__Group__0__Impl rule__XConstructorCall__Group__1 )
-            // InternalPerspectiveDsl.g:16878:2: rule__XConstructorCall__Group__0__Impl rule__XConstructorCall__Group__1
+            // InternalPerspectiveDsl.g:16879:1: ( rule__XConstructorCall__Group__0__Impl rule__XConstructorCall__Group__1 )
+            // InternalPerspectiveDsl.g:16880:2: rule__XConstructorCall__Group__0__Impl rule__XConstructorCall__Group__1
             {
             pushFollow(FOLLOW_116);
             rule__XConstructorCall__Group__0__Impl();
@@ -55478,23 +55478,23 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__0__Impl"
-    // InternalPerspectiveDsl.g:16885:1: rule__XConstructorCall__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:16887:1: rule__XConstructorCall__Group__0__Impl : ( () ) ;
     public final void rule__XConstructorCall__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16889:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:16890:1: ( () )
+            // InternalPerspectiveDsl.g:16891:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:16892:1: ( () )
             {
-            // InternalPerspectiveDsl.g:16890:1: ( () )
-            // InternalPerspectiveDsl.g:16891:2: ()
+            // InternalPerspectiveDsl.g:16892:1: ( () )
+            // InternalPerspectiveDsl.g:16893:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getXConstructorCallAction_0()); 
             }
-            // InternalPerspectiveDsl.g:16892:2: ()
-            // InternalPerspectiveDsl.g:16892:3: 
+            // InternalPerspectiveDsl.g:16894:2: ()
+            // InternalPerspectiveDsl.g:16894:3: 
             {
             }
 
@@ -55519,14 +55519,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__1"
-    // InternalPerspectiveDsl.g:16900:1: rule__XConstructorCall__Group__1 : rule__XConstructorCall__Group__1__Impl rule__XConstructorCall__Group__2 ;
+    // InternalPerspectiveDsl.g:16902:1: rule__XConstructorCall__Group__1 : rule__XConstructorCall__Group__1__Impl rule__XConstructorCall__Group__2 ;
     public final void rule__XConstructorCall__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16904:1: ( rule__XConstructorCall__Group__1__Impl rule__XConstructorCall__Group__2 )
-            // InternalPerspectiveDsl.g:16905:2: rule__XConstructorCall__Group__1__Impl rule__XConstructorCall__Group__2
+            // InternalPerspectiveDsl.g:16906:1: ( rule__XConstructorCall__Group__1__Impl rule__XConstructorCall__Group__2 )
+            // InternalPerspectiveDsl.g:16907:2: rule__XConstructorCall__Group__1__Impl rule__XConstructorCall__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__XConstructorCall__Group__1__Impl();
@@ -55557,17 +55557,17 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__1__Impl"
-    // InternalPerspectiveDsl.g:16912:1: rule__XConstructorCall__Group__1__Impl : ( 'new' ) ;
+    // InternalPerspectiveDsl.g:16914:1: rule__XConstructorCall__Group__1__Impl : ( 'new' ) ;
     public final void rule__XConstructorCall__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16916:1: ( ( 'new' ) )
-            // InternalPerspectiveDsl.g:16917:1: ( 'new' )
+            // InternalPerspectiveDsl.g:16918:1: ( ( 'new' ) )
+            // InternalPerspectiveDsl.g:16919:1: ( 'new' )
             {
-            // InternalPerspectiveDsl.g:16917:1: ( 'new' )
-            // InternalPerspectiveDsl.g:16918:2: 'new'
+            // InternalPerspectiveDsl.g:16919:1: ( 'new' )
+            // InternalPerspectiveDsl.g:16920:2: 'new'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getNewKeyword_1()); 
@@ -55598,14 +55598,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__2"
-    // InternalPerspectiveDsl.g:16927:1: rule__XConstructorCall__Group__2 : rule__XConstructorCall__Group__2__Impl rule__XConstructorCall__Group__3 ;
+    // InternalPerspectiveDsl.g:16929:1: rule__XConstructorCall__Group__2 : rule__XConstructorCall__Group__2__Impl rule__XConstructorCall__Group__3 ;
     public final void rule__XConstructorCall__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16931:1: ( rule__XConstructorCall__Group__2__Impl rule__XConstructorCall__Group__3 )
-            // InternalPerspectiveDsl.g:16932:2: rule__XConstructorCall__Group__2__Impl rule__XConstructorCall__Group__3
+            // InternalPerspectiveDsl.g:16933:1: ( rule__XConstructorCall__Group__2__Impl rule__XConstructorCall__Group__3 )
+            // InternalPerspectiveDsl.g:16934:2: rule__XConstructorCall__Group__2__Impl rule__XConstructorCall__Group__3
             {
             pushFollow(FOLLOW_117);
             rule__XConstructorCall__Group__2__Impl();
@@ -55636,23 +55636,23 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__2__Impl"
-    // InternalPerspectiveDsl.g:16939:1: rule__XConstructorCall__Group__2__Impl : ( ( rule__XConstructorCall__ConstructorAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:16941:1: rule__XConstructorCall__Group__2__Impl : ( ( rule__XConstructorCall__ConstructorAssignment_2 ) ) ;
     public final void rule__XConstructorCall__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16943:1: ( ( ( rule__XConstructorCall__ConstructorAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:16944:1: ( ( rule__XConstructorCall__ConstructorAssignment_2 ) )
+            // InternalPerspectiveDsl.g:16945:1: ( ( ( rule__XConstructorCall__ConstructorAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:16946:1: ( ( rule__XConstructorCall__ConstructorAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:16944:1: ( ( rule__XConstructorCall__ConstructorAssignment_2 ) )
-            // InternalPerspectiveDsl.g:16945:2: ( rule__XConstructorCall__ConstructorAssignment_2 )
+            // InternalPerspectiveDsl.g:16946:1: ( ( rule__XConstructorCall__ConstructorAssignment_2 ) )
+            // InternalPerspectiveDsl.g:16947:2: ( rule__XConstructorCall__ConstructorAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getConstructorAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:16946:2: ( rule__XConstructorCall__ConstructorAssignment_2 )
-            // InternalPerspectiveDsl.g:16946:3: rule__XConstructorCall__ConstructorAssignment_2
+            // InternalPerspectiveDsl.g:16948:2: ( rule__XConstructorCall__ConstructorAssignment_2 )
+            // InternalPerspectiveDsl.g:16948:3: rule__XConstructorCall__ConstructorAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__ConstructorAssignment_2();
@@ -55687,14 +55687,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__3"
-    // InternalPerspectiveDsl.g:16954:1: rule__XConstructorCall__Group__3 : rule__XConstructorCall__Group__3__Impl rule__XConstructorCall__Group__4 ;
+    // InternalPerspectiveDsl.g:16956:1: rule__XConstructorCall__Group__3 : rule__XConstructorCall__Group__3__Impl rule__XConstructorCall__Group__4 ;
     public final void rule__XConstructorCall__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16958:1: ( rule__XConstructorCall__Group__3__Impl rule__XConstructorCall__Group__4 )
-            // InternalPerspectiveDsl.g:16959:2: rule__XConstructorCall__Group__3__Impl rule__XConstructorCall__Group__4
+            // InternalPerspectiveDsl.g:16960:1: ( rule__XConstructorCall__Group__3__Impl rule__XConstructorCall__Group__4 )
+            // InternalPerspectiveDsl.g:16961:2: rule__XConstructorCall__Group__3__Impl rule__XConstructorCall__Group__4
             {
             pushFollow(FOLLOW_117);
             rule__XConstructorCall__Group__3__Impl();
@@ -55725,27 +55725,27 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__3__Impl"
-    // InternalPerspectiveDsl.g:16966:1: rule__XConstructorCall__Group__3__Impl : ( ( rule__XConstructorCall__Group_3__0 )? ) ;
+    // InternalPerspectiveDsl.g:16968:1: rule__XConstructorCall__Group__3__Impl : ( ( rule__XConstructorCall__Group_3__0 )? ) ;
     public final void rule__XConstructorCall__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16970:1: ( ( ( rule__XConstructorCall__Group_3__0 )? ) )
-            // InternalPerspectiveDsl.g:16971:1: ( ( rule__XConstructorCall__Group_3__0 )? )
+            // InternalPerspectiveDsl.g:16972:1: ( ( ( rule__XConstructorCall__Group_3__0 )? ) )
+            // InternalPerspectiveDsl.g:16973:1: ( ( rule__XConstructorCall__Group_3__0 )? )
             {
-            // InternalPerspectiveDsl.g:16971:1: ( ( rule__XConstructorCall__Group_3__0 )? )
-            // InternalPerspectiveDsl.g:16972:2: ( rule__XConstructorCall__Group_3__0 )?
+            // InternalPerspectiveDsl.g:16973:1: ( ( rule__XConstructorCall__Group_3__0 )? )
+            // InternalPerspectiveDsl.g:16974:2: ( rule__XConstructorCall__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getGroup_3()); 
             }
-            // InternalPerspectiveDsl.g:16973:2: ( rule__XConstructorCall__Group_3__0 )?
+            // InternalPerspectiveDsl.g:16975:2: ( rule__XConstructorCall__Group_3__0 )?
             int alt119=2;
             alt119 = dfa119.predict(input);
             switch (alt119) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:16973:3: rule__XConstructorCall__Group_3__0
+                    // InternalPerspectiveDsl.g:16975:3: rule__XConstructorCall__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XConstructorCall__Group_3__0();
@@ -55783,14 +55783,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__4"
-    // InternalPerspectiveDsl.g:16981:1: rule__XConstructorCall__Group__4 : rule__XConstructorCall__Group__4__Impl rule__XConstructorCall__Group__5 ;
+    // InternalPerspectiveDsl.g:16983:1: rule__XConstructorCall__Group__4 : rule__XConstructorCall__Group__4__Impl rule__XConstructorCall__Group__5 ;
     public final void rule__XConstructorCall__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16985:1: ( rule__XConstructorCall__Group__4__Impl rule__XConstructorCall__Group__5 )
-            // InternalPerspectiveDsl.g:16986:2: rule__XConstructorCall__Group__4__Impl rule__XConstructorCall__Group__5
+            // InternalPerspectiveDsl.g:16987:1: ( rule__XConstructorCall__Group__4__Impl rule__XConstructorCall__Group__5 )
+            // InternalPerspectiveDsl.g:16988:2: rule__XConstructorCall__Group__4__Impl rule__XConstructorCall__Group__5
             {
             pushFollow(FOLLOW_117);
             rule__XConstructorCall__Group__4__Impl();
@@ -55821,27 +55821,27 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__4__Impl"
-    // InternalPerspectiveDsl.g:16993:1: rule__XConstructorCall__Group__4__Impl : ( ( rule__XConstructorCall__Group_4__0 )? ) ;
+    // InternalPerspectiveDsl.g:16995:1: rule__XConstructorCall__Group__4__Impl : ( ( rule__XConstructorCall__Group_4__0 )? ) ;
     public final void rule__XConstructorCall__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:16997:1: ( ( ( rule__XConstructorCall__Group_4__0 )? ) )
-            // InternalPerspectiveDsl.g:16998:1: ( ( rule__XConstructorCall__Group_4__0 )? )
+            // InternalPerspectiveDsl.g:16999:1: ( ( ( rule__XConstructorCall__Group_4__0 )? ) )
+            // InternalPerspectiveDsl.g:17000:1: ( ( rule__XConstructorCall__Group_4__0 )? )
             {
-            // InternalPerspectiveDsl.g:16998:1: ( ( rule__XConstructorCall__Group_4__0 )? )
-            // InternalPerspectiveDsl.g:16999:2: ( rule__XConstructorCall__Group_4__0 )?
+            // InternalPerspectiveDsl.g:17000:1: ( ( rule__XConstructorCall__Group_4__0 )? )
+            // InternalPerspectiveDsl.g:17001:2: ( rule__XConstructorCall__Group_4__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getGroup_4()); 
             }
-            // InternalPerspectiveDsl.g:17000:2: ( rule__XConstructorCall__Group_4__0 )?
+            // InternalPerspectiveDsl.g:17002:2: ( rule__XConstructorCall__Group_4__0 )?
             int alt120=2;
             alt120 = dfa120.predict(input);
             switch (alt120) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:17000:3: rule__XConstructorCall__Group_4__0
+                    // InternalPerspectiveDsl.g:17002:3: rule__XConstructorCall__Group_4__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XConstructorCall__Group_4__0();
@@ -55879,14 +55879,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__5"
-    // InternalPerspectiveDsl.g:17008:1: rule__XConstructorCall__Group__5 : rule__XConstructorCall__Group__5__Impl ;
+    // InternalPerspectiveDsl.g:17010:1: rule__XConstructorCall__Group__5 : rule__XConstructorCall__Group__5__Impl ;
     public final void rule__XConstructorCall__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17012:1: ( rule__XConstructorCall__Group__5__Impl )
-            // InternalPerspectiveDsl.g:17013:2: rule__XConstructorCall__Group__5__Impl
+            // InternalPerspectiveDsl.g:17014:1: ( rule__XConstructorCall__Group__5__Impl )
+            // InternalPerspectiveDsl.g:17015:2: rule__XConstructorCall__Group__5__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__Group__5__Impl();
@@ -55912,27 +55912,27 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__5__Impl"
-    // InternalPerspectiveDsl.g:17019:1: rule__XConstructorCall__Group__5__Impl : ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? ) ;
+    // InternalPerspectiveDsl.g:17021:1: rule__XConstructorCall__Group__5__Impl : ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? ) ;
     public final void rule__XConstructorCall__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17023:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? ) )
-            // InternalPerspectiveDsl.g:17024:1: ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? )
+            // InternalPerspectiveDsl.g:17025:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? ) )
+            // InternalPerspectiveDsl.g:17026:1: ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? )
             {
-            // InternalPerspectiveDsl.g:17024:1: ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? )
-            // InternalPerspectiveDsl.g:17025:2: ( rule__XConstructorCall__ArgumentsAssignment_5 )?
+            // InternalPerspectiveDsl.g:17026:1: ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? )
+            // InternalPerspectiveDsl.g:17027:2: ( rule__XConstructorCall__ArgumentsAssignment_5 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_5()); 
             }
-            // InternalPerspectiveDsl.g:17026:2: ( rule__XConstructorCall__ArgumentsAssignment_5 )?
+            // InternalPerspectiveDsl.g:17028:2: ( rule__XConstructorCall__ArgumentsAssignment_5 )?
             int alt121=2;
             alt121 = dfa121.predict(input);
             switch (alt121) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:17026:3: rule__XConstructorCall__ArgumentsAssignment_5
+                    // InternalPerspectiveDsl.g:17028:3: rule__XConstructorCall__ArgumentsAssignment_5
                     {
                     pushFollow(FOLLOW_2);
                     rule__XConstructorCall__ArgumentsAssignment_5();
@@ -55970,14 +55970,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3__0"
-    // InternalPerspectiveDsl.g:17035:1: rule__XConstructorCall__Group_3__0 : rule__XConstructorCall__Group_3__0__Impl rule__XConstructorCall__Group_3__1 ;
+    // InternalPerspectiveDsl.g:17037:1: rule__XConstructorCall__Group_3__0 : rule__XConstructorCall__Group_3__0__Impl rule__XConstructorCall__Group_3__1 ;
     public final void rule__XConstructorCall__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17039:1: ( rule__XConstructorCall__Group_3__0__Impl rule__XConstructorCall__Group_3__1 )
-            // InternalPerspectiveDsl.g:17040:2: rule__XConstructorCall__Group_3__0__Impl rule__XConstructorCall__Group_3__1
+            // InternalPerspectiveDsl.g:17041:1: ( rule__XConstructorCall__Group_3__0__Impl rule__XConstructorCall__Group_3__1 )
+            // InternalPerspectiveDsl.g:17042:2: rule__XConstructorCall__Group_3__0__Impl rule__XConstructorCall__Group_3__1
             {
             pushFollow(FOLLOW_91);
             rule__XConstructorCall__Group_3__0__Impl();
@@ -56008,23 +56008,23 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3__0__Impl"
-    // InternalPerspectiveDsl.g:17047:1: rule__XConstructorCall__Group_3__0__Impl : ( ( '<' ) ) ;
+    // InternalPerspectiveDsl.g:17049:1: rule__XConstructorCall__Group_3__0__Impl : ( ( '<' ) ) ;
     public final void rule__XConstructorCall__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17051:1: ( ( ( '<' ) ) )
-            // InternalPerspectiveDsl.g:17052:1: ( ( '<' ) )
+            // InternalPerspectiveDsl.g:17053:1: ( ( ( '<' ) ) )
+            // InternalPerspectiveDsl.g:17054:1: ( ( '<' ) )
             {
-            // InternalPerspectiveDsl.g:17052:1: ( ( '<' ) )
-            // InternalPerspectiveDsl.g:17053:2: ( '<' )
+            // InternalPerspectiveDsl.g:17054:1: ( ( '<' ) )
+            // InternalPerspectiveDsl.g:17055:2: ( '<' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0()); 
             }
-            // InternalPerspectiveDsl.g:17054:2: ( '<' )
-            // InternalPerspectiveDsl.g:17054:3: '<'
+            // InternalPerspectiveDsl.g:17056:2: ( '<' )
+            // InternalPerspectiveDsl.g:17056:3: '<'
             {
             match(input,27,FOLLOW_2); if (state.failed) return ;
 
@@ -56055,14 +56055,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3__1"
-    // InternalPerspectiveDsl.g:17062:1: rule__XConstructorCall__Group_3__1 : rule__XConstructorCall__Group_3__1__Impl rule__XConstructorCall__Group_3__2 ;
+    // InternalPerspectiveDsl.g:17064:1: rule__XConstructorCall__Group_3__1 : rule__XConstructorCall__Group_3__1__Impl rule__XConstructorCall__Group_3__2 ;
     public final void rule__XConstructorCall__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17066:1: ( rule__XConstructorCall__Group_3__1__Impl rule__XConstructorCall__Group_3__2 )
-            // InternalPerspectiveDsl.g:17067:2: rule__XConstructorCall__Group_3__1__Impl rule__XConstructorCall__Group_3__2
+            // InternalPerspectiveDsl.g:17068:1: ( rule__XConstructorCall__Group_3__1__Impl rule__XConstructorCall__Group_3__2 )
+            // InternalPerspectiveDsl.g:17069:2: rule__XConstructorCall__Group_3__1__Impl rule__XConstructorCall__Group_3__2
             {
             pushFollow(FOLLOW_92);
             rule__XConstructorCall__Group_3__1__Impl();
@@ -56093,23 +56093,23 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3__1__Impl"
-    // InternalPerspectiveDsl.g:17074:1: rule__XConstructorCall__Group_3__1__Impl : ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) ) ;
+    // InternalPerspectiveDsl.g:17076:1: rule__XConstructorCall__Group_3__1__Impl : ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) ) ;
     public final void rule__XConstructorCall__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17078:1: ( ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) ) )
-            // InternalPerspectiveDsl.g:17079:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) )
+            // InternalPerspectiveDsl.g:17080:1: ( ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) ) )
+            // InternalPerspectiveDsl.g:17081:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) )
             {
-            // InternalPerspectiveDsl.g:17079:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) )
-            // InternalPerspectiveDsl.g:17080:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 )
+            // InternalPerspectiveDsl.g:17081:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) )
+            // InternalPerspectiveDsl.g:17082:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getTypeArgumentsAssignment_3_1()); 
             }
-            // InternalPerspectiveDsl.g:17081:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 )
-            // InternalPerspectiveDsl.g:17081:3: rule__XConstructorCall__TypeArgumentsAssignment_3_1
+            // InternalPerspectiveDsl.g:17083:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 )
+            // InternalPerspectiveDsl.g:17083:3: rule__XConstructorCall__TypeArgumentsAssignment_3_1
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__TypeArgumentsAssignment_3_1();
@@ -56144,14 +56144,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3__2"
-    // InternalPerspectiveDsl.g:17089:1: rule__XConstructorCall__Group_3__2 : rule__XConstructorCall__Group_3__2__Impl rule__XConstructorCall__Group_3__3 ;
+    // InternalPerspectiveDsl.g:17091:1: rule__XConstructorCall__Group_3__2 : rule__XConstructorCall__Group_3__2__Impl rule__XConstructorCall__Group_3__3 ;
     public final void rule__XConstructorCall__Group_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17093:1: ( rule__XConstructorCall__Group_3__2__Impl rule__XConstructorCall__Group_3__3 )
-            // InternalPerspectiveDsl.g:17094:2: rule__XConstructorCall__Group_3__2__Impl rule__XConstructorCall__Group_3__3
+            // InternalPerspectiveDsl.g:17095:1: ( rule__XConstructorCall__Group_3__2__Impl rule__XConstructorCall__Group_3__3 )
+            // InternalPerspectiveDsl.g:17096:2: rule__XConstructorCall__Group_3__2__Impl rule__XConstructorCall__Group_3__3
             {
             pushFollow(FOLLOW_92);
             rule__XConstructorCall__Group_3__2__Impl();
@@ -56182,22 +56182,22 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3__2__Impl"
-    // InternalPerspectiveDsl.g:17101:1: rule__XConstructorCall__Group_3__2__Impl : ( ( rule__XConstructorCall__Group_3_2__0 )* ) ;
+    // InternalPerspectiveDsl.g:17103:1: rule__XConstructorCall__Group_3__2__Impl : ( ( rule__XConstructorCall__Group_3_2__0 )* ) ;
     public final void rule__XConstructorCall__Group_3__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17105:1: ( ( ( rule__XConstructorCall__Group_3_2__0 )* ) )
-            // InternalPerspectiveDsl.g:17106:1: ( ( rule__XConstructorCall__Group_3_2__0 )* )
+            // InternalPerspectiveDsl.g:17107:1: ( ( ( rule__XConstructorCall__Group_3_2__0 )* ) )
+            // InternalPerspectiveDsl.g:17108:1: ( ( rule__XConstructorCall__Group_3_2__0 )* )
             {
-            // InternalPerspectiveDsl.g:17106:1: ( ( rule__XConstructorCall__Group_3_2__0 )* )
-            // InternalPerspectiveDsl.g:17107:2: ( rule__XConstructorCall__Group_3_2__0 )*
+            // InternalPerspectiveDsl.g:17108:1: ( ( rule__XConstructorCall__Group_3_2__0 )* )
+            // InternalPerspectiveDsl.g:17109:2: ( rule__XConstructorCall__Group_3_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getGroup_3_2()); 
             }
-            // InternalPerspectiveDsl.g:17108:2: ( rule__XConstructorCall__Group_3_2__0 )*
+            // InternalPerspectiveDsl.g:17110:2: ( rule__XConstructorCall__Group_3_2__0 )*
             loop122:
             do {
                 int alt122=2;
@@ -56210,7 +56210,7 @@
 
                 switch (alt122) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:17108:3: rule__XConstructorCall__Group_3_2__0
+            	    // InternalPerspectiveDsl.g:17110:3: rule__XConstructorCall__Group_3_2__0
             	    {
             	    pushFollow(FOLLOW_53);
             	    rule__XConstructorCall__Group_3_2__0();
@@ -56251,14 +56251,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3__3"
-    // InternalPerspectiveDsl.g:17116:1: rule__XConstructorCall__Group_3__3 : rule__XConstructorCall__Group_3__3__Impl ;
+    // InternalPerspectiveDsl.g:17118:1: rule__XConstructorCall__Group_3__3 : rule__XConstructorCall__Group_3__3__Impl ;
     public final void rule__XConstructorCall__Group_3__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17120:1: ( rule__XConstructorCall__Group_3__3__Impl )
-            // InternalPerspectiveDsl.g:17121:2: rule__XConstructorCall__Group_3__3__Impl
+            // InternalPerspectiveDsl.g:17122:1: ( rule__XConstructorCall__Group_3__3__Impl )
+            // InternalPerspectiveDsl.g:17123:2: rule__XConstructorCall__Group_3__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__Group_3__3__Impl();
@@ -56284,17 +56284,17 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3__3__Impl"
-    // InternalPerspectiveDsl.g:17127:1: rule__XConstructorCall__Group_3__3__Impl : ( '>' ) ;
+    // InternalPerspectiveDsl.g:17129:1: rule__XConstructorCall__Group_3__3__Impl : ( '>' ) ;
     public final void rule__XConstructorCall__Group_3__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17131:1: ( ( '>' ) )
-            // InternalPerspectiveDsl.g:17132:1: ( '>' )
+            // InternalPerspectiveDsl.g:17133:1: ( ( '>' ) )
+            // InternalPerspectiveDsl.g:17134:1: ( '>' )
             {
-            // InternalPerspectiveDsl.g:17132:1: ( '>' )
-            // InternalPerspectiveDsl.g:17133:2: '>'
+            // InternalPerspectiveDsl.g:17134:1: ( '>' )
+            // InternalPerspectiveDsl.g:17135:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3()); 
@@ -56325,14 +56325,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3_2__0"
-    // InternalPerspectiveDsl.g:17143:1: rule__XConstructorCall__Group_3_2__0 : rule__XConstructorCall__Group_3_2__0__Impl rule__XConstructorCall__Group_3_2__1 ;
+    // InternalPerspectiveDsl.g:17145:1: rule__XConstructorCall__Group_3_2__0 : rule__XConstructorCall__Group_3_2__0__Impl rule__XConstructorCall__Group_3_2__1 ;
     public final void rule__XConstructorCall__Group_3_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17147:1: ( rule__XConstructorCall__Group_3_2__0__Impl rule__XConstructorCall__Group_3_2__1 )
-            // InternalPerspectiveDsl.g:17148:2: rule__XConstructorCall__Group_3_2__0__Impl rule__XConstructorCall__Group_3_2__1
+            // InternalPerspectiveDsl.g:17149:1: ( rule__XConstructorCall__Group_3_2__0__Impl rule__XConstructorCall__Group_3_2__1 )
+            // InternalPerspectiveDsl.g:17150:2: rule__XConstructorCall__Group_3_2__0__Impl rule__XConstructorCall__Group_3_2__1
             {
             pushFollow(FOLLOW_91);
             rule__XConstructorCall__Group_3_2__0__Impl();
@@ -56363,17 +56363,17 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3_2__0__Impl"
-    // InternalPerspectiveDsl.g:17155:1: rule__XConstructorCall__Group_3_2__0__Impl : ( ',' ) ;
+    // InternalPerspectiveDsl.g:17157:1: rule__XConstructorCall__Group_3_2__0__Impl : ( ',' ) ;
     public final void rule__XConstructorCall__Group_3_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17159:1: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:17160:1: ( ',' )
+            // InternalPerspectiveDsl.g:17161:1: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:17162:1: ( ',' )
             {
-            // InternalPerspectiveDsl.g:17160:1: ( ',' )
-            // InternalPerspectiveDsl.g:17161:2: ','
+            // InternalPerspectiveDsl.g:17162:1: ( ',' )
+            // InternalPerspectiveDsl.g:17163:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0()); 
@@ -56404,14 +56404,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3_2__1"
-    // InternalPerspectiveDsl.g:17170:1: rule__XConstructorCall__Group_3_2__1 : rule__XConstructorCall__Group_3_2__1__Impl ;
+    // InternalPerspectiveDsl.g:17172:1: rule__XConstructorCall__Group_3_2__1 : rule__XConstructorCall__Group_3_2__1__Impl ;
     public final void rule__XConstructorCall__Group_3_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17174:1: ( rule__XConstructorCall__Group_3_2__1__Impl )
-            // InternalPerspectiveDsl.g:17175:2: rule__XConstructorCall__Group_3_2__1__Impl
+            // InternalPerspectiveDsl.g:17176:1: ( rule__XConstructorCall__Group_3_2__1__Impl )
+            // InternalPerspectiveDsl.g:17177:2: rule__XConstructorCall__Group_3_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__Group_3_2__1__Impl();
@@ -56437,23 +56437,23 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3_2__1__Impl"
-    // InternalPerspectiveDsl.g:17181:1: rule__XConstructorCall__Group_3_2__1__Impl : ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) ) ;
+    // InternalPerspectiveDsl.g:17183:1: rule__XConstructorCall__Group_3_2__1__Impl : ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) ) ;
     public final void rule__XConstructorCall__Group_3_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17185:1: ( ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) ) )
-            // InternalPerspectiveDsl.g:17186:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) )
+            // InternalPerspectiveDsl.g:17187:1: ( ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) ) )
+            // InternalPerspectiveDsl.g:17188:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) )
             {
-            // InternalPerspectiveDsl.g:17186:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) )
-            // InternalPerspectiveDsl.g:17187:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 )
+            // InternalPerspectiveDsl.g:17188:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) )
+            // InternalPerspectiveDsl.g:17189:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getTypeArgumentsAssignment_3_2_1()); 
             }
-            // InternalPerspectiveDsl.g:17188:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 )
-            // InternalPerspectiveDsl.g:17188:3: rule__XConstructorCall__TypeArgumentsAssignment_3_2_1
+            // InternalPerspectiveDsl.g:17190:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 )
+            // InternalPerspectiveDsl.g:17190:3: rule__XConstructorCall__TypeArgumentsAssignment_3_2_1
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__TypeArgumentsAssignment_3_2_1();
@@ -56488,14 +56488,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4__0"
-    // InternalPerspectiveDsl.g:17197:1: rule__XConstructorCall__Group_4__0 : rule__XConstructorCall__Group_4__0__Impl rule__XConstructorCall__Group_4__1 ;
+    // InternalPerspectiveDsl.g:17199:1: rule__XConstructorCall__Group_4__0 : rule__XConstructorCall__Group_4__0__Impl rule__XConstructorCall__Group_4__1 ;
     public final void rule__XConstructorCall__Group_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17201:1: ( rule__XConstructorCall__Group_4__0__Impl rule__XConstructorCall__Group_4__1 )
-            // InternalPerspectiveDsl.g:17202:2: rule__XConstructorCall__Group_4__0__Impl rule__XConstructorCall__Group_4__1
+            // InternalPerspectiveDsl.g:17203:1: ( rule__XConstructorCall__Group_4__0__Impl rule__XConstructorCall__Group_4__1 )
+            // InternalPerspectiveDsl.g:17204:2: rule__XConstructorCall__Group_4__0__Impl rule__XConstructorCall__Group_4__1
             {
             pushFollow(FOLLOW_93);
             rule__XConstructorCall__Group_4__0__Impl();
@@ -56526,23 +56526,23 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4__0__Impl"
-    // InternalPerspectiveDsl.g:17209:1: rule__XConstructorCall__Group_4__0__Impl : ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) ) ;
+    // InternalPerspectiveDsl.g:17211:1: rule__XConstructorCall__Group_4__0__Impl : ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) ) ;
     public final void rule__XConstructorCall__Group_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17213:1: ( ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) ) )
-            // InternalPerspectiveDsl.g:17214:1: ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) )
+            // InternalPerspectiveDsl.g:17215:1: ( ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) ) )
+            // InternalPerspectiveDsl.g:17216:1: ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) )
             {
-            // InternalPerspectiveDsl.g:17214:1: ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) )
-            // InternalPerspectiveDsl.g:17215:2: ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 )
+            // InternalPerspectiveDsl.g:17216:1: ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) )
+            // InternalPerspectiveDsl.g:17217:2: ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallAssignment_4_0()); 
             }
-            // InternalPerspectiveDsl.g:17216:2: ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 )
-            // InternalPerspectiveDsl.g:17216:3: rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0
+            // InternalPerspectiveDsl.g:17218:2: ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 )
+            // InternalPerspectiveDsl.g:17218:3: rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0();
@@ -56577,14 +56577,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4__1"
-    // InternalPerspectiveDsl.g:17224:1: rule__XConstructorCall__Group_4__1 : rule__XConstructorCall__Group_4__1__Impl rule__XConstructorCall__Group_4__2 ;
+    // InternalPerspectiveDsl.g:17226:1: rule__XConstructorCall__Group_4__1 : rule__XConstructorCall__Group_4__1__Impl rule__XConstructorCall__Group_4__2 ;
     public final void rule__XConstructorCall__Group_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17228:1: ( rule__XConstructorCall__Group_4__1__Impl rule__XConstructorCall__Group_4__2 )
-            // InternalPerspectiveDsl.g:17229:2: rule__XConstructorCall__Group_4__1__Impl rule__XConstructorCall__Group_4__2
+            // InternalPerspectiveDsl.g:17230:1: ( rule__XConstructorCall__Group_4__1__Impl rule__XConstructorCall__Group_4__2 )
+            // InternalPerspectiveDsl.g:17231:2: rule__XConstructorCall__Group_4__1__Impl rule__XConstructorCall__Group_4__2
             {
             pushFollow(FOLLOW_93);
             rule__XConstructorCall__Group_4__1__Impl();
@@ -56615,22 +56615,22 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4__1__Impl"
-    // InternalPerspectiveDsl.g:17236:1: rule__XConstructorCall__Group_4__1__Impl : ( ( rule__XConstructorCall__Alternatives_4_1 )? ) ;
+    // InternalPerspectiveDsl.g:17238:1: rule__XConstructorCall__Group_4__1__Impl : ( ( rule__XConstructorCall__Alternatives_4_1 )? ) ;
     public final void rule__XConstructorCall__Group_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17240:1: ( ( ( rule__XConstructorCall__Alternatives_4_1 )? ) )
-            // InternalPerspectiveDsl.g:17241:1: ( ( rule__XConstructorCall__Alternatives_4_1 )? )
+            // InternalPerspectiveDsl.g:17242:1: ( ( ( rule__XConstructorCall__Alternatives_4_1 )? ) )
+            // InternalPerspectiveDsl.g:17243:1: ( ( rule__XConstructorCall__Alternatives_4_1 )? )
             {
-            // InternalPerspectiveDsl.g:17241:1: ( ( rule__XConstructorCall__Alternatives_4_1 )? )
-            // InternalPerspectiveDsl.g:17242:2: ( rule__XConstructorCall__Alternatives_4_1 )?
+            // InternalPerspectiveDsl.g:17243:1: ( ( rule__XConstructorCall__Alternatives_4_1 )? )
+            // InternalPerspectiveDsl.g:17244:2: ( rule__XConstructorCall__Alternatives_4_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getAlternatives_4_1()); 
             }
-            // InternalPerspectiveDsl.g:17243:2: ( rule__XConstructorCall__Alternatives_4_1 )?
+            // InternalPerspectiveDsl.g:17245:2: ( rule__XConstructorCall__Alternatives_4_1 )?
             int alt123=2;
             int LA123_0 = input.LA(1);
 
@@ -56639,7 +56639,7 @@
             }
             switch (alt123) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:17243:3: rule__XConstructorCall__Alternatives_4_1
+                    // InternalPerspectiveDsl.g:17245:3: rule__XConstructorCall__Alternatives_4_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XConstructorCall__Alternatives_4_1();
@@ -56677,14 +56677,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4__2"
-    // InternalPerspectiveDsl.g:17251:1: rule__XConstructorCall__Group_4__2 : rule__XConstructorCall__Group_4__2__Impl ;
+    // InternalPerspectiveDsl.g:17253:1: rule__XConstructorCall__Group_4__2 : rule__XConstructorCall__Group_4__2__Impl ;
     public final void rule__XConstructorCall__Group_4__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17255:1: ( rule__XConstructorCall__Group_4__2__Impl )
-            // InternalPerspectiveDsl.g:17256:2: rule__XConstructorCall__Group_4__2__Impl
+            // InternalPerspectiveDsl.g:17257:1: ( rule__XConstructorCall__Group_4__2__Impl )
+            // InternalPerspectiveDsl.g:17258:2: rule__XConstructorCall__Group_4__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__Group_4__2__Impl();
@@ -56710,17 +56710,17 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4__2__Impl"
-    // InternalPerspectiveDsl.g:17262:1: rule__XConstructorCall__Group_4__2__Impl : ( ')' ) ;
+    // InternalPerspectiveDsl.g:17264:1: rule__XConstructorCall__Group_4__2__Impl : ( ')' ) ;
     public final void rule__XConstructorCall__Group_4__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17266:1: ( ( ')' ) )
-            // InternalPerspectiveDsl.g:17267:1: ( ')' )
+            // InternalPerspectiveDsl.g:17268:1: ( ( ')' ) )
+            // InternalPerspectiveDsl.g:17269:1: ( ')' )
             {
-            // InternalPerspectiveDsl.g:17267:1: ( ')' )
-            // InternalPerspectiveDsl.g:17268:2: ')'
+            // InternalPerspectiveDsl.g:17269:1: ( ')' )
+            // InternalPerspectiveDsl.g:17270:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2()); 
@@ -56751,14 +56751,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4_1_1__0"
-    // InternalPerspectiveDsl.g:17278:1: rule__XConstructorCall__Group_4_1_1__0 : rule__XConstructorCall__Group_4_1_1__0__Impl rule__XConstructorCall__Group_4_1_1__1 ;
+    // InternalPerspectiveDsl.g:17280:1: rule__XConstructorCall__Group_4_1_1__0 : rule__XConstructorCall__Group_4_1_1__0__Impl rule__XConstructorCall__Group_4_1_1__1 ;
     public final void rule__XConstructorCall__Group_4_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17282:1: ( rule__XConstructorCall__Group_4_1_1__0__Impl rule__XConstructorCall__Group_4_1_1__1 )
-            // InternalPerspectiveDsl.g:17283:2: rule__XConstructorCall__Group_4_1_1__0__Impl rule__XConstructorCall__Group_4_1_1__1
+            // InternalPerspectiveDsl.g:17284:1: ( rule__XConstructorCall__Group_4_1_1__0__Impl rule__XConstructorCall__Group_4_1_1__1 )
+            // InternalPerspectiveDsl.g:17285:2: rule__XConstructorCall__Group_4_1_1__0__Impl rule__XConstructorCall__Group_4_1_1__1
             {
             pushFollow(FOLLOW_52);
             rule__XConstructorCall__Group_4_1_1__0__Impl();
@@ -56789,23 +56789,23 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4_1_1__0__Impl"
-    // InternalPerspectiveDsl.g:17290:1: rule__XConstructorCall__Group_4_1_1__0__Impl : ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) ) ;
+    // InternalPerspectiveDsl.g:17292:1: rule__XConstructorCall__Group_4_1_1__0__Impl : ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) ) ;
     public final void rule__XConstructorCall__Group_4_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17294:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) ) )
-            // InternalPerspectiveDsl.g:17295:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) )
+            // InternalPerspectiveDsl.g:17296:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) ) )
+            // InternalPerspectiveDsl.g:17297:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) )
             {
-            // InternalPerspectiveDsl.g:17295:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) )
-            // InternalPerspectiveDsl.g:17296:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 )
+            // InternalPerspectiveDsl.g:17297:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) )
+            // InternalPerspectiveDsl.g:17298:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_1_0()); 
             }
-            // InternalPerspectiveDsl.g:17297:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 )
-            // InternalPerspectiveDsl.g:17297:3: rule__XConstructorCall__ArgumentsAssignment_4_1_1_0
+            // InternalPerspectiveDsl.g:17299:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 )
+            // InternalPerspectiveDsl.g:17299:3: rule__XConstructorCall__ArgumentsAssignment_4_1_1_0
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__ArgumentsAssignment_4_1_1_0();
@@ -56840,14 +56840,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4_1_1__1"
-    // InternalPerspectiveDsl.g:17305:1: rule__XConstructorCall__Group_4_1_1__1 : rule__XConstructorCall__Group_4_1_1__1__Impl ;
+    // InternalPerspectiveDsl.g:17307:1: rule__XConstructorCall__Group_4_1_1__1 : rule__XConstructorCall__Group_4_1_1__1__Impl ;
     public final void rule__XConstructorCall__Group_4_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17309:1: ( rule__XConstructorCall__Group_4_1_1__1__Impl )
-            // InternalPerspectiveDsl.g:17310:2: rule__XConstructorCall__Group_4_1_1__1__Impl
+            // InternalPerspectiveDsl.g:17311:1: ( rule__XConstructorCall__Group_4_1_1__1__Impl )
+            // InternalPerspectiveDsl.g:17312:2: rule__XConstructorCall__Group_4_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__Group_4_1_1__1__Impl();
@@ -56873,22 +56873,22 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4_1_1__1__Impl"
-    // InternalPerspectiveDsl.g:17316:1: rule__XConstructorCall__Group_4_1_1__1__Impl : ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:17318:1: rule__XConstructorCall__Group_4_1_1__1__Impl : ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* ) ;
     public final void rule__XConstructorCall__Group_4_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17320:1: ( ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* ) )
-            // InternalPerspectiveDsl.g:17321:1: ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* )
+            // InternalPerspectiveDsl.g:17322:1: ( ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* ) )
+            // InternalPerspectiveDsl.g:17323:1: ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:17321:1: ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* )
-            // InternalPerspectiveDsl.g:17322:2: ( rule__XConstructorCall__Group_4_1_1_1__0 )*
+            // InternalPerspectiveDsl.g:17323:1: ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* )
+            // InternalPerspectiveDsl.g:17324:2: ( rule__XConstructorCall__Group_4_1_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1_1()); 
             }
-            // InternalPerspectiveDsl.g:17323:2: ( rule__XConstructorCall__Group_4_1_1_1__0 )*
+            // InternalPerspectiveDsl.g:17325:2: ( rule__XConstructorCall__Group_4_1_1_1__0 )*
             loop124:
             do {
                 int alt124=2;
@@ -56901,7 +56901,7 @@
 
                 switch (alt124) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:17323:3: rule__XConstructorCall__Group_4_1_1_1__0
+            	    // InternalPerspectiveDsl.g:17325:3: rule__XConstructorCall__Group_4_1_1_1__0
             	    {
             	    pushFollow(FOLLOW_53);
             	    rule__XConstructorCall__Group_4_1_1_1__0();
@@ -56942,14 +56942,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4_1_1_1__0"
-    // InternalPerspectiveDsl.g:17332:1: rule__XConstructorCall__Group_4_1_1_1__0 : rule__XConstructorCall__Group_4_1_1_1__0__Impl rule__XConstructorCall__Group_4_1_1_1__1 ;
+    // InternalPerspectiveDsl.g:17334:1: rule__XConstructorCall__Group_4_1_1_1__0 : rule__XConstructorCall__Group_4_1_1_1__0__Impl rule__XConstructorCall__Group_4_1_1_1__1 ;
     public final void rule__XConstructorCall__Group_4_1_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17336:1: ( rule__XConstructorCall__Group_4_1_1_1__0__Impl rule__XConstructorCall__Group_4_1_1_1__1 )
-            // InternalPerspectiveDsl.g:17337:2: rule__XConstructorCall__Group_4_1_1_1__0__Impl rule__XConstructorCall__Group_4_1_1_1__1
+            // InternalPerspectiveDsl.g:17338:1: ( rule__XConstructorCall__Group_4_1_1_1__0__Impl rule__XConstructorCall__Group_4_1_1_1__1 )
+            // InternalPerspectiveDsl.g:17339:2: rule__XConstructorCall__Group_4_1_1_1__0__Impl rule__XConstructorCall__Group_4_1_1_1__1
             {
             pushFollow(FOLLOW_54);
             rule__XConstructorCall__Group_4_1_1_1__0__Impl();
@@ -56980,17 +56980,17 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4_1_1_1__0__Impl"
-    // InternalPerspectiveDsl.g:17344:1: rule__XConstructorCall__Group_4_1_1_1__0__Impl : ( ',' ) ;
+    // InternalPerspectiveDsl.g:17346:1: rule__XConstructorCall__Group_4_1_1_1__0__Impl : ( ',' ) ;
     public final void rule__XConstructorCall__Group_4_1_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17348:1: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:17349:1: ( ',' )
+            // InternalPerspectiveDsl.g:17350:1: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:17351:1: ( ',' )
             {
-            // InternalPerspectiveDsl.g:17349:1: ( ',' )
-            // InternalPerspectiveDsl.g:17350:2: ','
+            // InternalPerspectiveDsl.g:17351:1: ( ',' )
+            // InternalPerspectiveDsl.g:17352:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0()); 
@@ -57021,14 +57021,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4_1_1_1__1"
-    // InternalPerspectiveDsl.g:17359:1: rule__XConstructorCall__Group_4_1_1_1__1 : rule__XConstructorCall__Group_4_1_1_1__1__Impl ;
+    // InternalPerspectiveDsl.g:17361:1: rule__XConstructorCall__Group_4_1_1_1__1 : rule__XConstructorCall__Group_4_1_1_1__1__Impl ;
     public final void rule__XConstructorCall__Group_4_1_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17363:1: ( rule__XConstructorCall__Group_4_1_1_1__1__Impl )
-            // InternalPerspectiveDsl.g:17364:2: rule__XConstructorCall__Group_4_1_1_1__1__Impl
+            // InternalPerspectiveDsl.g:17365:1: ( rule__XConstructorCall__Group_4_1_1_1__1__Impl )
+            // InternalPerspectiveDsl.g:17366:2: rule__XConstructorCall__Group_4_1_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__Group_4_1_1_1__1__Impl();
@@ -57054,23 +57054,23 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4_1_1_1__1__Impl"
-    // InternalPerspectiveDsl.g:17370:1: rule__XConstructorCall__Group_4_1_1_1__1__Impl : ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:17372:1: rule__XConstructorCall__Group_4_1_1_1__1__Impl : ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) ) ;
     public final void rule__XConstructorCall__Group_4_1_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17374:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) ) )
-            // InternalPerspectiveDsl.g:17375:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) )
+            // InternalPerspectiveDsl.g:17376:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) ) )
+            // InternalPerspectiveDsl.g:17377:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:17375:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) )
-            // InternalPerspectiveDsl.g:17376:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 )
+            // InternalPerspectiveDsl.g:17377:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) )
+            // InternalPerspectiveDsl.g:17378:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_1_1_1()); 
             }
-            // InternalPerspectiveDsl.g:17377:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 )
-            // InternalPerspectiveDsl.g:17377:3: rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1
+            // InternalPerspectiveDsl.g:17379:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 )
+            // InternalPerspectiveDsl.g:17379:3: rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1();
@@ -57105,14 +57105,14 @@
 
 
     // $ANTLR start "rule__XBooleanLiteral__Group__0"
-    // InternalPerspectiveDsl.g:17386:1: rule__XBooleanLiteral__Group__0 : rule__XBooleanLiteral__Group__0__Impl rule__XBooleanLiteral__Group__1 ;
+    // InternalPerspectiveDsl.g:17388:1: rule__XBooleanLiteral__Group__0 : rule__XBooleanLiteral__Group__0__Impl rule__XBooleanLiteral__Group__1 ;
     public final void rule__XBooleanLiteral__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17390:1: ( rule__XBooleanLiteral__Group__0__Impl rule__XBooleanLiteral__Group__1 )
-            // InternalPerspectiveDsl.g:17391:2: rule__XBooleanLiteral__Group__0__Impl rule__XBooleanLiteral__Group__1
+            // InternalPerspectiveDsl.g:17392:1: ( rule__XBooleanLiteral__Group__0__Impl rule__XBooleanLiteral__Group__1 )
+            // InternalPerspectiveDsl.g:17393:2: rule__XBooleanLiteral__Group__0__Impl rule__XBooleanLiteral__Group__1
             {
             pushFollow(FOLLOW_118);
             rule__XBooleanLiteral__Group__0__Impl();
@@ -57143,23 +57143,23 @@
 
 
     // $ANTLR start "rule__XBooleanLiteral__Group__0__Impl"
-    // InternalPerspectiveDsl.g:17398:1: rule__XBooleanLiteral__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:17400:1: rule__XBooleanLiteral__Group__0__Impl : ( () ) ;
     public final void rule__XBooleanLiteral__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17402:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:17403:1: ( () )
+            // InternalPerspectiveDsl.g:17404:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:17405:1: ( () )
             {
-            // InternalPerspectiveDsl.g:17403:1: ( () )
-            // InternalPerspectiveDsl.g:17404:2: ()
+            // InternalPerspectiveDsl.g:17405:1: ( () )
+            // InternalPerspectiveDsl.g:17406:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBooleanLiteralAccess().getXBooleanLiteralAction_0()); 
             }
-            // InternalPerspectiveDsl.g:17405:2: ()
-            // InternalPerspectiveDsl.g:17405:3: 
+            // InternalPerspectiveDsl.g:17407:2: ()
+            // InternalPerspectiveDsl.g:17407:3: 
             {
             }
 
@@ -57184,14 +57184,14 @@
 
 
     // $ANTLR start "rule__XBooleanLiteral__Group__1"
-    // InternalPerspectiveDsl.g:17413:1: rule__XBooleanLiteral__Group__1 : rule__XBooleanLiteral__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:17415:1: rule__XBooleanLiteral__Group__1 : rule__XBooleanLiteral__Group__1__Impl ;
     public final void rule__XBooleanLiteral__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17417:1: ( rule__XBooleanLiteral__Group__1__Impl )
-            // InternalPerspectiveDsl.g:17418:2: rule__XBooleanLiteral__Group__1__Impl
+            // InternalPerspectiveDsl.g:17419:1: ( rule__XBooleanLiteral__Group__1__Impl )
+            // InternalPerspectiveDsl.g:17420:2: rule__XBooleanLiteral__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XBooleanLiteral__Group__1__Impl();
@@ -57217,23 +57217,23 @@
 
 
     // $ANTLR start "rule__XBooleanLiteral__Group__1__Impl"
-    // InternalPerspectiveDsl.g:17424:1: rule__XBooleanLiteral__Group__1__Impl : ( ( rule__XBooleanLiteral__Alternatives_1 ) ) ;
+    // InternalPerspectiveDsl.g:17426:1: rule__XBooleanLiteral__Group__1__Impl : ( ( rule__XBooleanLiteral__Alternatives_1 ) ) ;
     public final void rule__XBooleanLiteral__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17428:1: ( ( ( rule__XBooleanLiteral__Alternatives_1 ) ) )
-            // InternalPerspectiveDsl.g:17429:1: ( ( rule__XBooleanLiteral__Alternatives_1 ) )
+            // InternalPerspectiveDsl.g:17430:1: ( ( ( rule__XBooleanLiteral__Alternatives_1 ) ) )
+            // InternalPerspectiveDsl.g:17431:1: ( ( rule__XBooleanLiteral__Alternatives_1 ) )
             {
-            // InternalPerspectiveDsl.g:17429:1: ( ( rule__XBooleanLiteral__Alternatives_1 ) )
-            // InternalPerspectiveDsl.g:17430:2: ( rule__XBooleanLiteral__Alternatives_1 )
+            // InternalPerspectiveDsl.g:17431:1: ( ( rule__XBooleanLiteral__Alternatives_1 ) )
+            // InternalPerspectiveDsl.g:17432:2: ( rule__XBooleanLiteral__Alternatives_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBooleanLiteralAccess().getAlternatives_1()); 
             }
-            // InternalPerspectiveDsl.g:17431:2: ( rule__XBooleanLiteral__Alternatives_1 )
-            // InternalPerspectiveDsl.g:17431:3: rule__XBooleanLiteral__Alternatives_1
+            // InternalPerspectiveDsl.g:17433:2: ( rule__XBooleanLiteral__Alternatives_1 )
+            // InternalPerspectiveDsl.g:17433:3: rule__XBooleanLiteral__Alternatives_1
             {
             pushFollow(FOLLOW_2);
             rule__XBooleanLiteral__Alternatives_1();
@@ -57268,14 +57268,14 @@
 
 
     // $ANTLR start "rule__XNullLiteral__Group__0"
-    // InternalPerspectiveDsl.g:17440:1: rule__XNullLiteral__Group__0 : rule__XNullLiteral__Group__0__Impl rule__XNullLiteral__Group__1 ;
+    // InternalPerspectiveDsl.g:17442:1: rule__XNullLiteral__Group__0 : rule__XNullLiteral__Group__0__Impl rule__XNullLiteral__Group__1 ;
     public final void rule__XNullLiteral__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17444:1: ( rule__XNullLiteral__Group__0__Impl rule__XNullLiteral__Group__1 )
-            // InternalPerspectiveDsl.g:17445:2: rule__XNullLiteral__Group__0__Impl rule__XNullLiteral__Group__1
+            // InternalPerspectiveDsl.g:17446:1: ( rule__XNullLiteral__Group__0__Impl rule__XNullLiteral__Group__1 )
+            // InternalPerspectiveDsl.g:17447:2: rule__XNullLiteral__Group__0__Impl rule__XNullLiteral__Group__1
             {
             pushFollow(FOLLOW_119);
             rule__XNullLiteral__Group__0__Impl();
@@ -57306,23 +57306,23 @@
 
 
     // $ANTLR start "rule__XNullLiteral__Group__0__Impl"
-    // InternalPerspectiveDsl.g:17452:1: rule__XNullLiteral__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:17454:1: rule__XNullLiteral__Group__0__Impl : ( () ) ;
     public final void rule__XNullLiteral__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17456:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:17457:1: ( () )
+            // InternalPerspectiveDsl.g:17458:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:17459:1: ( () )
             {
-            // InternalPerspectiveDsl.g:17457:1: ( () )
-            // InternalPerspectiveDsl.g:17458:2: ()
+            // InternalPerspectiveDsl.g:17459:1: ( () )
+            // InternalPerspectiveDsl.g:17460:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXNullLiteralAccess().getXNullLiteralAction_0()); 
             }
-            // InternalPerspectiveDsl.g:17459:2: ()
-            // InternalPerspectiveDsl.g:17459:3: 
+            // InternalPerspectiveDsl.g:17461:2: ()
+            // InternalPerspectiveDsl.g:17461:3: 
             {
             }
 
@@ -57347,14 +57347,14 @@
 
 
     // $ANTLR start "rule__XNullLiteral__Group__1"
-    // InternalPerspectiveDsl.g:17467:1: rule__XNullLiteral__Group__1 : rule__XNullLiteral__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:17469:1: rule__XNullLiteral__Group__1 : rule__XNullLiteral__Group__1__Impl ;
     public final void rule__XNullLiteral__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17471:1: ( rule__XNullLiteral__Group__1__Impl )
-            // InternalPerspectiveDsl.g:17472:2: rule__XNullLiteral__Group__1__Impl
+            // InternalPerspectiveDsl.g:17473:1: ( rule__XNullLiteral__Group__1__Impl )
+            // InternalPerspectiveDsl.g:17474:2: rule__XNullLiteral__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XNullLiteral__Group__1__Impl();
@@ -57380,17 +57380,17 @@
 
 
     // $ANTLR start "rule__XNullLiteral__Group__1__Impl"
-    // InternalPerspectiveDsl.g:17478:1: rule__XNullLiteral__Group__1__Impl : ( 'null' ) ;
+    // InternalPerspectiveDsl.g:17480:1: rule__XNullLiteral__Group__1__Impl : ( 'null' ) ;
     public final void rule__XNullLiteral__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17482:1: ( ( 'null' ) )
-            // InternalPerspectiveDsl.g:17483:1: ( 'null' )
+            // InternalPerspectiveDsl.g:17484:1: ( ( 'null' ) )
+            // InternalPerspectiveDsl.g:17485:1: ( 'null' )
             {
-            // InternalPerspectiveDsl.g:17483:1: ( 'null' )
-            // InternalPerspectiveDsl.g:17484:2: 'null'
+            // InternalPerspectiveDsl.g:17485:1: ( 'null' )
+            // InternalPerspectiveDsl.g:17486:2: 'null'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXNullLiteralAccess().getNullKeyword_1()); 
@@ -57421,14 +57421,14 @@
 
 
     // $ANTLR start "rule__XNumberLiteral__Group__0"
-    // InternalPerspectiveDsl.g:17494:1: rule__XNumberLiteral__Group__0 : rule__XNumberLiteral__Group__0__Impl rule__XNumberLiteral__Group__1 ;
+    // InternalPerspectiveDsl.g:17496:1: rule__XNumberLiteral__Group__0 : rule__XNumberLiteral__Group__0__Impl rule__XNumberLiteral__Group__1 ;
     public final void rule__XNumberLiteral__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17498:1: ( rule__XNumberLiteral__Group__0__Impl rule__XNumberLiteral__Group__1 )
-            // InternalPerspectiveDsl.g:17499:2: rule__XNumberLiteral__Group__0__Impl rule__XNumberLiteral__Group__1
+            // InternalPerspectiveDsl.g:17500:1: ( rule__XNumberLiteral__Group__0__Impl rule__XNumberLiteral__Group__1 )
+            // InternalPerspectiveDsl.g:17501:2: rule__XNumberLiteral__Group__0__Impl rule__XNumberLiteral__Group__1
             {
             pushFollow(FOLLOW_120);
             rule__XNumberLiteral__Group__0__Impl();
@@ -57459,23 +57459,23 @@
 
 
     // $ANTLR start "rule__XNumberLiteral__Group__0__Impl"
-    // InternalPerspectiveDsl.g:17506:1: rule__XNumberLiteral__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:17508:1: rule__XNumberLiteral__Group__0__Impl : ( () ) ;
     public final void rule__XNumberLiteral__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17510:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:17511:1: ( () )
+            // InternalPerspectiveDsl.g:17512:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:17513:1: ( () )
             {
-            // InternalPerspectiveDsl.g:17511:1: ( () )
-            // InternalPerspectiveDsl.g:17512:2: ()
+            // InternalPerspectiveDsl.g:17513:1: ( () )
+            // InternalPerspectiveDsl.g:17514:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXNumberLiteralAccess().getXNumberLiteralAction_0()); 
             }
-            // InternalPerspectiveDsl.g:17513:2: ()
-            // InternalPerspectiveDsl.g:17513:3: 
+            // InternalPerspectiveDsl.g:17515:2: ()
+            // InternalPerspectiveDsl.g:17515:3: 
             {
             }
 
@@ -57500,14 +57500,14 @@
 
 
     // $ANTLR start "rule__XNumberLiteral__Group__1"
-    // InternalPerspectiveDsl.g:17521:1: rule__XNumberLiteral__Group__1 : rule__XNumberLiteral__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:17523:1: rule__XNumberLiteral__Group__1 : rule__XNumberLiteral__Group__1__Impl ;
     public final void rule__XNumberLiteral__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17525:1: ( rule__XNumberLiteral__Group__1__Impl )
-            // InternalPerspectiveDsl.g:17526:2: rule__XNumberLiteral__Group__1__Impl
+            // InternalPerspectiveDsl.g:17527:1: ( rule__XNumberLiteral__Group__1__Impl )
+            // InternalPerspectiveDsl.g:17528:2: rule__XNumberLiteral__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XNumberLiteral__Group__1__Impl();
@@ -57533,23 +57533,23 @@
 
 
     // $ANTLR start "rule__XNumberLiteral__Group__1__Impl"
-    // InternalPerspectiveDsl.g:17532:1: rule__XNumberLiteral__Group__1__Impl : ( ( rule__XNumberLiteral__ValueAssignment_1 ) ) ;
+    // InternalPerspectiveDsl.g:17534:1: rule__XNumberLiteral__Group__1__Impl : ( ( rule__XNumberLiteral__ValueAssignment_1 ) ) ;
     public final void rule__XNumberLiteral__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17536:1: ( ( ( rule__XNumberLiteral__ValueAssignment_1 ) ) )
-            // InternalPerspectiveDsl.g:17537:1: ( ( rule__XNumberLiteral__ValueAssignment_1 ) )
+            // InternalPerspectiveDsl.g:17538:1: ( ( ( rule__XNumberLiteral__ValueAssignment_1 ) ) )
+            // InternalPerspectiveDsl.g:17539:1: ( ( rule__XNumberLiteral__ValueAssignment_1 ) )
             {
-            // InternalPerspectiveDsl.g:17537:1: ( ( rule__XNumberLiteral__ValueAssignment_1 ) )
-            // InternalPerspectiveDsl.g:17538:2: ( rule__XNumberLiteral__ValueAssignment_1 )
+            // InternalPerspectiveDsl.g:17539:1: ( ( rule__XNumberLiteral__ValueAssignment_1 ) )
+            // InternalPerspectiveDsl.g:17540:2: ( rule__XNumberLiteral__ValueAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXNumberLiteralAccess().getValueAssignment_1()); 
             }
-            // InternalPerspectiveDsl.g:17539:2: ( rule__XNumberLiteral__ValueAssignment_1 )
-            // InternalPerspectiveDsl.g:17539:3: rule__XNumberLiteral__ValueAssignment_1
+            // InternalPerspectiveDsl.g:17541:2: ( rule__XNumberLiteral__ValueAssignment_1 )
+            // InternalPerspectiveDsl.g:17541:3: rule__XNumberLiteral__ValueAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__XNumberLiteral__ValueAssignment_1();
@@ -57584,14 +57584,14 @@
 
 
     // $ANTLR start "rule__XStringLiteral__Group__0"
-    // InternalPerspectiveDsl.g:17548:1: rule__XStringLiteral__Group__0 : rule__XStringLiteral__Group__0__Impl rule__XStringLiteral__Group__1 ;
+    // InternalPerspectiveDsl.g:17550:1: rule__XStringLiteral__Group__0 : rule__XStringLiteral__Group__0__Impl rule__XStringLiteral__Group__1 ;
     public final void rule__XStringLiteral__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17552:1: ( rule__XStringLiteral__Group__0__Impl rule__XStringLiteral__Group__1 )
-            // InternalPerspectiveDsl.g:17553:2: rule__XStringLiteral__Group__0__Impl rule__XStringLiteral__Group__1
+            // InternalPerspectiveDsl.g:17554:1: ( rule__XStringLiteral__Group__0__Impl rule__XStringLiteral__Group__1 )
+            // InternalPerspectiveDsl.g:17555:2: rule__XStringLiteral__Group__0__Impl rule__XStringLiteral__Group__1
             {
             pushFollow(FOLLOW_15);
             rule__XStringLiteral__Group__0__Impl();
@@ -57622,23 +57622,23 @@
 
 
     // $ANTLR start "rule__XStringLiteral__Group__0__Impl"
-    // InternalPerspectiveDsl.g:17560:1: rule__XStringLiteral__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:17562:1: rule__XStringLiteral__Group__0__Impl : ( () ) ;
     public final void rule__XStringLiteral__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17564:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:17565:1: ( () )
+            // InternalPerspectiveDsl.g:17566:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:17567:1: ( () )
             {
-            // InternalPerspectiveDsl.g:17565:1: ( () )
-            // InternalPerspectiveDsl.g:17566:2: ()
+            // InternalPerspectiveDsl.g:17567:1: ( () )
+            // InternalPerspectiveDsl.g:17568:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXStringLiteralAccess().getXStringLiteralAction_0()); 
             }
-            // InternalPerspectiveDsl.g:17567:2: ()
-            // InternalPerspectiveDsl.g:17567:3: 
+            // InternalPerspectiveDsl.g:17569:2: ()
+            // InternalPerspectiveDsl.g:17569:3: 
             {
             }
 
@@ -57663,14 +57663,14 @@
 
 
     // $ANTLR start "rule__XStringLiteral__Group__1"
-    // InternalPerspectiveDsl.g:17575:1: rule__XStringLiteral__Group__1 : rule__XStringLiteral__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:17577:1: rule__XStringLiteral__Group__1 : rule__XStringLiteral__Group__1__Impl ;
     public final void rule__XStringLiteral__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17579:1: ( rule__XStringLiteral__Group__1__Impl )
-            // InternalPerspectiveDsl.g:17580:2: rule__XStringLiteral__Group__1__Impl
+            // InternalPerspectiveDsl.g:17581:1: ( rule__XStringLiteral__Group__1__Impl )
+            // InternalPerspectiveDsl.g:17582:2: rule__XStringLiteral__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XStringLiteral__Group__1__Impl();
@@ -57696,23 +57696,23 @@
 
 
     // $ANTLR start "rule__XStringLiteral__Group__1__Impl"
-    // InternalPerspectiveDsl.g:17586:1: rule__XStringLiteral__Group__1__Impl : ( ( rule__XStringLiteral__ValueAssignment_1 ) ) ;
+    // InternalPerspectiveDsl.g:17588:1: rule__XStringLiteral__Group__1__Impl : ( ( rule__XStringLiteral__ValueAssignment_1 ) ) ;
     public final void rule__XStringLiteral__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17590:1: ( ( ( rule__XStringLiteral__ValueAssignment_1 ) ) )
-            // InternalPerspectiveDsl.g:17591:1: ( ( rule__XStringLiteral__ValueAssignment_1 ) )
+            // InternalPerspectiveDsl.g:17592:1: ( ( ( rule__XStringLiteral__ValueAssignment_1 ) ) )
+            // InternalPerspectiveDsl.g:17593:1: ( ( rule__XStringLiteral__ValueAssignment_1 ) )
             {
-            // InternalPerspectiveDsl.g:17591:1: ( ( rule__XStringLiteral__ValueAssignment_1 ) )
-            // InternalPerspectiveDsl.g:17592:2: ( rule__XStringLiteral__ValueAssignment_1 )
+            // InternalPerspectiveDsl.g:17593:1: ( ( rule__XStringLiteral__ValueAssignment_1 ) )
+            // InternalPerspectiveDsl.g:17594:2: ( rule__XStringLiteral__ValueAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXStringLiteralAccess().getValueAssignment_1()); 
             }
-            // InternalPerspectiveDsl.g:17593:2: ( rule__XStringLiteral__ValueAssignment_1 )
-            // InternalPerspectiveDsl.g:17593:3: rule__XStringLiteral__ValueAssignment_1
+            // InternalPerspectiveDsl.g:17595:2: ( rule__XStringLiteral__ValueAssignment_1 )
+            // InternalPerspectiveDsl.g:17595:3: rule__XStringLiteral__ValueAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__XStringLiteral__ValueAssignment_1();
@@ -57747,14 +57747,14 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__0"
-    // InternalPerspectiveDsl.g:17602:1: rule__XTypeLiteral__Group__0 : rule__XTypeLiteral__Group__0__Impl rule__XTypeLiteral__Group__1 ;
+    // InternalPerspectiveDsl.g:17604:1: rule__XTypeLiteral__Group__0 : rule__XTypeLiteral__Group__0__Impl rule__XTypeLiteral__Group__1 ;
     public final void rule__XTypeLiteral__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17606:1: ( rule__XTypeLiteral__Group__0__Impl rule__XTypeLiteral__Group__1 )
-            // InternalPerspectiveDsl.g:17607:2: rule__XTypeLiteral__Group__0__Impl rule__XTypeLiteral__Group__1
+            // InternalPerspectiveDsl.g:17608:1: ( rule__XTypeLiteral__Group__0__Impl rule__XTypeLiteral__Group__1 )
+            // InternalPerspectiveDsl.g:17609:2: rule__XTypeLiteral__Group__0__Impl rule__XTypeLiteral__Group__1
             {
             pushFollow(FOLLOW_121);
             rule__XTypeLiteral__Group__0__Impl();
@@ -57785,23 +57785,23 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__0__Impl"
-    // InternalPerspectiveDsl.g:17614:1: rule__XTypeLiteral__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:17616:1: rule__XTypeLiteral__Group__0__Impl : ( () ) ;
     public final void rule__XTypeLiteral__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17618:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:17619:1: ( () )
+            // InternalPerspectiveDsl.g:17620:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:17621:1: ( () )
             {
-            // InternalPerspectiveDsl.g:17619:1: ( () )
-            // InternalPerspectiveDsl.g:17620:2: ()
+            // InternalPerspectiveDsl.g:17621:1: ( () )
+            // InternalPerspectiveDsl.g:17622:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getXTypeLiteralAction_0()); 
             }
-            // InternalPerspectiveDsl.g:17621:2: ()
-            // InternalPerspectiveDsl.g:17621:3: 
+            // InternalPerspectiveDsl.g:17623:2: ()
+            // InternalPerspectiveDsl.g:17623:3: 
             {
             }
 
@@ -57826,14 +57826,14 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__1"
-    // InternalPerspectiveDsl.g:17629:1: rule__XTypeLiteral__Group__1 : rule__XTypeLiteral__Group__1__Impl rule__XTypeLiteral__Group__2 ;
+    // InternalPerspectiveDsl.g:17631:1: rule__XTypeLiteral__Group__1 : rule__XTypeLiteral__Group__1__Impl rule__XTypeLiteral__Group__2 ;
     public final void rule__XTypeLiteral__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17633:1: ( rule__XTypeLiteral__Group__1__Impl rule__XTypeLiteral__Group__2 )
-            // InternalPerspectiveDsl.g:17634:2: rule__XTypeLiteral__Group__1__Impl rule__XTypeLiteral__Group__2
+            // InternalPerspectiveDsl.g:17635:1: ( rule__XTypeLiteral__Group__1__Impl rule__XTypeLiteral__Group__2 )
+            // InternalPerspectiveDsl.g:17636:2: rule__XTypeLiteral__Group__1__Impl rule__XTypeLiteral__Group__2
             {
             pushFollow(FOLLOW_50);
             rule__XTypeLiteral__Group__1__Impl();
@@ -57864,17 +57864,17 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__1__Impl"
-    // InternalPerspectiveDsl.g:17641:1: rule__XTypeLiteral__Group__1__Impl : ( 'typeof' ) ;
+    // InternalPerspectiveDsl.g:17643:1: rule__XTypeLiteral__Group__1__Impl : ( 'typeof' ) ;
     public final void rule__XTypeLiteral__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17645:1: ( ( 'typeof' ) )
-            // InternalPerspectiveDsl.g:17646:1: ( 'typeof' )
+            // InternalPerspectiveDsl.g:17647:1: ( ( 'typeof' ) )
+            // InternalPerspectiveDsl.g:17648:1: ( 'typeof' )
             {
-            // InternalPerspectiveDsl.g:17646:1: ( 'typeof' )
-            // InternalPerspectiveDsl.g:17647:2: 'typeof'
+            // InternalPerspectiveDsl.g:17648:1: ( 'typeof' )
+            // InternalPerspectiveDsl.g:17649:2: 'typeof'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1()); 
@@ -57905,14 +57905,14 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__2"
-    // InternalPerspectiveDsl.g:17656:1: rule__XTypeLiteral__Group__2 : rule__XTypeLiteral__Group__2__Impl rule__XTypeLiteral__Group__3 ;
+    // InternalPerspectiveDsl.g:17658:1: rule__XTypeLiteral__Group__2 : rule__XTypeLiteral__Group__2__Impl rule__XTypeLiteral__Group__3 ;
     public final void rule__XTypeLiteral__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17660:1: ( rule__XTypeLiteral__Group__2__Impl rule__XTypeLiteral__Group__3 )
-            // InternalPerspectiveDsl.g:17661:2: rule__XTypeLiteral__Group__2__Impl rule__XTypeLiteral__Group__3
+            // InternalPerspectiveDsl.g:17662:1: ( rule__XTypeLiteral__Group__2__Impl rule__XTypeLiteral__Group__3 )
+            // InternalPerspectiveDsl.g:17663:2: rule__XTypeLiteral__Group__2__Impl rule__XTypeLiteral__Group__3
             {
             pushFollow(FOLLOW_7);
             rule__XTypeLiteral__Group__2__Impl();
@@ -57943,17 +57943,17 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__2__Impl"
-    // InternalPerspectiveDsl.g:17668:1: rule__XTypeLiteral__Group__2__Impl : ( '(' ) ;
+    // InternalPerspectiveDsl.g:17670:1: rule__XTypeLiteral__Group__2__Impl : ( '(' ) ;
     public final void rule__XTypeLiteral__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17672:1: ( ( '(' ) )
-            // InternalPerspectiveDsl.g:17673:1: ( '(' )
+            // InternalPerspectiveDsl.g:17674:1: ( ( '(' ) )
+            // InternalPerspectiveDsl.g:17675:1: ( '(' )
             {
-            // InternalPerspectiveDsl.g:17673:1: ( '(' )
-            // InternalPerspectiveDsl.g:17674:2: '('
+            // InternalPerspectiveDsl.g:17675:1: ( '(' )
+            // InternalPerspectiveDsl.g:17676:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2()); 
@@ -57984,14 +57984,14 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__3"
-    // InternalPerspectiveDsl.g:17683:1: rule__XTypeLiteral__Group__3 : rule__XTypeLiteral__Group__3__Impl rule__XTypeLiteral__Group__4 ;
+    // InternalPerspectiveDsl.g:17685:1: rule__XTypeLiteral__Group__3 : rule__XTypeLiteral__Group__3__Impl rule__XTypeLiteral__Group__4 ;
     public final void rule__XTypeLiteral__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17687:1: ( rule__XTypeLiteral__Group__3__Impl rule__XTypeLiteral__Group__4 )
-            // InternalPerspectiveDsl.g:17688:2: rule__XTypeLiteral__Group__3__Impl rule__XTypeLiteral__Group__4
+            // InternalPerspectiveDsl.g:17689:1: ( rule__XTypeLiteral__Group__3__Impl rule__XTypeLiteral__Group__4 )
+            // InternalPerspectiveDsl.g:17690:2: rule__XTypeLiteral__Group__3__Impl rule__XTypeLiteral__Group__4
             {
             pushFollow(FOLLOW_122);
             rule__XTypeLiteral__Group__3__Impl();
@@ -58022,23 +58022,23 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__3__Impl"
-    // InternalPerspectiveDsl.g:17695:1: rule__XTypeLiteral__Group__3__Impl : ( ( rule__XTypeLiteral__TypeAssignment_3 ) ) ;
+    // InternalPerspectiveDsl.g:17697:1: rule__XTypeLiteral__Group__3__Impl : ( ( rule__XTypeLiteral__TypeAssignment_3 ) ) ;
     public final void rule__XTypeLiteral__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17699:1: ( ( ( rule__XTypeLiteral__TypeAssignment_3 ) ) )
-            // InternalPerspectiveDsl.g:17700:1: ( ( rule__XTypeLiteral__TypeAssignment_3 ) )
+            // InternalPerspectiveDsl.g:17701:1: ( ( ( rule__XTypeLiteral__TypeAssignment_3 ) ) )
+            // InternalPerspectiveDsl.g:17702:1: ( ( rule__XTypeLiteral__TypeAssignment_3 ) )
             {
-            // InternalPerspectiveDsl.g:17700:1: ( ( rule__XTypeLiteral__TypeAssignment_3 ) )
-            // InternalPerspectiveDsl.g:17701:2: ( rule__XTypeLiteral__TypeAssignment_3 )
+            // InternalPerspectiveDsl.g:17702:1: ( ( rule__XTypeLiteral__TypeAssignment_3 ) )
+            // InternalPerspectiveDsl.g:17703:2: ( rule__XTypeLiteral__TypeAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getTypeAssignment_3()); 
             }
-            // InternalPerspectiveDsl.g:17702:2: ( rule__XTypeLiteral__TypeAssignment_3 )
-            // InternalPerspectiveDsl.g:17702:3: rule__XTypeLiteral__TypeAssignment_3
+            // InternalPerspectiveDsl.g:17704:2: ( rule__XTypeLiteral__TypeAssignment_3 )
+            // InternalPerspectiveDsl.g:17704:3: rule__XTypeLiteral__TypeAssignment_3
             {
             pushFollow(FOLLOW_2);
             rule__XTypeLiteral__TypeAssignment_3();
@@ -58073,14 +58073,14 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__4"
-    // InternalPerspectiveDsl.g:17710:1: rule__XTypeLiteral__Group__4 : rule__XTypeLiteral__Group__4__Impl rule__XTypeLiteral__Group__5 ;
+    // InternalPerspectiveDsl.g:17712:1: rule__XTypeLiteral__Group__4 : rule__XTypeLiteral__Group__4__Impl rule__XTypeLiteral__Group__5 ;
     public final void rule__XTypeLiteral__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17714:1: ( rule__XTypeLiteral__Group__4__Impl rule__XTypeLiteral__Group__5 )
-            // InternalPerspectiveDsl.g:17715:2: rule__XTypeLiteral__Group__4__Impl rule__XTypeLiteral__Group__5
+            // InternalPerspectiveDsl.g:17716:1: ( rule__XTypeLiteral__Group__4__Impl rule__XTypeLiteral__Group__5 )
+            // InternalPerspectiveDsl.g:17717:2: rule__XTypeLiteral__Group__4__Impl rule__XTypeLiteral__Group__5
             {
             pushFollow(FOLLOW_122);
             rule__XTypeLiteral__Group__4__Impl();
@@ -58111,22 +58111,22 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__4__Impl"
-    // InternalPerspectiveDsl.g:17722:1: rule__XTypeLiteral__Group__4__Impl : ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* ) ;
+    // InternalPerspectiveDsl.g:17724:1: rule__XTypeLiteral__Group__4__Impl : ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* ) ;
     public final void rule__XTypeLiteral__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17726:1: ( ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* ) )
-            // InternalPerspectiveDsl.g:17727:1: ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* )
+            // InternalPerspectiveDsl.g:17728:1: ( ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* ) )
+            // InternalPerspectiveDsl.g:17729:1: ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* )
             {
-            // InternalPerspectiveDsl.g:17727:1: ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* )
-            // InternalPerspectiveDsl.g:17728:2: ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )*
+            // InternalPerspectiveDsl.g:17729:1: ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* )
+            // InternalPerspectiveDsl.g:17730:2: ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsAssignment_4()); 
             }
-            // InternalPerspectiveDsl.g:17729:2: ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )*
+            // InternalPerspectiveDsl.g:17731:2: ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )*
             loop125:
             do {
                 int alt125=2;
@@ -58139,7 +58139,7 @@
 
                 switch (alt125) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:17729:3: rule__XTypeLiteral__ArrayDimensionsAssignment_4
+            	    // InternalPerspectiveDsl.g:17731:3: rule__XTypeLiteral__ArrayDimensionsAssignment_4
             	    {
             	    pushFollow(FOLLOW_123);
             	    rule__XTypeLiteral__ArrayDimensionsAssignment_4();
@@ -58180,14 +58180,14 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__5"
-    // InternalPerspectiveDsl.g:17737:1: rule__XTypeLiteral__Group__5 : rule__XTypeLiteral__Group__5__Impl ;
+    // InternalPerspectiveDsl.g:17739:1: rule__XTypeLiteral__Group__5 : rule__XTypeLiteral__Group__5__Impl ;
     public final void rule__XTypeLiteral__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17741:1: ( rule__XTypeLiteral__Group__5__Impl )
-            // InternalPerspectiveDsl.g:17742:2: rule__XTypeLiteral__Group__5__Impl
+            // InternalPerspectiveDsl.g:17743:1: ( rule__XTypeLiteral__Group__5__Impl )
+            // InternalPerspectiveDsl.g:17744:2: rule__XTypeLiteral__Group__5__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XTypeLiteral__Group__5__Impl();
@@ -58213,17 +58213,17 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__5__Impl"
-    // InternalPerspectiveDsl.g:17748:1: rule__XTypeLiteral__Group__5__Impl : ( ')' ) ;
+    // InternalPerspectiveDsl.g:17750:1: rule__XTypeLiteral__Group__5__Impl : ( ')' ) ;
     public final void rule__XTypeLiteral__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17752:1: ( ( ')' ) )
-            // InternalPerspectiveDsl.g:17753:1: ( ')' )
+            // InternalPerspectiveDsl.g:17754:1: ( ( ')' ) )
+            // InternalPerspectiveDsl.g:17755:1: ( ')' )
             {
-            // InternalPerspectiveDsl.g:17753:1: ( ')' )
-            // InternalPerspectiveDsl.g:17754:2: ')'
+            // InternalPerspectiveDsl.g:17755:1: ( ')' )
+            // InternalPerspectiveDsl.g:17756:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getRightParenthesisKeyword_5()); 
@@ -58254,14 +58254,14 @@
 
 
     // $ANTLR start "rule__XThrowExpression__Group__0"
-    // InternalPerspectiveDsl.g:17764:1: rule__XThrowExpression__Group__0 : rule__XThrowExpression__Group__0__Impl rule__XThrowExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:17766:1: rule__XThrowExpression__Group__0 : rule__XThrowExpression__Group__0__Impl rule__XThrowExpression__Group__1 ;
     public final void rule__XThrowExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17768:1: ( rule__XThrowExpression__Group__0__Impl rule__XThrowExpression__Group__1 )
-            // InternalPerspectiveDsl.g:17769:2: rule__XThrowExpression__Group__0__Impl rule__XThrowExpression__Group__1
+            // InternalPerspectiveDsl.g:17770:1: ( rule__XThrowExpression__Group__0__Impl rule__XThrowExpression__Group__1 )
+            // InternalPerspectiveDsl.g:17771:2: rule__XThrowExpression__Group__0__Impl rule__XThrowExpression__Group__1
             {
             pushFollow(FOLLOW_124);
             rule__XThrowExpression__Group__0__Impl();
@@ -58292,23 +58292,23 @@
 
 
     // $ANTLR start "rule__XThrowExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:17776:1: rule__XThrowExpression__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:17778:1: rule__XThrowExpression__Group__0__Impl : ( () ) ;
     public final void rule__XThrowExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17780:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:17781:1: ( () )
+            // InternalPerspectiveDsl.g:17782:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:17783:1: ( () )
             {
-            // InternalPerspectiveDsl.g:17781:1: ( () )
-            // InternalPerspectiveDsl.g:17782:2: ()
+            // InternalPerspectiveDsl.g:17783:1: ( () )
+            // InternalPerspectiveDsl.g:17784:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXThrowExpressionAccess().getXThrowExpressionAction_0()); 
             }
-            // InternalPerspectiveDsl.g:17783:2: ()
-            // InternalPerspectiveDsl.g:17783:3: 
+            // InternalPerspectiveDsl.g:17785:2: ()
+            // InternalPerspectiveDsl.g:17785:3: 
             {
             }
 
@@ -58333,14 +58333,14 @@
 
 
     // $ANTLR start "rule__XThrowExpression__Group__1"
-    // InternalPerspectiveDsl.g:17791:1: rule__XThrowExpression__Group__1 : rule__XThrowExpression__Group__1__Impl rule__XThrowExpression__Group__2 ;
+    // InternalPerspectiveDsl.g:17793:1: rule__XThrowExpression__Group__1 : rule__XThrowExpression__Group__1__Impl rule__XThrowExpression__Group__2 ;
     public final void rule__XThrowExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17795:1: ( rule__XThrowExpression__Group__1__Impl rule__XThrowExpression__Group__2 )
-            // InternalPerspectiveDsl.g:17796:2: rule__XThrowExpression__Group__1__Impl rule__XThrowExpression__Group__2
+            // InternalPerspectiveDsl.g:17797:1: ( rule__XThrowExpression__Group__1__Impl rule__XThrowExpression__Group__2 )
+            // InternalPerspectiveDsl.g:17798:2: rule__XThrowExpression__Group__1__Impl rule__XThrowExpression__Group__2
             {
             pushFollow(FOLLOW_54);
             rule__XThrowExpression__Group__1__Impl();
@@ -58371,17 +58371,17 @@
 
 
     // $ANTLR start "rule__XThrowExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:17803:1: rule__XThrowExpression__Group__1__Impl : ( 'throw' ) ;
+    // InternalPerspectiveDsl.g:17805:1: rule__XThrowExpression__Group__1__Impl : ( 'throw' ) ;
     public final void rule__XThrowExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17807:1: ( ( 'throw' ) )
-            // InternalPerspectiveDsl.g:17808:1: ( 'throw' )
+            // InternalPerspectiveDsl.g:17809:1: ( ( 'throw' ) )
+            // InternalPerspectiveDsl.g:17810:1: ( 'throw' )
             {
-            // InternalPerspectiveDsl.g:17808:1: ( 'throw' )
-            // InternalPerspectiveDsl.g:17809:2: 'throw'
+            // InternalPerspectiveDsl.g:17810:1: ( 'throw' )
+            // InternalPerspectiveDsl.g:17811:2: 'throw'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1()); 
@@ -58412,14 +58412,14 @@
 
 
     // $ANTLR start "rule__XThrowExpression__Group__2"
-    // InternalPerspectiveDsl.g:17818:1: rule__XThrowExpression__Group__2 : rule__XThrowExpression__Group__2__Impl ;
+    // InternalPerspectiveDsl.g:17820:1: rule__XThrowExpression__Group__2 : rule__XThrowExpression__Group__2__Impl ;
     public final void rule__XThrowExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17822:1: ( rule__XThrowExpression__Group__2__Impl )
-            // InternalPerspectiveDsl.g:17823:2: rule__XThrowExpression__Group__2__Impl
+            // InternalPerspectiveDsl.g:17824:1: ( rule__XThrowExpression__Group__2__Impl )
+            // InternalPerspectiveDsl.g:17825:2: rule__XThrowExpression__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XThrowExpression__Group__2__Impl();
@@ -58445,23 +58445,23 @@
 
 
     // $ANTLR start "rule__XThrowExpression__Group__2__Impl"
-    // InternalPerspectiveDsl.g:17829:1: rule__XThrowExpression__Group__2__Impl : ( ( rule__XThrowExpression__ExpressionAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:17831:1: rule__XThrowExpression__Group__2__Impl : ( ( rule__XThrowExpression__ExpressionAssignment_2 ) ) ;
     public final void rule__XThrowExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17833:1: ( ( ( rule__XThrowExpression__ExpressionAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:17834:1: ( ( rule__XThrowExpression__ExpressionAssignment_2 ) )
+            // InternalPerspectiveDsl.g:17835:1: ( ( ( rule__XThrowExpression__ExpressionAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:17836:1: ( ( rule__XThrowExpression__ExpressionAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:17834:1: ( ( rule__XThrowExpression__ExpressionAssignment_2 ) )
-            // InternalPerspectiveDsl.g:17835:2: ( rule__XThrowExpression__ExpressionAssignment_2 )
+            // InternalPerspectiveDsl.g:17836:1: ( ( rule__XThrowExpression__ExpressionAssignment_2 ) )
+            // InternalPerspectiveDsl.g:17837:2: ( rule__XThrowExpression__ExpressionAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXThrowExpressionAccess().getExpressionAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:17836:2: ( rule__XThrowExpression__ExpressionAssignment_2 )
-            // InternalPerspectiveDsl.g:17836:3: rule__XThrowExpression__ExpressionAssignment_2
+            // InternalPerspectiveDsl.g:17838:2: ( rule__XThrowExpression__ExpressionAssignment_2 )
+            // InternalPerspectiveDsl.g:17838:3: rule__XThrowExpression__ExpressionAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__XThrowExpression__ExpressionAssignment_2();
@@ -58496,14 +58496,14 @@
 
 
     // $ANTLR start "rule__XReturnExpression__Group__0"
-    // InternalPerspectiveDsl.g:17845:1: rule__XReturnExpression__Group__0 : rule__XReturnExpression__Group__0__Impl rule__XReturnExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:17847:1: rule__XReturnExpression__Group__0 : rule__XReturnExpression__Group__0__Impl rule__XReturnExpression__Group__1 ;
     public final void rule__XReturnExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17849:1: ( rule__XReturnExpression__Group__0__Impl rule__XReturnExpression__Group__1 )
-            // InternalPerspectiveDsl.g:17850:2: rule__XReturnExpression__Group__0__Impl rule__XReturnExpression__Group__1
+            // InternalPerspectiveDsl.g:17851:1: ( rule__XReturnExpression__Group__0__Impl rule__XReturnExpression__Group__1 )
+            // InternalPerspectiveDsl.g:17852:2: rule__XReturnExpression__Group__0__Impl rule__XReturnExpression__Group__1
             {
             pushFollow(FOLLOW_125);
             rule__XReturnExpression__Group__0__Impl();
@@ -58534,23 +58534,23 @@
 
 
     // $ANTLR start "rule__XReturnExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:17857:1: rule__XReturnExpression__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:17859:1: rule__XReturnExpression__Group__0__Impl : ( () ) ;
     public final void rule__XReturnExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17861:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:17862:1: ( () )
+            // InternalPerspectiveDsl.g:17863:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:17864:1: ( () )
             {
-            // InternalPerspectiveDsl.g:17862:1: ( () )
-            // InternalPerspectiveDsl.g:17863:2: ()
+            // InternalPerspectiveDsl.g:17864:1: ( () )
+            // InternalPerspectiveDsl.g:17865:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXReturnExpressionAccess().getXReturnExpressionAction_0()); 
             }
-            // InternalPerspectiveDsl.g:17864:2: ()
-            // InternalPerspectiveDsl.g:17864:3: 
+            // InternalPerspectiveDsl.g:17866:2: ()
+            // InternalPerspectiveDsl.g:17866:3: 
             {
             }
 
@@ -58575,14 +58575,14 @@
 
 
     // $ANTLR start "rule__XReturnExpression__Group__1"
-    // InternalPerspectiveDsl.g:17872:1: rule__XReturnExpression__Group__1 : rule__XReturnExpression__Group__1__Impl rule__XReturnExpression__Group__2 ;
+    // InternalPerspectiveDsl.g:17874:1: rule__XReturnExpression__Group__1 : rule__XReturnExpression__Group__1__Impl rule__XReturnExpression__Group__2 ;
     public final void rule__XReturnExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17876:1: ( rule__XReturnExpression__Group__1__Impl rule__XReturnExpression__Group__2 )
-            // InternalPerspectiveDsl.g:17877:2: rule__XReturnExpression__Group__1__Impl rule__XReturnExpression__Group__2
+            // InternalPerspectiveDsl.g:17878:1: ( rule__XReturnExpression__Group__1__Impl rule__XReturnExpression__Group__2 )
+            // InternalPerspectiveDsl.g:17879:2: rule__XReturnExpression__Group__1__Impl rule__XReturnExpression__Group__2
             {
             pushFollow(FOLLOW_54);
             rule__XReturnExpression__Group__1__Impl();
@@ -58613,17 +58613,17 @@
 
 
     // $ANTLR start "rule__XReturnExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:17884:1: rule__XReturnExpression__Group__1__Impl : ( 'return' ) ;
+    // InternalPerspectiveDsl.g:17886:1: rule__XReturnExpression__Group__1__Impl : ( 'return' ) ;
     public final void rule__XReturnExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17888:1: ( ( 'return' ) )
-            // InternalPerspectiveDsl.g:17889:1: ( 'return' )
+            // InternalPerspectiveDsl.g:17890:1: ( ( 'return' ) )
+            // InternalPerspectiveDsl.g:17891:1: ( 'return' )
             {
-            // InternalPerspectiveDsl.g:17889:1: ( 'return' )
-            // InternalPerspectiveDsl.g:17890:2: 'return'
+            // InternalPerspectiveDsl.g:17891:1: ( 'return' )
+            // InternalPerspectiveDsl.g:17892:2: 'return'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1()); 
@@ -58654,14 +58654,14 @@
 
 
     // $ANTLR start "rule__XReturnExpression__Group__2"
-    // InternalPerspectiveDsl.g:17899:1: rule__XReturnExpression__Group__2 : rule__XReturnExpression__Group__2__Impl ;
+    // InternalPerspectiveDsl.g:17901:1: rule__XReturnExpression__Group__2 : rule__XReturnExpression__Group__2__Impl ;
     public final void rule__XReturnExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17903:1: ( rule__XReturnExpression__Group__2__Impl )
-            // InternalPerspectiveDsl.g:17904:2: rule__XReturnExpression__Group__2__Impl
+            // InternalPerspectiveDsl.g:17905:1: ( rule__XReturnExpression__Group__2__Impl )
+            // InternalPerspectiveDsl.g:17906:2: rule__XReturnExpression__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XReturnExpression__Group__2__Impl();
@@ -58687,27 +58687,27 @@
 
 
     // $ANTLR start "rule__XReturnExpression__Group__2__Impl"
-    // InternalPerspectiveDsl.g:17910:1: rule__XReturnExpression__Group__2__Impl : ( ( rule__XReturnExpression__ExpressionAssignment_2 )? ) ;
+    // InternalPerspectiveDsl.g:17912:1: rule__XReturnExpression__Group__2__Impl : ( ( rule__XReturnExpression__ExpressionAssignment_2 )? ) ;
     public final void rule__XReturnExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17914:1: ( ( ( rule__XReturnExpression__ExpressionAssignment_2 )? ) )
-            // InternalPerspectiveDsl.g:17915:1: ( ( rule__XReturnExpression__ExpressionAssignment_2 )? )
+            // InternalPerspectiveDsl.g:17916:1: ( ( ( rule__XReturnExpression__ExpressionAssignment_2 )? ) )
+            // InternalPerspectiveDsl.g:17917:1: ( ( rule__XReturnExpression__ExpressionAssignment_2 )? )
             {
-            // InternalPerspectiveDsl.g:17915:1: ( ( rule__XReturnExpression__ExpressionAssignment_2 )? )
-            // InternalPerspectiveDsl.g:17916:2: ( rule__XReturnExpression__ExpressionAssignment_2 )?
+            // InternalPerspectiveDsl.g:17917:1: ( ( rule__XReturnExpression__ExpressionAssignment_2 )? )
+            // InternalPerspectiveDsl.g:17918:2: ( rule__XReturnExpression__ExpressionAssignment_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXReturnExpressionAccess().getExpressionAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:17917:2: ( rule__XReturnExpression__ExpressionAssignment_2 )?
+            // InternalPerspectiveDsl.g:17919:2: ( rule__XReturnExpression__ExpressionAssignment_2 )?
             int alt126=2;
             alt126 = dfa126.predict(input);
             switch (alt126) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:17917:3: rule__XReturnExpression__ExpressionAssignment_2
+                    // InternalPerspectiveDsl.g:17919:3: rule__XReturnExpression__ExpressionAssignment_2
                     {
                     pushFollow(FOLLOW_2);
                     rule__XReturnExpression__ExpressionAssignment_2();
@@ -58745,14 +58745,14 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group__0"
-    // InternalPerspectiveDsl.g:17926:1: rule__XTryCatchFinallyExpression__Group__0 : rule__XTryCatchFinallyExpression__Group__0__Impl rule__XTryCatchFinallyExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:17928:1: rule__XTryCatchFinallyExpression__Group__0 : rule__XTryCatchFinallyExpression__Group__0__Impl rule__XTryCatchFinallyExpression__Group__1 ;
     public final void rule__XTryCatchFinallyExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17930:1: ( rule__XTryCatchFinallyExpression__Group__0__Impl rule__XTryCatchFinallyExpression__Group__1 )
-            // InternalPerspectiveDsl.g:17931:2: rule__XTryCatchFinallyExpression__Group__0__Impl rule__XTryCatchFinallyExpression__Group__1
+            // InternalPerspectiveDsl.g:17932:1: ( rule__XTryCatchFinallyExpression__Group__0__Impl rule__XTryCatchFinallyExpression__Group__1 )
+            // InternalPerspectiveDsl.g:17933:2: rule__XTryCatchFinallyExpression__Group__0__Impl rule__XTryCatchFinallyExpression__Group__1
             {
             pushFollow(FOLLOW_126);
             rule__XTryCatchFinallyExpression__Group__0__Impl();
@@ -58783,23 +58783,23 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:17938:1: rule__XTryCatchFinallyExpression__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:17940:1: rule__XTryCatchFinallyExpression__Group__0__Impl : ( () ) ;
     public final void rule__XTryCatchFinallyExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17942:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:17943:1: ( () )
+            // InternalPerspectiveDsl.g:17944:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:17945:1: ( () )
             {
-            // InternalPerspectiveDsl.g:17943:1: ( () )
-            // InternalPerspectiveDsl.g:17944:2: ()
+            // InternalPerspectiveDsl.g:17945:1: ( () )
+            // InternalPerspectiveDsl.g:17946:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0()); 
             }
-            // InternalPerspectiveDsl.g:17945:2: ()
-            // InternalPerspectiveDsl.g:17945:3: 
+            // InternalPerspectiveDsl.g:17947:2: ()
+            // InternalPerspectiveDsl.g:17947:3: 
             {
             }
 
@@ -58824,14 +58824,14 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group__1"
-    // InternalPerspectiveDsl.g:17953:1: rule__XTryCatchFinallyExpression__Group__1 : rule__XTryCatchFinallyExpression__Group__1__Impl rule__XTryCatchFinallyExpression__Group__2 ;
+    // InternalPerspectiveDsl.g:17955:1: rule__XTryCatchFinallyExpression__Group__1 : rule__XTryCatchFinallyExpression__Group__1__Impl rule__XTryCatchFinallyExpression__Group__2 ;
     public final void rule__XTryCatchFinallyExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17957:1: ( rule__XTryCatchFinallyExpression__Group__1__Impl rule__XTryCatchFinallyExpression__Group__2 )
-            // InternalPerspectiveDsl.g:17958:2: rule__XTryCatchFinallyExpression__Group__1__Impl rule__XTryCatchFinallyExpression__Group__2
+            // InternalPerspectiveDsl.g:17959:1: ( rule__XTryCatchFinallyExpression__Group__1__Impl rule__XTryCatchFinallyExpression__Group__2 )
+            // InternalPerspectiveDsl.g:17960:2: rule__XTryCatchFinallyExpression__Group__1__Impl rule__XTryCatchFinallyExpression__Group__2
             {
             pushFollow(FOLLOW_54);
             rule__XTryCatchFinallyExpression__Group__1__Impl();
@@ -58862,17 +58862,17 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:17965:1: rule__XTryCatchFinallyExpression__Group__1__Impl : ( 'try' ) ;
+    // InternalPerspectiveDsl.g:17967:1: rule__XTryCatchFinallyExpression__Group__1__Impl : ( 'try' ) ;
     public final void rule__XTryCatchFinallyExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17969:1: ( ( 'try' ) )
-            // InternalPerspectiveDsl.g:17970:1: ( 'try' )
+            // InternalPerspectiveDsl.g:17971:1: ( ( 'try' ) )
+            // InternalPerspectiveDsl.g:17972:1: ( 'try' )
             {
-            // InternalPerspectiveDsl.g:17970:1: ( 'try' )
-            // InternalPerspectiveDsl.g:17971:2: 'try'
+            // InternalPerspectiveDsl.g:17972:1: ( 'try' )
+            // InternalPerspectiveDsl.g:17973:2: 'try'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1()); 
@@ -58903,14 +58903,14 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group__2"
-    // InternalPerspectiveDsl.g:17980:1: rule__XTryCatchFinallyExpression__Group__2 : rule__XTryCatchFinallyExpression__Group__2__Impl rule__XTryCatchFinallyExpression__Group__3 ;
+    // InternalPerspectiveDsl.g:17982:1: rule__XTryCatchFinallyExpression__Group__2 : rule__XTryCatchFinallyExpression__Group__2__Impl rule__XTryCatchFinallyExpression__Group__3 ;
     public final void rule__XTryCatchFinallyExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17984:1: ( rule__XTryCatchFinallyExpression__Group__2__Impl rule__XTryCatchFinallyExpression__Group__3 )
-            // InternalPerspectiveDsl.g:17985:2: rule__XTryCatchFinallyExpression__Group__2__Impl rule__XTryCatchFinallyExpression__Group__3
+            // InternalPerspectiveDsl.g:17986:1: ( rule__XTryCatchFinallyExpression__Group__2__Impl rule__XTryCatchFinallyExpression__Group__3 )
+            // InternalPerspectiveDsl.g:17987:2: rule__XTryCatchFinallyExpression__Group__2__Impl rule__XTryCatchFinallyExpression__Group__3
             {
             pushFollow(FOLLOW_127);
             rule__XTryCatchFinallyExpression__Group__2__Impl();
@@ -58941,23 +58941,23 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group__2__Impl"
-    // InternalPerspectiveDsl.g:17992:1: rule__XTryCatchFinallyExpression__Group__2__Impl : ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:17994:1: rule__XTryCatchFinallyExpression__Group__2__Impl : ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) ) ;
     public final void rule__XTryCatchFinallyExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:17996:1: ( ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:17997:1: ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) )
+            // InternalPerspectiveDsl.g:17998:1: ( ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:17999:1: ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:17997:1: ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) )
-            // InternalPerspectiveDsl.g:17998:2: ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 )
+            // InternalPerspectiveDsl.g:17999:1: ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) )
+            // InternalPerspectiveDsl.g:18000:2: ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:17999:2: ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 )
-            // InternalPerspectiveDsl.g:17999:3: rule__XTryCatchFinallyExpression__ExpressionAssignment_2
+            // InternalPerspectiveDsl.g:18001:2: ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 )
+            // InternalPerspectiveDsl.g:18001:3: rule__XTryCatchFinallyExpression__ExpressionAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__XTryCatchFinallyExpression__ExpressionAssignment_2();
@@ -58992,14 +58992,14 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group__3"
-    // InternalPerspectiveDsl.g:18007:1: rule__XTryCatchFinallyExpression__Group__3 : rule__XTryCatchFinallyExpression__Group__3__Impl ;
+    // InternalPerspectiveDsl.g:18009:1: rule__XTryCatchFinallyExpression__Group__3 : rule__XTryCatchFinallyExpression__Group__3__Impl ;
     public final void rule__XTryCatchFinallyExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18011:1: ( rule__XTryCatchFinallyExpression__Group__3__Impl )
-            // InternalPerspectiveDsl.g:18012:2: rule__XTryCatchFinallyExpression__Group__3__Impl
+            // InternalPerspectiveDsl.g:18013:1: ( rule__XTryCatchFinallyExpression__Group__3__Impl )
+            // InternalPerspectiveDsl.g:18014:2: rule__XTryCatchFinallyExpression__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XTryCatchFinallyExpression__Group__3__Impl();
@@ -59025,23 +59025,23 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group__3__Impl"
-    // InternalPerspectiveDsl.g:18018:1: rule__XTryCatchFinallyExpression__Group__3__Impl : ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) ) ;
+    // InternalPerspectiveDsl.g:18020:1: rule__XTryCatchFinallyExpression__Group__3__Impl : ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) ) ;
     public final void rule__XTryCatchFinallyExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18022:1: ( ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) ) )
-            // InternalPerspectiveDsl.g:18023:1: ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) )
+            // InternalPerspectiveDsl.g:18024:1: ( ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) ) )
+            // InternalPerspectiveDsl.g:18025:1: ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) )
             {
-            // InternalPerspectiveDsl.g:18023:1: ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) )
-            // InternalPerspectiveDsl.g:18024:2: ( rule__XTryCatchFinallyExpression__Alternatives_3 )
+            // InternalPerspectiveDsl.g:18025:1: ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) )
+            // InternalPerspectiveDsl.g:18026:2: ( rule__XTryCatchFinallyExpression__Alternatives_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getAlternatives_3()); 
             }
-            // InternalPerspectiveDsl.g:18025:2: ( rule__XTryCatchFinallyExpression__Alternatives_3 )
-            // InternalPerspectiveDsl.g:18025:3: rule__XTryCatchFinallyExpression__Alternatives_3
+            // InternalPerspectiveDsl.g:18027:2: ( rule__XTryCatchFinallyExpression__Alternatives_3 )
+            // InternalPerspectiveDsl.g:18027:3: rule__XTryCatchFinallyExpression__Alternatives_3
             {
             pushFollow(FOLLOW_2);
             rule__XTryCatchFinallyExpression__Alternatives_3();
@@ -59076,14 +59076,14 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0__0"
-    // InternalPerspectiveDsl.g:18034:1: rule__XTryCatchFinallyExpression__Group_3_0__0 : rule__XTryCatchFinallyExpression__Group_3_0__0__Impl rule__XTryCatchFinallyExpression__Group_3_0__1 ;
+    // InternalPerspectiveDsl.g:18036:1: rule__XTryCatchFinallyExpression__Group_3_0__0 : rule__XTryCatchFinallyExpression__Group_3_0__0__Impl rule__XTryCatchFinallyExpression__Group_3_0__1 ;
     public final void rule__XTryCatchFinallyExpression__Group_3_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18038:1: ( rule__XTryCatchFinallyExpression__Group_3_0__0__Impl rule__XTryCatchFinallyExpression__Group_3_0__1 )
-            // InternalPerspectiveDsl.g:18039:2: rule__XTryCatchFinallyExpression__Group_3_0__0__Impl rule__XTryCatchFinallyExpression__Group_3_0__1
+            // InternalPerspectiveDsl.g:18040:1: ( rule__XTryCatchFinallyExpression__Group_3_0__0__Impl rule__XTryCatchFinallyExpression__Group_3_0__1 )
+            // InternalPerspectiveDsl.g:18041:2: rule__XTryCatchFinallyExpression__Group_3_0__0__Impl rule__XTryCatchFinallyExpression__Group_3_0__1
             {
             pushFollow(FOLLOW_128);
             rule__XTryCatchFinallyExpression__Group_3_0__0__Impl();
@@ -59114,26 +59114,26 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0__0__Impl"
-    // InternalPerspectiveDsl.g:18046:1: rule__XTryCatchFinallyExpression__Group_3_0__0__Impl : ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) ) ;
+    // InternalPerspectiveDsl.g:18048:1: rule__XTryCatchFinallyExpression__Group_3_0__0__Impl : ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) ) ;
     public final void rule__XTryCatchFinallyExpression__Group_3_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18050:1: ( ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) ) )
-            // InternalPerspectiveDsl.g:18051:1: ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) )
+            // InternalPerspectiveDsl.g:18052:1: ( ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) ) )
+            // InternalPerspectiveDsl.g:18053:1: ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) )
             {
-            // InternalPerspectiveDsl.g:18051:1: ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) )
-            // InternalPerspectiveDsl.g:18052:2: ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* )
+            // InternalPerspectiveDsl.g:18053:1: ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) )
+            // InternalPerspectiveDsl.g:18054:2: ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* )
             {
-            // InternalPerspectiveDsl.g:18052:2: ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) )
-            // InternalPerspectiveDsl.g:18053:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )
+            // InternalPerspectiveDsl.g:18054:2: ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) )
+            // InternalPerspectiveDsl.g:18055:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesAssignment_3_0_0()); 
             }
-            // InternalPerspectiveDsl.g:18054:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )
-            // InternalPerspectiveDsl.g:18054:4: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0
+            // InternalPerspectiveDsl.g:18056:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )
+            // InternalPerspectiveDsl.g:18056:4: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0
             {
             pushFollow(FOLLOW_129);
             rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0();
@@ -59149,13 +59149,13 @@
 
             }
 
-            // InternalPerspectiveDsl.g:18057:2: ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* )
-            // InternalPerspectiveDsl.g:18058:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )*
+            // InternalPerspectiveDsl.g:18059:2: ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* )
+            // InternalPerspectiveDsl.g:18060:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesAssignment_3_0_0()); 
             }
-            // InternalPerspectiveDsl.g:18059:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )*
+            // InternalPerspectiveDsl.g:18061:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )*
             loop127:
             do {
                 int alt127=2;
@@ -59174,7 +59174,7 @@
 
                 switch (alt127) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:18059:4: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0
+            	    // InternalPerspectiveDsl.g:18061:4: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0
             	    {
             	    pushFollow(FOLLOW_129);
             	    rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0();
@@ -59218,14 +59218,14 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0__1"
-    // InternalPerspectiveDsl.g:18068:1: rule__XTryCatchFinallyExpression__Group_3_0__1 : rule__XTryCatchFinallyExpression__Group_3_0__1__Impl ;
+    // InternalPerspectiveDsl.g:18070:1: rule__XTryCatchFinallyExpression__Group_3_0__1 : rule__XTryCatchFinallyExpression__Group_3_0__1__Impl ;
     public final void rule__XTryCatchFinallyExpression__Group_3_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18072:1: ( rule__XTryCatchFinallyExpression__Group_3_0__1__Impl )
-            // InternalPerspectiveDsl.g:18073:2: rule__XTryCatchFinallyExpression__Group_3_0__1__Impl
+            // InternalPerspectiveDsl.g:18074:1: ( rule__XTryCatchFinallyExpression__Group_3_0__1__Impl )
+            // InternalPerspectiveDsl.g:18075:2: rule__XTryCatchFinallyExpression__Group_3_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XTryCatchFinallyExpression__Group_3_0__1__Impl();
@@ -59251,22 +59251,22 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0__1__Impl"
-    // InternalPerspectiveDsl.g:18079:1: rule__XTryCatchFinallyExpression__Group_3_0__1__Impl : ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? ) ;
+    // InternalPerspectiveDsl.g:18081:1: rule__XTryCatchFinallyExpression__Group_3_0__1__Impl : ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? ) ;
     public final void rule__XTryCatchFinallyExpression__Group_3_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18083:1: ( ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? ) )
-            // InternalPerspectiveDsl.g:18084:1: ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? )
+            // InternalPerspectiveDsl.g:18085:1: ( ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? ) )
+            // InternalPerspectiveDsl.g:18086:1: ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? )
             {
-            // InternalPerspectiveDsl.g:18084:1: ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? )
-            // InternalPerspectiveDsl.g:18085:2: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )?
+            // InternalPerspectiveDsl.g:18086:1: ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? )
+            // InternalPerspectiveDsl.g:18087:2: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0_1()); 
             }
-            // InternalPerspectiveDsl.g:18086:2: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )?
+            // InternalPerspectiveDsl.g:18088:2: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )?
             int alt128=2;
             int LA128_0 = input.LA(1);
 
@@ -59279,7 +59279,7 @@
             }
             switch (alt128) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:18086:3: rule__XTryCatchFinallyExpression__Group_3_0_1__0
+                    // InternalPerspectiveDsl.g:18088:3: rule__XTryCatchFinallyExpression__Group_3_0_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XTryCatchFinallyExpression__Group_3_0_1__0();
@@ -59317,14 +59317,14 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0_1__0"
-    // InternalPerspectiveDsl.g:18095:1: rule__XTryCatchFinallyExpression__Group_3_0_1__0 : rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_0_1__1 ;
+    // InternalPerspectiveDsl.g:18097:1: rule__XTryCatchFinallyExpression__Group_3_0_1__0 : rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_0_1__1 ;
     public final void rule__XTryCatchFinallyExpression__Group_3_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18099:1: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_0_1__1 )
-            // InternalPerspectiveDsl.g:18100:2: rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_0_1__1
+            // InternalPerspectiveDsl.g:18101:1: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_0_1__1 )
+            // InternalPerspectiveDsl.g:18102:2: rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_0_1__1
             {
             pushFollow(FOLLOW_54);
             rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl();
@@ -59355,23 +59355,23 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl"
-    // InternalPerspectiveDsl.g:18107:1: rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl : ( ( 'finally' ) ) ;
+    // InternalPerspectiveDsl.g:18109:1: rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl : ( ( 'finally' ) ) ;
     public final void rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18111:1: ( ( ( 'finally' ) ) )
-            // InternalPerspectiveDsl.g:18112:1: ( ( 'finally' ) )
+            // InternalPerspectiveDsl.g:18113:1: ( ( ( 'finally' ) ) )
+            // InternalPerspectiveDsl.g:18114:1: ( ( 'finally' ) )
             {
-            // InternalPerspectiveDsl.g:18112:1: ( ( 'finally' ) )
-            // InternalPerspectiveDsl.g:18113:2: ( 'finally' )
+            // InternalPerspectiveDsl.g:18114:1: ( ( 'finally' ) )
+            // InternalPerspectiveDsl.g:18115:2: ( 'finally' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:18114:2: ( 'finally' )
-            // InternalPerspectiveDsl.g:18114:3: 'finally'
+            // InternalPerspectiveDsl.g:18116:2: ( 'finally' )
+            // InternalPerspectiveDsl.g:18116:3: 'finally'
             {
             match(input,114,FOLLOW_2); if (state.failed) return ;
 
@@ -59402,14 +59402,14 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0_1__1"
-    // InternalPerspectiveDsl.g:18122:1: rule__XTryCatchFinallyExpression__Group_3_0_1__1 : rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl ;
+    // InternalPerspectiveDsl.g:18124:1: rule__XTryCatchFinallyExpression__Group_3_0_1__1 : rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl ;
     public final void rule__XTryCatchFinallyExpression__Group_3_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18126:1: ( rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl )
-            // InternalPerspectiveDsl.g:18127:2: rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl
+            // InternalPerspectiveDsl.g:18128:1: ( rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl )
+            // InternalPerspectiveDsl.g:18129:2: rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl();
@@ -59435,23 +59435,23 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl"
-    // InternalPerspectiveDsl.g:18133:1: rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl : ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:18135:1: rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl : ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) ) ;
     public final void rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18137:1: ( ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) ) )
-            // InternalPerspectiveDsl.g:18138:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) )
+            // InternalPerspectiveDsl.g:18139:1: ( ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) ) )
+            // InternalPerspectiveDsl.g:18140:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:18138:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) )
-            // InternalPerspectiveDsl.g:18139:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 )
+            // InternalPerspectiveDsl.g:18140:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) )
+            // InternalPerspectiveDsl.g:18141:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionAssignment_3_0_1_1()); 
             }
-            // InternalPerspectiveDsl.g:18140:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 )
-            // InternalPerspectiveDsl.g:18140:3: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1
+            // InternalPerspectiveDsl.g:18142:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 )
+            // InternalPerspectiveDsl.g:18142:3: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1();
@@ -59486,14 +59486,14 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_1__0"
-    // InternalPerspectiveDsl.g:18149:1: rule__XTryCatchFinallyExpression__Group_3_1__0 : rule__XTryCatchFinallyExpression__Group_3_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_1__1 ;
+    // InternalPerspectiveDsl.g:18151:1: rule__XTryCatchFinallyExpression__Group_3_1__0 : rule__XTryCatchFinallyExpression__Group_3_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_1__1 ;
     public final void rule__XTryCatchFinallyExpression__Group_3_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18153:1: ( rule__XTryCatchFinallyExpression__Group_3_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_1__1 )
-            // InternalPerspectiveDsl.g:18154:2: rule__XTryCatchFinallyExpression__Group_3_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_1__1
+            // InternalPerspectiveDsl.g:18155:1: ( rule__XTryCatchFinallyExpression__Group_3_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_1__1 )
+            // InternalPerspectiveDsl.g:18156:2: rule__XTryCatchFinallyExpression__Group_3_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_1__1
             {
             pushFollow(FOLLOW_54);
             rule__XTryCatchFinallyExpression__Group_3_1__0__Impl();
@@ -59524,17 +59524,17 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_1__0__Impl"
-    // InternalPerspectiveDsl.g:18161:1: rule__XTryCatchFinallyExpression__Group_3_1__0__Impl : ( 'finally' ) ;
+    // InternalPerspectiveDsl.g:18163:1: rule__XTryCatchFinallyExpression__Group_3_1__0__Impl : ( 'finally' ) ;
     public final void rule__XTryCatchFinallyExpression__Group_3_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18165:1: ( ( 'finally' ) )
-            // InternalPerspectiveDsl.g:18166:1: ( 'finally' )
+            // InternalPerspectiveDsl.g:18167:1: ( ( 'finally' ) )
+            // InternalPerspectiveDsl.g:18168:1: ( 'finally' )
             {
-            // InternalPerspectiveDsl.g:18166:1: ( 'finally' )
-            // InternalPerspectiveDsl.g:18167:2: 'finally'
+            // InternalPerspectiveDsl.g:18168:1: ( 'finally' )
+            // InternalPerspectiveDsl.g:18169:2: 'finally'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0()); 
@@ -59565,14 +59565,14 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_1__1"
-    // InternalPerspectiveDsl.g:18176:1: rule__XTryCatchFinallyExpression__Group_3_1__1 : rule__XTryCatchFinallyExpression__Group_3_1__1__Impl ;
+    // InternalPerspectiveDsl.g:18178:1: rule__XTryCatchFinallyExpression__Group_3_1__1 : rule__XTryCatchFinallyExpression__Group_3_1__1__Impl ;
     public final void rule__XTryCatchFinallyExpression__Group_3_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18180:1: ( rule__XTryCatchFinallyExpression__Group_3_1__1__Impl )
-            // InternalPerspectiveDsl.g:18181:2: rule__XTryCatchFinallyExpression__Group_3_1__1__Impl
+            // InternalPerspectiveDsl.g:18182:1: ( rule__XTryCatchFinallyExpression__Group_3_1__1__Impl )
+            // InternalPerspectiveDsl.g:18183:2: rule__XTryCatchFinallyExpression__Group_3_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XTryCatchFinallyExpression__Group_3_1__1__Impl();
@@ -59598,23 +59598,23 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_1__1__Impl"
-    // InternalPerspectiveDsl.g:18187:1: rule__XTryCatchFinallyExpression__Group_3_1__1__Impl : ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:18189:1: rule__XTryCatchFinallyExpression__Group_3_1__1__Impl : ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) ) ;
     public final void rule__XTryCatchFinallyExpression__Group_3_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18191:1: ( ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) ) )
-            // InternalPerspectiveDsl.g:18192:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) )
+            // InternalPerspectiveDsl.g:18193:1: ( ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) ) )
+            // InternalPerspectiveDsl.g:18194:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:18192:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) )
-            // InternalPerspectiveDsl.g:18193:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 )
+            // InternalPerspectiveDsl.g:18194:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) )
+            // InternalPerspectiveDsl.g:18195:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionAssignment_3_1_1()); 
             }
-            // InternalPerspectiveDsl.g:18194:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 )
-            // InternalPerspectiveDsl.g:18194:3: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1
+            // InternalPerspectiveDsl.g:18196:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 )
+            // InternalPerspectiveDsl.g:18196:3: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1();
@@ -59649,14 +59649,14 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group__0"
-    // InternalPerspectiveDsl.g:18203:1: rule__XSynchronizedExpression__Group__0 : rule__XSynchronizedExpression__Group__0__Impl rule__XSynchronizedExpression__Group__1 ;
+    // InternalPerspectiveDsl.g:18205:1: rule__XSynchronizedExpression__Group__0 : rule__XSynchronizedExpression__Group__0__Impl rule__XSynchronizedExpression__Group__1 ;
     public final void rule__XSynchronizedExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18207:1: ( rule__XSynchronizedExpression__Group__0__Impl rule__XSynchronizedExpression__Group__1 )
-            // InternalPerspectiveDsl.g:18208:2: rule__XSynchronizedExpression__Group__0__Impl rule__XSynchronizedExpression__Group__1
+            // InternalPerspectiveDsl.g:18209:1: ( rule__XSynchronizedExpression__Group__0__Impl rule__XSynchronizedExpression__Group__1 )
+            // InternalPerspectiveDsl.g:18210:2: rule__XSynchronizedExpression__Group__0__Impl rule__XSynchronizedExpression__Group__1
             {
             pushFollow(FOLLOW_54);
             rule__XSynchronizedExpression__Group__0__Impl();
@@ -59687,23 +59687,23 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group__0__Impl"
-    // InternalPerspectiveDsl.g:18215:1: rule__XSynchronizedExpression__Group__0__Impl : ( ( rule__XSynchronizedExpression__Group_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:18217:1: rule__XSynchronizedExpression__Group__0__Impl : ( ( rule__XSynchronizedExpression__Group_0__0 ) ) ;
     public final void rule__XSynchronizedExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18219:1: ( ( ( rule__XSynchronizedExpression__Group_0__0 ) ) )
-            // InternalPerspectiveDsl.g:18220:1: ( ( rule__XSynchronizedExpression__Group_0__0 ) )
+            // InternalPerspectiveDsl.g:18221:1: ( ( ( rule__XSynchronizedExpression__Group_0__0 ) ) )
+            // InternalPerspectiveDsl.g:18222:1: ( ( rule__XSynchronizedExpression__Group_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:18220:1: ( ( rule__XSynchronizedExpression__Group_0__0 ) )
-            // InternalPerspectiveDsl.g:18221:2: ( rule__XSynchronizedExpression__Group_0__0 )
+            // InternalPerspectiveDsl.g:18222:1: ( ( rule__XSynchronizedExpression__Group_0__0 ) )
+            // InternalPerspectiveDsl.g:18223:2: ( rule__XSynchronizedExpression__Group_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getGroup_0()); 
             }
-            // InternalPerspectiveDsl.g:18222:2: ( rule__XSynchronizedExpression__Group_0__0 )
-            // InternalPerspectiveDsl.g:18222:3: rule__XSynchronizedExpression__Group_0__0
+            // InternalPerspectiveDsl.g:18224:2: ( rule__XSynchronizedExpression__Group_0__0 )
+            // InternalPerspectiveDsl.g:18224:3: rule__XSynchronizedExpression__Group_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XSynchronizedExpression__Group_0__0();
@@ -59738,14 +59738,14 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group__1"
-    // InternalPerspectiveDsl.g:18230:1: rule__XSynchronizedExpression__Group__1 : rule__XSynchronizedExpression__Group__1__Impl rule__XSynchronizedExpression__Group__2 ;
+    // InternalPerspectiveDsl.g:18232:1: rule__XSynchronizedExpression__Group__1 : rule__XSynchronizedExpression__Group__1__Impl rule__XSynchronizedExpression__Group__2 ;
     public final void rule__XSynchronizedExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18234:1: ( rule__XSynchronizedExpression__Group__1__Impl rule__XSynchronizedExpression__Group__2 )
-            // InternalPerspectiveDsl.g:18235:2: rule__XSynchronizedExpression__Group__1__Impl rule__XSynchronizedExpression__Group__2
+            // InternalPerspectiveDsl.g:18236:1: ( rule__XSynchronizedExpression__Group__1__Impl rule__XSynchronizedExpression__Group__2 )
+            // InternalPerspectiveDsl.g:18237:2: rule__XSynchronizedExpression__Group__1__Impl rule__XSynchronizedExpression__Group__2
             {
             pushFollow(FOLLOW_99);
             rule__XSynchronizedExpression__Group__1__Impl();
@@ -59776,23 +59776,23 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group__1__Impl"
-    // InternalPerspectiveDsl.g:18242:1: rule__XSynchronizedExpression__Group__1__Impl : ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) ) ;
+    // InternalPerspectiveDsl.g:18244:1: rule__XSynchronizedExpression__Group__1__Impl : ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) ) ;
     public final void rule__XSynchronizedExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18246:1: ( ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) ) )
-            // InternalPerspectiveDsl.g:18247:1: ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) )
+            // InternalPerspectiveDsl.g:18248:1: ( ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) ) )
+            // InternalPerspectiveDsl.g:18249:1: ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) )
             {
-            // InternalPerspectiveDsl.g:18247:1: ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) )
-            // InternalPerspectiveDsl.g:18248:2: ( rule__XSynchronizedExpression__ParamAssignment_1 )
+            // InternalPerspectiveDsl.g:18249:1: ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) )
+            // InternalPerspectiveDsl.g:18250:2: ( rule__XSynchronizedExpression__ParamAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getParamAssignment_1()); 
             }
-            // InternalPerspectiveDsl.g:18249:2: ( rule__XSynchronizedExpression__ParamAssignment_1 )
-            // InternalPerspectiveDsl.g:18249:3: rule__XSynchronizedExpression__ParamAssignment_1
+            // InternalPerspectiveDsl.g:18251:2: ( rule__XSynchronizedExpression__ParamAssignment_1 )
+            // InternalPerspectiveDsl.g:18251:3: rule__XSynchronizedExpression__ParamAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__XSynchronizedExpression__ParamAssignment_1();
@@ -59827,14 +59827,14 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group__2"
-    // InternalPerspectiveDsl.g:18257:1: rule__XSynchronizedExpression__Group__2 : rule__XSynchronizedExpression__Group__2__Impl rule__XSynchronizedExpression__Group__3 ;
+    // InternalPerspectiveDsl.g:18259:1: rule__XSynchronizedExpression__Group__2 : rule__XSynchronizedExpression__Group__2__Impl rule__XSynchronizedExpression__Group__3 ;
     public final void rule__XSynchronizedExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18261:1: ( rule__XSynchronizedExpression__Group__2__Impl rule__XSynchronizedExpression__Group__3 )
-            // InternalPerspectiveDsl.g:18262:2: rule__XSynchronizedExpression__Group__2__Impl rule__XSynchronizedExpression__Group__3
+            // InternalPerspectiveDsl.g:18263:1: ( rule__XSynchronizedExpression__Group__2__Impl rule__XSynchronizedExpression__Group__3 )
+            // InternalPerspectiveDsl.g:18264:2: rule__XSynchronizedExpression__Group__2__Impl rule__XSynchronizedExpression__Group__3
             {
             pushFollow(FOLLOW_54);
             rule__XSynchronizedExpression__Group__2__Impl();
@@ -59865,17 +59865,17 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group__2__Impl"
-    // InternalPerspectiveDsl.g:18269:1: rule__XSynchronizedExpression__Group__2__Impl : ( ')' ) ;
+    // InternalPerspectiveDsl.g:18271:1: rule__XSynchronizedExpression__Group__2__Impl : ( ')' ) ;
     public final void rule__XSynchronizedExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18273:1: ( ( ')' ) )
-            // InternalPerspectiveDsl.g:18274:1: ( ')' )
+            // InternalPerspectiveDsl.g:18275:1: ( ( ')' ) )
+            // InternalPerspectiveDsl.g:18276:1: ( ')' )
             {
-            // InternalPerspectiveDsl.g:18274:1: ( ')' )
-            // InternalPerspectiveDsl.g:18275:2: ')'
+            // InternalPerspectiveDsl.g:18276:1: ( ')' )
+            // InternalPerspectiveDsl.g:18277:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2()); 
@@ -59906,14 +59906,14 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group__3"
-    // InternalPerspectiveDsl.g:18284:1: rule__XSynchronizedExpression__Group__3 : rule__XSynchronizedExpression__Group__3__Impl ;
+    // InternalPerspectiveDsl.g:18286:1: rule__XSynchronizedExpression__Group__3 : rule__XSynchronizedExpression__Group__3__Impl ;
     public final void rule__XSynchronizedExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18288:1: ( rule__XSynchronizedExpression__Group__3__Impl )
-            // InternalPerspectiveDsl.g:18289:2: rule__XSynchronizedExpression__Group__3__Impl
+            // InternalPerspectiveDsl.g:18290:1: ( rule__XSynchronizedExpression__Group__3__Impl )
+            // InternalPerspectiveDsl.g:18291:2: rule__XSynchronizedExpression__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSynchronizedExpression__Group__3__Impl();
@@ -59939,23 +59939,23 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group__3__Impl"
-    // InternalPerspectiveDsl.g:18295:1: rule__XSynchronizedExpression__Group__3__Impl : ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) ) ;
+    // InternalPerspectiveDsl.g:18297:1: rule__XSynchronizedExpression__Group__3__Impl : ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) ) ;
     public final void rule__XSynchronizedExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18299:1: ( ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) ) )
-            // InternalPerspectiveDsl.g:18300:1: ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) )
+            // InternalPerspectiveDsl.g:18301:1: ( ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) ) )
+            // InternalPerspectiveDsl.g:18302:1: ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) )
             {
-            // InternalPerspectiveDsl.g:18300:1: ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) )
-            // InternalPerspectiveDsl.g:18301:2: ( rule__XSynchronizedExpression__ExpressionAssignment_3 )
+            // InternalPerspectiveDsl.g:18302:1: ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) )
+            // InternalPerspectiveDsl.g:18303:2: ( rule__XSynchronizedExpression__ExpressionAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getExpressionAssignment_3()); 
             }
-            // InternalPerspectiveDsl.g:18302:2: ( rule__XSynchronizedExpression__ExpressionAssignment_3 )
-            // InternalPerspectiveDsl.g:18302:3: rule__XSynchronizedExpression__ExpressionAssignment_3
+            // InternalPerspectiveDsl.g:18304:2: ( rule__XSynchronizedExpression__ExpressionAssignment_3 )
+            // InternalPerspectiveDsl.g:18304:3: rule__XSynchronizedExpression__ExpressionAssignment_3
             {
             pushFollow(FOLLOW_2);
             rule__XSynchronizedExpression__ExpressionAssignment_3();
@@ -59990,14 +59990,14 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group_0__0"
-    // InternalPerspectiveDsl.g:18311:1: rule__XSynchronizedExpression__Group_0__0 : rule__XSynchronizedExpression__Group_0__0__Impl ;
+    // InternalPerspectiveDsl.g:18313:1: rule__XSynchronizedExpression__Group_0__0 : rule__XSynchronizedExpression__Group_0__0__Impl ;
     public final void rule__XSynchronizedExpression__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18315:1: ( rule__XSynchronizedExpression__Group_0__0__Impl )
-            // InternalPerspectiveDsl.g:18316:2: rule__XSynchronizedExpression__Group_0__0__Impl
+            // InternalPerspectiveDsl.g:18317:1: ( rule__XSynchronizedExpression__Group_0__0__Impl )
+            // InternalPerspectiveDsl.g:18318:2: rule__XSynchronizedExpression__Group_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSynchronizedExpression__Group_0__0__Impl();
@@ -60023,23 +60023,23 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group_0__0__Impl"
-    // InternalPerspectiveDsl.g:18322:1: rule__XSynchronizedExpression__Group_0__0__Impl : ( ( rule__XSynchronizedExpression__Group_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:18324:1: rule__XSynchronizedExpression__Group_0__0__Impl : ( ( rule__XSynchronizedExpression__Group_0_0__0 ) ) ;
     public final void rule__XSynchronizedExpression__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18326:1: ( ( ( rule__XSynchronizedExpression__Group_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:18327:1: ( ( rule__XSynchronizedExpression__Group_0_0__0 ) )
+            // InternalPerspectiveDsl.g:18328:1: ( ( ( rule__XSynchronizedExpression__Group_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:18329:1: ( ( rule__XSynchronizedExpression__Group_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:18327:1: ( ( rule__XSynchronizedExpression__Group_0_0__0 ) )
-            // InternalPerspectiveDsl.g:18328:2: ( rule__XSynchronizedExpression__Group_0_0__0 )
+            // InternalPerspectiveDsl.g:18329:1: ( ( rule__XSynchronizedExpression__Group_0_0__0 ) )
+            // InternalPerspectiveDsl.g:18330:2: ( rule__XSynchronizedExpression__Group_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getGroup_0_0()); 
             }
-            // InternalPerspectiveDsl.g:18329:2: ( rule__XSynchronizedExpression__Group_0_0__0 )
-            // InternalPerspectiveDsl.g:18329:3: rule__XSynchronizedExpression__Group_0_0__0
+            // InternalPerspectiveDsl.g:18331:2: ( rule__XSynchronizedExpression__Group_0_0__0 )
+            // InternalPerspectiveDsl.g:18331:3: rule__XSynchronizedExpression__Group_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XSynchronizedExpression__Group_0_0__0();
@@ -60074,14 +60074,14 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group_0_0__0"
-    // InternalPerspectiveDsl.g:18338:1: rule__XSynchronizedExpression__Group_0_0__0 : rule__XSynchronizedExpression__Group_0_0__0__Impl rule__XSynchronizedExpression__Group_0_0__1 ;
+    // InternalPerspectiveDsl.g:18340:1: rule__XSynchronizedExpression__Group_0_0__0 : rule__XSynchronizedExpression__Group_0_0__0__Impl rule__XSynchronizedExpression__Group_0_0__1 ;
     public final void rule__XSynchronizedExpression__Group_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18342:1: ( rule__XSynchronizedExpression__Group_0_0__0__Impl rule__XSynchronizedExpression__Group_0_0__1 )
-            // InternalPerspectiveDsl.g:18343:2: rule__XSynchronizedExpression__Group_0_0__0__Impl rule__XSynchronizedExpression__Group_0_0__1
+            // InternalPerspectiveDsl.g:18344:1: ( rule__XSynchronizedExpression__Group_0_0__0__Impl rule__XSynchronizedExpression__Group_0_0__1 )
+            // InternalPerspectiveDsl.g:18345:2: rule__XSynchronizedExpression__Group_0_0__0__Impl rule__XSynchronizedExpression__Group_0_0__1
             {
             pushFollow(FOLLOW_130);
             rule__XSynchronizedExpression__Group_0_0__0__Impl();
@@ -60112,23 +60112,23 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:18350:1: rule__XSynchronizedExpression__Group_0_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:18352:1: rule__XSynchronizedExpression__Group_0_0__0__Impl : ( () ) ;
     public final void rule__XSynchronizedExpression__Group_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18354:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:18355:1: ( () )
+            // InternalPerspectiveDsl.g:18356:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:18357:1: ( () )
             {
-            // InternalPerspectiveDsl.g:18355:1: ( () )
-            // InternalPerspectiveDsl.g:18356:2: ()
+            // InternalPerspectiveDsl.g:18357:1: ( () )
+            // InternalPerspectiveDsl.g:18358:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getXSynchronizedExpressionAction_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:18357:2: ()
-            // InternalPerspectiveDsl.g:18357:3: 
+            // InternalPerspectiveDsl.g:18359:2: ()
+            // InternalPerspectiveDsl.g:18359:3: 
             {
             }
 
@@ -60153,14 +60153,14 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group_0_0__1"
-    // InternalPerspectiveDsl.g:18365:1: rule__XSynchronizedExpression__Group_0_0__1 : rule__XSynchronizedExpression__Group_0_0__1__Impl rule__XSynchronizedExpression__Group_0_0__2 ;
+    // InternalPerspectiveDsl.g:18367:1: rule__XSynchronizedExpression__Group_0_0__1 : rule__XSynchronizedExpression__Group_0_0__1__Impl rule__XSynchronizedExpression__Group_0_0__2 ;
     public final void rule__XSynchronizedExpression__Group_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18369:1: ( rule__XSynchronizedExpression__Group_0_0__1__Impl rule__XSynchronizedExpression__Group_0_0__2 )
-            // InternalPerspectiveDsl.g:18370:2: rule__XSynchronizedExpression__Group_0_0__1__Impl rule__XSynchronizedExpression__Group_0_0__2
+            // InternalPerspectiveDsl.g:18371:1: ( rule__XSynchronizedExpression__Group_0_0__1__Impl rule__XSynchronizedExpression__Group_0_0__2 )
+            // InternalPerspectiveDsl.g:18372:2: rule__XSynchronizedExpression__Group_0_0__1__Impl rule__XSynchronizedExpression__Group_0_0__2
             {
             pushFollow(FOLLOW_50);
             rule__XSynchronizedExpression__Group_0_0__1__Impl();
@@ -60191,17 +60191,17 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:18377:1: rule__XSynchronizedExpression__Group_0_0__1__Impl : ( 'synchronized' ) ;
+    // InternalPerspectiveDsl.g:18379:1: rule__XSynchronizedExpression__Group_0_0__1__Impl : ( 'synchronized' ) ;
     public final void rule__XSynchronizedExpression__Group_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18381:1: ( ( 'synchronized' ) )
-            // InternalPerspectiveDsl.g:18382:1: ( 'synchronized' )
+            // InternalPerspectiveDsl.g:18383:1: ( ( 'synchronized' ) )
+            // InternalPerspectiveDsl.g:18384:1: ( 'synchronized' )
             {
-            // InternalPerspectiveDsl.g:18382:1: ( 'synchronized' )
-            // InternalPerspectiveDsl.g:18383:2: 'synchronized'
+            // InternalPerspectiveDsl.g:18384:1: ( 'synchronized' )
+            // InternalPerspectiveDsl.g:18385:2: 'synchronized'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1()); 
@@ -60232,14 +60232,14 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group_0_0__2"
-    // InternalPerspectiveDsl.g:18392:1: rule__XSynchronizedExpression__Group_0_0__2 : rule__XSynchronizedExpression__Group_0_0__2__Impl ;
+    // InternalPerspectiveDsl.g:18394:1: rule__XSynchronizedExpression__Group_0_0__2 : rule__XSynchronizedExpression__Group_0_0__2__Impl ;
     public final void rule__XSynchronizedExpression__Group_0_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18396:1: ( rule__XSynchronizedExpression__Group_0_0__2__Impl )
-            // InternalPerspectiveDsl.g:18397:2: rule__XSynchronizedExpression__Group_0_0__2__Impl
+            // InternalPerspectiveDsl.g:18398:1: ( rule__XSynchronizedExpression__Group_0_0__2__Impl )
+            // InternalPerspectiveDsl.g:18399:2: rule__XSynchronizedExpression__Group_0_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSynchronizedExpression__Group_0_0__2__Impl();
@@ -60265,17 +60265,17 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group_0_0__2__Impl"
-    // InternalPerspectiveDsl.g:18403:1: rule__XSynchronizedExpression__Group_0_0__2__Impl : ( '(' ) ;
+    // InternalPerspectiveDsl.g:18405:1: rule__XSynchronizedExpression__Group_0_0__2__Impl : ( '(' ) ;
     public final void rule__XSynchronizedExpression__Group_0_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18407:1: ( ( '(' ) )
-            // InternalPerspectiveDsl.g:18408:1: ( '(' )
+            // InternalPerspectiveDsl.g:18409:1: ( ( '(' ) )
+            // InternalPerspectiveDsl.g:18410:1: ( '(' )
             {
-            // InternalPerspectiveDsl.g:18408:1: ( '(' )
-            // InternalPerspectiveDsl.g:18409:2: '('
+            // InternalPerspectiveDsl.g:18410:1: ( '(' )
+            // InternalPerspectiveDsl.g:18411:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2()); 
@@ -60306,14 +60306,14 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__0"
-    // InternalPerspectiveDsl.g:18419:1: rule__XCatchClause__Group__0 : rule__XCatchClause__Group__0__Impl rule__XCatchClause__Group__1 ;
+    // InternalPerspectiveDsl.g:18421:1: rule__XCatchClause__Group__0 : rule__XCatchClause__Group__0__Impl rule__XCatchClause__Group__1 ;
     public final void rule__XCatchClause__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18423:1: ( rule__XCatchClause__Group__0__Impl rule__XCatchClause__Group__1 )
-            // InternalPerspectiveDsl.g:18424:2: rule__XCatchClause__Group__0__Impl rule__XCatchClause__Group__1
+            // InternalPerspectiveDsl.g:18425:1: ( rule__XCatchClause__Group__0__Impl rule__XCatchClause__Group__1 )
+            // InternalPerspectiveDsl.g:18426:2: rule__XCatchClause__Group__0__Impl rule__XCatchClause__Group__1
             {
             pushFollow(FOLLOW_50);
             rule__XCatchClause__Group__0__Impl();
@@ -60344,23 +60344,23 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__0__Impl"
-    // InternalPerspectiveDsl.g:18431:1: rule__XCatchClause__Group__0__Impl : ( ( 'catch' ) ) ;
+    // InternalPerspectiveDsl.g:18433:1: rule__XCatchClause__Group__0__Impl : ( ( 'catch' ) ) ;
     public final void rule__XCatchClause__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18435:1: ( ( ( 'catch' ) ) )
-            // InternalPerspectiveDsl.g:18436:1: ( ( 'catch' ) )
+            // InternalPerspectiveDsl.g:18437:1: ( ( ( 'catch' ) ) )
+            // InternalPerspectiveDsl.g:18438:1: ( ( 'catch' ) )
             {
-            // InternalPerspectiveDsl.g:18436:1: ( ( 'catch' ) )
-            // InternalPerspectiveDsl.g:18437:2: ( 'catch' )
+            // InternalPerspectiveDsl.g:18438:1: ( ( 'catch' ) )
+            // InternalPerspectiveDsl.g:18439:2: ( 'catch' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCatchClauseAccess().getCatchKeyword_0()); 
             }
-            // InternalPerspectiveDsl.g:18438:2: ( 'catch' )
-            // InternalPerspectiveDsl.g:18438:3: 'catch'
+            // InternalPerspectiveDsl.g:18440:2: ( 'catch' )
+            // InternalPerspectiveDsl.g:18440:3: 'catch'
             {
             match(input,116,FOLLOW_2); if (state.failed) return ;
 
@@ -60391,14 +60391,14 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__1"
-    // InternalPerspectiveDsl.g:18446:1: rule__XCatchClause__Group__1 : rule__XCatchClause__Group__1__Impl rule__XCatchClause__Group__2 ;
+    // InternalPerspectiveDsl.g:18448:1: rule__XCatchClause__Group__1 : rule__XCatchClause__Group__1__Impl rule__XCatchClause__Group__2 ;
     public final void rule__XCatchClause__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18450:1: ( rule__XCatchClause__Group__1__Impl rule__XCatchClause__Group__2 )
-            // InternalPerspectiveDsl.g:18451:2: rule__XCatchClause__Group__1__Impl rule__XCatchClause__Group__2
+            // InternalPerspectiveDsl.g:18452:1: ( rule__XCatchClause__Group__1__Impl rule__XCatchClause__Group__2 )
+            // InternalPerspectiveDsl.g:18453:2: rule__XCatchClause__Group__1__Impl rule__XCatchClause__Group__2
             {
             pushFollow(FOLLOW_71);
             rule__XCatchClause__Group__1__Impl();
@@ -60429,17 +60429,17 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__1__Impl"
-    // InternalPerspectiveDsl.g:18458:1: rule__XCatchClause__Group__1__Impl : ( '(' ) ;
+    // InternalPerspectiveDsl.g:18460:1: rule__XCatchClause__Group__1__Impl : ( '(' ) ;
     public final void rule__XCatchClause__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18462:1: ( ( '(' ) )
-            // InternalPerspectiveDsl.g:18463:1: ( '(' )
+            // InternalPerspectiveDsl.g:18464:1: ( ( '(' ) )
+            // InternalPerspectiveDsl.g:18465:1: ( '(' )
             {
-            // InternalPerspectiveDsl.g:18463:1: ( '(' )
-            // InternalPerspectiveDsl.g:18464:2: '('
+            // InternalPerspectiveDsl.g:18465:1: ( '(' )
+            // InternalPerspectiveDsl.g:18466:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1()); 
@@ -60470,14 +60470,14 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__2"
-    // InternalPerspectiveDsl.g:18473:1: rule__XCatchClause__Group__2 : rule__XCatchClause__Group__2__Impl rule__XCatchClause__Group__3 ;
+    // InternalPerspectiveDsl.g:18475:1: rule__XCatchClause__Group__2 : rule__XCatchClause__Group__2__Impl rule__XCatchClause__Group__3 ;
     public final void rule__XCatchClause__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18477:1: ( rule__XCatchClause__Group__2__Impl rule__XCatchClause__Group__3 )
-            // InternalPerspectiveDsl.g:18478:2: rule__XCatchClause__Group__2__Impl rule__XCatchClause__Group__3
+            // InternalPerspectiveDsl.g:18479:1: ( rule__XCatchClause__Group__2__Impl rule__XCatchClause__Group__3 )
+            // InternalPerspectiveDsl.g:18480:2: rule__XCatchClause__Group__2__Impl rule__XCatchClause__Group__3
             {
             pushFollow(FOLLOW_99);
             rule__XCatchClause__Group__2__Impl();
@@ -60508,23 +60508,23 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__2__Impl"
-    // InternalPerspectiveDsl.g:18485:1: rule__XCatchClause__Group__2__Impl : ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:18487:1: rule__XCatchClause__Group__2__Impl : ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) ) ;
     public final void rule__XCatchClause__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18489:1: ( ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:18490:1: ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) )
+            // InternalPerspectiveDsl.g:18491:1: ( ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:18492:1: ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:18490:1: ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) )
-            // InternalPerspectiveDsl.g:18491:2: ( rule__XCatchClause__DeclaredParamAssignment_2 )
+            // InternalPerspectiveDsl.g:18492:1: ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) )
+            // InternalPerspectiveDsl.g:18493:2: ( rule__XCatchClause__DeclaredParamAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCatchClauseAccess().getDeclaredParamAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:18492:2: ( rule__XCatchClause__DeclaredParamAssignment_2 )
-            // InternalPerspectiveDsl.g:18492:3: rule__XCatchClause__DeclaredParamAssignment_2
+            // InternalPerspectiveDsl.g:18494:2: ( rule__XCatchClause__DeclaredParamAssignment_2 )
+            // InternalPerspectiveDsl.g:18494:3: rule__XCatchClause__DeclaredParamAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__XCatchClause__DeclaredParamAssignment_2();
@@ -60559,14 +60559,14 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__3"
-    // InternalPerspectiveDsl.g:18500:1: rule__XCatchClause__Group__3 : rule__XCatchClause__Group__3__Impl rule__XCatchClause__Group__4 ;
+    // InternalPerspectiveDsl.g:18502:1: rule__XCatchClause__Group__3 : rule__XCatchClause__Group__3__Impl rule__XCatchClause__Group__4 ;
     public final void rule__XCatchClause__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18504:1: ( rule__XCatchClause__Group__3__Impl rule__XCatchClause__Group__4 )
-            // InternalPerspectiveDsl.g:18505:2: rule__XCatchClause__Group__3__Impl rule__XCatchClause__Group__4
+            // InternalPerspectiveDsl.g:18506:1: ( rule__XCatchClause__Group__3__Impl rule__XCatchClause__Group__4 )
+            // InternalPerspectiveDsl.g:18507:2: rule__XCatchClause__Group__3__Impl rule__XCatchClause__Group__4
             {
             pushFollow(FOLLOW_54);
             rule__XCatchClause__Group__3__Impl();
@@ -60597,17 +60597,17 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__3__Impl"
-    // InternalPerspectiveDsl.g:18512:1: rule__XCatchClause__Group__3__Impl : ( ')' ) ;
+    // InternalPerspectiveDsl.g:18514:1: rule__XCatchClause__Group__3__Impl : ( ')' ) ;
     public final void rule__XCatchClause__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18516:1: ( ( ')' ) )
-            // InternalPerspectiveDsl.g:18517:1: ( ')' )
+            // InternalPerspectiveDsl.g:18518:1: ( ( ')' ) )
+            // InternalPerspectiveDsl.g:18519:1: ( ')' )
             {
-            // InternalPerspectiveDsl.g:18517:1: ( ')' )
-            // InternalPerspectiveDsl.g:18518:2: ')'
+            // InternalPerspectiveDsl.g:18519:1: ( ')' )
+            // InternalPerspectiveDsl.g:18520:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3()); 
@@ -60638,14 +60638,14 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__4"
-    // InternalPerspectiveDsl.g:18527:1: rule__XCatchClause__Group__4 : rule__XCatchClause__Group__4__Impl ;
+    // InternalPerspectiveDsl.g:18529:1: rule__XCatchClause__Group__4 : rule__XCatchClause__Group__4__Impl ;
     public final void rule__XCatchClause__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18531:1: ( rule__XCatchClause__Group__4__Impl )
-            // InternalPerspectiveDsl.g:18532:2: rule__XCatchClause__Group__4__Impl
+            // InternalPerspectiveDsl.g:18533:1: ( rule__XCatchClause__Group__4__Impl )
+            // InternalPerspectiveDsl.g:18534:2: rule__XCatchClause__Group__4__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XCatchClause__Group__4__Impl();
@@ -60671,23 +60671,23 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__4__Impl"
-    // InternalPerspectiveDsl.g:18538:1: rule__XCatchClause__Group__4__Impl : ( ( rule__XCatchClause__ExpressionAssignment_4 ) ) ;
+    // InternalPerspectiveDsl.g:18540:1: rule__XCatchClause__Group__4__Impl : ( ( rule__XCatchClause__ExpressionAssignment_4 ) ) ;
     public final void rule__XCatchClause__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18542:1: ( ( ( rule__XCatchClause__ExpressionAssignment_4 ) ) )
-            // InternalPerspectiveDsl.g:18543:1: ( ( rule__XCatchClause__ExpressionAssignment_4 ) )
+            // InternalPerspectiveDsl.g:18544:1: ( ( ( rule__XCatchClause__ExpressionAssignment_4 ) ) )
+            // InternalPerspectiveDsl.g:18545:1: ( ( rule__XCatchClause__ExpressionAssignment_4 ) )
             {
-            // InternalPerspectiveDsl.g:18543:1: ( ( rule__XCatchClause__ExpressionAssignment_4 ) )
-            // InternalPerspectiveDsl.g:18544:2: ( rule__XCatchClause__ExpressionAssignment_4 )
+            // InternalPerspectiveDsl.g:18545:1: ( ( rule__XCatchClause__ExpressionAssignment_4 ) )
+            // InternalPerspectiveDsl.g:18546:2: ( rule__XCatchClause__ExpressionAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCatchClauseAccess().getExpressionAssignment_4()); 
             }
-            // InternalPerspectiveDsl.g:18545:2: ( rule__XCatchClause__ExpressionAssignment_4 )
-            // InternalPerspectiveDsl.g:18545:3: rule__XCatchClause__ExpressionAssignment_4
+            // InternalPerspectiveDsl.g:18547:2: ( rule__XCatchClause__ExpressionAssignment_4 )
+            // InternalPerspectiveDsl.g:18547:3: rule__XCatchClause__ExpressionAssignment_4
             {
             pushFollow(FOLLOW_2);
             rule__XCatchClause__ExpressionAssignment_4();
@@ -60722,14 +60722,14 @@
 
 
     // $ANTLR start "rule__QualifiedName__Group__0"
-    // InternalPerspectiveDsl.g:18554:1: rule__QualifiedName__Group__0 : rule__QualifiedName__Group__0__Impl rule__QualifiedName__Group__1 ;
+    // InternalPerspectiveDsl.g:18556:1: rule__QualifiedName__Group__0 : rule__QualifiedName__Group__0__Impl rule__QualifiedName__Group__1 ;
     public final void rule__QualifiedName__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18558:1: ( rule__QualifiedName__Group__0__Impl rule__QualifiedName__Group__1 )
-            // InternalPerspectiveDsl.g:18559:2: rule__QualifiedName__Group__0__Impl rule__QualifiedName__Group__1
+            // InternalPerspectiveDsl.g:18560:1: ( rule__QualifiedName__Group__0__Impl rule__QualifiedName__Group__1 )
+            // InternalPerspectiveDsl.g:18561:2: rule__QualifiedName__Group__0__Impl rule__QualifiedName__Group__1
             {
             pushFollow(FOLLOW_131);
             rule__QualifiedName__Group__0__Impl();
@@ -60760,17 +60760,17 @@
 
 
     // $ANTLR start "rule__QualifiedName__Group__0__Impl"
-    // InternalPerspectiveDsl.g:18566:1: rule__QualifiedName__Group__0__Impl : ( ruleValidID ) ;
+    // InternalPerspectiveDsl.g:18568:1: rule__QualifiedName__Group__0__Impl : ( ruleValidID ) ;
     public final void rule__QualifiedName__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18570:1: ( ( ruleValidID ) )
-            // InternalPerspectiveDsl.g:18571:1: ( ruleValidID )
+            // InternalPerspectiveDsl.g:18572:1: ( ( ruleValidID ) )
+            // InternalPerspectiveDsl.g:18573:1: ( ruleValidID )
             {
-            // InternalPerspectiveDsl.g:18571:1: ( ruleValidID )
-            // InternalPerspectiveDsl.g:18572:2: ruleValidID
+            // InternalPerspectiveDsl.g:18573:1: ( ruleValidID )
+            // InternalPerspectiveDsl.g:18574:2: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0()); 
@@ -60805,14 +60805,14 @@
 
 
     // $ANTLR start "rule__QualifiedName__Group__1"
-    // InternalPerspectiveDsl.g:18581:1: rule__QualifiedName__Group__1 : rule__QualifiedName__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:18583:1: rule__QualifiedName__Group__1 : rule__QualifiedName__Group__1__Impl ;
     public final void rule__QualifiedName__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18585:1: ( rule__QualifiedName__Group__1__Impl )
-            // InternalPerspectiveDsl.g:18586:2: rule__QualifiedName__Group__1__Impl
+            // InternalPerspectiveDsl.g:18587:1: ( rule__QualifiedName__Group__1__Impl )
+            // InternalPerspectiveDsl.g:18588:2: rule__QualifiedName__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__QualifiedName__Group__1__Impl();
@@ -60838,22 +60838,22 @@
 
 
     // $ANTLR start "rule__QualifiedName__Group__1__Impl"
-    // InternalPerspectiveDsl.g:18592:1: rule__QualifiedName__Group__1__Impl : ( ( rule__QualifiedName__Group_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:18594:1: rule__QualifiedName__Group__1__Impl : ( ( rule__QualifiedName__Group_1__0 )* ) ;
     public final void rule__QualifiedName__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18596:1: ( ( ( rule__QualifiedName__Group_1__0 )* ) )
-            // InternalPerspectiveDsl.g:18597:1: ( ( rule__QualifiedName__Group_1__0 )* )
+            // InternalPerspectiveDsl.g:18598:1: ( ( ( rule__QualifiedName__Group_1__0 )* ) )
+            // InternalPerspectiveDsl.g:18599:1: ( ( rule__QualifiedName__Group_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:18597:1: ( ( rule__QualifiedName__Group_1__0 )* )
-            // InternalPerspectiveDsl.g:18598:2: ( rule__QualifiedName__Group_1__0 )*
+            // InternalPerspectiveDsl.g:18599:1: ( ( rule__QualifiedName__Group_1__0 )* )
+            // InternalPerspectiveDsl.g:18600:2: ( rule__QualifiedName__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameAccess().getGroup_1()); 
             }
-            // InternalPerspectiveDsl.g:18599:2: ( rule__QualifiedName__Group_1__0 )*
+            // InternalPerspectiveDsl.g:18601:2: ( rule__QualifiedName__Group_1__0 )*
             loop129:
             do {
                 int alt129=2;
@@ -60878,7 +60878,7 @@
 
                 switch (alt129) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:18599:3: rule__QualifiedName__Group_1__0
+            	    // InternalPerspectiveDsl.g:18601:3: rule__QualifiedName__Group_1__0
             	    {
             	    pushFollow(FOLLOW_132);
             	    rule__QualifiedName__Group_1__0();
@@ -60919,14 +60919,14 @@
 
 
     // $ANTLR start "rule__QualifiedName__Group_1__0"
-    // InternalPerspectiveDsl.g:18608:1: rule__QualifiedName__Group_1__0 : rule__QualifiedName__Group_1__0__Impl rule__QualifiedName__Group_1__1 ;
+    // InternalPerspectiveDsl.g:18610:1: rule__QualifiedName__Group_1__0 : rule__QualifiedName__Group_1__0__Impl rule__QualifiedName__Group_1__1 ;
     public final void rule__QualifiedName__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18612:1: ( rule__QualifiedName__Group_1__0__Impl rule__QualifiedName__Group_1__1 )
-            // InternalPerspectiveDsl.g:18613:2: rule__QualifiedName__Group_1__0__Impl rule__QualifiedName__Group_1__1
+            // InternalPerspectiveDsl.g:18614:1: ( rule__QualifiedName__Group_1__0__Impl rule__QualifiedName__Group_1__1 )
+            // InternalPerspectiveDsl.g:18615:2: rule__QualifiedName__Group_1__0__Impl rule__QualifiedName__Group_1__1
             {
             pushFollow(FOLLOW_7);
             rule__QualifiedName__Group_1__0__Impl();
@@ -60957,23 +60957,23 @@
 
 
     // $ANTLR start "rule__QualifiedName__Group_1__0__Impl"
-    // InternalPerspectiveDsl.g:18620:1: rule__QualifiedName__Group_1__0__Impl : ( ( '.' ) ) ;
+    // InternalPerspectiveDsl.g:18622:1: rule__QualifiedName__Group_1__0__Impl : ( ( '.' ) ) ;
     public final void rule__QualifiedName__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18624:1: ( ( ( '.' ) ) )
-            // InternalPerspectiveDsl.g:18625:1: ( ( '.' ) )
+            // InternalPerspectiveDsl.g:18626:1: ( ( ( '.' ) ) )
+            // InternalPerspectiveDsl.g:18627:1: ( ( '.' ) )
             {
-            // InternalPerspectiveDsl.g:18625:1: ( ( '.' ) )
-            // InternalPerspectiveDsl.g:18626:2: ( '.' )
+            // InternalPerspectiveDsl.g:18627:1: ( ( '.' ) )
+            // InternalPerspectiveDsl.g:18628:2: ( '.' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0()); 
             }
-            // InternalPerspectiveDsl.g:18627:2: ( '.' )
-            // InternalPerspectiveDsl.g:18627:3: '.'
+            // InternalPerspectiveDsl.g:18629:2: ( '.' )
+            // InternalPerspectiveDsl.g:18629:3: '.'
             {
             match(input,43,FOLLOW_2); if (state.failed) return ;
 
@@ -61004,14 +61004,14 @@
 
 
     // $ANTLR start "rule__QualifiedName__Group_1__1"
-    // InternalPerspectiveDsl.g:18635:1: rule__QualifiedName__Group_1__1 : rule__QualifiedName__Group_1__1__Impl ;
+    // InternalPerspectiveDsl.g:18637:1: rule__QualifiedName__Group_1__1 : rule__QualifiedName__Group_1__1__Impl ;
     public final void rule__QualifiedName__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18639:1: ( rule__QualifiedName__Group_1__1__Impl )
-            // InternalPerspectiveDsl.g:18640:2: rule__QualifiedName__Group_1__1__Impl
+            // InternalPerspectiveDsl.g:18641:1: ( rule__QualifiedName__Group_1__1__Impl )
+            // InternalPerspectiveDsl.g:18642:2: rule__QualifiedName__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__QualifiedName__Group_1__1__Impl();
@@ -61037,17 +61037,17 @@
 
 
     // $ANTLR start "rule__QualifiedName__Group_1__1__Impl"
-    // InternalPerspectiveDsl.g:18646:1: rule__QualifiedName__Group_1__1__Impl : ( ruleValidID ) ;
+    // InternalPerspectiveDsl.g:18648:1: rule__QualifiedName__Group_1__1__Impl : ( ruleValidID ) ;
     public final void rule__QualifiedName__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18650:1: ( ( ruleValidID ) )
-            // InternalPerspectiveDsl.g:18651:1: ( ruleValidID )
+            // InternalPerspectiveDsl.g:18652:1: ( ( ruleValidID ) )
+            // InternalPerspectiveDsl.g:18653:1: ( ruleValidID )
             {
-            // InternalPerspectiveDsl.g:18651:1: ( ruleValidID )
-            // InternalPerspectiveDsl.g:18652:2: ruleValidID
+            // InternalPerspectiveDsl.g:18653:1: ( ruleValidID )
+            // InternalPerspectiveDsl.g:18654:2: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1()); 
@@ -61082,14 +61082,14 @@
 
 
     // $ANTLR start "rule__Number__Group_1__0"
-    // InternalPerspectiveDsl.g:18662:1: rule__Number__Group_1__0 : rule__Number__Group_1__0__Impl rule__Number__Group_1__1 ;
+    // InternalPerspectiveDsl.g:18664:1: rule__Number__Group_1__0 : rule__Number__Group_1__0__Impl rule__Number__Group_1__1 ;
     public final void rule__Number__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18666:1: ( rule__Number__Group_1__0__Impl rule__Number__Group_1__1 )
-            // InternalPerspectiveDsl.g:18667:2: rule__Number__Group_1__0__Impl rule__Number__Group_1__1
+            // InternalPerspectiveDsl.g:18668:1: ( rule__Number__Group_1__0__Impl rule__Number__Group_1__1 )
+            // InternalPerspectiveDsl.g:18669:2: rule__Number__Group_1__0__Impl rule__Number__Group_1__1
             {
             pushFollow(FOLLOW_131);
             rule__Number__Group_1__0__Impl();
@@ -61120,23 +61120,23 @@
 
 
     // $ANTLR start "rule__Number__Group_1__0__Impl"
-    // InternalPerspectiveDsl.g:18674:1: rule__Number__Group_1__0__Impl : ( ( rule__Number__Alternatives_1_0 ) ) ;
+    // InternalPerspectiveDsl.g:18676:1: rule__Number__Group_1__0__Impl : ( ( rule__Number__Alternatives_1_0 ) ) ;
     public final void rule__Number__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18678:1: ( ( ( rule__Number__Alternatives_1_0 ) ) )
-            // InternalPerspectiveDsl.g:18679:1: ( ( rule__Number__Alternatives_1_0 ) )
+            // InternalPerspectiveDsl.g:18680:1: ( ( ( rule__Number__Alternatives_1_0 ) ) )
+            // InternalPerspectiveDsl.g:18681:1: ( ( rule__Number__Alternatives_1_0 ) )
             {
-            // InternalPerspectiveDsl.g:18679:1: ( ( rule__Number__Alternatives_1_0 ) )
-            // InternalPerspectiveDsl.g:18680:2: ( rule__Number__Alternatives_1_0 )
+            // InternalPerspectiveDsl.g:18681:1: ( ( rule__Number__Alternatives_1_0 ) )
+            // InternalPerspectiveDsl.g:18682:2: ( rule__Number__Alternatives_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNumberAccess().getAlternatives_1_0()); 
             }
-            // InternalPerspectiveDsl.g:18681:2: ( rule__Number__Alternatives_1_0 )
-            // InternalPerspectiveDsl.g:18681:3: rule__Number__Alternatives_1_0
+            // InternalPerspectiveDsl.g:18683:2: ( rule__Number__Alternatives_1_0 )
+            // InternalPerspectiveDsl.g:18683:3: rule__Number__Alternatives_1_0
             {
             pushFollow(FOLLOW_2);
             rule__Number__Alternatives_1_0();
@@ -61171,14 +61171,14 @@
 
 
     // $ANTLR start "rule__Number__Group_1__1"
-    // InternalPerspectiveDsl.g:18689:1: rule__Number__Group_1__1 : rule__Number__Group_1__1__Impl ;
+    // InternalPerspectiveDsl.g:18691:1: rule__Number__Group_1__1 : rule__Number__Group_1__1__Impl ;
     public final void rule__Number__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18693:1: ( rule__Number__Group_1__1__Impl )
-            // InternalPerspectiveDsl.g:18694:2: rule__Number__Group_1__1__Impl
+            // InternalPerspectiveDsl.g:18695:1: ( rule__Number__Group_1__1__Impl )
+            // InternalPerspectiveDsl.g:18696:2: rule__Number__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__Number__Group_1__1__Impl();
@@ -61204,22 +61204,22 @@
 
 
     // $ANTLR start "rule__Number__Group_1__1__Impl"
-    // InternalPerspectiveDsl.g:18700:1: rule__Number__Group_1__1__Impl : ( ( rule__Number__Group_1_1__0 )? ) ;
+    // InternalPerspectiveDsl.g:18702:1: rule__Number__Group_1__1__Impl : ( ( rule__Number__Group_1_1__0 )? ) ;
     public final void rule__Number__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18704:1: ( ( ( rule__Number__Group_1_1__0 )? ) )
-            // InternalPerspectiveDsl.g:18705:1: ( ( rule__Number__Group_1_1__0 )? )
+            // InternalPerspectiveDsl.g:18706:1: ( ( ( rule__Number__Group_1_1__0 )? ) )
+            // InternalPerspectiveDsl.g:18707:1: ( ( rule__Number__Group_1_1__0 )? )
             {
-            // InternalPerspectiveDsl.g:18705:1: ( ( rule__Number__Group_1_1__0 )? )
-            // InternalPerspectiveDsl.g:18706:2: ( rule__Number__Group_1_1__0 )?
+            // InternalPerspectiveDsl.g:18707:1: ( ( rule__Number__Group_1_1__0 )? )
+            // InternalPerspectiveDsl.g:18708:2: ( rule__Number__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNumberAccess().getGroup_1_1()); 
             }
-            // InternalPerspectiveDsl.g:18707:2: ( rule__Number__Group_1_1__0 )?
+            // InternalPerspectiveDsl.g:18709:2: ( rule__Number__Group_1_1__0 )?
             int alt130=2;
             int LA130_0 = input.LA(1);
 
@@ -61232,7 +61232,7 @@
             }
             switch (alt130) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:18707:3: rule__Number__Group_1_1__0
+                    // InternalPerspectiveDsl.g:18709:3: rule__Number__Group_1_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__Number__Group_1_1__0();
@@ -61270,14 +61270,14 @@
 
 
     // $ANTLR start "rule__Number__Group_1_1__0"
-    // InternalPerspectiveDsl.g:18716:1: rule__Number__Group_1_1__0 : rule__Number__Group_1_1__0__Impl rule__Number__Group_1_1__1 ;
+    // InternalPerspectiveDsl.g:18718:1: rule__Number__Group_1_1__0 : rule__Number__Group_1_1__0__Impl rule__Number__Group_1_1__1 ;
     public final void rule__Number__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18720:1: ( rule__Number__Group_1_1__0__Impl rule__Number__Group_1_1__1 )
-            // InternalPerspectiveDsl.g:18721:2: rule__Number__Group_1_1__0__Impl rule__Number__Group_1_1__1
+            // InternalPerspectiveDsl.g:18722:1: ( rule__Number__Group_1_1__0__Impl rule__Number__Group_1_1__1 )
+            // InternalPerspectiveDsl.g:18723:2: rule__Number__Group_1_1__0__Impl rule__Number__Group_1_1__1
             {
             pushFollow(FOLLOW_133);
             rule__Number__Group_1_1__0__Impl();
@@ -61308,17 +61308,17 @@
 
 
     // $ANTLR start "rule__Number__Group_1_1__0__Impl"
-    // InternalPerspectiveDsl.g:18728:1: rule__Number__Group_1_1__0__Impl : ( '.' ) ;
+    // InternalPerspectiveDsl.g:18730:1: rule__Number__Group_1_1__0__Impl : ( '.' ) ;
     public final void rule__Number__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18732:1: ( ( '.' ) )
-            // InternalPerspectiveDsl.g:18733:1: ( '.' )
+            // InternalPerspectiveDsl.g:18734:1: ( ( '.' ) )
+            // InternalPerspectiveDsl.g:18735:1: ( '.' )
             {
-            // InternalPerspectiveDsl.g:18733:1: ( '.' )
-            // InternalPerspectiveDsl.g:18734:2: '.'
+            // InternalPerspectiveDsl.g:18735:1: ( '.' )
+            // InternalPerspectiveDsl.g:18736:2: '.'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0()); 
@@ -61349,14 +61349,14 @@
 
 
     // $ANTLR start "rule__Number__Group_1_1__1"
-    // InternalPerspectiveDsl.g:18743:1: rule__Number__Group_1_1__1 : rule__Number__Group_1_1__1__Impl ;
+    // InternalPerspectiveDsl.g:18745:1: rule__Number__Group_1_1__1 : rule__Number__Group_1_1__1__Impl ;
     public final void rule__Number__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18747:1: ( rule__Number__Group_1_1__1__Impl )
-            // InternalPerspectiveDsl.g:18748:2: rule__Number__Group_1_1__1__Impl
+            // InternalPerspectiveDsl.g:18749:1: ( rule__Number__Group_1_1__1__Impl )
+            // InternalPerspectiveDsl.g:18750:2: rule__Number__Group_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__Number__Group_1_1__1__Impl();
@@ -61382,23 +61382,23 @@
 
 
     // $ANTLR start "rule__Number__Group_1_1__1__Impl"
-    // InternalPerspectiveDsl.g:18754:1: rule__Number__Group_1_1__1__Impl : ( ( rule__Number__Alternatives_1_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:18756:1: rule__Number__Group_1_1__1__Impl : ( ( rule__Number__Alternatives_1_1_1 ) ) ;
     public final void rule__Number__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18758:1: ( ( ( rule__Number__Alternatives_1_1_1 ) ) )
-            // InternalPerspectiveDsl.g:18759:1: ( ( rule__Number__Alternatives_1_1_1 ) )
+            // InternalPerspectiveDsl.g:18760:1: ( ( ( rule__Number__Alternatives_1_1_1 ) ) )
+            // InternalPerspectiveDsl.g:18761:1: ( ( rule__Number__Alternatives_1_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:18759:1: ( ( rule__Number__Alternatives_1_1_1 ) )
-            // InternalPerspectiveDsl.g:18760:2: ( rule__Number__Alternatives_1_1_1 )
+            // InternalPerspectiveDsl.g:18761:1: ( ( rule__Number__Alternatives_1_1_1 ) )
+            // InternalPerspectiveDsl.g:18762:2: ( rule__Number__Alternatives_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNumberAccess().getAlternatives_1_1_1()); 
             }
-            // InternalPerspectiveDsl.g:18761:2: ( rule__Number__Alternatives_1_1_1 )
-            // InternalPerspectiveDsl.g:18761:3: rule__Number__Alternatives_1_1_1
+            // InternalPerspectiveDsl.g:18763:2: ( rule__Number__Alternatives_1_1_1 )
+            // InternalPerspectiveDsl.g:18763:3: rule__Number__Alternatives_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__Number__Alternatives_1_1_1();
@@ -61433,14 +61433,14 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0__0"
-    // InternalPerspectiveDsl.g:18770:1: rule__JvmTypeReference__Group_0__0 : rule__JvmTypeReference__Group_0__0__Impl rule__JvmTypeReference__Group_0__1 ;
+    // InternalPerspectiveDsl.g:18772:1: rule__JvmTypeReference__Group_0__0 : rule__JvmTypeReference__Group_0__0__Impl rule__JvmTypeReference__Group_0__1 ;
     public final void rule__JvmTypeReference__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18774:1: ( rule__JvmTypeReference__Group_0__0__Impl rule__JvmTypeReference__Group_0__1 )
-            // InternalPerspectiveDsl.g:18775:2: rule__JvmTypeReference__Group_0__0__Impl rule__JvmTypeReference__Group_0__1
+            // InternalPerspectiveDsl.g:18776:1: ( rule__JvmTypeReference__Group_0__0__Impl rule__JvmTypeReference__Group_0__1 )
+            // InternalPerspectiveDsl.g:18777:2: rule__JvmTypeReference__Group_0__0__Impl rule__JvmTypeReference__Group_0__1
             {
             pushFollow(FOLLOW_58);
             rule__JvmTypeReference__Group_0__0__Impl();
@@ -61471,17 +61471,17 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0__0__Impl"
-    // InternalPerspectiveDsl.g:18782:1: rule__JvmTypeReference__Group_0__0__Impl : ( ruleJvmParameterizedTypeReference ) ;
+    // InternalPerspectiveDsl.g:18784:1: rule__JvmTypeReference__Group_0__0__Impl : ( ruleJvmParameterizedTypeReference ) ;
     public final void rule__JvmTypeReference__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18786:1: ( ( ruleJvmParameterizedTypeReference ) )
-            // InternalPerspectiveDsl.g:18787:1: ( ruleJvmParameterizedTypeReference )
+            // InternalPerspectiveDsl.g:18788:1: ( ( ruleJvmParameterizedTypeReference ) )
+            // InternalPerspectiveDsl.g:18789:1: ( ruleJvmParameterizedTypeReference )
             {
-            // InternalPerspectiveDsl.g:18787:1: ( ruleJvmParameterizedTypeReference )
-            // InternalPerspectiveDsl.g:18788:2: ruleJvmParameterizedTypeReference
+            // InternalPerspectiveDsl.g:18789:1: ( ruleJvmParameterizedTypeReference )
+            // InternalPerspectiveDsl.g:18790:2: ruleJvmParameterizedTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0()); 
@@ -61516,14 +61516,14 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0__1"
-    // InternalPerspectiveDsl.g:18797:1: rule__JvmTypeReference__Group_0__1 : rule__JvmTypeReference__Group_0__1__Impl ;
+    // InternalPerspectiveDsl.g:18799:1: rule__JvmTypeReference__Group_0__1 : rule__JvmTypeReference__Group_0__1__Impl ;
     public final void rule__JvmTypeReference__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18801:1: ( rule__JvmTypeReference__Group_0__1__Impl )
-            // InternalPerspectiveDsl.g:18802:2: rule__JvmTypeReference__Group_0__1__Impl
+            // InternalPerspectiveDsl.g:18803:1: ( rule__JvmTypeReference__Group_0__1__Impl )
+            // InternalPerspectiveDsl.g:18804:2: rule__JvmTypeReference__Group_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmTypeReference__Group_0__1__Impl();
@@ -61549,22 +61549,22 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0__1__Impl"
-    // InternalPerspectiveDsl.g:18808:1: rule__JvmTypeReference__Group_0__1__Impl : ( ( rule__JvmTypeReference__Group_0_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:18810:1: rule__JvmTypeReference__Group_0__1__Impl : ( ( rule__JvmTypeReference__Group_0_1__0 )* ) ;
     public final void rule__JvmTypeReference__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18812:1: ( ( ( rule__JvmTypeReference__Group_0_1__0 )* ) )
-            // InternalPerspectiveDsl.g:18813:1: ( ( rule__JvmTypeReference__Group_0_1__0 )* )
+            // InternalPerspectiveDsl.g:18814:1: ( ( ( rule__JvmTypeReference__Group_0_1__0 )* ) )
+            // InternalPerspectiveDsl.g:18815:1: ( ( rule__JvmTypeReference__Group_0_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:18813:1: ( ( rule__JvmTypeReference__Group_0_1__0 )* )
-            // InternalPerspectiveDsl.g:18814:2: ( rule__JvmTypeReference__Group_0_1__0 )*
+            // InternalPerspectiveDsl.g:18815:1: ( ( rule__JvmTypeReference__Group_0_1__0 )* )
+            // InternalPerspectiveDsl.g:18816:2: ( rule__JvmTypeReference__Group_0_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1()); 
             }
-            // InternalPerspectiveDsl.g:18815:2: ( rule__JvmTypeReference__Group_0_1__0 )*
+            // InternalPerspectiveDsl.g:18817:2: ( rule__JvmTypeReference__Group_0_1__0 )*
             loop131:
             do {
                 int alt131=2;
@@ -61589,7 +61589,7 @@
 
                 switch (alt131) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:18815:3: rule__JvmTypeReference__Group_0_1__0
+            	    // InternalPerspectiveDsl.g:18817:3: rule__JvmTypeReference__Group_0_1__0
             	    {
             	    pushFollow(FOLLOW_123);
             	    rule__JvmTypeReference__Group_0_1__0();
@@ -61630,14 +61630,14 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0_1__0"
-    // InternalPerspectiveDsl.g:18824:1: rule__JvmTypeReference__Group_0_1__0 : rule__JvmTypeReference__Group_0_1__0__Impl ;
+    // InternalPerspectiveDsl.g:18826:1: rule__JvmTypeReference__Group_0_1__0 : rule__JvmTypeReference__Group_0_1__0__Impl ;
     public final void rule__JvmTypeReference__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18828:1: ( rule__JvmTypeReference__Group_0_1__0__Impl )
-            // InternalPerspectiveDsl.g:18829:2: rule__JvmTypeReference__Group_0_1__0__Impl
+            // InternalPerspectiveDsl.g:18830:1: ( rule__JvmTypeReference__Group_0_1__0__Impl )
+            // InternalPerspectiveDsl.g:18831:2: rule__JvmTypeReference__Group_0_1__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmTypeReference__Group_0_1__0__Impl();
@@ -61663,23 +61663,23 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0_1__0__Impl"
-    // InternalPerspectiveDsl.g:18835:1: rule__JvmTypeReference__Group_0_1__0__Impl : ( ( rule__JvmTypeReference__Group_0_1_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:18837:1: rule__JvmTypeReference__Group_0_1__0__Impl : ( ( rule__JvmTypeReference__Group_0_1_0__0 ) ) ;
     public final void rule__JvmTypeReference__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18839:1: ( ( ( rule__JvmTypeReference__Group_0_1_0__0 ) ) )
-            // InternalPerspectiveDsl.g:18840:1: ( ( rule__JvmTypeReference__Group_0_1_0__0 ) )
+            // InternalPerspectiveDsl.g:18841:1: ( ( ( rule__JvmTypeReference__Group_0_1_0__0 ) ) )
+            // InternalPerspectiveDsl.g:18842:1: ( ( rule__JvmTypeReference__Group_0_1_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:18840:1: ( ( rule__JvmTypeReference__Group_0_1_0__0 ) )
-            // InternalPerspectiveDsl.g:18841:2: ( rule__JvmTypeReference__Group_0_1_0__0 )
+            // InternalPerspectiveDsl.g:18842:1: ( ( rule__JvmTypeReference__Group_0_1_0__0 ) )
+            // InternalPerspectiveDsl.g:18843:2: ( rule__JvmTypeReference__Group_0_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:18842:2: ( rule__JvmTypeReference__Group_0_1_0__0 )
-            // InternalPerspectiveDsl.g:18842:3: rule__JvmTypeReference__Group_0_1_0__0
+            // InternalPerspectiveDsl.g:18844:2: ( rule__JvmTypeReference__Group_0_1_0__0 )
+            // InternalPerspectiveDsl.g:18844:3: rule__JvmTypeReference__Group_0_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmTypeReference__Group_0_1_0__0();
@@ -61714,14 +61714,14 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0_1_0__0"
-    // InternalPerspectiveDsl.g:18851:1: rule__JvmTypeReference__Group_0_1_0__0 : rule__JvmTypeReference__Group_0_1_0__0__Impl rule__JvmTypeReference__Group_0_1_0__1 ;
+    // InternalPerspectiveDsl.g:18853:1: rule__JvmTypeReference__Group_0_1_0__0 : rule__JvmTypeReference__Group_0_1_0__0__Impl rule__JvmTypeReference__Group_0_1_0__1 ;
     public final void rule__JvmTypeReference__Group_0_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18855:1: ( rule__JvmTypeReference__Group_0_1_0__0__Impl rule__JvmTypeReference__Group_0_1_0__1 )
-            // InternalPerspectiveDsl.g:18856:2: rule__JvmTypeReference__Group_0_1_0__0__Impl rule__JvmTypeReference__Group_0_1_0__1
+            // InternalPerspectiveDsl.g:18857:1: ( rule__JvmTypeReference__Group_0_1_0__0__Impl rule__JvmTypeReference__Group_0_1_0__1 )
+            // InternalPerspectiveDsl.g:18858:2: rule__JvmTypeReference__Group_0_1_0__0__Impl rule__JvmTypeReference__Group_0_1_0__1
             {
             pushFollow(FOLLOW_58);
             rule__JvmTypeReference__Group_0_1_0__0__Impl();
@@ -61752,23 +61752,23 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0_1_0__0__Impl"
-    // InternalPerspectiveDsl.g:18863:1: rule__JvmTypeReference__Group_0_1_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:18865:1: rule__JvmTypeReference__Group_0_1_0__0__Impl : ( () ) ;
     public final void rule__JvmTypeReference__Group_0_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18867:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:18868:1: ( () )
+            // InternalPerspectiveDsl.g:18869:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:18870:1: ( () )
             {
-            // InternalPerspectiveDsl.g:18868:1: ( () )
-            // InternalPerspectiveDsl.g:18869:2: ()
+            // InternalPerspectiveDsl.g:18870:1: ( () )
+            // InternalPerspectiveDsl.g:18871:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:18870:2: ()
-            // InternalPerspectiveDsl.g:18870:3: 
+            // InternalPerspectiveDsl.g:18872:2: ()
+            // InternalPerspectiveDsl.g:18872:3: 
             {
             }
 
@@ -61793,14 +61793,14 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0_1_0__1"
-    // InternalPerspectiveDsl.g:18878:1: rule__JvmTypeReference__Group_0_1_0__1 : rule__JvmTypeReference__Group_0_1_0__1__Impl ;
+    // InternalPerspectiveDsl.g:18880:1: rule__JvmTypeReference__Group_0_1_0__1 : rule__JvmTypeReference__Group_0_1_0__1__Impl ;
     public final void rule__JvmTypeReference__Group_0_1_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18882:1: ( rule__JvmTypeReference__Group_0_1_0__1__Impl )
-            // InternalPerspectiveDsl.g:18883:2: rule__JvmTypeReference__Group_0_1_0__1__Impl
+            // InternalPerspectiveDsl.g:18884:1: ( rule__JvmTypeReference__Group_0_1_0__1__Impl )
+            // InternalPerspectiveDsl.g:18885:2: rule__JvmTypeReference__Group_0_1_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmTypeReference__Group_0_1_0__1__Impl();
@@ -61826,17 +61826,17 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0_1_0__1__Impl"
-    // InternalPerspectiveDsl.g:18889:1: rule__JvmTypeReference__Group_0_1_0__1__Impl : ( ruleArrayBrackets ) ;
+    // InternalPerspectiveDsl.g:18891:1: rule__JvmTypeReference__Group_0_1_0__1__Impl : ( ruleArrayBrackets ) ;
     public final void rule__JvmTypeReference__Group_0_1_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18893:1: ( ( ruleArrayBrackets ) )
-            // InternalPerspectiveDsl.g:18894:1: ( ruleArrayBrackets )
+            // InternalPerspectiveDsl.g:18895:1: ( ( ruleArrayBrackets ) )
+            // InternalPerspectiveDsl.g:18896:1: ( ruleArrayBrackets )
             {
-            // InternalPerspectiveDsl.g:18894:1: ( ruleArrayBrackets )
-            // InternalPerspectiveDsl.g:18895:2: ruleArrayBrackets
+            // InternalPerspectiveDsl.g:18896:1: ( ruleArrayBrackets )
+            // InternalPerspectiveDsl.g:18897:2: ruleArrayBrackets
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1()); 
@@ -61871,14 +61871,14 @@
 
 
     // $ANTLR start "rule__ArrayBrackets__Group__0"
-    // InternalPerspectiveDsl.g:18905:1: rule__ArrayBrackets__Group__0 : rule__ArrayBrackets__Group__0__Impl rule__ArrayBrackets__Group__1 ;
+    // InternalPerspectiveDsl.g:18907:1: rule__ArrayBrackets__Group__0 : rule__ArrayBrackets__Group__0__Impl rule__ArrayBrackets__Group__1 ;
     public final void rule__ArrayBrackets__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18909:1: ( rule__ArrayBrackets__Group__0__Impl rule__ArrayBrackets__Group__1 )
-            // InternalPerspectiveDsl.g:18910:2: rule__ArrayBrackets__Group__0__Impl rule__ArrayBrackets__Group__1
+            // InternalPerspectiveDsl.g:18911:1: ( rule__ArrayBrackets__Group__0__Impl rule__ArrayBrackets__Group__1 )
+            // InternalPerspectiveDsl.g:18912:2: rule__ArrayBrackets__Group__0__Impl rule__ArrayBrackets__Group__1
             {
             pushFollow(FOLLOW_96);
             rule__ArrayBrackets__Group__0__Impl();
@@ -61909,17 +61909,17 @@
 
 
     // $ANTLR start "rule__ArrayBrackets__Group__0__Impl"
-    // InternalPerspectiveDsl.g:18917:1: rule__ArrayBrackets__Group__0__Impl : ( '[' ) ;
+    // InternalPerspectiveDsl.g:18919:1: rule__ArrayBrackets__Group__0__Impl : ( '[' ) ;
     public final void rule__ArrayBrackets__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18921:1: ( ( '[' ) )
-            // InternalPerspectiveDsl.g:18922:1: ( '[' )
+            // InternalPerspectiveDsl.g:18923:1: ( ( '[' ) )
+            // InternalPerspectiveDsl.g:18924:1: ( '[' )
             {
-            // InternalPerspectiveDsl.g:18922:1: ( '[' )
-            // InternalPerspectiveDsl.g:18923:2: '['
+            // InternalPerspectiveDsl.g:18924:1: ( '[' )
+            // InternalPerspectiveDsl.g:18925:2: '['
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0()); 
@@ -61950,14 +61950,14 @@
 
 
     // $ANTLR start "rule__ArrayBrackets__Group__1"
-    // InternalPerspectiveDsl.g:18932:1: rule__ArrayBrackets__Group__1 : rule__ArrayBrackets__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:18934:1: rule__ArrayBrackets__Group__1 : rule__ArrayBrackets__Group__1__Impl ;
     public final void rule__ArrayBrackets__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18936:1: ( rule__ArrayBrackets__Group__1__Impl )
-            // InternalPerspectiveDsl.g:18937:2: rule__ArrayBrackets__Group__1__Impl
+            // InternalPerspectiveDsl.g:18938:1: ( rule__ArrayBrackets__Group__1__Impl )
+            // InternalPerspectiveDsl.g:18939:2: rule__ArrayBrackets__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__ArrayBrackets__Group__1__Impl();
@@ -61983,17 +61983,17 @@
 
 
     // $ANTLR start "rule__ArrayBrackets__Group__1__Impl"
-    // InternalPerspectiveDsl.g:18943:1: rule__ArrayBrackets__Group__1__Impl : ( ']' ) ;
+    // InternalPerspectiveDsl.g:18945:1: rule__ArrayBrackets__Group__1__Impl : ( ']' ) ;
     public final void rule__ArrayBrackets__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18947:1: ( ( ']' ) )
-            // InternalPerspectiveDsl.g:18948:1: ( ']' )
+            // InternalPerspectiveDsl.g:18949:1: ( ( ']' ) )
+            // InternalPerspectiveDsl.g:18950:1: ( ']' )
             {
-            // InternalPerspectiveDsl.g:18948:1: ( ']' )
-            // InternalPerspectiveDsl.g:18949:2: ']'
+            // InternalPerspectiveDsl.g:18950:1: ( ']' )
+            // InternalPerspectiveDsl.g:18951:2: ']'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1()); 
@@ -62024,14 +62024,14 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group__0"
-    // InternalPerspectiveDsl.g:18959:1: rule__XFunctionTypeRef__Group__0 : rule__XFunctionTypeRef__Group__0__Impl rule__XFunctionTypeRef__Group__1 ;
+    // InternalPerspectiveDsl.g:18961:1: rule__XFunctionTypeRef__Group__0 : rule__XFunctionTypeRef__Group__0__Impl rule__XFunctionTypeRef__Group__1 ;
     public final void rule__XFunctionTypeRef__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18963:1: ( rule__XFunctionTypeRef__Group__0__Impl rule__XFunctionTypeRef__Group__1 )
-            // InternalPerspectiveDsl.g:18964:2: rule__XFunctionTypeRef__Group__0__Impl rule__XFunctionTypeRef__Group__1
+            // InternalPerspectiveDsl.g:18965:1: ( rule__XFunctionTypeRef__Group__0__Impl rule__XFunctionTypeRef__Group__1 )
+            // InternalPerspectiveDsl.g:18966:2: rule__XFunctionTypeRef__Group__0__Impl rule__XFunctionTypeRef__Group__1
             {
             pushFollow(FOLLOW_71);
             rule__XFunctionTypeRef__Group__0__Impl();
@@ -62062,22 +62062,22 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group__0__Impl"
-    // InternalPerspectiveDsl.g:18971:1: rule__XFunctionTypeRef__Group__0__Impl : ( ( rule__XFunctionTypeRef__Group_0__0 )? ) ;
+    // InternalPerspectiveDsl.g:18973:1: rule__XFunctionTypeRef__Group__0__Impl : ( ( rule__XFunctionTypeRef__Group_0__0 )? ) ;
     public final void rule__XFunctionTypeRef__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18975:1: ( ( ( rule__XFunctionTypeRef__Group_0__0 )? ) )
-            // InternalPerspectiveDsl.g:18976:1: ( ( rule__XFunctionTypeRef__Group_0__0 )? )
+            // InternalPerspectiveDsl.g:18977:1: ( ( ( rule__XFunctionTypeRef__Group_0__0 )? ) )
+            // InternalPerspectiveDsl.g:18978:1: ( ( rule__XFunctionTypeRef__Group_0__0 )? )
             {
-            // InternalPerspectiveDsl.g:18976:1: ( ( rule__XFunctionTypeRef__Group_0__0 )? )
-            // InternalPerspectiveDsl.g:18977:2: ( rule__XFunctionTypeRef__Group_0__0 )?
+            // InternalPerspectiveDsl.g:18978:1: ( ( rule__XFunctionTypeRef__Group_0__0 )? )
+            // InternalPerspectiveDsl.g:18979:2: ( rule__XFunctionTypeRef__Group_0__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getGroup_0()); 
             }
-            // InternalPerspectiveDsl.g:18978:2: ( rule__XFunctionTypeRef__Group_0__0 )?
+            // InternalPerspectiveDsl.g:18980:2: ( rule__XFunctionTypeRef__Group_0__0 )?
             int alt132=2;
             int LA132_0 = input.LA(1);
 
@@ -62086,7 +62086,7 @@
             }
             switch (alt132) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:18978:3: rule__XFunctionTypeRef__Group_0__0
+                    // InternalPerspectiveDsl.g:18980:3: rule__XFunctionTypeRef__Group_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XFunctionTypeRef__Group_0__0();
@@ -62124,14 +62124,14 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group__1"
-    // InternalPerspectiveDsl.g:18986:1: rule__XFunctionTypeRef__Group__1 : rule__XFunctionTypeRef__Group__1__Impl rule__XFunctionTypeRef__Group__2 ;
+    // InternalPerspectiveDsl.g:18988:1: rule__XFunctionTypeRef__Group__1 : rule__XFunctionTypeRef__Group__1__Impl rule__XFunctionTypeRef__Group__2 ;
     public final void rule__XFunctionTypeRef__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:18990:1: ( rule__XFunctionTypeRef__Group__1__Impl rule__XFunctionTypeRef__Group__2 )
-            // InternalPerspectiveDsl.g:18991:2: rule__XFunctionTypeRef__Group__1__Impl rule__XFunctionTypeRef__Group__2
+            // InternalPerspectiveDsl.g:18992:1: ( rule__XFunctionTypeRef__Group__1__Impl rule__XFunctionTypeRef__Group__2 )
+            // InternalPerspectiveDsl.g:18993:2: rule__XFunctionTypeRef__Group__1__Impl rule__XFunctionTypeRef__Group__2
             {
             pushFollow(FOLLOW_71);
             rule__XFunctionTypeRef__Group__1__Impl();
@@ -62162,17 +62162,17 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group__1__Impl"
-    // InternalPerspectiveDsl.g:18998:1: rule__XFunctionTypeRef__Group__1__Impl : ( '=>' ) ;
+    // InternalPerspectiveDsl.g:19000:1: rule__XFunctionTypeRef__Group__1__Impl : ( '=>' ) ;
     public final void rule__XFunctionTypeRef__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19002:1: ( ( '=>' ) )
-            // InternalPerspectiveDsl.g:19003:1: ( '=>' )
+            // InternalPerspectiveDsl.g:19004:1: ( ( '=>' ) )
+            // InternalPerspectiveDsl.g:19005:1: ( '=>' )
             {
-            // InternalPerspectiveDsl.g:19003:1: ( '=>' )
-            // InternalPerspectiveDsl.g:19004:2: '=>'
+            // InternalPerspectiveDsl.g:19005:1: ( '=>' )
+            // InternalPerspectiveDsl.g:19006:2: '=>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1()); 
@@ -62203,14 +62203,14 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group__2"
-    // InternalPerspectiveDsl.g:19013:1: rule__XFunctionTypeRef__Group__2 : rule__XFunctionTypeRef__Group__2__Impl ;
+    // InternalPerspectiveDsl.g:19015:1: rule__XFunctionTypeRef__Group__2 : rule__XFunctionTypeRef__Group__2__Impl ;
     public final void rule__XFunctionTypeRef__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19017:1: ( rule__XFunctionTypeRef__Group__2__Impl )
-            // InternalPerspectiveDsl.g:19018:2: rule__XFunctionTypeRef__Group__2__Impl
+            // InternalPerspectiveDsl.g:19019:1: ( rule__XFunctionTypeRef__Group__2__Impl )
+            // InternalPerspectiveDsl.g:19020:2: rule__XFunctionTypeRef__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFunctionTypeRef__Group__2__Impl();
@@ -62236,23 +62236,23 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group__2__Impl"
-    // InternalPerspectiveDsl.g:19024:1: rule__XFunctionTypeRef__Group__2__Impl : ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) ) ;
+    // InternalPerspectiveDsl.g:19026:1: rule__XFunctionTypeRef__Group__2__Impl : ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) ) ;
     public final void rule__XFunctionTypeRef__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19028:1: ( ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) ) )
-            // InternalPerspectiveDsl.g:19029:1: ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) )
+            // InternalPerspectiveDsl.g:19030:1: ( ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) ) )
+            // InternalPerspectiveDsl.g:19031:1: ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) )
             {
-            // InternalPerspectiveDsl.g:19029:1: ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) )
-            // InternalPerspectiveDsl.g:19030:2: ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 )
+            // InternalPerspectiveDsl.g:19031:1: ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) )
+            // InternalPerspectiveDsl.g:19032:2: ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeAssignment_2()); 
             }
-            // InternalPerspectiveDsl.g:19031:2: ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 )
-            // InternalPerspectiveDsl.g:19031:3: rule__XFunctionTypeRef__ReturnTypeAssignment_2
+            // InternalPerspectiveDsl.g:19033:2: ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 )
+            // InternalPerspectiveDsl.g:19033:3: rule__XFunctionTypeRef__ReturnTypeAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__XFunctionTypeRef__ReturnTypeAssignment_2();
@@ -62287,14 +62287,14 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0__0"
-    // InternalPerspectiveDsl.g:19040:1: rule__XFunctionTypeRef__Group_0__0 : rule__XFunctionTypeRef__Group_0__0__Impl rule__XFunctionTypeRef__Group_0__1 ;
+    // InternalPerspectiveDsl.g:19042:1: rule__XFunctionTypeRef__Group_0__0 : rule__XFunctionTypeRef__Group_0__0__Impl rule__XFunctionTypeRef__Group_0__1 ;
     public final void rule__XFunctionTypeRef__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19044:1: ( rule__XFunctionTypeRef__Group_0__0__Impl rule__XFunctionTypeRef__Group_0__1 )
-            // InternalPerspectiveDsl.g:19045:2: rule__XFunctionTypeRef__Group_0__0__Impl rule__XFunctionTypeRef__Group_0__1
+            // InternalPerspectiveDsl.g:19046:1: ( rule__XFunctionTypeRef__Group_0__0__Impl rule__XFunctionTypeRef__Group_0__1 )
+            // InternalPerspectiveDsl.g:19047:2: rule__XFunctionTypeRef__Group_0__0__Impl rule__XFunctionTypeRef__Group_0__1
             {
             pushFollow(FOLLOW_134);
             rule__XFunctionTypeRef__Group_0__0__Impl();
@@ -62325,17 +62325,17 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0__0__Impl"
-    // InternalPerspectiveDsl.g:19052:1: rule__XFunctionTypeRef__Group_0__0__Impl : ( '(' ) ;
+    // InternalPerspectiveDsl.g:19054:1: rule__XFunctionTypeRef__Group_0__0__Impl : ( '(' ) ;
     public final void rule__XFunctionTypeRef__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19056:1: ( ( '(' ) )
-            // InternalPerspectiveDsl.g:19057:1: ( '(' )
+            // InternalPerspectiveDsl.g:19058:1: ( ( '(' ) )
+            // InternalPerspectiveDsl.g:19059:1: ( '(' )
             {
-            // InternalPerspectiveDsl.g:19057:1: ( '(' )
-            // InternalPerspectiveDsl.g:19058:2: '('
+            // InternalPerspectiveDsl.g:19059:1: ( '(' )
+            // InternalPerspectiveDsl.g:19060:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0()); 
@@ -62366,14 +62366,14 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0__1"
-    // InternalPerspectiveDsl.g:19067:1: rule__XFunctionTypeRef__Group_0__1 : rule__XFunctionTypeRef__Group_0__1__Impl rule__XFunctionTypeRef__Group_0__2 ;
+    // InternalPerspectiveDsl.g:19069:1: rule__XFunctionTypeRef__Group_0__1 : rule__XFunctionTypeRef__Group_0__1__Impl rule__XFunctionTypeRef__Group_0__2 ;
     public final void rule__XFunctionTypeRef__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19071:1: ( rule__XFunctionTypeRef__Group_0__1__Impl rule__XFunctionTypeRef__Group_0__2 )
-            // InternalPerspectiveDsl.g:19072:2: rule__XFunctionTypeRef__Group_0__1__Impl rule__XFunctionTypeRef__Group_0__2
+            // InternalPerspectiveDsl.g:19073:1: ( rule__XFunctionTypeRef__Group_0__1__Impl rule__XFunctionTypeRef__Group_0__2 )
+            // InternalPerspectiveDsl.g:19074:2: rule__XFunctionTypeRef__Group_0__1__Impl rule__XFunctionTypeRef__Group_0__2
             {
             pushFollow(FOLLOW_134);
             rule__XFunctionTypeRef__Group_0__1__Impl();
@@ -62404,22 +62404,22 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0__1__Impl"
-    // InternalPerspectiveDsl.g:19079:1: rule__XFunctionTypeRef__Group_0__1__Impl : ( ( rule__XFunctionTypeRef__Group_0_1__0 )? ) ;
+    // InternalPerspectiveDsl.g:19081:1: rule__XFunctionTypeRef__Group_0__1__Impl : ( ( rule__XFunctionTypeRef__Group_0_1__0 )? ) ;
     public final void rule__XFunctionTypeRef__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19083:1: ( ( ( rule__XFunctionTypeRef__Group_0_1__0 )? ) )
-            // InternalPerspectiveDsl.g:19084:1: ( ( rule__XFunctionTypeRef__Group_0_1__0 )? )
+            // InternalPerspectiveDsl.g:19085:1: ( ( ( rule__XFunctionTypeRef__Group_0_1__0 )? ) )
+            // InternalPerspectiveDsl.g:19086:1: ( ( rule__XFunctionTypeRef__Group_0_1__0 )? )
             {
-            // InternalPerspectiveDsl.g:19084:1: ( ( rule__XFunctionTypeRef__Group_0_1__0 )? )
-            // InternalPerspectiveDsl.g:19085:2: ( rule__XFunctionTypeRef__Group_0_1__0 )?
+            // InternalPerspectiveDsl.g:19086:1: ( ( rule__XFunctionTypeRef__Group_0_1__0 )? )
+            // InternalPerspectiveDsl.g:19087:2: ( rule__XFunctionTypeRef__Group_0_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1()); 
             }
-            // InternalPerspectiveDsl.g:19086:2: ( rule__XFunctionTypeRef__Group_0_1__0 )?
+            // InternalPerspectiveDsl.g:19088:2: ( rule__XFunctionTypeRef__Group_0_1__0 )?
             int alt133=2;
             int LA133_0 = input.LA(1);
 
@@ -62428,7 +62428,7 @@
             }
             switch (alt133) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:19086:3: rule__XFunctionTypeRef__Group_0_1__0
+                    // InternalPerspectiveDsl.g:19088:3: rule__XFunctionTypeRef__Group_0_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XFunctionTypeRef__Group_0_1__0();
@@ -62466,14 +62466,14 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0__2"
-    // InternalPerspectiveDsl.g:19094:1: rule__XFunctionTypeRef__Group_0__2 : rule__XFunctionTypeRef__Group_0__2__Impl ;
+    // InternalPerspectiveDsl.g:19096:1: rule__XFunctionTypeRef__Group_0__2 : rule__XFunctionTypeRef__Group_0__2__Impl ;
     public final void rule__XFunctionTypeRef__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19098:1: ( rule__XFunctionTypeRef__Group_0__2__Impl )
-            // InternalPerspectiveDsl.g:19099:2: rule__XFunctionTypeRef__Group_0__2__Impl
+            // InternalPerspectiveDsl.g:19100:1: ( rule__XFunctionTypeRef__Group_0__2__Impl )
+            // InternalPerspectiveDsl.g:19101:2: rule__XFunctionTypeRef__Group_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFunctionTypeRef__Group_0__2__Impl();
@@ -62499,17 +62499,17 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0__2__Impl"
-    // InternalPerspectiveDsl.g:19105:1: rule__XFunctionTypeRef__Group_0__2__Impl : ( ')' ) ;
+    // InternalPerspectiveDsl.g:19107:1: rule__XFunctionTypeRef__Group_0__2__Impl : ( ')' ) ;
     public final void rule__XFunctionTypeRef__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19109:1: ( ( ')' ) )
-            // InternalPerspectiveDsl.g:19110:1: ( ')' )
+            // InternalPerspectiveDsl.g:19111:1: ( ( ')' ) )
+            // InternalPerspectiveDsl.g:19112:1: ( ')' )
             {
-            // InternalPerspectiveDsl.g:19110:1: ( ')' )
-            // InternalPerspectiveDsl.g:19111:2: ')'
+            // InternalPerspectiveDsl.g:19112:1: ( ')' )
+            // InternalPerspectiveDsl.g:19113:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2()); 
@@ -62540,14 +62540,14 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0_1__0"
-    // InternalPerspectiveDsl.g:19121:1: rule__XFunctionTypeRef__Group_0_1__0 : rule__XFunctionTypeRef__Group_0_1__0__Impl rule__XFunctionTypeRef__Group_0_1__1 ;
+    // InternalPerspectiveDsl.g:19123:1: rule__XFunctionTypeRef__Group_0_1__0 : rule__XFunctionTypeRef__Group_0_1__0__Impl rule__XFunctionTypeRef__Group_0_1__1 ;
     public final void rule__XFunctionTypeRef__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19125:1: ( rule__XFunctionTypeRef__Group_0_1__0__Impl rule__XFunctionTypeRef__Group_0_1__1 )
-            // InternalPerspectiveDsl.g:19126:2: rule__XFunctionTypeRef__Group_0_1__0__Impl rule__XFunctionTypeRef__Group_0_1__1
+            // InternalPerspectiveDsl.g:19127:1: ( rule__XFunctionTypeRef__Group_0_1__0__Impl rule__XFunctionTypeRef__Group_0_1__1 )
+            // InternalPerspectiveDsl.g:19128:2: rule__XFunctionTypeRef__Group_0_1__0__Impl rule__XFunctionTypeRef__Group_0_1__1
             {
             pushFollow(FOLLOW_52);
             rule__XFunctionTypeRef__Group_0_1__0__Impl();
@@ -62578,23 +62578,23 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0_1__0__Impl"
-    // InternalPerspectiveDsl.g:19133:1: rule__XFunctionTypeRef__Group_0_1__0__Impl : ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) ) ;
+    // InternalPerspectiveDsl.g:19135:1: rule__XFunctionTypeRef__Group_0_1__0__Impl : ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) ) ;
     public final void rule__XFunctionTypeRef__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19137:1: ( ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) ) )
-            // InternalPerspectiveDsl.g:19138:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) )
+            // InternalPerspectiveDsl.g:19139:1: ( ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) ) )
+            // InternalPerspectiveDsl.g:19140:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) )
             {
-            // InternalPerspectiveDsl.g:19138:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) )
-            // InternalPerspectiveDsl.g:19139:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 )
+            // InternalPerspectiveDsl.g:19140:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) )
+            // InternalPerspectiveDsl.g:19141:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:19140:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 )
-            // InternalPerspectiveDsl.g:19140:3: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0
+            // InternalPerspectiveDsl.g:19142:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 )
+            // InternalPerspectiveDsl.g:19142:3: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0
             {
             pushFollow(FOLLOW_2);
             rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0();
@@ -62629,14 +62629,14 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0_1__1"
-    // InternalPerspectiveDsl.g:19148:1: rule__XFunctionTypeRef__Group_0_1__1 : rule__XFunctionTypeRef__Group_0_1__1__Impl ;
+    // InternalPerspectiveDsl.g:19150:1: rule__XFunctionTypeRef__Group_0_1__1 : rule__XFunctionTypeRef__Group_0_1__1__Impl ;
     public final void rule__XFunctionTypeRef__Group_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19152:1: ( rule__XFunctionTypeRef__Group_0_1__1__Impl )
-            // InternalPerspectiveDsl.g:19153:2: rule__XFunctionTypeRef__Group_0_1__1__Impl
+            // InternalPerspectiveDsl.g:19154:1: ( rule__XFunctionTypeRef__Group_0_1__1__Impl )
+            // InternalPerspectiveDsl.g:19155:2: rule__XFunctionTypeRef__Group_0_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFunctionTypeRef__Group_0_1__1__Impl();
@@ -62662,22 +62662,22 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0_1__1__Impl"
-    // InternalPerspectiveDsl.g:19159:1: rule__XFunctionTypeRef__Group_0_1__1__Impl : ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* ) ;
+    // InternalPerspectiveDsl.g:19161:1: rule__XFunctionTypeRef__Group_0_1__1__Impl : ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* ) ;
     public final void rule__XFunctionTypeRef__Group_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19163:1: ( ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* ) )
-            // InternalPerspectiveDsl.g:19164:1: ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* )
+            // InternalPerspectiveDsl.g:19165:1: ( ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* ) )
+            // InternalPerspectiveDsl.g:19166:1: ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* )
             {
-            // InternalPerspectiveDsl.g:19164:1: ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* )
-            // InternalPerspectiveDsl.g:19165:2: ( rule__XFunctionTypeRef__Group_0_1_1__0 )*
+            // InternalPerspectiveDsl.g:19166:1: ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* )
+            // InternalPerspectiveDsl.g:19167:2: ( rule__XFunctionTypeRef__Group_0_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1_1()); 
             }
-            // InternalPerspectiveDsl.g:19166:2: ( rule__XFunctionTypeRef__Group_0_1_1__0 )*
+            // InternalPerspectiveDsl.g:19168:2: ( rule__XFunctionTypeRef__Group_0_1_1__0 )*
             loop134:
             do {
                 int alt134=2;
@@ -62690,7 +62690,7 @@
 
                 switch (alt134) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:19166:3: rule__XFunctionTypeRef__Group_0_1_1__0
+            	    // InternalPerspectiveDsl.g:19168:3: rule__XFunctionTypeRef__Group_0_1_1__0
             	    {
             	    pushFollow(FOLLOW_53);
             	    rule__XFunctionTypeRef__Group_0_1_1__0();
@@ -62731,14 +62731,14 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0_1_1__0"
-    // InternalPerspectiveDsl.g:19175:1: rule__XFunctionTypeRef__Group_0_1_1__0 : rule__XFunctionTypeRef__Group_0_1_1__0__Impl rule__XFunctionTypeRef__Group_0_1_1__1 ;
+    // InternalPerspectiveDsl.g:19177:1: rule__XFunctionTypeRef__Group_0_1_1__0 : rule__XFunctionTypeRef__Group_0_1_1__0__Impl rule__XFunctionTypeRef__Group_0_1_1__1 ;
     public final void rule__XFunctionTypeRef__Group_0_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19179:1: ( rule__XFunctionTypeRef__Group_0_1_1__0__Impl rule__XFunctionTypeRef__Group_0_1_1__1 )
-            // InternalPerspectiveDsl.g:19180:2: rule__XFunctionTypeRef__Group_0_1_1__0__Impl rule__XFunctionTypeRef__Group_0_1_1__1
+            // InternalPerspectiveDsl.g:19181:1: ( rule__XFunctionTypeRef__Group_0_1_1__0__Impl rule__XFunctionTypeRef__Group_0_1_1__1 )
+            // InternalPerspectiveDsl.g:19182:2: rule__XFunctionTypeRef__Group_0_1_1__0__Impl rule__XFunctionTypeRef__Group_0_1_1__1
             {
             pushFollow(FOLLOW_71);
             rule__XFunctionTypeRef__Group_0_1_1__0__Impl();
@@ -62769,17 +62769,17 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0_1_1__0__Impl"
-    // InternalPerspectiveDsl.g:19187:1: rule__XFunctionTypeRef__Group_0_1_1__0__Impl : ( ',' ) ;
+    // InternalPerspectiveDsl.g:19189:1: rule__XFunctionTypeRef__Group_0_1_1__0__Impl : ( ',' ) ;
     public final void rule__XFunctionTypeRef__Group_0_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19191:1: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:19192:1: ( ',' )
+            // InternalPerspectiveDsl.g:19193:1: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:19194:1: ( ',' )
             {
-            // InternalPerspectiveDsl.g:19192:1: ( ',' )
-            // InternalPerspectiveDsl.g:19193:2: ','
+            // InternalPerspectiveDsl.g:19194:1: ( ',' )
+            // InternalPerspectiveDsl.g:19195:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0()); 
@@ -62810,14 +62810,14 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0_1_1__1"
-    // InternalPerspectiveDsl.g:19202:1: rule__XFunctionTypeRef__Group_0_1_1__1 : rule__XFunctionTypeRef__Group_0_1_1__1__Impl ;
+    // InternalPerspectiveDsl.g:19204:1: rule__XFunctionTypeRef__Group_0_1_1__1 : rule__XFunctionTypeRef__Group_0_1_1__1__Impl ;
     public final void rule__XFunctionTypeRef__Group_0_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19206:1: ( rule__XFunctionTypeRef__Group_0_1_1__1__Impl )
-            // InternalPerspectiveDsl.g:19207:2: rule__XFunctionTypeRef__Group_0_1_1__1__Impl
+            // InternalPerspectiveDsl.g:19208:1: ( rule__XFunctionTypeRef__Group_0_1_1__1__Impl )
+            // InternalPerspectiveDsl.g:19209:2: rule__XFunctionTypeRef__Group_0_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFunctionTypeRef__Group_0_1_1__1__Impl();
@@ -62843,23 +62843,23 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0_1_1__1__Impl"
-    // InternalPerspectiveDsl.g:19213:1: rule__XFunctionTypeRef__Group_0_1_1__1__Impl : ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:19215:1: rule__XFunctionTypeRef__Group_0_1_1__1__Impl : ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) ) ;
     public final void rule__XFunctionTypeRef__Group_0_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19217:1: ( ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) ) )
-            // InternalPerspectiveDsl.g:19218:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) )
+            // InternalPerspectiveDsl.g:19219:1: ( ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) ) )
+            // InternalPerspectiveDsl.g:19220:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:19218:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) )
-            // InternalPerspectiveDsl.g:19219:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 )
+            // InternalPerspectiveDsl.g:19220:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) )
+            // InternalPerspectiveDsl.g:19221:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_1_1()); 
             }
-            // InternalPerspectiveDsl.g:19220:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 )
-            // InternalPerspectiveDsl.g:19220:3: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1
+            // InternalPerspectiveDsl.g:19222:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 )
+            // InternalPerspectiveDsl.g:19222:3: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1();
@@ -62894,14 +62894,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group__0"
-    // InternalPerspectiveDsl.g:19229:1: rule__JvmParameterizedTypeReference__Group__0 : rule__JvmParameterizedTypeReference__Group__0__Impl rule__JvmParameterizedTypeReference__Group__1 ;
+    // InternalPerspectiveDsl.g:19231:1: rule__JvmParameterizedTypeReference__Group__0 : rule__JvmParameterizedTypeReference__Group__0__Impl rule__JvmParameterizedTypeReference__Group__1 ;
     public final void rule__JvmParameterizedTypeReference__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19233:1: ( rule__JvmParameterizedTypeReference__Group__0__Impl rule__JvmParameterizedTypeReference__Group__1 )
-            // InternalPerspectiveDsl.g:19234:2: rule__JvmParameterizedTypeReference__Group__0__Impl rule__JvmParameterizedTypeReference__Group__1
+            // InternalPerspectiveDsl.g:19235:1: ( rule__JvmParameterizedTypeReference__Group__0__Impl rule__JvmParameterizedTypeReference__Group__1 )
+            // InternalPerspectiveDsl.g:19236:2: rule__JvmParameterizedTypeReference__Group__0__Impl rule__JvmParameterizedTypeReference__Group__1
             {
             pushFollow(FOLLOW_61);
             rule__JvmParameterizedTypeReference__Group__0__Impl();
@@ -62932,23 +62932,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group__0__Impl"
-    // InternalPerspectiveDsl.g:19241:1: rule__JvmParameterizedTypeReference__Group__0__Impl : ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) ) ;
+    // InternalPerspectiveDsl.g:19243:1: rule__JvmParameterizedTypeReference__Group__0__Impl : ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19245:1: ( ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) ) )
-            // InternalPerspectiveDsl.g:19246:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) )
+            // InternalPerspectiveDsl.g:19247:1: ( ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) ) )
+            // InternalPerspectiveDsl.g:19248:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) )
             {
-            // InternalPerspectiveDsl.g:19246:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) )
-            // InternalPerspectiveDsl.g:19247:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_0 )
+            // InternalPerspectiveDsl.g:19248:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) )
+            // InternalPerspectiveDsl.g:19249:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_0()); 
             }
-            // InternalPerspectiveDsl.g:19248:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_0 )
-            // InternalPerspectiveDsl.g:19248:3: rule__JvmParameterizedTypeReference__TypeAssignment_0
+            // InternalPerspectiveDsl.g:19250:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_0 )
+            // InternalPerspectiveDsl.g:19250:3: rule__JvmParameterizedTypeReference__TypeAssignment_0
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__TypeAssignment_0();
@@ -62983,14 +62983,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group__1"
-    // InternalPerspectiveDsl.g:19256:1: rule__JvmParameterizedTypeReference__Group__1 : rule__JvmParameterizedTypeReference__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:19258:1: rule__JvmParameterizedTypeReference__Group__1 : rule__JvmParameterizedTypeReference__Group__1__Impl ;
     public final void rule__JvmParameterizedTypeReference__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19260:1: ( rule__JvmParameterizedTypeReference__Group__1__Impl )
-            // InternalPerspectiveDsl.g:19261:2: rule__JvmParameterizedTypeReference__Group__1__Impl
+            // InternalPerspectiveDsl.g:19262:1: ( rule__JvmParameterizedTypeReference__Group__1__Impl )
+            // InternalPerspectiveDsl.g:19263:2: rule__JvmParameterizedTypeReference__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group__1__Impl();
@@ -63016,27 +63016,27 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group__1__Impl"
-    // InternalPerspectiveDsl.g:19267:1: rule__JvmParameterizedTypeReference__Group__1__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? ) ;
+    // InternalPerspectiveDsl.g:19269:1: rule__JvmParameterizedTypeReference__Group__1__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? ) ;
     public final void rule__JvmParameterizedTypeReference__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19271:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? ) )
-            // InternalPerspectiveDsl.g:19272:1: ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? )
+            // InternalPerspectiveDsl.g:19273:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? ) )
+            // InternalPerspectiveDsl.g:19274:1: ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? )
             {
-            // InternalPerspectiveDsl.g:19272:1: ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? )
-            // InternalPerspectiveDsl.g:19273:2: ( rule__JvmParameterizedTypeReference__Group_1__0 )?
+            // InternalPerspectiveDsl.g:19274:1: ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? )
+            // InternalPerspectiveDsl.g:19275:2: ( rule__JvmParameterizedTypeReference__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1()); 
             }
-            // InternalPerspectiveDsl.g:19274:2: ( rule__JvmParameterizedTypeReference__Group_1__0 )?
+            // InternalPerspectiveDsl.g:19276:2: ( rule__JvmParameterizedTypeReference__Group_1__0 )?
             int alt135=2;
             alt135 = dfa135.predict(input);
             switch (alt135) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:19274:3: rule__JvmParameterizedTypeReference__Group_1__0
+                    // InternalPerspectiveDsl.g:19276:3: rule__JvmParameterizedTypeReference__Group_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__JvmParameterizedTypeReference__Group_1__0();
@@ -63074,14 +63074,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__0"
-    // InternalPerspectiveDsl.g:19283:1: rule__JvmParameterizedTypeReference__Group_1__0 : rule__JvmParameterizedTypeReference__Group_1__0__Impl rule__JvmParameterizedTypeReference__Group_1__1 ;
+    // InternalPerspectiveDsl.g:19285:1: rule__JvmParameterizedTypeReference__Group_1__0 : rule__JvmParameterizedTypeReference__Group_1__0__Impl rule__JvmParameterizedTypeReference__Group_1__1 ;
     public final void rule__JvmParameterizedTypeReference__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19287:1: ( rule__JvmParameterizedTypeReference__Group_1__0__Impl rule__JvmParameterizedTypeReference__Group_1__1 )
-            // InternalPerspectiveDsl.g:19288:2: rule__JvmParameterizedTypeReference__Group_1__0__Impl rule__JvmParameterizedTypeReference__Group_1__1
+            // InternalPerspectiveDsl.g:19289:1: ( rule__JvmParameterizedTypeReference__Group_1__0__Impl rule__JvmParameterizedTypeReference__Group_1__1 )
+            // InternalPerspectiveDsl.g:19290:2: rule__JvmParameterizedTypeReference__Group_1__0__Impl rule__JvmParameterizedTypeReference__Group_1__1
             {
             pushFollow(FOLLOW_91);
             rule__JvmParameterizedTypeReference__Group_1__0__Impl();
@@ -63112,23 +63112,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__0__Impl"
-    // InternalPerspectiveDsl.g:19295:1: rule__JvmParameterizedTypeReference__Group_1__0__Impl : ( ( '<' ) ) ;
+    // InternalPerspectiveDsl.g:19297:1: rule__JvmParameterizedTypeReference__Group_1__0__Impl : ( ( '<' ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19299:1: ( ( ( '<' ) ) )
-            // InternalPerspectiveDsl.g:19300:1: ( ( '<' ) )
+            // InternalPerspectiveDsl.g:19301:1: ( ( ( '<' ) ) )
+            // InternalPerspectiveDsl.g:19302:1: ( ( '<' ) )
             {
-            // InternalPerspectiveDsl.g:19300:1: ( ( '<' ) )
-            // InternalPerspectiveDsl.g:19301:2: ( '<' )
+            // InternalPerspectiveDsl.g:19302:1: ( ( '<' ) )
+            // InternalPerspectiveDsl.g:19303:2: ( '<' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0()); 
             }
-            // InternalPerspectiveDsl.g:19302:2: ( '<' )
-            // InternalPerspectiveDsl.g:19302:3: '<'
+            // InternalPerspectiveDsl.g:19304:2: ( '<' )
+            // InternalPerspectiveDsl.g:19304:3: '<'
             {
             match(input,27,FOLLOW_2); if (state.failed) return ;
 
@@ -63159,14 +63159,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__1"
-    // InternalPerspectiveDsl.g:19310:1: rule__JvmParameterizedTypeReference__Group_1__1 : rule__JvmParameterizedTypeReference__Group_1__1__Impl rule__JvmParameterizedTypeReference__Group_1__2 ;
+    // InternalPerspectiveDsl.g:19312:1: rule__JvmParameterizedTypeReference__Group_1__1 : rule__JvmParameterizedTypeReference__Group_1__1__Impl rule__JvmParameterizedTypeReference__Group_1__2 ;
     public final void rule__JvmParameterizedTypeReference__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19314:1: ( rule__JvmParameterizedTypeReference__Group_1__1__Impl rule__JvmParameterizedTypeReference__Group_1__2 )
-            // InternalPerspectiveDsl.g:19315:2: rule__JvmParameterizedTypeReference__Group_1__1__Impl rule__JvmParameterizedTypeReference__Group_1__2
+            // InternalPerspectiveDsl.g:19316:1: ( rule__JvmParameterizedTypeReference__Group_1__1__Impl rule__JvmParameterizedTypeReference__Group_1__2 )
+            // InternalPerspectiveDsl.g:19317:2: rule__JvmParameterizedTypeReference__Group_1__1__Impl rule__JvmParameterizedTypeReference__Group_1__2
             {
             pushFollow(FOLLOW_92);
             rule__JvmParameterizedTypeReference__Group_1__1__Impl();
@@ -63197,23 +63197,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__1__Impl"
-    // InternalPerspectiveDsl.g:19322:1: rule__JvmParameterizedTypeReference__Group_1__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) ) ;
+    // InternalPerspectiveDsl.g:19324:1: rule__JvmParameterizedTypeReference__Group_1__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19326:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) ) )
-            // InternalPerspectiveDsl.g:19327:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) )
+            // InternalPerspectiveDsl.g:19328:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) ) )
+            // InternalPerspectiveDsl.g:19329:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) )
             {
-            // InternalPerspectiveDsl.g:19327:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) )
-            // InternalPerspectiveDsl.g:19328:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 )
+            // InternalPerspectiveDsl.g:19329:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) )
+            // InternalPerspectiveDsl.g:19330:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_1()); 
             }
-            // InternalPerspectiveDsl.g:19329:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 )
-            // InternalPerspectiveDsl.g:19329:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1
+            // InternalPerspectiveDsl.g:19331:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 )
+            // InternalPerspectiveDsl.g:19331:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1();
@@ -63248,14 +63248,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__2"
-    // InternalPerspectiveDsl.g:19337:1: rule__JvmParameterizedTypeReference__Group_1__2 : rule__JvmParameterizedTypeReference__Group_1__2__Impl rule__JvmParameterizedTypeReference__Group_1__3 ;
+    // InternalPerspectiveDsl.g:19339:1: rule__JvmParameterizedTypeReference__Group_1__2 : rule__JvmParameterizedTypeReference__Group_1__2__Impl rule__JvmParameterizedTypeReference__Group_1__3 ;
     public final void rule__JvmParameterizedTypeReference__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19341:1: ( rule__JvmParameterizedTypeReference__Group_1__2__Impl rule__JvmParameterizedTypeReference__Group_1__3 )
-            // InternalPerspectiveDsl.g:19342:2: rule__JvmParameterizedTypeReference__Group_1__2__Impl rule__JvmParameterizedTypeReference__Group_1__3
+            // InternalPerspectiveDsl.g:19343:1: ( rule__JvmParameterizedTypeReference__Group_1__2__Impl rule__JvmParameterizedTypeReference__Group_1__3 )
+            // InternalPerspectiveDsl.g:19344:2: rule__JvmParameterizedTypeReference__Group_1__2__Impl rule__JvmParameterizedTypeReference__Group_1__3
             {
             pushFollow(FOLLOW_92);
             rule__JvmParameterizedTypeReference__Group_1__2__Impl();
@@ -63286,22 +63286,22 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__2__Impl"
-    // InternalPerspectiveDsl.g:19349:1: rule__JvmParameterizedTypeReference__Group_1__2__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* ) ;
+    // InternalPerspectiveDsl.g:19351:1: rule__JvmParameterizedTypeReference__Group_1__2__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19353:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* ) )
-            // InternalPerspectiveDsl.g:19354:1: ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* )
+            // InternalPerspectiveDsl.g:19355:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* ) )
+            // InternalPerspectiveDsl.g:19356:1: ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* )
             {
-            // InternalPerspectiveDsl.g:19354:1: ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* )
-            // InternalPerspectiveDsl.g:19355:2: ( rule__JvmParameterizedTypeReference__Group_1_2__0 )*
+            // InternalPerspectiveDsl.g:19356:1: ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* )
+            // InternalPerspectiveDsl.g:19357:2: ( rule__JvmParameterizedTypeReference__Group_1_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_2()); 
             }
-            // InternalPerspectiveDsl.g:19356:2: ( rule__JvmParameterizedTypeReference__Group_1_2__0 )*
+            // InternalPerspectiveDsl.g:19358:2: ( rule__JvmParameterizedTypeReference__Group_1_2__0 )*
             loop136:
             do {
                 int alt136=2;
@@ -63314,7 +63314,7 @@
 
                 switch (alt136) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:19356:3: rule__JvmParameterizedTypeReference__Group_1_2__0
+            	    // InternalPerspectiveDsl.g:19358:3: rule__JvmParameterizedTypeReference__Group_1_2__0
             	    {
             	    pushFollow(FOLLOW_53);
             	    rule__JvmParameterizedTypeReference__Group_1_2__0();
@@ -63355,14 +63355,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__3"
-    // InternalPerspectiveDsl.g:19364:1: rule__JvmParameterizedTypeReference__Group_1__3 : rule__JvmParameterizedTypeReference__Group_1__3__Impl rule__JvmParameterizedTypeReference__Group_1__4 ;
+    // InternalPerspectiveDsl.g:19366:1: rule__JvmParameterizedTypeReference__Group_1__3 : rule__JvmParameterizedTypeReference__Group_1__3__Impl rule__JvmParameterizedTypeReference__Group_1__4 ;
     public final void rule__JvmParameterizedTypeReference__Group_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19368:1: ( rule__JvmParameterizedTypeReference__Group_1__3__Impl rule__JvmParameterizedTypeReference__Group_1__4 )
-            // InternalPerspectiveDsl.g:19369:2: rule__JvmParameterizedTypeReference__Group_1__3__Impl rule__JvmParameterizedTypeReference__Group_1__4
+            // InternalPerspectiveDsl.g:19370:1: ( rule__JvmParameterizedTypeReference__Group_1__3__Impl rule__JvmParameterizedTypeReference__Group_1__4 )
+            // InternalPerspectiveDsl.g:19371:2: rule__JvmParameterizedTypeReference__Group_1__3__Impl rule__JvmParameterizedTypeReference__Group_1__4
             {
             pushFollow(FOLLOW_131);
             rule__JvmParameterizedTypeReference__Group_1__3__Impl();
@@ -63393,17 +63393,17 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__3__Impl"
-    // InternalPerspectiveDsl.g:19376:1: rule__JvmParameterizedTypeReference__Group_1__3__Impl : ( '>' ) ;
+    // InternalPerspectiveDsl.g:19378:1: rule__JvmParameterizedTypeReference__Group_1__3__Impl : ( '>' ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19380:1: ( ( '>' ) )
-            // InternalPerspectiveDsl.g:19381:1: ( '>' )
+            // InternalPerspectiveDsl.g:19382:1: ( ( '>' ) )
+            // InternalPerspectiveDsl.g:19383:1: ( '>' )
             {
-            // InternalPerspectiveDsl.g:19381:1: ( '>' )
-            // InternalPerspectiveDsl.g:19382:2: '>'
+            // InternalPerspectiveDsl.g:19383:1: ( '>' )
+            // InternalPerspectiveDsl.g:19384:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3()); 
@@ -63434,14 +63434,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__4"
-    // InternalPerspectiveDsl.g:19391:1: rule__JvmParameterizedTypeReference__Group_1__4 : rule__JvmParameterizedTypeReference__Group_1__4__Impl ;
+    // InternalPerspectiveDsl.g:19393:1: rule__JvmParameterizedTypeReference__Group_1__4 : rule__JvmParameterizedTypeReference__Group_1__4__Impl ;
     public final void rule__JvmParameterizedTypeReference__Group_1__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19395:1: ( rule__JvmParameterizedTypeReference__Group_1__4__Impl )
-            // InternalPerspectiveDsl.g:19396:2: rule__JvmParameterizedTypeReference__Group_1__4__Impl
+            // InternalPerspectiveDsl.g:19397:1: ( rule__JvmParameterizedTypeReference__Group_1__4__Impl )
+            // InternalPerspectiveDsl.g:19398:2: rule__JvmParameterizedTypeReference__Group_1__4__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group_1__4__Impl();
@@ -63467,22 +63467,22 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__4__Impl"
-    // InternalPerspectiveDsl.g:19402:1: rule__JvmParameterizedTypeReference__Group_1__4__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* ) ;
+    // InternalPerspectiveDsl.g:19404:1: rule__JvmParameterizedTypeReference__Group_1__4__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19406:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* ) )
-            // InternalPerspectiveDsl.g:19407:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* )
+            // InternalPerspectiveDsl.g:19408:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* ) )
+            // InternalPerspectiveDsl.g:19409:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* )
             {
-            // InternalPerspectiveDsl.g:19407:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* )
-            // InternalPerspectiveDsl.g:19408:2: ( rule__JvmParameterizedTypeReference__Group_1_4__0 )*
+            // InternalPerspectiveDsl.g:19409:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* )
+            // InternalPerspectiveDsl.g:19410:2: ( rule__JvmParameterizedTypeReference__Group_1_4__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4()); 
             }
-            // InternalPerspectiveDsl.g:19409:2: ( rule__JvmParameterizedTypeReference__Group_1_4__0 )*
+            // InternalPerspectiveDsl.g:19411:2: ( rule__JvmParameterizedTypeReference__Group_1_4__0 )*
             loop137:
             do {
                 int alt137=2;
@@ -63507,7 +63507,7 @@
 
                 switch (alt137) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:19409:3: rule__JvmParameterizedTypeReference__Group_1_4__0
+            	    // InternalPerspectiveDsl.g:19411:3: rule__JvmParameterizedTypeReference__Group_1_4__0
             	    {
             	    pushFollow(FOLLOW_132);
             	    rule__JvmParameterizedTypeReference__Group_1_4__0();
@@ -63548,14 +63548,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_2__0"
-    // InternalPerspectiveDsl.g:19418:1: rule__JvmParameterizedTypeReference__Group_1_2__0 : rule__JvmParameterizedTypeReference__Group_1_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_2__1 ;
+    // InternalPerspectiveDsl.g:19420:1: rule__JvmParameterizedTypeReference__Group_1_2__0 : rule__JvmParameterizedTypeReference__Group_1_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_2__1 ;
     public final void rule__JvmParameterizedTypeReference__Group_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19422:1: ( rule__JvmParameterizedTypeReference__Group_1_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_2__1 )
-            // InternalPerspectiveDsl.g:19423:2: rule__JvmParameterizedTypeReference__Group_1_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_2__1
+            // InternalPerspectiveDsl.g:19424:1: ( rule__JvmParameterizedTypeReference__Group_1_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_2__1 )
+            // InternalPerspectiveDsl.g:19425:2: rule__JvmParameterizedTypeReference__Group_1_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_2__1
             {
             pushFollow(FOLLOW_91);
             rule__JvmParameterizedTypeReference__Group_1_2__0__Impl();
@@ -63586,17 +63586,17 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_2__0__Impl"
-    // InternalPerspectiveDsl.g:19430:1: rule__JvmParameterizedTypeReference__Group_1_2__0__Impl : ( ',' ) ;
+    // InternalPerspectiveDsl.g:19432:1: rule__JvmParameterizedTypeReference__Group_1_2__0__Impl : ( ',' ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19434:1: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:19435:1: ( ',' )
+            // InternalPerspectiveDsl.g:19436:1: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:19437:1: ( ',' )
             {
-            // InternalPerspectiveDsl.g:19435:1: ( ',' )
-            // InternalPerspectiveDsl.g:19436:2: ','
+            // InternalPerspectiveDsl.g:19437:1: ( ',' )
+            // InternalPerspectiveDsl.g:19438:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0()); 
@@ -63627,14 +63627,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_2__1"
-    // InternalPerspectiveDsl.g:19445:1: rule__JvmParameterizedTypeReference__Group_1_2__1 : rule__JvmParameterizedTypeReference__Group_1_2__1__Impl ;
+    // InternalPerspectiveDsl.g:19447:1: rule__JvmParameterizedTypeReference__Group_1_2__1 : rule__JvmParameterizedTypeReference__Group_1_2__1__Impl ;
     public final void rule__JvmParameterizedTypeReference__Group_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19449:1: ( rule__JvmParameterizedTypeReference__Group_1_2__1__Impl )
-            // InternalPerspectiveDsl.g:19450:2: rule__JvmParameterizedTypeReference__Group_1_2__1__Impl
+            // InternalPerspectiveDsl.g:19451:1: ( rule__JvmParameterizedTypeReference__Group_1_2__1__Impl )
+            // InternalPerspectiveDsl.g:19452:2: rule__JvmParameterizedTypeReference__Group_1_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group_1_2__1__Impl();
@@ -63660,23 +63660,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_2__1__Impl"
-    // InternalPerspectiveDsl.g:19456:1: rule__JvmParameterizedTypeReference__Group_1_2__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) ) ;
+    // InternalPerspectiveDsl.g:19458:1: rule__JvmParameterizedTypeReference__Group_1_2__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19460:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) ) )
-            // InternalPerspectiveDsl.g:19461:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) )
+            // InternalPerspectiveDsl.g:19462:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) ) )
+            // InternalPerspectiveDsl.g:19463:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) )
             {
-            // InternalPerspectiveDsl.g:19461:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) )
-            // InternalPerspectiveDsl.g:19462:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 )
+            // InternalPerspectiveDsl.g:19463:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) )
+            // InternalPerspectiveDsl.g:19464:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_2_1()); 
             }
-            // InternalPerspectiveDsl.g:19463:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 )
-            // InternalPerspectiveDsl.g:19463:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1
+            // InternalPerspectiveDsl.g:19465:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 )
+            // InternalPerspectiveDsl.g:19465:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1();
@@ -63711,14 +63711,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__0"
-    // InternalPerspectiveDsl.g:19472:1: rule__JvmParameterizedTypeReference__Group_1_4__0 : rule__JvmParameterizedTypeReference__Group_1_4__0__Impl rule__JvmParameterizedTypeReference__Group_1_4__1 ;
+    // InternalPerspectiveDsl.g:19474:1: rule__JvmParameterizedTypeReference__Group_1_4__0 : rule__JvmParameterizedTypeReference__Group_1_4__0__Impl rule__JvmParameterizedTypeReference__Group_1_4__1 ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19476:1: ( rule__JvmParameterizedTypeReference__Group_1_4__0__Impl rule__JvmParameterizedTypeReference__Group_1_4__1 )
-            // InternalPerspectiveDsl.g:19477:2: rule__JvmParameterizedTypeReference__Group_1_4__0__Impl rule__JvmParameterizedTypeReference__Group_1_4__1
+            // InternalPerspectiveDsl.g:19478:1: ( rule__JvmParameterizedTypeReference__Group_1_4__0__Impl rule__JvmParameterizedTypeReference__Group_1_4__1 )
+            // InternalPerspectiveDsl.g:19479:2: rule__JvmParameterizedTypeReference__Group_1_4__0__Impl rule__JvmParameterizedTypeReference__Group_1_4__1
             {
             pushFollow(FOLLOW_7);
             rule__JvmParameterizedTypeReference__Group_1_4__0__Impl();
@@ -63749,23 +63749,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__0__Impl"
-    // InternalPerspectiveDsl.g:19484:1: rule__JvmParameterizedTypeReference__Group_1_4__0__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:19486:1: rule__JvmParameterizedTypeReference__Group_1_4__0__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19488:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) ) )
-            // InternalPerspectiveDsl.g:19489:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) )
+            // InternalPerspectiveDsl.g:19490:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) ) )
+            // InternalPerspectiveDsl.g:19491:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:19489:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) )
-            // InternalPerspectiveDsl.g:19490:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 )
+            // InternalPerspectiveDsl.g:19491:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) )
+            // InternalPerspectiveDsl.g:19492:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0()); 
             }
-            // InternalPerspectiveDsl.g:19491:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 )
-            // InternalPerspectiveDsl.g:19491:3: rule__JvmParameterizedTypeReference__Group_1_4_0__0
+            // InternalPerspectiveDsl.g:19493:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 )
+            // InternalPerspectiveDsl.g:19493:3: rule__JvmParameterizedTypeReference__Group_1_4_0__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group_1_4_0__0();
@@ -63800,14 +63800,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__1"
-    // InternalPerspectiveDsl.g:19499:1: rule__JvmParameterizedTypeReference__Group_1_4__1 : rule__JvmParameterizedTypeReference__Group_1_4__1__Impl rule__JvmParameterizedTypeReference__Group_1_4__2 ;
+    // InternalPerspectiveDsl.g:19501:1: rule__JvmParameterizedTypeReference__Group_1_4__1 : rule__JvmParameterizedTypeReference__Group_1_4__1__Impl rule__JvmParameterizedTypeReference__Group_1_4__2 ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19503:1: ( rule__JvmParameterizedTypeReference__Group_1_4__1__Impl rule__JvmParameterizedTypeReference__Group_1_4__2 )
-            // InternalPerspectiveDsl.g:19504:2: rule__JvmParameterizedTypeReference__Group_1_4__1__Impl rule__JvmParameterizedTypeReference__Group_1_4__2
+            // InternalPerspectiveDsl.g:19505:1: ( rule__JvmParameterizedTypeReference__Group_1_4__1__Impl rule__JvmParameterizedTypeReference__Group_1_4__2 )
+            // InternalPerspectiveDsl.g:19506:2: rule__JvmParameterizedTypeReference__Group_1_4__1__Impl rule__JvmParameterizedTypeReference__Group_1_4__2
             {
             pushFollow(FOLLOW_61);
             rule__JvmParameterizedTypeReference__Group_1_4__1__Impl();
@@ -63838,23 +63838,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__1__Impl"
-    // InternalPerspectiveDsl.g:19511:1: rule__JvmParameterizedTypeReference__Group_1_4__1__Impl : ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) ) ;
+    // InternalPerspectiveDsl.g:19513:1: rule__JvmParameterizedTypeReference__Group_1_4__1__Impl : ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19515:1: ( ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) ) )
-            // InternalPerspectiveDsl.g:19516:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) )
+            // InternalPerspectiveDsl.g:19517:1: ( ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) ) )
+            // InternalPerspectiveDsl.g:19518:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) )
             {
-            // InternalPerspectiveDsl.g:19516:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) )
-            // InternalPerspectiveDsl.g:19517:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 )
+            // InternalPerspectiveDsl.g:19518:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) )
+            // InternalPerspectiveDsl.g:19519:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_1_4_1()); 
             }
-            // InternalPerspectiveDsl.g:19518:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 )
-            // InternalPerspectiveDsl.g:19518:3: rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1
+            // InternalPerspectiveDsl.g:19520:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 )
+            // InternalPerspectiveDsl.g:19520:3: rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1();
@@ -63889,14 +63889,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__2"
-    // InternalPerspectiveDsl.g:19526:1: rule__JvmParameterizedTypeReference__Group_1_4__2 : rule__JvmParameterizedTypeReference__Group_1_4__2__Impl ;
+    // InternalPerspectiveDsl.g:19528:1: rule__JvmParameterizedTypeReference__Group_1_4__2 : rule__JvmParameterizedTypeReference__Group_1_4__2__Impl ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19530:1: ( rule__JvmParameterizedTypeReference__Group_1_4__2__Impl )
-            // InternalPerspectiveDsl.g:19531:2: rule__JvmParameterizedTypeReference__Group_1_4__2__Impl
+            // InternalPerspectiveDsl.g:19532:1: ( rule__JvmParameterizedTypeReference__Group_1_4__2__Impl )
+            // InternalPerspectiveDsl.g:19533:2: rule__JvmParameterizedTypeReference__Group_1_4__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group_1_4__2__Impl();
@@ -63922,27 +63922,27 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__2__Impl"
-    // InternalPerspectiveDsl.g:19537:1: rule__JvmParameterizedTypeReference__Group_1_4__2__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? ) ;
+    // InternalPerspectiveDsl.g:19539:1: rule__JvmParameterizedTypeReference__Group_1_4__2__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19541:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? ) )
-            // InternalPerspectiveDsl.g:19542:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? )
+            // InternalPerspectiveDsl.g:19543:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? ) )
+            // InternalPerspectiveDsl.g:19544:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? )
             {
-            // InternalPerspectiveDsl.g:19542:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? )
-            // InternalPerspectiveDsl.g:19543:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )?
+            // InternalPerspectiveDsl.g:19544:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? )
+            // InternalPerspectiveDsl.g:19545:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2()); 
             }
-            // InternalPerspectiveDsl.g:19544:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )?
+            // InternalPerspectiveDsl.g:19546:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )?
             int alt138=2;
             alt138 = dfa138.predict(input);
             switch (alt138) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:19544:3: rule__JvmParameterizedTypeReference__Group_1_4_2__0
+                    // InternalPerspectiveDsl.g:19546:3: rule__JvmParameterizedTypeReference__Group_1_4_2__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__JvmParameterizedTypeReference__Group_1_4_2__0();
@@ -63980,14 +63980,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0__0"
-    // InternalPerspectiveDsl.g:19553:1: rule__JvmParameterizedTypeReference__Group_1_4_0__0 : rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl ;
+    // InternalPerspectiveDsl.g:19555:1: rule__JvmParameterizedTypeReference__Group_1_4_0__0 : rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19557:1: ( rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl )
-            // InternalPerspectiveDsl.g:19558:2: rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl
+            // InternalPerspectiveDsl.g:19559:1: ( rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl )
+            // InternalPerspectiveDsl.g:19560:2: rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl();
@@ -64013,23 +64013,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl"
-    // InternalPerspectiveDsl.g:19564:1: rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) ) ;
+    // InternalPerspectiveDsl.g:19566:1: rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19568:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) ) )
-            // InternalPerspectiveDsl.g:19569:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) )
+            // InternalPerspectiveDsl.g:19570:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) ) )
+            // InternalPerspectiveDsl.g:19571:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) )
             {
-            // InternalPerspectiveDsl.g:19569:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) )
-            // InternalPerspectiveDsl.g:19570:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 )
+            // InternalPerspectiveDsl.g:19571:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) )
+            // InternalPerspectiveDsl.g:19572:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0_0()); 
             }
-            // InternalPerspectiveDsl.g:19571:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 )
-            // InternalPerspectiveDsl.g:19571:3: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0
+            // InternalPerspectiveDsl.g:19573:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 )
+            // InternalPerspectiveDsl.g:19573:3: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group_1_4_0_0__0();
@@ -64064,14 +64064,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0_0__0"
-    // InternalPerspectiveDsl.g:19580:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 : rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_0_0__1 ;
+    // InternalPerspectiveDsl.g:19582:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 : rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_0_0__1 ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19584:1: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_0_0__1 )
-            // InternalPerspectiveDsl.g:19585:2: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_0_0__1
+            // InternalPerspectiveDsl.g:19586:1: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_0_0__1 )
+            // InternalPerspectiveDsl.g:19587:2: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_0_0__1
             {
             pushFollow(FOLLOW_131);
             rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl();
@@ -64102,23 +64102,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl"
-    // InternalPerspectiveDsl.g:19592:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:19594:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl : ( () ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19596:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:19597:1: ( () )
+            // InternalPerspectiveDsl.g:19598:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:19599:1: ( () )
             {
-            // InternalPerspectiveDsl.g:19597:1: ( () )
-            // InternalPerspectiveDsl.g:19598:2: ()
+            // InternalPerspectiveDsl.g:19599:1: ( () )
+            // InternalPerspectiveDsl.g:19600:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:19599:2: ()
-            // InternalPerspectiveDsl.g:19599:3: 
+            // InternalPerspectiveDsl.g:19601:2: ()
+            // InternalPerspectiveDsl.g:19601:3: 
             {
             }
 
@@ -64143,14 +64143,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0_0__1"
-    // InternalPerspectiveDsl.g:19607:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__1 : rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl ;
+    // InternalPerspectiveDsl.g:19609:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__1 : rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19611:1: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl )
-            // InternalPerspectiveDsl.g:19612:2: rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl
+            // InternalPerspectiveDsl.g:19613:1: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl )
+            // InternalPerspectiveDsl.g:19614:2: rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl();
@@ -64176,17 +64176,17 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl"
-    // InternalPerspectiveDsl.g:19618:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl : ( '.' ) ;
+    // InternalPerspectiveDsl.g:19620:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl : ( '.' ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19622:1: ( ( '.' ) )
-            // InternalPerspectiveDsl.g:19623:1: ( '.' )
+            // InternalPerspectiveDsl.g:19624:1: ( ( '.' ) )
+            // InternalPerspectiveDsl.g:19625:1: ( '.' )
             {
-            // InternalPerspectiveDsl.g:19623:1: ( '.' )
-            // InternalPerspectiveDsl.g:19624:2: '.'
+            // InternalPerspectiveDsl.g:19625:1: ( '.' )
+            // InternalPerspectiveDsl.g:19626:2: '.'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1()); 
@@ -64217,14 +64217,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__0"
-    // InternalPerspectiveDsl.g:19634:1: rule__JvmParameterizedTypeReference__Group_1_4_2__0 : rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__1 ;
+    // InternalPerspectiveDsl.g:19636:1: rule__JvmParameterizedTypeReference__Group_1_4_2__0 : rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__1 ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19638:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__1 )
-            // InternalPerspectiveDsl.g:19639:2: rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__1
+            // InternalPerspectiveDsl.g:19640:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__1 )
+            // InternalPerspectiveDsl.g:19641:2: rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__1
             {
             pushFollow(FOLLOW_91);
             rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl();
@@ -64255,23 +64255,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl"
-    // InternalPerspectiveDsl.g:19646:1: rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl : ( ( '<' ) ) ;
+    // InternalPerspectiveDsl.g:19648:1: rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl : ( ( '<' ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19650:1: ( ( ( '<' ) ) )
-            // InternalPerspectiveDsl.g:19651:1: ( ( '<' ) )
+            // InternalPerspectiveDsl.g:19652:1: ( ( ( '<' ) ) )
+            // InternalPerspectiveDsl.g:19653:1: ( ( '<' ) )
             {
-            // InternalPerspectiveDsl.g:19651:1: ( ( '<' ) )
-            // InternalPerspectiveDsl.g:19652:2: ( '<' )
+            // InternalPerspectiveDsl.g:19653:1: ( ( '<' ) )
+            // InternalPerspectiveDsl.g:19654:2: ( '<' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0()); 
             }
-            // InternalPerspectiveDsl.g:19653:2: ( '<' )
-            // InternalPerspectiveDsl.g:19653:3: '<'
+            // InternalPerspectiveDsl.g:19655:2: ( '<' )
+            // InternalPerspectiveDsl.g:19655:3: '<'
             {
             match(input,27,FOLLOW_2); if (state.failed) return ;
 
@@ -64302,14 +64302,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__1"
-    // InternalPerspectiveDsl.g:19661:1: rule__JvmParameterizedTypeReference__Group_1_4_2__1 : rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__2 ;
+    // InternalPerspectiveDsl.g:19663:1: rule__JvmParameterizedTypeReference__Group_1_4_2__1 : rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__2 ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19665:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__2 )
-            // InternalPerspectiveDsl.g:19666:2: rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__2
+            // InternalPerspectiveDsl.g:19667:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__2 )
+            // InternalPerspectiveDsl.g:19668:2: rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__2
             {
             pushFollow(FOLLOW_92);
             rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl();
@@ -64340,23 +64340,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl"
-    // InternalPerspectiveDsl.g:19673:1: rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) ) ;
+    // InternalPerspectiveDsl.g:19675:1: rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19677:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) ) )
-            // InternalPerspectiveDsl.g:19678:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) )
+            // InternalPerspectiveDsl.g:19679:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) ) )
+            // InternalPerspectiveDsl.g:19680:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) )
             {
-            // InternalPerspectiveDsl.g:19678:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) )
-            // InternalPerspectiveDsl.g:19679:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 )
+            // InternalPerspectiveDsl.g:19680:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) )
+            // InternalPerspectiveDsl.g:19681:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_1()); 
             }
-            // InternalPerspectiveDsl.g:19680:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 )
-            // InternalPerspectiveDsl.g:19680:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1
+            // InternalPerspectiveDsl.g:19682:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 )
+            // InternalPerspectiveDsl.g:19682:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1();
@@ -64391,14 +64391,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__2"
-    // InternalPerspectiveDsl.g:19688:1: rule__JvmParameterizedTypeReference__Group_1_4_2__2 : rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__3 ;
+    // InternalPerspectiveDsl.g:19690:1: rule__JvmParameterizedTypeReference__Group_1_4_2__2 : rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__3 ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19692:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__3 )
-            // InternalPerspectiveDsl.g:19693:2: rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__3
+            // InternalPerspectiveDsl.g:19694:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__3 )
+            // InternalPerspectiveDsl.g:19695:2: rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__3
             {
             pushFollow(FOLLOW_92);
             rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl();
@@ -64429,22 +64429,22 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl"
-    // InternalPerspectiveDsl.g:19700:1: rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* ) ;
+    // InternalPerspectiveDsl.g:19702:1: rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19704:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* ) )
-            // InternalPerspectiveDsl.g:19705:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* )
+            // InternalPerspectiveDsl.g:19706:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* ) )
+            // InternalPerspectiveDsl.g:19707:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* )
             {
-            // InternalPerspectiveDsl.g:19705:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* )
-            // InternalPerspectiveDsl.g:19706:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )*
+            // InternalPerspectiveDsl.g:19707:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* )
+            // InternalPerspectiveDsl.g:19708:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2_2()); 
             }
-            // InternalPerspectiveDsl.g:19707:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )*
+            // InternalPerspectiveDsl.g:19709:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )*
             loop139:
             do {
                 int alt139=2;
@@ -64457,7 +64457,7 @@
 
                 switch (alt139) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:19707:3: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0
+            	    // InternalPerspectiveDsl.g:19709:3: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0
             	    {
             	    pushFollow(FOLLOW_53);
             	    rule__JvmParameterizedTypeReference__Group_1_4_2_2__0();
@@ -64498,14 +64498,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__3"
-    // InternalPerspectiveDsl.g:19715:1: rule__JvmParameterizedTypeReference__Group_1_4_2__3 : rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl ;
+    // InternalPerspectiveDsl.g:19717:1: rule__JvmParameterizedTypeReference__Group_1_4_2__3 : rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19719:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl )
-            // InternalPerspectiveDsl.g:19720:2: rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl
+            // InternalPerspectiveDsl.g:19721:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl )
+            // InternalPerspectiveDsl.g:19722:2: rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl();
@@ -64531,17 +64531,17 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl"
-    // InternalPerspectiveDsl.g:19726:1: rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl : ( '>' ) ;
+    // InternalPerspectiveDsl.g:19728:1: rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl : ( '>' ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19730:1: ( ( '>' ) )
-            // InternalPerspectiveDsl.g:19731:1: ( '>' )
+            // InternalPerspectiveDsl.g:19732:1: ( ( '>' ) )
+            // InternalPerspectiveDsl.g:19733:1: ( '>' )
             {
-            // InternalPerspectiveDsl.g:19731:1: ( '>' )
-            // InternalPerspectiveDsl.g:19732:2: '>'
+            // InternalPerspectiveDsl.g:19733:1: ( '>' )
+            // InternalPerspectiveDsl.g:19734:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3()); 
@@ -64572,14 +64572,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2_2__0"
-    // InternalPerspectiveDsl.g:19742:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 : rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2_2__1 ;
+    // InternalPerspectiveDsl.g:19744:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 : rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2_2__1 ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19746:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2_2__1 )
-            // InternalPerspectiveDsl.g:19747:2: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2_2__1
+            // InternalPerspectiveDsl.g:19748:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2_2__1 )
+            // InternalPerspectiveDsl.g:19749:2: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2_2__1
             {
             pushFollow(FOLLOW_91);
             rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl();
@@ -64610,17 +64610,17 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl"
-    // InternalPerspectiveDsl.g:19754:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl : ( ',' ) ;
+    // InternalPerspectiveDsl.g:19756:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl : ( ',' ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19758:1: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:19759:1: ( ',' )
+            // InternalPerspectiveDsl.g:19760:1: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:19761:1: ( ',' )
             {
-            // InternalPerspectiveDsl.g:19759:1: ( ',' )
-            // InternalPerspectiveDsl.g:19760:2: ','
+            // InternalPerspectiveDsl.g:19761:1: ( ',' )
+            // InternalPerspectiveDsl.g:19762:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0()); 
@@ -64651,14 +64651,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2_2__1"
-    // InternalPerspectiveDsl.g:19769:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__1 : rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl ;
+    // InternalPerspectiveDsl.g:19771:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__1 : rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19773:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl )
-            // InternalPerspectiveDsl.g:19774:2: rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl
+            // InternalPerspectiveDsl.g:19775:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl )
+            // InternalPerspectiveDsl.g:19776:2: rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl();
@@ -64684,23 +64684,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl"
-    // InternalPerspectiveDsl.g:19780:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) ) ;
+    // InternalPerspectiveDsl.g:19782:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19784:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) ) )
-            // InternalPerspectiveDsl.g:19785:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) )
+            // InternalPerspectiveDsl.g:19786:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) ) )
+            // InternalPerspectiveDsl.g:19787:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) )
             {
-            // InternalPerspectiveDsl.g:19785:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) )
-            // InternalPerspectiveDsl.g:19786:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 )
+            // InternalPerspectiveDsl.g:19787:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) )
+            // InternalPerspectiveDsl.g:19788:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_2_1()); 
             }
-            // InternalPerspectiveDsl.g:19787:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 )
-            // InternalPerspectiveDsl.g:19787:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1
+            // InternalPerspectiveDsl.g:19789:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 )
+            // InternalPerspectiveDsl.g:19789:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1();
@@ -64735,14 +64735,14 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group__0"
-    // InternalPerspectiveDsl.g:19796:1: rule__JvmWildcardTypeReference__Group__0 : rule__JvmWildcardTypeReference__Group__0__Impl rule__JvmWildcardTypeReference__Group__1 ;
+    // InternalPerspectiveDsl.g:19798:1: rule__JvmWildcardTypeReference__Group__0 : rule__JvmWildcardTypeReference__Group__0__Impl rule__JvmWildcardTypeReference__Group__1 ;
     public final void rule__JvmWildcardTypeReference__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19800:1: ( rule__JvmWildcardTypeReference__Group__0__Impl rule__JvmWildcardTypeReference__Group__1 )
-            // InternalPerspectiveDsl.g:19801:2: rule__JvmWildcardTypeReference__Group__0__Impl rule__JvmWildcardTypeReference__Group__1
+            // InternalPerspectiveDsl.g:19802:1: ( rule__JvmWildcardTypeReference__Group__0__Impl rule__JvmWildcardTypeReference__Group__1 )
+            // InternalPerspectiveDsl.g:19803:2: rule__JvmWildcardTypeReference__Group__0__Impl rule__JvmWildcardTypeReference__Group__1
             {
             pushFollow(FOLLOW_91);
             rule__JvmWildcardTypeReference__Group__0__Impl();
@@ -64773,23 +64773,23 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group__0__Impl"
-    // InternalPerspectiveDsl.g:19808:1: rule__JvmWildcardTypeReference__Group__0__Impl : ( () ) ;
+    // InternalPerspectiveDsl.g:19810:1: rule__JvmWildcardTypeReference__Group__0__Impl : ( () ) ;
     public final void rule__JvmWildcardTypeReference__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19812:1: ( ( () ) )
-            // InternalPerspectiveDsl.g:19813:1: ( () )
+            // InternalPerspectiveDsl.g:19814:1: ( ( () ) )
+            // InternalPerspectiveDsl.g:19815:1: ( () )
             {
-            // InternalPerspectiveDsl.g:19813:1: ( () )
-            // InternalPerspectiveDsl.g:19814:2: ()
+            // InternalPerspectiveDsl.g:19815:1: ( () )
+            // InternalPerspectiveDsl.g:19816:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0()); 
             }
-            // InternalPerspectiveDsl.g:19815:2: ()
-            // InternalPerspectiveDsl.g:19815:3: 
+            // InternalPerspectiveDsl.g:19817:2: ()
+            // InternalPerspectiveDsl.g:19817:3: 
             {
             }
 
@@ -64814,14 +64814,14 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group__1"
-    // InternalPerspectiveDsl.g:19823:1: rule__JvmWildcardTypeReference__Group__1 : rule__JvmWildcardTypeReference__Group__1__Impl rule__JvmWildcardTypeReference__Group__2 ;
+    // InternalPerspectiveDsl.g:19825:1: rule__JvmWildcardTypeReference__Group__1 : rule__JvmWildcardTypeReference__Group__1__Impl rule__JvmWildcardTypeReference__Group__2 ;
     public final void rule__JvmWildcardTypeReference__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19827:1: ( rule__JvmWildcardTypeReference__Group__1__Impl rule__JvmWildcardTypeReference__Group__2 )
-            // InternalPerspectiveDsl.g:19828:2: rule__JvmWildcardTypeReference__Group__1__Impl rule__JvmWildcardTypeReference__Group__2
+            // InternalPerspectiveDsl.g:19829:1: ( rule__JvmWildcardTypeReference__Group__1__Impl rule__JvmWildcardTypeReference__Group__2 )
+            // InternalPerspectiveDsl.g:19830:2: rule__JvmWildcardTypeReference__Group__1__Impl rule__JvmWildcardTypeReference__Group__2
             {
             pushFollow(FOLLOW_135);
             rule__JvmWildcardTypeReference__Group__1__Impl();
@@ -64852,17 +64852,17 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group__1__Impl"
-    // InternalPerspectiveDsl.g:19835:1: rule__JvmWildcardTypeReference__Group__1__Impl : ( '?' ) ;
+    // InternalPerspectiveDsl.g:19837:1: rule__JvmWildcardTypeReference__Group__1__Impl : ( '?' ) ;
     public final void rule__JvmWildcardTypeReference__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19839:1: ( ( '?' ) )
-            // InternalPerspectiveDsl.g:19840:1: ( '?' )
+            // InternalPerspectiveDsl.g:19841:1: ( ( '?' ) )
+            // InternalPerspectiveDsl.g:19842:1: ( '?' )
             {
-            // InternalPerspectiveDsl.g:19840:1: ( '?' )
-            // InternalPerspectiveDsl.g:19841:2: '?'
+            // InternalPerspectiveDsl.g:19842:1: ( '?' )
+            // InternalPerspectiveDsl.g:19843:2: '?'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1()); 
@@ -64893,14 +64893,14 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group__2"
-    // InternalPerspectiveDsl.g:19850:1: rule__JvmWildcardTypeReference__Group__2 : rule__JvmWildcardTypeReference__Group__2__Impl ;
+    // InternalPerspectiveDsl.g:19852:1: rule__JvmWildcardTypeReference__Group__2 : rule__JvmWildcardTypeReference__Group__2__Impl ;
     public final void rule__JvmWildcardTypeReference__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19854:1: ( rule__JvmWildcardTypeReference__Group__2__Impl )
-            // InternalPerspectiveDsl.g:19855:2: rule__JvmWildcardTypeReference__Group__2__Impl
+            // InternalPerspectiveDsl.g:19856:1: ( rule__JvmWildcardTypeReference__Group__2__Impl )
+            // InternalPerspectiveDsl.g:19857:2: rule__JvmWildcardTypeReference__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmWildcardTypeReference__Group__2__Impl();
@@ -64926,22 +64926,22 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group__2__Impl"
-    // InternalPerspectiveDsl.g:19861:1: rule__JvmWildcardTypeReference__Group__2__Impl : ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? ) ;
+    // InternalPerspectiveDsl.g:19863:1: rule__JvmWildcardTypeReference__Group__2__Impl : ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? ) ;
     public final void rule__JvmWildcardTypeReference__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19865:1: ( ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? ) )
-            // InternalPerspectiveDsl.g:19866:1: ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? )
+            // InternalPerspectiveDsl.g:19867:1: ( ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? ) )
+            // InternalPerspectiveDsl.g:19868:1: ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? )
             {
-            // InternalPerspectiveDsl.g:19866:1: ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? )
-            // InternalPerspectiveDsl.g:19867:2: ( rule__JvmWildcardTypeReference__Alternatives_2 )?
+            // InternalPerspectiveDsl.g:19868:1: ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? )
+            // InternalPerspectiveDsl.g:19869:2: ( rule__JvmWildcardTypeReference__Alternatives_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getAlternatives_2()); 
             }
-            // InternalPerspectiveDsl.g:19868:2: ( rule__JvmWildcardTypeReference__Alternatives_2 )?
+            // InternalPerspectiveDsl.g:19870:2: ( rule__JvmWildcardTypeReference__Alternatives_2 )?
             int alt140=2;
             int LA140_0 = input.LA(1);
 
@@ -64950,7 +64950,7 @@
             }
             switch (alt140) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:19868:3: rule__JvmWildcardTypeReference__Alternatives_2
+                    // InternalPerspectiveDsl.g:19870:3: rule__JvmWildcardTypeReference__Alternatives_2
                     {
                     pushFollow(FOLLOW_2);
                     rule__JvmWildcardTypeReference__Alternatives_2();
@@ -64988,14 +64988,14 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_0__0"
-    // InternalPerspectiveDsl.g:19877:1: rule__JvmWildcardTypeReference__Group_2_0__0 : rule__JvmWildcardTypeReference__Group_2_0__0__Impl rule__JvmWildcardTypeReference__Group_2_0__1 ;
+    // InternalPerspectiveDsl.g:19879:1: rule__JvmWildcardTypeReference__Group_2_0__0 : rule__JvmWildcardTypeReference__Group_2_0__0__Impl rule__JvmWildcardTypeReference__Group_2_0__1 ;
     public final void rule__JvmWildcardTypeReference__Group_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19881:1: ( rule__JvmWildcardTypeReference__Group_2_0__0__Impl rule__JvmWildcardTypeReference__Group_2_0__1 )
-            // InternalPerspectiveDsl.g:19882:2: rule__JvmWildcardTypeReference__Group_2_0__0__Impl rule__JvmWildcardTypeReference__Group_2_0__1
+            // InternalPerspectiveDsl.g:19883:1: ( rule__JvmWildcardTypeReference__Group_2_0__0__Impl rule__JvmWildcardTypeReference__Group_2_0__1 )
+            // InternalPerspectiveDsl.g:19884:2: rule__JvmWildcardTypeReference__Group_2_0__0__Impl rule__JvmWildcardTypeReference__Group_2_0__1
             {
             pushFollow(FOLLOW_136);
             rule__JvmWildcardTypeReference__Group_2_0__0__Impl();
@@ -65026,23 +65026,23 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_0__0__Impl"
-    // InternalPerspectiveDsl.g:19889:1: rule__JvmWildcardTypeReference__Group_2_0__0__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) ) ;
+    // InternalPerspectiveDsl.g:19891:1: rule__JvmWildcardTypeReference__Group_2_0__0__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) ) ;
     public final void rule__JvmWildcardTypeReference__Group_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19893:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) ) )
-            // InternalPerspectiveDsl.g:19894:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) )
+            // InternalPerspectiveDsl.g:19895:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) ) )
+            // InternalPerspectiveDsl.g:19896:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) )
             {
-            // InternalPerspectiveDsl.g:19894:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) )
-            // InternalPerspectiveDsl.g:19895:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 )
+            // InternalPerspectiveDsl.g:19896:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) )
+            // InternalPerspectiveDsl.g:19897:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_0()); 
             }
-            // InternalPerspectiveDsl.g:19896:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 )
-            // InternalPerspectiveDsl.g:19896:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0
+            // InternalPerspectiveDsl.g:19898:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 )
+            // InternalPerspectiveDsl.g:19898:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0
             {
             pushFollow(FOLLOW_2);
             rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0();
@@ -65077,14 +65077,14 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_0__1"
-    // InternalPerspectiveDsl.g:19904:1: rule__JvmWildcardTypeReference__Group_2_0__1 : rule__JvmWildcardTypeReference__Group_2_0__1__Impl ;
+    // InternalPerspectiveDsl.g:19906:1: rule__JvmWildcardTypeReference__Group_2_0__1 : rule__JvmWildcardTypeReference__Group_2_0__1__Impl ;
     public final void rule__JvmWildcardTypeReference__Group_2_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19908:1: ( rule__JvmWildcardTypeReference__Group_2_0__1__Impl )
-            // InternalPerspectiveDsl.g:19909:2: rule__JvmWildcardTypeReference__Group_2_0__1__Impl
+            // InternalPerspectiveDsl.g:19910:1: ( rule__JvmWildcardTypeReference__Group_2_0__1__Impl )
+            // InternalPerspectiveDsl.g:19911:2: rule__JvmWildcardTypeReference__Group_2_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmWildcardTypeReference__Group_2_0__1__Impl();
@@ -65110,22 +65110,22 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_0__1__Impl"
-    // InternalPerspectiveDsl.g:19915:1: rule__JvmWildcardTypeReference__Group_2_0__1__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* ) ;
+    // InternalPerspectiveDsl.g:19917:1: rule__JvmWildcardTypeReference__Group_2_0__1__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* ) ;
     public final void rule__JvmWildcardTypeReference__Group_2_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19919:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* ) )
-            // InternalPerspectiveDsl.g:19920:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* )
+            // InternalPerspectiveDsl.g:19921:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* ) )
+            // InternalPerspectiveDsl.g:19922:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* )
             {
-            // InternalPerspectiveDsl.g:19920:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* )
-            // InternalPerspectiveDsl.g:19921:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )*
+            // InternalPerspectiveDsl.g:19922:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* )
+            // InternalPerspectiveDsl.g:19923:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_1()); 
             }
-            // InternalPerspectiveDsl.g:19922:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )*
+            // InternalPerspectiveDsl.g:19924:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )*
             loop141:
             do {
                 int alt141=2;
@@ -65138,7 +65138,7 @@
 
                 switch (alt141) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:19922:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1
+            	    // InternalPerspectiveDsl.g:19924:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1
             	    {
             	    pushFollow(FOLLOW_137);
             	    rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1();
@@ -65179,14 +65179,14 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_1__0"
-    // InternalPerspectiveDsl.g:19931:1: rule__JvmWildcardTypeReference__Group_2_1__0 : rule__JvmWildcardTypeReference__Group_2_1__0__Impl rule__JvmWildcardTypeReference__Group_2_1__1 ;
+    // InternalPerspectiveDsl.g:19933:1: rule__JvmWildcardTypeReference__Group_2_1__0 : rule__JvmWildcardTypeReference__Group_2_1__0__Impl rule__JvmWildcardTypeReference__Group_2_1__1 ;
     public final void rule__JvmWildcardTypeReference__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19935:1: ( rule__JvmWildcardTypeReference__Group_2_1__0__Impl rule__JvmWildcardTypeReference__Group_2_1__1 )
-            // InternalPerspectiveDsl.g:19936:2: rule__JvmWildcardTypeReference__Group_2_1__0__Impl rule__JvmWildcardTypeReference__Group_2_1__1
+            // InternalPerspectiveDsl.g:19937:1: ( rule__JvmWildcardTypeReference__Group_2_1__0__Impl rule__JvmWildcardTypeReference__Group_2_1__1 )
+            // InternalPerspectiveDsl.g:19938:2: rule__JvmWildcardTypeReference__Group_2_1__0__Impl rule__JvmWildcardTypeReference__Group_2_1__1
             {
             pushFollow(FOLLOW_136);
             rule__JvmWildcardTypeReference__Group_2_1__0__Impl();
@@ -65217,23 +65217,23 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_1__0__Impl"
-    // InternalPerspectiveDsl.g:19943:1: rule__JvmWildcardTypeReference__Group_2_1__0__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) ) ;
+    // InternalPerspectiveDsl.g:19945:1: rule__JvmWildcardTypeReference__Group_2_1__0__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) ) ;
     public final void rule__JvmWildcardTypeReference__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19947:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) ) )
-            // InternalPerspectiveDsl.g:19948:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) )
+            // InternalPerspectiveDsl.g:19949:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) ) )
+            // InternalPerspectiveDsl.g:19950:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) )
             {
-            // InternalPerspectiveDsl.g:19948:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) )
-            // InternalPerspectiveDsl.g:19949:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 )
+            // InternalPerspectiveDsl.g:19950:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) )
+            // InternalPerspectiveDsl.g:19951:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_0()); 
             }
-            // InternalPerspectiveDsl.g:19950:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 )
-            // InternalPerspectiveDsl.g:19950:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0
+            // InternalPerspectiveDsl.g:19952:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 )
+            // InternalPerspectiveDsl.g:19952:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0
             {
             pushFollow(FOLLOW_2);
             rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0();
@@ -65268,14 +65268,14 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_1__1"
-    // InternalPerspectiveDsl.g:19958:1: rule__JvmWildcardTypeReference__Group_2_1__1 : rule__JvmWildcardTypeReference__Group_2_1__1__Impl ;
+    // InternalPerspectiveDsl.g:19960:1: rule__JvmWildcardTypeReference__Group_2_1__1 : rule__JvmWildcardTypeReference__Group_2_1__1__Impl ;
     public final void rule__JvmWildcardTypeReference__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19962:1: ( rule__JvmWildcardTypeReference__Group_2_1__1__Impl )
-            // InternalPerspectiveDsl.g:19963:2: rule__JvmWildcardTypeReference__Group_2_1__1__Impl
+            // InternalPerspectiveDsl.g:19964:1: ( rule__JvmWildcardTypeReference__Group_2_1__1__Impl )
+            // InternalPerspectiveDsl.g:19965:2: rule__JvmWildcardTypeReference__Group_2_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmWildcardTypeReference__Group_2_1__1__Impl();
@@ -65301,22 +65301,22 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_1__1__Impl"
-    // InternalPerspectiveDsl.g:19969:1: rule__JvmWildcardTypeReference__Group_2_1__1__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* ) ;
+    // InternalPerspectiveDsl.g:19971:1: rule__JvmWildcardTypeReference__Group_2_1__1__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* ) ;
     public final void rule__JvmWildcardTypeReference__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19973:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* ) )
-            // InternalPerspectiveDsl.g:19974:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* )
+            // InternalPerspectiveDsl.g:19975:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* ) )
+            // InternalPerspectiveDsl.g:19976:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* )
             {
-            // InternalPerspectiveDsl.g:19974:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* )
-            // InternalPerspectiveDsl.g:19975:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )*
+            // InternalPerspectiveDsl.g:19976:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* )
+            // InternalPerspectiveDsl.g:19977:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_1()); 
             }
-            // InternalPerspectiveDsl.g:19976:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )*
+            // InternalPerspectiveDsl.g:19978:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )*
             loop142:
             do {
                 int alt142=2;
@@ -65329,7 +65329,7 @@
 
                 switch (alt142) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:19976:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1
+            	    // InternalPerspectiveDsl.g:19978:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1
             	    {
             	    pushFollow(FOLLOW_137);
             	    rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1();
@@ -65370,14 +65370,14 @@
 
 
     // $ANTLR start "rule__JvmUpperBound__Group__0"
-    // InternalPerspectiveDsl.g:19985:1: rule__JvmUpperBound__Group__0 : rule__JvmUpperBound__Group__0__Impl rule__JvmUpperBound__Group__1 ;
+    // InternalPerspectiveDsl.g:19987:1: rule__JvmUpperBound__Group__0 : rule__JvmUpperBound__Group__0__Impl rule__JvmUpperBound__Group__1 ;
     public final void rule__JvmUpperBound__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:19989:1: ( rule__JvmUpperBound__Group__0__Impl rule__JvmUpperBound__Group__1 )
-            // InternalPerspectiveDsl.g:19990:2: rule__JvmUpperBound__Group__0__Impl rule__JvmUpperBound__Group__1
+            // InternalPerspectiveDsl.g:19991:1: ( rule__JvmUpperBound__Group__0__Impl rule__JvmUpperBound__Group__1 )
+            // InternalPerspectiveDsl.g:19992:2: rule__JvmUpperBound__Group__0__Impl rule__JvmUpperBound__Group__1
             {
             pushFollow(FOLLOW_71);
             rule__JvmUpperBound__Group__0__Impl();
@@ -65408,17 +65408,17 @@
 
 
     // $ANTLR start "rule__JvmUpperBound__Group__0__Impl"
-    // InternalPerspectiveDsl.g:19997:1: rule__JvmUpperBound__Group__0__Impl : ( 'extends' ) ;
+    // InternalPerspectiveDsl.g:19999:1: rule__JvmUpperBound__Group__0__Impl : ( 'extends' ) ;
     public final void rule__JvmUpperBound__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20001:1: ( ( 'extends' ) )
-            // InternalPerspectiveDsl.g:20002:1: ( 'extends' )
+            // InternalPerspectiveDsl.g:20003:1: ( ( 'extends' ) )
+            // InternalPerspectiveDsl.g:20004:1: ( 'extends' )
             {
-            // InternalPerspectiveDsl.g:20002:1: ( 'extends' )
-            // InternalPerspectiveDsl.g:20003:2: 'extends'
+            // InternalPerspectiveDsl.g:20004:1: ( 'extends' )
+            // InternalPerspectiveDsl.g:20005:2: 'extends'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0()); 
@@ -65449,14 +65449,14 @@
 
 
     // $ANTLR start "rule__JvmUpperBound__Group__1"
-    // InternalPerspectiveDsl.g:20012:1: rule__JvmUpperBound__Group__1 : rule__JvmUpperBound__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:20014:1: rule__JvmUpperBound__Group__1 : rule__JvmUpperBound__Group__1__Impl ;
     public final void rule__JvmUpperBound__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20016:1: ( rule__JvmUpperBound__Group__1__Impl )
-            // InternalPerspectiveDsl.g:20017:2: rule__JvmUpperBound__Group__1__Impl
+            // InternalPerspectiveDsl.g:20018:1: ( rule__JvmUpperBound__Group__1__Impl )
+            // InternalPerspectiveDsl.g:20019:2: rule__JvmUpperBound__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmUpperBound__Group__1__Impl();
@@ -65482,23 +65482,23 @@
 
 
     // $ANTLR start "rule__JvmUpperBound__Group__1__Impl"
-    // InternalPerspectiveDsl.g:20023:1: rule__JvmUpperBound__Group__1__Impl : ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) ) ;
+    // InternalPerspectiveDsl.g:20025:1: rule__JvmUpperBound__Group__1__Impl : ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) ) ;
     public final void rule__JvmUpperBound__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20027:1: ( ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) ) )
-            // InternalPerspectiveDsl.g:20028:1: ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) )
+            // InternalPerspectiveDsl.g:20029:1: ( ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) ) )
+            // InternalPerspectiveDsl.g:20030:1: ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) )
             {
-            // InternalPerspectiveDsl.g:20028:1: ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) )
-            // InternalPerspectiveDsl.g:20029:2: ( rule__JvmUpperBound__TypeReferenceAssignment_1 )
+            // InternalPerspectiveDsl.g:20030:1: ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) )
+            // InternalPerspectiveDsl.g:20031:2: ( rule__JvmUpperBound__TypeReferenceAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceAssignment_1()); 
             }
-            // InternalPerspectiveDsl.g:20030:2: ( rule__JvmUpperBound__TypeReferenceAssignment_1 )
-            // InternalPerspectiveDsl.g:20030:3: rule__JvmUpperBound__TypeReferenceAssignment_1
+            // InternalPerspectiveDsl.g:20032:2: ( rule__JvmUpperBound__TypeReferenceAssignment_1 )
+            // InternalPerspectiveDsl.g:20032:3: rule__JvmUpperBound__TypeReferenceAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmUpperBound__TypeReferenceAssignment_1();
@@ -65533,14 +65533,14 @@
 
 
     // $ANTLR start "rule__JvmUpperBoundAnded__Group__0"
-    // InternalPerspectiveDsl.g:20039:1: rule__JvmUpperBoundAnded__Group__0 : rule__JvmUpperBoundAnded__Group__0__Impl rule__JvmUpperBoundAnded__Group__1 ;
+    // InternalPerspectiveDsl.g:20041:1: rule__JvmUpperBoundAnded__Group__0 : rule__JvmUpperBoundAnded__Group__0__Impl rule__JvmUpperBoundAnded__Group__1 ;
     public final void rule__JvmUpperBoundAnded__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20043:1: ( rule__JvmUpperBoundAnded__Group__0__Impl rule__JvmUpperBoundAnded__Group__1 )
-            // InternalPerspectiveDsl.g:20044:2: rule__JvmUpperBoundAnded__Group__0__Impl rule__JvmUpperBoundAnded__Group__1
+            // InternalPerspectiveDsl.g:20045:1: ( rule__JvmUpperBoundAnded__Group__0__Impl rule__JvmUpperBoundAnded__Group__1 )
+            // InternalPerspectiveDsl.g:20046:2: rule__JvmUpperBoundAnded__Group__0__Impl rule__JvmUpperBoundAnded__Group__1
             {
             pushFollow(FOLLOW_71);
             rule__JvmUpperBoundAnded__Group__0__Impl();
@@ -65571,17 +65571,17 @@
 
 
     // $ANTLR start "rule__JvmUpperBoundAnded__Group__0__Impl"
-    // InternalPerspectiveDsl.g:20051:1: rule__JvmUpperBoundAnded__Group__0__Impl : ( '&' ) ;
+    // InternalPerspectiveDsl.g:20053:1: rule__JvmUpperBoundAnded__Group__0__Impl : ( '&' ) ;
     public final void rule__JvmUpperBoundAnded__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20055:1: ( ( '&' ) )
-            // InternalPerspectiveDsl.g:20056:1: ( '&' )
+            // InternalPerspectiveDsl.g:20057:1: ( ( '&' ) )
+            // InternalPerspectiveDsl.g:20058:1: ( '&' )
             {
-            // InternalPerspectiveDsl.g:20056:1: ( '&' )
-            // InternalPerspectiveDsl.g:20057:2: '&'
+            // InternalPerspectiveDsl.g:20058:1: ( '&' )
+            // InternalPerspectiveDsl.g:20059:2: '&'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0()); 
@@ -65612,14 +65612,14 @@
 
 
     // $ANTLR start "rule__JvmUpperBoundAnded__Group__1"
-    // InternalPerspectiveDsl.g:20066:1: rule__JvmUpperBoundAnded__Group__1 : rule__JvmUpperBoundAnded__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:20068:1: rule__JvmUpperBoundAnded__Group__1 : rule__JvmUpperBoundAnded__Group__1__Impl ;
     public final void rule__JvmUpperBoundAnded__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20070:1: ( rule__JvmUpperBoundAnded__Group__1__Impl )
-            // InternalPerspectiveDsl.g:20071:2: rule__JvmUpperBoundAnded__Group__1__Impl
+            // InternalPerspectiveDsl.g:20072:1: ( rule__JvmUpperBoundAnded__Group__1__Impl )
+            // InternalPerspectiveDsl.g:20073:2: rule__JvmUpperBoundAnded__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmUpperBoundAnded__Group__1__Impl();
@@ -65645,23 +65645,23 @@
 
 
     // $ANTLR start "rule__JvmUpperBoundAnded__Group__1__Impl"
-    // InternalPerspectiveDsl.g:20077:1: rule__JvmUpperBoundAnded__Group__1__Impl : ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) ) ;
+    // InternalPerspectiveDsl.g:20079:1: rule__JvmUpperBoundAnded__Group__1__Impl : ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) ) ;
     public final void rule__JvmUpperBoundAnded__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20081:1: ( ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) ) )
-            // InternalPerspectiveDsl.g:20082:1: ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) )
+            // InternalPerspectiveDsl.g:20083:1: ( ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) ) )
+            // InternalPerspectiveDsl.g:20084:1: ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) )
             {
-            // InternalPerspectiveDsl.g:20082:1: ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) )
-            // InternalPerspectiveDsl.g:20083:2: ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 )
+            // InternalPerspectiveDsl.g:20084:1: ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) )
+            // InternalPerspectiveDsl.g:20085:2: ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceAssignment_1()); 
             }
-            // InternalPerspectiveDsl.g:20084:2: ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 )
-            // InternalPerspectiveDsl.g:20084:3: rule__JvmUpperBoundAnded__TypeReferenceAssignment_1
+            // InternalPerspectiveDsl.g:20086:2: ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 )
+            // InternalPerspectiveDsl.g:20086:3: rule__JvmUpperBoundAnded__TypeReferenceAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmUpperBoundAnded__TypeReferenceAssignment_1();
@@ -65696,14 +65696,14 @@
 
 
     // $ANTLR start "rule__JvmLowerBound__Group__0"
-    // InternalPerspectiveDsl.g:20093:1: rule__JvmLowerBound__Group__0 : rule__JvmLowerBound__Group__0__Impl rule__JvmLowerBound__Group__1 ;
+    // InternalPerspectiveDsl.g:20095:1: rule__JvmLowerBound__Group__0 : rule__JvmLowerBound__Group__0__Impl rule__JvmLowerBound__Group__1 ;
     public final void rule__JvmLowerBound__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20097:1: ( rule__JvmLowerBound__Group__0__Impl rule__JvmLowerBound__Group__1 )
-            // InternalPerspectiveDsl.g:20098:2: rule__JvmLowerBound__Group__0__Impl rule__JvmLowerBound__Group__1
+            // InternalPerspectiveDsl.g:20099:1: ( rule__JvmLowerBound__Group__0__Impl rule__JvmLowerBound__Group__1 )
+            // InternalPerspectiveDsl.g:20100:2: rule__JvmLowerBound__Group__0__Impl rule__JvmLowerBound__Group__1
             {
             pushFollow(FOLLOW_71);
             rule__JvmLowerBound__Group__0__Impl();
@@ -65734,17 +65734,17 @@
 
 
     // $ANTLR start "rule__JvmLowerBound__Group__0__Impl"
-    // InternalPerspectiveDsl.g:20105:1: rule__JvmLowerBound__Group__0__Impl : ( 'super' ) ;
+    // InternalPerspectiveDsl.g:20107:1: rule__JvmLowerBound__Group__0__Impl : ( 'super' ) ;
     public final void rule__JvmLowerBound__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20109:1: ( ( 'super' ) )
-            // InternalPerspectiveDsl.g:20110:1: ( 'super' )
+            // InternalPerspectiveDsl.g:20111:1: ( ( 'super' ) )
+            // InternalPerspectiveDsl.g:20112:1: ( 'super' )
             {
-            // InternalPerspectiveDsl.g:20110:1: ( 'super' )
-            // InternalPerspectiveDsl.g:20111:2: 'super'
+            // InternalPerspectiveDsl.g:20112:1: ( 'super' )
+            // InternalPerspectiveDsl.g:20113:2: 'super'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0()); 
@@ -65775,14 +65775,14 @@
 
 
     // $ANTLR start "rule__JvmLowerBound__Group__1"
-    // InternalPerspectiveDsl.g:20120:1: rule__JvmLowerBound__Group__1 : rule__JvmLowerBound__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:20122:1: rule__JvmLowerBound__Group__1 : rule__JvmLowerBound__Group__1__Impl ;
     public final void rule__JvmLowerBound__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20124:1: ( rule__JvmLowerBound__Group__1__Impl )
-            // InternalPerspectiveDsl.g:20125:2: rule__JvmLowerBound__Group__1__Impl
+            // InternalPerspectiveDsl.g:20126:1: ( rule__JvmLowerBound__Group__1__Impl )
+            // InternalPerspectiveDsl.g:20127:2: rule__JvmLowerBound__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmLowerBound__Group__1__Impl();
@@ -65808,23 +65808,23 @@
 
 
     // $ANTLR start "rule__JvmLowerBound__Group__1__Impl"
-    // InternalPerspectiveDsl.g:20131:1: rule__JvmLowerBound__Group__1__Impl : ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) ) ;
+    // InternalPerspectiveDsl.g:20133:1: rule__JvmLowerBound__Group__1__Impl : ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) ) ;
     public final void rule__JvmLowerBound__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20135:1: ( ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) ) )
-            // InternalPerspectiveDsl.g:20136:1: ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) )
+            // InternalPerspectiveDsl.g:20137:1: ( ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) ) )
+            // InternalPerspectiveDsl.g:20138:1: ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) )
             {
-            // InternalPerspectiveDsl.g:20136:1: ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) )
-            // InternalPerspectiveDsl.g:20137:2: ( rule__JvmLowerBound__TypeReferenceAssignment_1 )
+            // InternalPerspectiveDsl.g:20138:1: ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) )
+            // InternalPerspectiveDsl.g:20139:2: ( rule__JvmLowerBound__TypeReferenceAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceAssignment_1()); 
             }
-            // InternalPerspectiveDsl.g:20138:2: ( rule__JvmLowerBound__TypeReferenceAssignment_1 )
-            // InternalPerspectiveDsl.g:20138:3: rule__JvmLowerBound__TypeReferenceAssignment_1
+            // InternalPerspectiveDsl.g:20140:2: ( rule__JvmLowerBound__TypeReferenceAssignment_1 )
+            // InternalPerspectiveDsl.g:20140:3: rule__JvmLowerBound__TypeReferenceAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmLowerBound__TypeReferenceAssignment_1();
@@ -65859,14 +65859,14 @@
 
 
     // $ANTLR start "rule__JvmLowerBoundAnded__Group__0"
-    // InternalPerspectiveDsl.g:20147:1: rule__JvmLowerBoundAnded__Group__0 : rule__JvmLowerBoundAnded__Group__0__Impl rule__JvmLowerBoundAnded__Group__1 ;
+    // InternalPerspectiveDsl.g:20149:1: rule__JvmLowerBoundAnded__Group__0 : rule__JvmLowerBoundAnded__Group__0__Impl rule__JvmLowerBoundAnded__Group__1 ;
     public final void rule__JvmLowerBoundAnded__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20151:1: ( rule__JvmLowerBoundAnded__Group__0__Impl rule__JvmLowerBoundAnded__Group__1 )
-            // InternalPerspectiveDsl.g:20152:2: rule__JvmLowerBoundAnded__Group__0__Impl rule__JvmLowerBoundAnded__Group__1
+            // InternalPerspectiveDsl.g:20153:1: ( rule__JvmLowerBoundAnded__Group__0__Impl rule__JvmLowerBoundAnded__Group__1 )
+            // InternalPerspectiveDsl.g:20154:2: rule__JvmLowerBoundAnded__Group__0__Impl rule__JvmLowerBoundAnded__Group__1
             {
             pushFollow(FOLLOW_71);
             rule__JvmLowerBoundAnded__Group__0__Impl();
@@ -65897,17 +65897,17 @@
 
 
     // $ANTLR start "rule__JvmLowerBoundAnded__Group__0__Impl"
-    // InternalPerspectiveDsl.g:20159:1: rule__JvmLowerBoundAnded__Group__0__Impl : ( '&' ) ;
+    // InternalPerspectiveDsl.g:20161:1: rule__JvmLowerBoundAnded__Group__0__Impl : ( '&' ) ;
     public final void rule__JvmLowerBoundAnded__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20163:1: ( ( '&' ) )
-            // InternalPerspectiveDsl.g:20164:1: ( '&' )
+            // InternalPerspectiveDsl.g:20165:1: ( ( '&' ) )
+            // InternalPerspectiveDsl.g:20166:1: ( '&' )
             {
-            // InternalPerspectiveDsl.g:20164:1: ( '&' )
-            // InternalPerspectiveDsl.g:20165:2: '&'
+            // InternalPerspectiveDsl.g:20166:1: ( '&' )
+            // InternalPerspectiveDsl.g:20167:2: '&'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0()); 
@@ -65938,14 +65938,14 @@
 
 
     // $ANTLR start "rule__JvmLowerBoundAnded__Group__1"
-    // InternalPerspectiveDsl.g:20174:1: rule__JvmLowerBoundAnded__Group__1 : rule__JvmLowerBoundAnded__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:20176:1: rule__JvmLowerBoundAnded__Group__1 : rule__JvmLowerBoundAnded__Group__1__Impl ;
     public final void rule__JvmLowerBoundAnded__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20178:1: ( rule__JvmLowerBoundAnded__Group__1__Impl )
-            // InternalPerspectiveDsl.g:20179:2: rule__JvmLowerBoundAnded__Group__1__Impl
+            // InternalPerspectiveDsl.g:20180:1: ( rule__JvmLowerBoundAnded__Group__1__Impl )
+            // InternalPerspectiveDsl.g:20181:2: rule__JvmLowerBoundAnded__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmLowerBoundAnded__Group__1__Impl();
@@ -65971,23 +65971,23 @@
 
 
     // $ANTLR start "rule__JvmLowerBoundAnded__Group__1__Impl"
-    // InternalPerspectiveDsl.g:20185:1: rule__JvmLowerBoundAnded__Group__1__Impl : ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) ) ;
+    // InternalPerspectiveDsl.g:20187:1: rule__JvmLowerBoundAnded__Group__1__Impl : ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) ) ;
     public final void rule__JvmLowerBoundAnded__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20189:1: ( ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) ) )
-            // InternalPerspectiveDsl.g:20190:1: ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) )
+            // InternalPerspectiveDsl.g:20191:1: ( ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) ) )
+            // InternalPerspectiveDsl.g:20192:1: ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) )
             {
-            // InternalPerspectiveDsl.g:20190:1: ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) )
-            // InternalPerspectiveDsl.g:20191:2: ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 )
+            // InternalPerspectiveDsl.g:20192:1: ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) )
+            // InternalPerspectiveDsl.g:20193:2: ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceAssignment_1()); 
             }
-            // InternalPerspectiveDsl.g:20192:2: ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 )
-            // InternalPerspectiveDsl.g:20192:3: rule__JvmLowerBoundAnded__TypeReferenceAssignment_1
+            // InternalPerspectiveDsl.g:20194:2: ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 )
+            // InternalPerspectiveDsl.g:20194:3: rule__JvmLowerBoundAnded__TypeReferenceAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmLowerBoundAnded__TypeReferenceAssignment_1();
@@ -66022,14 +66022,14 @@
 
 
     // $ANTLR start "rule__QualifiedNameWithWildcard__Group__0"
-    // InternalPerspectiveDsl.g:20201:1: rule__QualifiedNameWithWildcard__Group__0 : rule__QualifiedNameWithWildcard__Group__0__Impl rule__QualifiedNameWithWildcard__Group__1 ;
+    // InternalPerspectiveDsl.g:20203:1: rule__QualifiedNameWithWildcard__Group__0 : rule__QualifiedNameWithWildcard__Group__0__Impl rule__QualifiedNameWithWildcard__Group__1 ;
     public final void rule__QualifiedNameWithWildcard__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20205:1: ( rule__QualifiedNameWithWildcard__Group__0__Impl rule__QualifiedNameWithWildcard__Group__1 )
-            // InternalPerspectiveDsl.g:20206:2: rule__QualifiedNameWithWildcard__Group__0__Impl rule__QualifiedNameWithWildcard__Group__1
+            // InternalPerspectiveDsl.g:20207:1: ( rule__QualifiedNameWithWildcard__Group__0__Impl rule__QualifiedNameWithWildcard__Group__1 )
+            // InternalPerspectiveDsl.g:20208:2: rule__QualifiedNameWithWildcard__Group__0__Impl rule__QualifiedNameWithWildcard__Group__1
             {
             pushFollow(FOLLOW_131);
             rule__QualifiedNameWithWildcard__Group__0__Impl();
@@ -66060,17 +66060,17 @@
 
 
     // $ANTLR start "rule__QualifiedNameWithWildcard__Group__0__Impl"
-    // InternalPerspectiveDsl.g:20213:1: rule__QualifiedNameWithWildcard__Group__0__Impl : ( ruleQualifiedName ) ;
+    // InternalPerspectiveDsl.g:20215:1: rule__QualifiedNameWithWildcard__Group__0__Impl : ( ruleQualifiedName ) ;
     public final void rule__QualifiedNameWithWildcard__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20217:1: ( ( ruleQualifiedName ) )
-            // InternalPerspectiveDsl.g:20218:1: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:20219:1: ( ( ruleQualifiedName ) )
+            // InternalPerspectiveDsl.g:20220:1: ( ruleQualifiedName )
             {
-            // InternalPerspectiveDsl.g:20218:1: ( ruleQualifiedName )
-            // InternalPerspectiveDsl.g:20219:2: ruleQualifiedName
+            // InternalPerspectiveDsl.g:20220:1: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:20221:2: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0()); 
@@ -66105,14 +66105,14 @@
 
 
     // $ANTLR start "rule__QualifiedNameWithWildcard__Group__1"
-    // InternalPerspectiveDsl.g:20228:1: rule__QualifiedNameWithWildcard__Group__1 : rule__QualifiedNameWithWildcard__Group__1__Impl rule__QualifiedNameWithWildcard__Group__2 ;
+    // InternalPerspectiveDsl.g:20230:1: rule__QualifiedNameWithWildcard__Group__1 : rule__QualifiedNameWithWildcard__Group__1__Impl rule__QualifiedNameWithWildcard__Group__2 ;
     public final void rule__QualifiedNameWithWildcard__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20232:1: ( rule__QualifiedNameWithWildcard__Group__1__Impl rule__QualifiedNameWithWildcard__Group__2 )
-            // InternalPerspectiveDsl.g:20233:2: rule__QualifiedNameWithWildcard__Group__1__Impl rule__QualifiedNameWithWildcard__Group__2
+            // InternalPerspectiveDsl.g:20234:1: ( rule__QualifiedNameWithWildcard__Group__1__Impl rule__QualifiedNameWithWildcard__Group__2 )
+            // InternalPerspectiveDsl.g:20235:2: rule__QualifiedNameWithWildcard__Group__1__Impl rule__QualifiedNameWithWildcard__Group__2
             {
             pushFollow(FOLLOW_138);
             rule__QualifiedNameWithWildcard__Group__1__Impl();
@@ -66143,17 +66143,17 @@
 
 
     // $ANTLR start "rule__QualifiedNameWithWildcard__Group__1__Impl"
-    // InternalPerspectiveDsl.g:20240:1: rule__QualifiedNameWithWildcard__Group__1__Impl : ( '.' ) ;
+    // InternalPerspectiveDsl.g:20242:1: rule__QualifiedNameWithWildcard__Group__1__Impl : ( '.' ) ;
     public final void rule__QualifiedNameWithWildcard__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20244:1: ( ( '.' ) )
-            // InternalPerspectiveDsl.g:20245:1: ( '.' )
+            // InternalPerspectiveDsl.g:20246:1: ( ( '.' ) )
+            // InternalPerspectiveDsl.g:20247:1: ( '.' )
             {
-            // InternalPerspectiveDsl.g:20245:1: ( '.' )
-            // InternalPerspectiveDsl.g:20246:2: '.'
+            // InternalPerspectiveDsl.g:20247:1: ( '.' )
+            // InternalPerspectiveDsl.g:20248:2: '.'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1()); 
@@ -66184,14 +66184,14 @@
 
 
     // $ANTLR start "rule__QualifiedNameWithWildcard__Group__2"
-    // InternalPerspectiveDsl.g:20255:1: rule__QualifiedNameWithWildcard__Group__2 : rule__QualifiedNameWithWildcard__Group__2__Impl ;
+    // InternalPerspectiveDsl.g:20257:1: rule__QualifiedNameWithWildcard__Group__2 : rule__QualifiedNameWithWildcard__Group__2__Impl ;
     public final void rule__QualifiedNameWithWildcard__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20259:1: ( rule__QualifiedNameWithWildcard__Group__2__Impl )
-            // InternalPerspectiveDsl.g:20260:2: rule__QualifiedNameWithWildcard__Group__2__Impl
+            // InternalPerspectiveDsl.g:20261:1: ( rule__QualifiedNameWithWildcard__Group__2__Impl )
+            // InternalPerspectiveDsl.g:20262:2: rule__QualifiedNameWithWildcard__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__QualifiedNameWithWildcard__Group__2__Impl();
@@ -66217,17 +66217,17 @@
 
 
     // $ANTLR start "rule__QualifiedNameWithWildcard__Group__2__Impl"
-    // InternalPerspectiveDsl.g:20266:1: rule__QualifiedNameWithWildcard__Group__2__Impl : ( '*' ) ;
+    // InternalPerspectiveDsl.g:20268:1: rule__QualifiedNameWithWildcard__Group__2__Impl : ( '*' ) ;
     public final void rule__QualifiedNameWithWildcard__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20270:1: ( ( '*' ) )
-            // InternalPerspectiveDsl.g:20271:1: ( '*' )
+            // InternalPerspectiveDsl.g:20272:1: ( ( '*' ) )
+            // InternalPerspectiveDsl.g:20273:1: ( '*' )
             {
-            // InternalPerspectiveDsl.g:20271:1: ( '*' )
-            // InternalPerspectiveDsl.g:20272:2: '*'
+            // InternalPerspectiveDsl.g:20273:1: ( '*' )
+            // InternalPerspectiveDsl.g:20274:2: '*'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2()); 
@@ -66258,14 +66258,14 @@
 
 
     // $ANTLR start "rule__QualifiedNameInStaticImport__Group__0"
-    // InternalPerspectiveDsl.g:20282:1: rule__QualifiedNameInStaticImport__Group__0 : rule__QualifiedNameInStaticImport__Group__0__Impl rule__QualifiedNameInStaticImport__Group__1 ;
+    // InternalPerspectiveDsl.g:20284:1: rule__QualifiedNameInStaticImport__Group__0 : rule__QualifiedNameInStaticImport__Group__0__Impl rule__QualifiedNameInStaticImport__Group__1 ;
     public final void rule__QualifiedNameInStaticImport__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20286:1: ( rule__QualifiedNameInStaticImport__Group__0__Impl rule__QualifiedNameInStaticImport__Group__1 )
-            // InternalPerspectiveDsl.g:20287:2: rule__QualifiedNameInStaticImport__Group__0__Impl rule__QualifiedNameInStaticImport__Group__1
+            // InternalPerspectiveDsl.g:20288:1: ( rule__QualifiedNameInStaticImport__Group__0__Impl rule__QualifiedNameInStaticImport__Group__1 )
+            // InternalPerspectiveDsl.g:20289:2: rule__QualifiedNameInStaticImport__Group__0__Impl rule__QualifiedNameInStaticImport__Group__1
             {
             pushFollow(FOLLOW_131);
             rule__QualifiedNameInStaticImport__Group__0__Impl();
@@ -66296,17 +66296,17 @@
 
 
     // $ANTLR start "rule__QualifiedNameInStaticImport__Group__0__Impl"
-    // InternalPerspectiveDsl.g:20294:1: rule__QualifiedNameInStaticImport__Group__0__Impl : ( ruleValidID ) ;
+    // InternalPerspectiveDsl.g:20296:1: rule__QualifiedNameInStaticImport__Group__0__Impl : ( ruleValidID ) ;
     public final void rule__QualifiedNameInStaticImport__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20298:1: ( ( ruleValidID ) )
-            // InternalPerspectiveDsl.g:20299:1: ( ruleValidID )
+            // InternalPerspectiveDsl.g:20300:1: ( ( ruleValidID ) )
+            // InternalPerspectiveDsl.g:20301:1: ( ruleValidID )
             {
-            // InternalPerspectiveDsl.g:20299:1: ( ruleValidID )
-            // InternalPerspectiveDsl.g:20300:2: ruleValidID
+            // InternalPerspectiveDsl.g:20301:1: ( ruleValidID )
+            // InternalPerspectiveDsl.g:20302:2: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0()); 
@@ -66341,14 +66341,14 @@
 
 
     // $ANTLR start "rule__QualifiedNameInStaticImport__Group__1"
-    // InternalPerspectiveDsl.g:20309:1: rule__QualifiedNameInStaticImport__Group__1 : rule__QualifiedNameInStaticImport__Group__1__Impl ;
+    // InternalPerspectiveDsl.g:20311:1: rule__QualifiedNameInStaticImport__Group__1 : rule__QualifiedNameInStaticImport__Group__1__Impl ;
     public final void rule__QualifiedNameInStaticImport__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20313:1: ( rule__QualifiedNameInStaticImport__Group__1__Impl )
-            // InternalPerspectiveDsl.g:20314:2: rule__QualifiedNameInStaticImport__Group__1__Impl
+            // InternalPerspectiveDsl.g:20315:1: ( rule__QualifiedNameInStaticImport__Group__1__Impl )
+            // InternalPerspectiveDsl.g:20316:2: rule__QualifiedNameInStaticImport__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__QualifiedNameInStaticImport__Group__1__Impl();
@@ -66374,17 +66374,17 @@
 
 
     // $ANTLR start "rule__QualifiedNameInStaticImport__Group__1__Impl"
-    // InternalPerspectiveDsl.g:20320:1: rule__QualifiedNameInStaticImport__Group__1__Impl : ( '.' ) ;
+    // InternalPerspectiveDsl.g:20322:1: rule__QualifiedNameInStaticImport__Group__1__Impl : ( '.' ) ;
     public final void rule__QualifiedNameInStaticImport__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20324:1: ( ( '.' ) )
-            // InternalPerspectiveDsl.g:20325:1: ( '.' )
+            // InternalPerspectiveDsl.g:20326:1: ( ( '.' ) )
+            // InternalPerspectiveDsl.g:20327:1: ( '.' )
             {
-            // InternalPerspectiveDsl.g:20325:1: ( '.' )
-            // InternalPerspectiveDsl.g:20326:2: '.'
+            // InternalPerspectiveDsl.g:20327:1: ( '.' )
+            // InternalPerspectiveDsl.g:20328:2: '.'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1()); 
@@ -66415,17 +66415,17 @@
 
 
     // $ANTLR start "rule__Perspective__UnorderedGroup_5"
-    // InternalPerspectiveDsl.g:20336:1: rule__Perspective__UnorderedGroup_5 : ( rule__Perspective__UnorderedGroup_5__0 )? ;
+    // InternalPerspectiveDsl.g:20338:1: rule__Perspective__UnorderedGroup_5 : ( rule__Perspective__UnorderedGroup_5__0 )? ;
     public final void rule__Perspective__UnorderedGroup_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         		getUnorderedGroupHelper().enter(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5());
         	
         try {
-            // InternalPerspectiveDsl.g:20341:1: ( ( rule__Perspective__UnorderedGroup_5__0 )? )
-            // InternalPerspectiveDsl.g:20342:2: ( rule__Perspective__UnorderedGroup_5__0 )?
+            // InternalPerspectiveDsl.g:20343:1: ( ( rule__Perspective__UnorderedGroup_5__0 )? )
+            // InternalPerspectiveDsl.g:20344:2: ( rule__Perspective__UnorderedGroup_5__0 )?
             {
-            // InternalPerspectiveDsl.g:20342:2: ( rule__Perspective__UnorderedGroup_5__0 )?
+            // InternalPerspectiveDsl.g:20344:2: ( rule__Perspective__UnorderedGroup_5__0 )?
             int alt143=2;
             int LA143_0 = input.LA(1);
 
@@ -66473,17 +66473,17 @@
 
 
     // $ANTLR start "rule__Perspective__UnorderedGroup_5__Impl"
-    // InternalPerspectiveDsl.g:20350:1: rule__Perspective__UnorderedGroup_5__Impl : ( ({...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) ) ) | ({...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) ) ) | ({...}? => ( ( ( rule__Perspective__Group_5_2__0 ) ) ) ) ) ;
+    // InternalPerspectiveDsl.g:20352:1: rule__Perspective__UnorderedGroup_5__Impl : ( ({...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) ) ) | ({...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) ) ) | ({...}? => ( ( ( rule__Perspective__Group_5_2__0 ) ) ) ) ) ;
     public final void rule__Perspective__UnorderedGroup_5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         		boolean selected = false;
         	
         try {
-            // InternalPerspectiveDsl.g:20355:1: ( ( ({...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) ) ) | ({...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) ) ) | ({...}? => ( ( ( rule__Perspective__Group_5_2__0 ) ) ) ) ) )
-            // InternalPerspectiveDsl.g:20356:3: ( ({...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) ) ) | ({...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) ) ) | ({...}? => ( ( ( rule__Perspective__Group_5_2__0 ) ) ) ) )
+            // InternalPerspectiveDsl.g:20357:1: ( ( ({...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) ) ) | ({...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) ) ) | ({...}? => ( ( ( rule__Perspective__Group_5_2__0 ) ) ) ) ) )
+            // InternalPerspectiveDsl.g:20358:3: ( ({...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) ) ) | ({...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) ) ) | ({...}? => ( ( ( rule__Perspective__Group_5_2__0 ) ) ) ) )
             {
-            // InternalPerspectiveDsl.g:20356:3: ( ({...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) ) ) | ({...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) ) ) | ({...}? => ( ( ( rule__Perspective__Group_5_2__0 ) ) ) ) )
+            // InternalPerspectiveDsl.g:20358:3: ( ({...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) ) ) | ({...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) ) ) | ({...}? => ( ( ( rule__Perspective__Group_5_2__0 ) ) ) ) )
             int alt144=3;
             int LA144_0 = input.LA(1);
 
@@ -66505,28 +66505,28 @@
             }
             switch (alt144) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:20357:3: ({...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20359:3: ({...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) ) )
                     {
-                    // InternalPerspectiveDsl.g:20357:3: ({...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) ) )
-                    // InternalPerspectiveDsl.g:20358:4: {...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) )
+                    // InternalPerspectiveDsl.g:20359:3: ({...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20360:4: {...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 0) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__Perspective__UnorderedGroup_5__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 0)");
                     }
-                    // InternalPerspectiveDsl.g:20358:107: ( ( ( rule__Perspective__Group_5_0__0 ) ) )
-                    // InternalPerspectiveDsl.g:20359:5: ( ( rule__Perspective__Group_5_0__0 ) )
+                    // InternalPerspectiveDsl.g:20360:107: ( ( ( rule__Perspective__Group_5_0__0 ) ) )
+                    // InternalPerspectiveDsl.g:20361:5: ( ( rule__Perspective__Group_5_0__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 0);
                     selected = true;
-                    // InternalPerspectiveDsl.g:20365:5: ( ( rule__Perspective__Group_5_0__0 ) )
-                    // InternalPerspectiveDsl.g:20366:6: ( rule__Perspective__Group_5_0__0 )
+                    // InternalPerspectiveDsl.g:20367:5: ( ( rule__Perspective__Group_5_0__0 ) )
+                    // InternalPerspectiveDsl.g:20368:6: ( rule__Perspective__Group_5_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveAccess().getGroup_5_0()); 
                     }
-                    // InternalPerspectiveDsl.g:20367:6: ( rule__Perspective__Group_5_0__0 )
-                    // InternalPerspectiveDsl.g:20367:7: rule__Perspective__Group_5_0__0
+                    // InternalPerspectiveDsl.g:20369:6: ( rule__Perspective__Group_5_0__0 )
+                    // InternalPerspectiveDsl.g:20369:7: rule__Perspective__Group_5_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__Perspective__Group_5_0__0();
@@ -66552,28 +66552,28 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:20372:3: ({...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20374:3: ({...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) ) )
                     {
-                    // InternalPerspectiveDsl.g:20372:3: ({...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) ) )
-                    // InternalPerspectiveDsl.g:20373:4: {...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) )
+                    // InternalPerspectiveDsl.g:20374:3: ({...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20375:4: {...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 1) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__Perspective__UnorderedGroup_5__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 1)");
                     }
-                    // InternalPerspectiveDsl.g:20373:107: ( ( ( rule__Perspective__Group_5_1__0 ) ) )
-                    // InternalPerspectiveDsl.g:20374:5: ( ( rule__Perspective__Group_5_1__0 ) )
+                    // InternalPerspectiveDsl.g:20375:107: ( ( ( rule__Perspective__Group_5_1__0 ) ) )
+                    // InternalPerspectiveDsl.g:20376:5: ( ( rule__Perspective__Group_5_1__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 1);
                     selected = true;
-                    // InternalPerspectiveDsl.g:20380:5: ( ( rule__Perspective__Group_5_1__0 ) )
-                    // InternalPerspectiveDsl.g:20381:6: ( rule__Perspective__Group_5_1__0 )
+                    // InternalPerspectiveDsl.g:20382:5: ( ( rule__Perspective__Group_5_1__0 ) )
+                    // InternalPerspectiveDsl.g:20383:6: ( rule__Perspective__Group_5_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveAccess().getGroup_5_1()); 
                     }
-                    // InternalPerspectiveDsl.g:20382:6: ( rule__Perspective__Group_5_1__0 )
-                    // InternalPerspectiveDsl.g:20382:7: rule__Perspective__Group_5_1__0
+                    // InternalPerspectiveDsl.g:20384:6: ( rule__Perspective__Group_5_1__0 )
+                    // InternalPerspectiveDsl.g:20384:7: rule__Perspective__Group_5_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__Perspective__Group_5_1__0();
@@ -66599,28 +66599,28 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:20387:3: ({...}? => ( ( ( rule__Perspective__Group_5_2__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20389:3: ({...}? => ( ( ( rule__Perspective__Group_5_2__0 ) ) ) )
                     {
-                    // InternalPerspectiveDsl.g:20387:3: ({...}? => ( ( ( rule__Perspective__Group_5_2__0 ) ) ) )
-                    // InternalPerspectiveDsl.g:20388:4: {...}? => ( ( ( rule__Perspective__Group_5_2__0 ) ) )
+                    // InternalPerspectiveDsl.g:20389:3: ({...}? => ( ( ( rule__Perspective__Group_5_2__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20390:4: {...}? => ( ( ( rule__Perspective__Group_5_2__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 2) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__Perspective__UnorderedGroup_5__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 2)");
                     }
-                    // InternalPerspectiveDsl.g:20388:107: ( ( ( rule__Perspective__Group_5_2__0 ) ) )
-                    // InternalPerspectiveDsl.g:20389:5: ( ( rule__Perspective__Group_5_2__0 ) )
+                    // InternalPerspectiveDsl.g:20390:107: ( ( ( rule__Perspective__Group_5_2__0 ) ) )
+                    // InternalPerspectiveDsl.g:20391:5: ( ( rule__Perspective__Group_5_2__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 2);
                     selected = true;
-                    // InternalPerspectiveDsl.g:20395:5: ( ( rule__Perspective__Group_5_2__0 ) )
-                    // InternalPerspectiveDsl.g:20396:6: ( rule__Perspective__Group_5_2__0 )
+                    // InternalPerspectiveDsl.g:20397:5: ( ( rule__Perspective__Group_5_2__0 ) )
+                    // InternalPerspectiveDsl.g:20398:6: ( rule__Perspective__Group_5_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveAccess().getGroup_5_2()); 
                     }
-                    // InternalPerspectiveDsl.g:20397:6: ( rule__Perspective__Group_5_2__0 )
-                    // InternalPerspectiveDsl.g:20397:7: rule__Perspective__Group_5_2__0
+                    // InternalPerspectiveDsl.g:20399:6: ( rule__Perspective__Group_5_2__0 )
+                    // InternalPerspectiveDsl.g:20399:7: rule__Perspective__Group_5_2__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__Perspective__Group_5_2__0();
@@ -66669,21 +66669,21 @@
 
 
     // $ANTLR start "rule__Perspective__UnorderedGroup_5__0"
-    // InternalPerspectiveDsl.g:20410:1: rule__Perspective__UnorderedGroup_5__0 : rule__Perspective__UnorderedGroup_5__Impl ( rule__Perspective__UnorderedGroup_5__1 )? ;
+    // InternalPerspectiveDsl.g:20412:1: rule__Perspective__UnorderedGroup_5__0 : rule__Perspective__UnorderedGroup_5__Impl ( rule__Perspective__UnorderedGroup_5__1 )? ;
     public final void rule__Perspective__UnorderedGroup_5__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20414:1: ( rule__Perspective__UnorderedGroup_5__Impl ( rule__Perspective__UnorderedGroup_5__1 )? )
-            // InternalPerspectiveDsl.g:20415:2: rule__Perspective__UnorderedGroup_5__Impl ( rule__Perspective__UnorderedGroup_5__1 )?
+            // InternalPerspectiveDsl.g:20416:1: ( rule__Perspective__UnorderedGroup_5__Impl ( rule__Perspective__UnorderedGroup_5__1 )? )
+            // InternalPerspectiveDsl.g:20417:2: rule__Perspective__UnorderedGroup_5__Impl ( rule__Perspective__UnorderedGroup_5__1 )?
             {
             pushFollow(FOLLOW_139);
             rule__Perspective__UnorderedGroup_5__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalPerspectiveDsl.g:20416:2: ( rule__Perspective__UnorderedGroup_5__1 )?
+            // InternalPerspectiveDsl.g:20418:2: ( rule__Perspective__UnorderedGroup_5__1 )?
             int alt145=2;
             int LA145_0 = input.LA(1);
 
@@ -66730,21 +66730,21 @@
 
 
     // $ANTLR start "rule__Perspective__UnorderedGroup_5__1"
-    // InternalPerspectiveDsl.g:20422:1: rule__Perspective__UnorderedGroup_5__1 : rule__Perspective__UnorderedGroup_5__Impl ( rule__Perspective__UnorderedGroup_5__2 )? ;
+    // InternalPerspectiveDsl.g:20424:1: rule__Perspective__UnorderedGroup_5__1 : rule__Perspective__UnorderedGroup_5__Impl ( rule__Perspective__UnorderedGroup_5__2 )? ;
     public final void rule__Perspective__UnorderedGroup_5__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20426:1: ( rule__Perspective__UnorderedGroup_5__Impl ( rule__Perspective__UnorderedGroup_5__2 )? )
-            // InternalPerspectiveDsl.g:20427:2: rule__Perspective__UnorderedGroup_5__Impl ( rule__Perspective__UnorderedGroup_5__2 )?
+            // InternalPerspectiveDsl.g:20428:1: ( rule__Perspective__UnorderedGroup_5__Impl ( rule__Perspective__UnorderedGroup_5__2 )? )
+            // InternalPerspectiveDsl.g:20429:2: rule__Perspective__UnorderedGroup_5__Impl ( rule__Perspective__UnorderedGroup_5__2 )?
             {
             pushFollow(FOLLOW_139);
             rule__Perspective__UnorderedGroup_5__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalPerspectiveDsl.g:20428:2: ( rule__Perspective__UnorderedGroup_5__2 )?
+            // InternalPerspectiveDsl.g:20430:2: ( rule__Perspective__UnorderedGroup_5__2 )?
             int alt146=2;
             int LA146_0 = input.LA(1);
 
@@ -66791,14 +66791,14 @@
 
 
     // $ANTLR start "rule__Perspective__UnorderedGroup_5__2"
-    // InternalPerspectiveDsl.g:20434:1: rule__Perspective__UnorderedGroup_5__2 : rule__Perspective__UnorderedGroup_5__Impl ;
+    // InternalPerspectiveDsl.g:20436:1: rule__Perspective__UnorderedGroup_5__2 : rule__Perspective__UnorderedGroup_5__Impl ;
     public final void rule__Perspective__UnorderedGroup_5__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20438:1: ( rule__Perspective__UnorderedGroup_5__Impl )
-            // InternalPerspectiveDsl.g:20439:2: rule__Perspective__UnorderedGroup_5__Impl
+            // InternalPerspectiveDsl.g:20440:1: ( rule__Perspective__UnorderedGroup_5__Impl )
+            // InternalPerspectiveDsl.g:20441:2: rule__Perspective__UnorderedGroup_5__Impl
             {
             pushFollow(FOLLOW_2);
             rule__Perspective__UnorderedGroup_5__Impl();
@@ -66824,17 +66824,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__UnorderedGroup_3"
-    // InternalPerspectiveDsl.g:20446:1: rule__PerspectiveSashContainer__UnorderedGroup_3 : ( rule__PerspectiveSashContainer__UnorderedGroup_3__0 )? ;
+    // InternalPerspectiveDsl.g:20448:1: rule__PerspectiveSashContainer__UnorderedGroup_3 : ( rule__PerspectiveSashContainer__UnorderedGroup_3__0 )? ;
     public final void rule__PerspectiveSashContainer__UnorderedGroup_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         		getUnorderedGroupHelper().enter(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3());
         	
         try {
-            // InternalPerspectiveDsl.g:20451:1: ( ( rule__PerspectiveSashContainer__UnorderedGroup_3__0 )? )
-            // InternalPerspectiveDsl.g:20452:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3__0 )?
+            // InternalPerspectiveDsl.g:20453:1: ( ( rule__PerspectiveSashContainer__UnorderedGroup_3__0 )? )
+            // InternalPerspectiveDsl.g:20454:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3__0 )?
             {
-            // InternalPerspectiveDsl.g:20452:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3__0 )?
+            // InternalPerspectiveDsl.g:20454:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3__0 )?
             int alt147=2;
             int LA147_0 = input.LA(1);
 
@@ -66885,17 +66885,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__UnorderedGroup_3__Impl"
-    // InternalPerspectiveDsl.g:20460:1: rule__PerspectiveSashContainer__UnorderedGroup_3__Impl : ( ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) ) ) ) ) ;
+    // InternalPerspectiveDsl.g:20462:1: rule__PerspectiveSashContainer__UnorderedGroup_3__Impl : ( ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) ) ) ) ) ;
     public final void rule__PerspectiveSashContainer__UnorderedGroup_3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         		boolean selected = false;
         	
         try {
-            // InternalPerspectiveDsl.g:20465:1: ( ( ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) ) ) ) ) )
-            // InternalPerspectiveDsl.g:20466:3: ( ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) ) ) ) )
+            // InternalPerspectiveDsl.g:20467:1: ( ( ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) ) ) ) ) )
+            // InternalPerspectiveDsl.g:20468:3: ( ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) ) ) ) )
             {
-            // InternalPerspectiveDsl.g:20466:3: ( ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) ) ) ) )
+            // InternalPerspectiveDsl.g:20468:3: ( ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) ) ) ) )
             int alt148=4;
             int LA148_0 = input.LA(1);
 
@@ -66920,28 +66920,28 @@
             }
             switch (alt148) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:20467:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20469:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) ) )
                     {
-                    // InternalPerspectiveDsl.g:20467:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) ) )
-                    // InternalPerspectiveDsl.g:20468:4: {...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) )
+                    // InternalPerspectiveDsl.g:20469:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20470:4: {...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 0) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__PerspectiveSashContainer__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 0)");
                     }
-                    // InternalPerspectiveDsl.g:20468:120: ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) )
-                    // InternalPerspectiveDsl.g:20469:5: ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) )
+                    // InternalPerspectiveDsl.g:20470:120: ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) )
+                    // InternalPerspectiveDsl.g:20471:5: ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 0);
                     selected = true;
-                    // InternalPerspectiveDsl.g:20475:5: ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) )
-                    // InternalPerspectiveDsl.g:20476:6: ( rule__PerspectiveSashContainer__Group_3_0__0 )
+                    // InternalPerspectiveDsl.g:20477:5: ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) )
+                    // InternalPerspectiveDsl.g:20478:6: ( rule__PerspectiveSashContainer__Group_3_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveSashContainerAccess().getGroup_3_0()); 
                     }
-                    // InternalPerspectiveDsl.g:20477:6: ( rule__PerspectiveSashContainer__Group_3_0__0 )
-                    // InternalPerspectiveDsl.g:20477:7: rule__PerspectiveSashContainer__Group_3_0__0
+                    // InternalPerspectiveDsl.g:20479:6: ( rule__PerspectiveSashContainer__Group_3_0__0 )
+                    // InternalPerspectiveDsl.g:20479:7: rule__PerspectiveSashContainer__Group_3_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__PerspectiveSashContainer__Group_3_0__0();
@@ -66967,28 +66967,28 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:20482:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20484:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) ) )
                     {
-                    // InternalPerspectiveDsl.g:20482:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) ) )
-                    // InternalPerspectiveDsl.g:20483:4: {...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) )
+                    // InternalPerspectiveDsl.g:20484:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20485:4: {...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 1) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__PerspectiveSashContainer__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 1)");
                     }
-                    // InternalPerspectiveDsl.g:20483:120: ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) )
-                    // InternalPerspectiveDsl.g:20484:5: ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) )
+                    // InternalPerspectiveDsl.g:20485:120: ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) )
+                    // InternalPerspectiveDsl.g:20486:5: ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 1);
                     selected = true;
-                    // InternalPerspectiveDsl.g:20490:5: ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) )
-                    // InternalPerspectiveDsl.g:20491:6: ( rule__PerspectiveSashContainer__Group_3_1__0 )
+                    // InternalPerspectiveDsl.g:20492:5: ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) )
+                    // InternalPerspectiveDsl.g:20493:6: ( rule__PerspectiveSashContainer__Group_3_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveSashContainerAccess().getGroup_3_1()); 
                     }
-                    // InternalPerspectiveDsl.g:20492:6: ( rule__PerspectiveSashContainer__Group_3_1__0 )
-                    // InternalPerspectiveDsl.g:20492:7: rule__PerspectiveSashContainer__Group_3_1__0
+                    // InternalPerspectiveDsl.g:20494:6: ( rule__PerspectiveSashContainer__Group_3_1__0 )
+                    // InternalPerspectiveDsl.g:20494:7: rule__PerspectiveSashContainer__Group_3_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__PerspectiveSashContainer__Group_3_1__0();
@@ -67014,28 +67014,28 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:20497:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20499:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) ) )
                     {
-                    // InternalPerspectiveDsl.g:20497:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) ) )
-                    // InternalPerspectiveDsl.g:20498:4: {...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) )
+                    // InternalPerspectiveDsl.g:20499:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20500:4: {...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 2) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__PerspectiveSashContainer__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 2)");
                     }
-                    // InternalPerspectiveDsl.g:20498:120: ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) )
-                    // InternalPerspectiveDsl.g:20499:5: ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) )
+                    // InternalPerspectiveDsl.g:20500:120: ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) )
+                    // InternalPerspectiveDsl.g:20501:5: ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 2);
                     selected = true;
-                    // InternalPerspectiveDsl.g:20505:5: ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) )
-                    // InternalPerspectiveDsl.g:20506:6: ( rule__PerspectiveSashContainer__Group_3_2__0 )
+                    // InternalPerspectiveDsl.g:20507:5: ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) )
+                    // InternalPerspectiveDsl.g:20508:6: ( rule__PerspectiveSashContainer__Group_3_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveSashContainerAccess().getGroup_3_2()); 
                     }
-                    // InternalPerspectiveDsl.g:20507:6: ( rule__PerspectiveSashContainer__Group_3_2__0 )
-                    // InternalPerspectiveDsl.g:20507:7: rule__PerspectiveSashContainer__Group_3_2__0
+                    // InternalPerspectiveDsl.g:20509:6: ( rule__PerspectiveSashContainer__Group_3_2__0 )
+                    // InternalPerspectiveDsl.g:20509:7: rule__PerspectiveSashContainer__Group_3_2__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__PerspectiveSashContainer__Group_3_2__0();
@@ -67061,28 +67061,28 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:20512:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20514:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) ) ) )
                     {
-                    // InternalPerspectiveDsl.g:20512:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) ) ) )
-                    // InternalPerspectiveDsl.g:20513:4: {...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) ) )
+                    // InternalPerspectiveDsl.g:20514:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20515:4: {...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 3) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__PerspectiveSashContainer__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 3)");
                     }
-                    // InternalPerspectiveDsl.g:20513:120: ( ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) ) )
-                    // InternalPerspectiveDsl.g:20514:5: ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) )
+                    // InternalPerspectiveDsl.g:20515:120: ( ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) ) )
+                    // InternalPerspectiveDsl.g:20516:5: ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 3);
                     selected = true;
-                    // InternalPerspectiveDsl.g:20520:5: ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) )
-                    // InternalPerspectiveDsl.g:20521:6: ( rule__PerspectiveSashContainer__Group_3_3__0 )
+                    // InternalPerspectiveDsl.g:20522:5: ( ( rule__PerspectiveSashContainer__Group_3_3__0 ) )
+                    // InternalPerspectiveDsl.g:20523:6: ( rule__PerspectiveSashContainer__Group_3_3__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveSashContainerAccess().getGroup_3_3()); 
                     }
-                    // InternalPerspectiveDsl.g:20522:6: ( rule__PerspectiveSashContainer__Group_3_3__0 )
-                    // InternalPerspectiveDsl.g:20522:7: rule__PerspectiveSashContainer__Group_3_3__0
+                    // InternalPerspectiveDsl.g:20524:6: ( rule__PerspectiveSashContainer__Group_3_3__0 )
+                    // InternalPerspectiveDsl.g:20524:7: rule__PerspectiveSashContainer__Group_3_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__PerspectiveSashContainer__Group_3_3__0();
@@ -67131,21 +67131,21 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__UnorderedGroup_3__0"
-    // InternalPerspectiveDsl.g:20535:1: rule__PerspectiveSashContainer__UnorderedGroup_3__0 : rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ( rule__PerspectiveSashContainer__UnorderedGroup_3__1 )? ;
+    // InternalPerspectiveDsl.g:20537:1: rule__PerspectiveSashContainer__UnorderedGroup_3__0 : rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ( rule__PerspectiveSashContainer__UnorderedGroup_3__1 )? ;
     public final void rule__PerspectiveSashContainer__UnorderedGroup_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20539:1: ( rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ( rule__PerspectiveSashContainer__UnorderedGroup_3__1 )? )
-            // InternalPerspectiveDsl.g:20540:2: rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ( rule__PerspectiveSashContainer__UnorderedGroup_3__1 )?
+            // InternalPerspectiveDsl.g:20541:1: ( rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ( rule__PerspectiveSashContainer__UnorderedGroup_3__1 )? )
+            // InternalPerspectiveDsl.g:20542:2: rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ( rule__PerspectiveSashContainer__UnorderedGroup_3__1 )?
             {
             pushFollow(FOLLOW_140);
             rule__PerspectiveSashContainer__UnorderedGroup_3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalPerspectiveDsl.g:20541:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3__1 )?
+            // InternalPerspectiveDsl.g:20543:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3__1 )?
             int alt149=2;
             int LA149_0 = input.LA(1);
 
@@ -67195,21 +67195,21 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__UnorderedGroup_3__1"
-    // InternalPerspectiveDsl.g:20547:1: rule__PerspectiveSashContainer__UnorderedGroup_3__1 : rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ( rule__PerspectiveSashContainer__UnorderedGroup_3__2 )? ;
+    // InternalPerspectiveDsl.g:20549:1: rule__PerspectiveSashContainer__UnorderedGroup_3__1 : rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ( rule__PerspectiveSashContainer__UnorderedGroup_3__2 )? ;
     public final void rule__PerspectiveSashContainer__UnorderedGroup_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20551:1: ( rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ( rule__PerspectiveSashContainer__UnorderedGroup_3__2 )? )
-            // InternalPerspectiveDsl.g:20552:2: rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ( rule__PerspectiveSashContainer__UnorderedGroup_3__2 )?
+            // InternalPerspectiveDsl.g:20553:1: ( rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ( rule__PerspectiveSashContainer__UnorderedGroup_3__2 )? )
+            // InternalPerspectiveDsl.g:20554:2: rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ( rule__PerspectiveSashContainer__UnorderedGroup_3__2 )?
             {
             pushFollow(FOLLOW_140);
             rule__PerspectiveSashContainer__UnorderedGroup_3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalPerspectiveDsl.g:20553:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3__2 )?
+            // InternalPerspectiveDsl.g:20555:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3__2 )?
             int alt150=2;
             int LA150_0 = input.LA(1);
 
@@ -67259,21 +67259,21 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__UnorderedGroup_3__2"
-    // InternalPerspectiveDsl.g:20559:1: rule__PerspectiveSashContainer__UnorderedGroup_3__2 : rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ( rule__PerspectiveSashContainer__UnorderedGroup_3__3 )? ;
+    // InternalPerspectiveDsl.g:20561:1: rule__PerspectiveSashContainer__UnorderedGroup_3__2 : rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ( rule__PerspectiveSashContainer__UnorderedGroup_3__3 )? ;
     public final void rule__PerspectiveSashContainer__UnorderedGroup_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20563:1: ( rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ( rule__PerspectiveSashContainer__UnorderedGroup_3__3 )? )
-            // InternalPerspectiveDsl.g:20564:2: rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ( rule__PerspectiveSashContainer__UnorderedGroup_3__3 )?
+            // InternalPerspectiveDsl.g:20565:1: ( rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ( rule__PerspectiveSashContainer__UnorderedGroup_3__3 )? )
+            // InternalPerspectiveDsl.g:20566:2: rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ( rule__PerspectiveSashContainer__UnorderedGroup_3__3 )?
             {
             pushFollow(FOLLOW_140);
             rule__PerspectiveSashContainer__UnorderedGroup_3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalPerspectiveDsl.g:20565:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3__3 )?
+            // InternalPerspectiveDsl.g:20567:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3__3 )?
             int alt151=2;
             int LA151_0 = input.LA(1);
 
@@ -67323,14 +67323,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__UnorderedGroup_3__3"
-    // InternalPerspectiveDsl.g:20571:1: rule__PerspectiveSashContainer__UnorderedGroup_3__3 : rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ;
+    // InternalPerspectiveDsl.g:20573:1: rule__PerspectiveSashContainer__UnorderedGroup_3__3 : rule__PerspectiveSashContainer__UnorderedGroup_3__Impl ;
     public final void rule__PerspectiveSashContainer__UnorderedGroup_3__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20575:1: ( rule__PerspectiveSashContainer__UnorderedGroup_3__Impl )
-            // InternalPerspectiveDsl.g:20576:2: rule__PerspectiveSashContainer__UnorderedGroup_3__Impl
+            // InternalPerspectiveDsl.g:20577:1: ( rule__PerspectiveSashContainer__UnorderedGroup_3__Impl )
+            // InternalPerspectiveDsl.g:20578:2: rule__PerspectiveSashContainer__UnorderedGroup_3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSashContainer__UnorderedGroup_3__Impl();
@@ -67356,17 +67356,17 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__UnorderedGroup_3"
-    // InternalPerspectiveDsl.g:20583:1: rule__PerspectivePartStack__UnorderedGroup_3 : ( rule__PerspectivePartStack__UnorderedGroup_3__0 )? ;
+    // InternalPerspectiveDsl.g:20585:1: rule__PerspectivePartStack__UnorderedGroup_3 : ( rule__PerspectivePartStack__UnorderedGroup_3__0 )? ;
     public final void rule__PerspectivePartStack__UnorderedGroup_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         		getUnorderedGroupHelper().enter(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3());
         	
         try {
-            // InternalPerspectiveDsl.g:20588:1: ( ( rule__PerspectivePartStack__UnorderedGroup_3__0 )? )
-            // InternalPerspectiveDsl.g:20589:2: ( rule__PerspectivePartStack__UnorderedGroup_3__0 )?
+            // InternalPerspectiveDsl.g:20590:1: ( ( rule__PerspectivePartStack__UnorderedGroup_3__0 )? )
+            // InternalPerspectiveDsl.g:20591:2: ( rule__PerspectivePartStack__UnorderedGroup_3__0 )?
             {
-            // InternalPerspectiveDsl.g:20589:2: ( rule__PerspectivePartStack__UnorderedGroup_3__0 )?
+            // InternalPerspectiveDsl.g:20591:2: ( rule__PerspectivePartStack__UnorderedGroup_3__0 )?
             int alt152=2;
             int LA152_0 = input.LA(1);
 
@@ -67414,17 +67414,17 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__UnorderedGroup_3__Impl"
-    // InternalPerspectiveDsl.g:20597:1: rule__PerspectivePartStack__UnorderedGroup_3__Impl : ( ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_2__0 ) ) ) ) ) ;
+    // InternalPerspectiveDsl.g:20599:1: rule__PerspectivePartStack__UnorderedGroup_3__Impl : ( ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_2__0 ) ) ) ) ) ;
     public final void rule__PerspectivePartStack__UnorderedGroup_3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         		boolean selected = false;
         	
         try {
-            // InternalPerspectiveDsl.g:20602:1: ( ( ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_2__0 ) ) ) ) ) )
-            // InternalPerspectiveDsl.g:20603:3: ( ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_2__0 ) ) ) ) )
+            // InternalPerspectiveDsl.g:20604:1: ( ( ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_2__0 ) ) ) ) ) )
+            // InternalPerspectiveDsl.g:20605:3: ( ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_2__0 ) ) ) ) )
             {
-            // InternalPerspectiveDsl.g:20603:3: ( ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_2__0 ) ) ) ) )
+            // InternalPerspectiveDsl.g:20605:3: ( ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_2__0 ) ) ) ) )
             int alt153=3;
             int LA153_0 = input.LA(1);
 
@@ -67446,28 +67446,28 @@
             }
             switch (alt153) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:20604:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20606:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) ) )
                     {
-                    // InternalPerspectiveDsl.g:20604:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) ) )
-                    // InternalPerspectiveDsl.g:20605:4: {...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) )
+                    // InternalPerspectiveDsl.g:20606:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20607:4: {...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 0) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__PerspectivePartStack__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 0)");
                     }
-                    // InternalPerspectiveDsl.g:20605:116: ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) )
-                    // InternalPerspectiveDsl.g:20606:5: ( ( rule__PerspectivePartStack__Group_3_0__0 ) )
+                    // InternalPerspectiveDsl.g:20607:116: ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) )
+                    // InternalPerspectiveDsl.g:20608:5: ( ( rule__PerspectivePartStack__Group_3_0__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 0);
                     selected = true;
-                    // InternalPerspectiveDsl.g:20612:5: ( ( rule__PerspectivePartStack__Group_3_0__0 ) )
-                    // InternalPerspectiveDsl.g:20613:6: ( rule__PerspectivePartStack__Group_3_0__0 )
+                    // InternalPerspectiveDsl.g:20614:5: ( ( rule__PerspectivePartStack__Group_3_0__0 ) )
+                    // InternalPerspectiveDsl.g:20615:6: ( rule__PerspectivePartStack__Group_3_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectivePartStackAccess().getGroup_3_0()); 
                     }
-                    // InternalPerspectiveDsl.g:20614:6: ( rule__PerspectivePartStack__Group_3_0__0 )
-                    // InternalPerspectiveDsl.g:20614:7: rule__PerspectivePartStack__Group_3_0__0
+                    // InternalPerspectiveDsl.g:20616:6: ( rule__PerspectivePartStack__Group_3_0__0 )
+                    // InternalPerspectiveDsl.g:20616:7: rule__PerspectivePartStack__Group_3_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__PerspectivePartStack__Group_3_0__0();
@@ -67493,28 +67493,28 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:20619:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20621:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) ) )
                     {
-                    // InternalPerspectiveDsl.g:20619:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) ) )
-                    // InternalPerspectiveDsl.g:20620:4: {...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) )
+                    // InternalPerspectiveDsl.g:20621:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20622:4: {...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 1) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__PerspectivePartStack__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 1)");
                     }
-                    // InternalPerspectiveDsl.g:20620:116: ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) )
-                    // InternalPerspectiveDsl.g:20621:5: ( ( rule__PerspectivePartStack__Group_3_1__0 ) )
+                    // InternalPerspectiveDsl.g:20622:116: ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) )
+                    // InternalPerspectiveDsl.g:20623:5: ( ( rule__PerspectivePartStack__Group_3_1__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 1);
                     selected = true;
-                    // InternalPerspectiveDsl.g:20627:5: ( ( rule__PerspectivePartStack__Group_3_1__0 ) )
-                    // InternalPerspectiveDsl.g:20628:6: ( rule__PerspectivePartStack__Group_3_1__0 )
+                    // InternalPerspectiveDsl.g:20629:5: ( ( rule__PerspectivePartStack__Group_3_1__0 ) )
+                    // InternalPerspectiveDsl.g:20630:6: ( rule__PerspectivePartStack__Group_3_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectivePartStackAccess().getGroup_3_1()); 
                     }
-                    // InternalPerspectiveDsl.g:20629:6: ( rule__PerspectivePartStack__Group_3_1__0 )
-                    // InternalPerspectiveDsl.g:20629:7: rule__PerspectivePartStack__Group_3_1__0
+                    // InternalPerspectiveDsl.g:20631:6: ( rule__PerspectivePartStack__Group_3_1__0 )
+                    // InternalPerspectiveDsl.g:20631:7: rule__PerspectivePartStack__Group_3_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__PerspectivePartStack__Group_3_1__0();
@@ -67540,28 +67540,28 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:20634:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_2__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20636:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_2__0 ) ) ) )
                     {
-                    // InternalPerspectiveDsl.g:20634:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_2__0 ) ) ) )
-                    // InternalPerspectiveDsl.g:20635:4: {...}? => ( ( ( rule__PerspectivePartStack__Group_3_2__0 ) ) )
+                    // InternalPerspectiveDsl.g:20636:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_2__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20637:4: {...}? => ( ( ( rule__PerspectivePartStack__Group_3_2__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 2) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__PerspectivePartStack__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 2)");
                     }
-                    // InternalPerspectiveDsl.g:20635:116: ( ( ( rule__PerspectivePartStack__Group_3_2__0 ) ) )
-                    // InternalPerspectiveDsl.g:20636:5: ( ( rule__PerspectivePartStack__Group_3_2__0 ) )
+                    // InternalPerspectiveDsl.g:20637:116: ( ( ( rule__PerspectivePartStack__Group_3_2__0 ) ) )
+                    // InternalPerspectiveDsl.g:20638:5: ( ( rule__PerspectivePartStack__Group_3_2__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 2);
                     selected = true;
-                    // InternalPerspectiveDsl.g:20642:5: ( ( rule__PerspectivePartStack__Group_3_2__0 ) )
-                    // InternalPerspectiveDsl.g:20643:6: ( rule__PerspectivePartStack__Group_3_2__0 )
+                    // InternalPerspectiveDsl.g:20644:5: ( ( rule__PerspectivePartStack__Group_3_2__0 ) )
+                    // InternalPerspectiveDsl.g:20645:6: ( rule__PerspectivePartStack__Group_3_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectivePartStackAccess().getGroup_3_2()); 
                     }
-                    // InternalPerspectiveDsl.g:20644:6: ( rule__PerspectivePartStack__Group_3_2__0 )
-                    // InternalPerspectiveDsl.g:20644:7: rule__PerspectivePartStack__Group_3_2__0
+                    // InternalPerspectiveDsl.g:20646:6: ( rule__PerspectivePartStack__Group_3_2__0 )
+                    // InternalPerspectiveDsl.g:20646:7: rule__PerspectivePartStack__Group_3_2__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__PerspectivePartStack__Group_3_2__0();
@@ -67610,21 +67610,21 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__UnorderedGroup_3__0"
-    // InternalPerspectiveDsl.g:20657:1: rule__PerspectivePartStack__UnorderedGroup_3__0 : rule__PerspectivePartStack__UnorderedGroup_3__Impl ( rule__PerspectivePartStack__UnorderedGroup_3__1 )? ;
+    // InternalPerspectiveDsl.g:20659:1: rule__PerspectivePartStack__UnorderedGroup_3__0 : rule__PerspectivePartStack__UnorderedGroup_3__Impl ( rule__PerspectivePartStack__UnorderedGroup_3__1 )? ;
     public final void rule__PerspectivePartStack__UnorderedGroup_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20661:1: ( rule__PerspectivePartStack__UnorderedGroup_3__Impl ( rule__PerspectivePartStack__UnorderedGroup_3__1 )? )
-            // InternalPerspectiveDsl.g:20662:2: rule__PerspectivePartStack__UnorderedGroup_3__Impl ( rule__PerspectivePartStack__UnorderedGroup_3__1 )?
+            // InternalPerspectiveDsl.g:20663:1: ( rule__PerspectivePartStack__UnorderedGroup_3__Impl ( rule__PerspectivePartStack__UnorderedGroup_3__1 )? )
+            // InternalPerspectiveDsl.g:20664:2: rule__PerspectivePartStack__UnorderedGroup_3__Impl ( rule__PerspectivePartStack__UnorderedGroup_3__1 )?
             {
             pushFollow(FOLLOW_141);
             rule__PerspectivePartStack__UnorderedGroup_3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalPerspectiveDsl.g:20663:2: ( rule__PerspectivePartStack__UnorderedGroup_3__1 )?
+            // InternalPerspectiveDsl.g:20665:2: ( rule__PerspectivePartStack__UnorderedGroup_3__1 )?
             int alt154=2;
             int LA154_0 = input.LA(1);
 
@@ -67671,21 +67671,21 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__UnorderedGroup_3__1"
-    // InternalPerspectiveDsl.g:20669:1: rule__PerspectivePartStack__UnorderedGroup_3__1 : rule__PerspectivePartStack__UnorderedGroup_3__Impl ( rule__PerspectivePartStack__UnorderedGroup_3__2 )? ;
+    // InternalPerspectiveDsl.g:20671:1: rule__PerspectivePartStack__UnorderedGroup_3__1 : rule__PerspectivePartStack__UnorderedGroup_3__Impl ( rule__PerspectivePartStack__UnorderedGroup_3__2 )? ;
     public final void rule__PerspectivePartStack__UnorderedGroup_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20673:1: ( rule__PerspectivePartStack__UnorderedGroup_3__Impl ( rule__PerspectivePartStack__UnorderedGroup_3__2 )? )
-            // InternalPerspectiveDsl.g:20674:2: rule__PerspectivePartStack__UnorderedGroup_3__Impl ( rule__PerspectivePartStack__UnorderedGroup_3__2 )?
+            // InternalPerspectiveDsl.g:20675:1: ( rule__PerspectivePartStack__UnorderedGroup_3__Impl ( rule__PerspectivePartStack__UnorderedGroup_3__2 )? )
+            // InternalPerspectiveDsl.g:20676:2: rule__PerspectivePartStack__UnorderedGroup_3__Impl ( rule__PerspectivePartStack__UnorderedGroup_3__2 )?
             {
             pushFollow(FOLLOW_141);
             rule__PerspectivePartStack__UnorderedGroup_3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalPerspectiveDsl.g:20675:2: ( rule__PerspectivePartStack__UnorderedGroup_3__2 )?
+            // InternalPerspectiveDsl.g:20677:2: ( rule__PerspectivePartStack__UnorderedGroup_3__2 )?
             int alt155=2;
             int LA155_0 = input.LA(1);
 
@@ -67732,14 +67732,14 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__UnorderedGroup_3__2"
-    // InternalPerspectiveDsl.g:20681:1: rule__PerspectivePartStack__UnorderedGroup_3__2 : rule__PerspectivePartStack__UnorderedGroup_3__Impl ;
+    // InternalPerspectiveDsl.g:20683:1: rule__PerspectivePartStack__UnorderedGroup_3__2 : rule__PerspectivePartStack__UnorderedGroup_3__Impl ;
     public final void rule__PerspectivePartStack__UnorderedGroup_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20685:1: ( rule__PerspectivePartStack__UnorderedGroup_3__Impl )
-            // InternalPerspectiveDsl.g:20686:2: rule__PerspectivePartStack__UnorderedGroup_3__Impl
+            // InternalPerspectiveDsl.g:20687:1: ( rule__PerspectivePartStack__UnorderedGroup_3__Impl )
+            // InternalPerspectiveDsl.g:20688:2: rule__PerspectivePartStack__UnorderedGroup_3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePartStack__UnorderedGroup_3__Impl();
@@ -67765,17 +67765,17 @@
 
 
     // $ANTLR start "rule__PerspectivePart__UnorderedGroup_3"
-    // InternalPerspectiveDsl.g:20693:1: rule__PerspectivePart__UnorderedGroup_3 : ( rule__PerspectivePart__UnorderedGroup_3__0 )? ;
+    // InternalPerspectiveDsl.g:20695:1: rule__PerspectivePart__UnorderedGroup_3 : ( rule__PerspectivePart__UnorderedGroup_3__0 )? ;
     public final void rule__PerspectivePart__UnorderedGroup_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         		getUnorderedGroupHelper().enter(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3());
         	
         try {
-            // InternalPerspectiveDsl.g:20698:1: ( ( rule__PerspectivePart__UnorderedGroup_3__0 )? )
-            // InternalPerspectiveDsl.g:20699:2: ( rule__PerspectivePart__UnorderedGroup_3__0 )?
+            // InternalPerspectiveDsl.g:20700:1: ( ( rule__PerspectivePart__UnorderedGroup_3__0 )? )
+            // InternalPerspectiveDsl.g:20701:2: ( rule__PerspectivePart__UnorderedGroup_3__0 )?
             {
-            // InternalPerspectiveDsl.g:20699:2: ( rule__PerspectivePart__UnorderedGroup_3__0 )?
+            // InternalPerspectiveDsl.g:20701:2: ( rule__PerspectivePart__UnorderedGroup_3__0 )?
             int alt156=2;
             int LA156_0 = input.LA(1);
 
@@ -67829,17 +67829,17 @@
 
 
     // $ANTLR start "rule__PerspectivePart__UnorderedGroup_3__Impl"
-    // InternalPerspectiveDsl.g:20707:1: rule__PerspectivePart__UnorderedGroup_3__Impl : ( ({...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) ) ) ) ) ;
+    // InternalPerspectiveDsl.g:20709:1: rule__PerspectivePart__UnorderedGroup_3__Impl : ( ({...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) ) ) ) ) ;
     public final void rule__PerspectivePart__UnorderedGroup_3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         		boolean selected = false;
         	
         try {
-            // InternalPerspectiveDsl.g:20712:1: ( ( ({...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) ) ) ) ) )
-            // InternalPerspectiveDsl.g:20713:3: ( ({...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) ) ) ) )
+            // InternalPerspectiveDsl.g:20714:1: ( ( ({...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) ) ) ) ) )
+            // InternalPerspectiveDsl.g:20715:3: ( ({...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) ) ) ) )
             {
-            // InternalPerspectiveDsl.g:20713:3: ( ({...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) ) ) ) )
+            // InternalPerspectiveDsl.g:20715:3: ( ({...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) ) ) ) )
             int alt157=5;
             int LA157_0 = input.LA(1);
 
@@ -67867,28 +67867,28 @@
             }
             switch (alt157) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:20714:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20716:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) ) )
                     {
-                    // InternalPerspectiveDsl.g:20714:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) ) )
-                    // InternalPerspectiveDsl.g:20715:4: {...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) )
+                    // InternalPerspectiveDsl.g:20716:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20717:4: {...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 0) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__PerspectivePart__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 0)");
                     }
-                    // InternalPerspectiveDsl.g:20715:111: ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) )
-                    // InternalPerspectiveDsl.g:20716:5: ( ( rule__PerspectivePart__Group_3_0__0 ) )
+                    // InternalPerspectiveDsl.g:20717:111: ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) )
+                    // InternalPerspectiveDsl.g:20718:5: ( ( rule__PerspectivePart__Group_3_0__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 0);
                     selected = true;
-                    // InternalPerspectiveDsl.g:20722:5: ( ( rule__PerspectivePart__Group_3_0__0 ) )
-                    // InternalPerspectiveDsl.g:20723:6: ( rule__PerspectivePart__Group_3_0__0 )
+                    // InternalPerspectiveDsl.g:20724:5: ( ( rule__PerspectivePart__Group_3_0__0 ) )
+                    // InternalPerspectiveDsl.g:20725:6: ( rule__PerspectivePart__Group_3_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectivePartAccess().getGroup_3_0()); 
                     }
-                    // InternalPerspectiveDsl.g:20724:6: ( rule__PerspectivePart__Group_3_0__0 )
-                    // InternalPerspectiveDsl.g:20724:7: rule__PerspectivePart__Group_3_0__0
+                    // InternalPerspectiveDsl.g:20726:6: ( rule__PerspectivePart__Group_3_0__0 )
+                    // InternalPerspectiveDsl.g:20726:7: rule__PerspectivePart__Group_3_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__PerspectivePart__Group_3_0__0();
@@ -67914,28 +67914,28 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:20729:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20731:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) ) )
                     {
-                    // InternalPerspectiveDsl.g:20729:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) ) )
-                    // InternalPerspectiveDsl.g:20730:4: {...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) )
+                    // InternalPerspectiveDsl.g:20731:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20732:4: {...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 1) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__PerspectivePart__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 1)");
                     }
-                    // InternalPerspectiveDsl.g:20730:111: ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) )
-                    // InternalPerspectiveDsl.g:20731:5: ( ( rule__PerspectivePart__Group_3_1__0 ) )
+                    // InternalPerspectiveDsl.g:20732:111: ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) )
+                    // InternalPerspectiveDsl.g:20733:5: ( ( rule__PerspectivePart__Group_3_1__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 1);
                     selected = true;
-                    // InternalPerspectiveDsl.g:20737:5: ( ( rule__PerspectivePart__Group_3_1__0 ) )
-                    // InternalPerspectiveDsl.g:20738:6: ( rule__PerspectivePart__Group_3_1__0 )
+                    // InternalPerspectiveDsl.g:20739:5: ( ( rule__PerspectivePart__Group_3_1__0 ) )
+                    // InternalPerspectiveDsl.g:20740:6: ( rule__PerspectivePart__Group_3_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectivePartAccess().getGroup_3_1()); 
                     }
-                    // InternalPerspectiveDsl.g:20739:6: ( rule__PerspectivePart__Group_3_1__0 )
-                    // InternalPerspectiveDsl.g:20739:7: rule__PerspectivePart__Group_3_1__0
+                    // InternalPerspectiveDsl.g:20741:6: ( rule__PerspectivePart__Group_3_1__0 )
+                    // InternalPerspectiveDsl.g:20741:7: rule__PerspectivePart__Group_3_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__PerspectivePart__Group_3_1__0();
@@ -67961,28 +67961,28 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:20744:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20746:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) ) )
                     {
-                    // InternalPerspectiveDsl.g:20744:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) ) )
-                    // InternalPerspectiveDsl.g:20745:4: {...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) )
+                    // InternalPerspectiveDsl.g:20746:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20747:4: {...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 2) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__PerspectivePart__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 2)");
                     }
-                    // InternalPerspectiveDsl.g:20745:111: ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) )
-                    // InternalPerspectiveDsl.g:20746:5: ( ( rule__PerspectivePart__Group_3_2__0 ) )
+                    // InternalPerspectiveDsl.g:20747:111: ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) )
+                    // InternalPerspectiveDsl.g:20748:5: ( ( rule__PerspectivePart__Group_3_2__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 2);
                     selected = true;
-                    // InternalPerspectiveDsl.g:20752:5: ( ( rule__PerspectivePart__Group_3_2__0 ) )
-                    // InternalPerspectiveDsl.g:20753:6: ( rule__PerspectivePart__Group_3_2__0 )
+                    // InternalPerspectiveDsl.g:20754:5: ( ( rule__PerspectivePart__Group_3_2__0 ) )
+                    // InternalPerspectiveDsl.g:20755:6: ( rule__PerspectivePart__Group_3_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectivePartAccess().getGroup_3_2()); 
                     }
-                    // InternalPerspectiveDsl.g:20754:6: ( rule__PerspectivePart__Group_3_2__0 )
-                    // InternalPerspectiveDsl.g:20754:7: rule__PerspectivePart__Group_3_2__0
+                    // InternalPerspectiveDsl.g:20756:6: ( rule__PerspectivePart__Group_3_2__0 )
+                    // InternalPerspectiveDsl.g:20756:7: rule__PerspectivePart__Group_3_2__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__PerspectivePart__Group_3_2__0();
@@ -68008,28 +68008,28 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:20759:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20761:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) ) )
                     {
-                    // InternalPerspectiveDsl.g:20759:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) ) )
-                    // InternalPerspectiveDsl.g:20760:4: {...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) )
+                    // InternalPerspectiveDsl.g:20761:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20762:4: {...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 3) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__PerspectivePart__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 3)");
                     }
-                    // InternalPerspectiveDsl.g:20760:111: ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) )
-                    // InternalPerspectiveDsl.g:20761:5: ( ( rule__PerspectivePart__Group_3_3__0 ) )
+                    // InternalPerspectiveDsl.g:20762:111: ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) )
+                    // InternalPerspectiveDsl.g:20763:5: ( ( rule__PerspectivePart__Group_3_3__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 3);
                     selected = true;
-                    // InternalPerspectiveDsl.g:20767:5: ( ( rule__PerspectivePart__Group_3_3__0 ) )
-                    // InternalPerspectiveDsl.g:20768:6: ( rule__PerspectivePart__Group_3_3__0 )
+                    // InternalPerspectiveDsl.g:20769:5: ( ( rule__PerspectivePart__Group_3_3__0 ) )
+                    // InternalPerspectiveDsl.g:20770:6: ( rule__PerspectivePart__Group_3_3__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectivePartAccess().getGroup_3_3()); 
                     }
-                    // InternalPerspectiveDsl.g:20769:6: ( rule__PerspectivePart__Group_3_3__0 )
-                    // InternalPerspectiveDsl.g:20769:7: rule__PerspectivePart__Group_3_3__0
+                    // InternalPerspectiveDsl.g:20771:6: ( rule__PerspectivePart__Group_3_3__0 )
+                    // InternalPerspectiveDsl.g:20771:7: rule__PerspectivePart__Group_3_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__PerspectivePart__Group_3_3__0();
@@ -68055,28 +68055,28 @@
                     }
                     break;
                 case 5 :
-                    // InternalPerspectiveDsl.g:20774:3: ({...}? => ( ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) ) ) )
+                    // InternalPerspectiveDsl.g:20776:3: ({...}? => ( ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) ) ) )
                     {
-                    // InternalPerspectiveDsl.g:20774:3: ({...}? => ( ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) ) ) )
-                    // InternalPerspectiveDsl.g:20775:4: {...}? => ( ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) ) )
+                    // InternalPerspectiveDsl.g:20776:3: ({...}? => ( ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) ) ) )
+                    // InternalPerspectiveDsl.g:20777:4: {...}? => ( ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 4) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__PerspectivePart__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 4)");
                     }
-                    // InternalPerspectiveDsl.g:20775:111: ( ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) ) )
-                    // InternalPerspectiveDsl.g:20776:5: ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) )
+                    // InternalPerspectiveDsl.g:20777:111: ( ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) ) )
+                    // InternalPerspectiveDsl.g:20778:5: ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 4);
                     selected = true;
-                    // InternalPerspectiveDsl.g:20782:5: ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) )
-                    // InternalPerspectiveDsl.g:20783:6: ( rule__PerspectivePart__IsClosableAssignment_3_4 )
+                    // InternalPerspectiveDsl.g:20784:5: ( ( rule__PerspectivePart__IsClosableAssignment_3_4 ) )
+                    // InternalPerspectiveDsl.g:20785:6: ( rule__PerspectivePart__IsClosableAssignment_3_4 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectivePartAccess().getIsClosableAssignment_3_4()); 
                     }
-                    // InternalPerspectiveDsl.g:20784:6: ( rule__PerspectivePart__IsClosableAssignment_3_4 )
-                    // InternalPerspectiveDsl.g:20784:7: rule__PerspectivePart__IsClosableAssignment_3_4
+                    // InternalPerspectiveDsl.g:20786:6: ( rule__PerspectivePart__IsClosableAssignment_3_4 )
+                    // InternalPerspectiveDsl.g:20786:7: rule__PerspectivePart__IsClosableAssignment_3_4
                     {
                     pushFollow(FOLLOW_2);
                     rule__PerspectivePart__IsClosableAssignment_3_4();
@@ -68125,21 +68125,21 @@
 
 
     // $ANTLR start "rule__PerspectivePart__UnorderedGroup_3__0"
-    // InternalPerspectiveDsl.g:20797:1: rule__PerspectivePart__UnorderedGroup_3__0 : rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__1 )? ;
+    // InternalPerspectiveDsl.g:20799:1: rule__PerspectivePart__UnorderedGroup_3__0 : rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__1 )? ;
     public final void rule__PerspectivePart__UnorderedGroup_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20801:1: ( rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__1 )? )
-            // InternalPerspectiveDsl.g:20802:2: rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__1 )?
+            // InternalPerspectiveDsl.g:20803:1: ( rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__1 )? )
+            // InternalPerspectiveDsl.g:20804:2: rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__1 )?
             {
             pushFollow(FOLLOW_142);
             rule__PerspectivePart__UnorderedGroup_3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalPerspectiveDsl.g:20803:2: ( rule__PerspectivePart__UnorderedGroup_3__1 )?
+            // InternalPerspectiveDsl.g:20805:2: ( rule__PerspectivePart__UnorderedGroup_3__1 )?
             int alt158=2;
             int LA158_0 = input.LA(1);
 
@@ -68192,21 +68192,21 @@
 
 
     // $ANTLR start "rule__PerspectivePart__UnorderedGroup_3__1"
-    // InternalPerspectiveDsl.g:20809:1: rule__PerspectivePart__UnorderedGroup_3__1 : rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__2 )? ;
+    // InternalPerspectiveDsl.g:20811:1: rule__PerspectivePart__UnorderedGroup_3__1 : rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__2 )? ;
     public final void rule__PerspectivePart__UnorderedGroup_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20813:1: ( rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__2 )? )
-            // InternalPerspectiveDsl.g:20814:2: rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__2 )?
+            // InternalPerspectiveDsl.g:20815:1: ( rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__2 )? )
+            // InternalPerspectiveDsl.g:20816:2: rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__2 )?
             {
             pushFollow(FOLLOW_142);
             rule__PerspectivePart__UnorderedGroup_3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalPerspectiveDsl.g:20815:2: ( rule__PerspectivePart__UnorderedGroup_3__2 )?
+            // InternalPerspectiveDsl.g:20817:2: ( rule__PerspectivePart__UnorderedGroup_3__2 )?
             int alt159=2;
             int LA159_0 = input.LA(1);
 
@@ -68259,21 +68259,21 @@
 
 
     // $ANTLR start "rule__PerspectivePart__UnorderedGroup_3__2"
-    // InternalPerspectiveDsl.g:20821:1: rule__PerspectivePart__UnorderedGroup_3__2 : rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__3 )? ;
+    // InternalPerspectiveDsl.g:20823:1: rule__PerspectivePart__UnorderedGroup_3__2 : rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__3 )? ;
     public final void rule__PerspectivePart__UnorderedGroup_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20825:1: ( rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__3 )? )
-            // InternalPerspectiveDsl.g:20826:2: rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__3 )?
+            // InternalPerspectiveDsl.g:20827:1: ( rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__3 )? )
+            // InternalPerspectiveDsl.g:20828:2: rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__3 )?
             {
             pushFollow(FOLLOW_142);
             rule__PerspectivePart__UnorderedGroup_3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalPerspectiveDsl.g:20827:2: ( rule__PerspectivePart__UnorderedGroup_3__3 )?
+            // InternalPerspectiveDsl.g:20829:2: ( rule__PerspectivePart__UnorderedGroup_3__3 )?
             int alt160=2;
             int LA160_0 = input.LA(1);
 
@@ -68326,21 +68326,21 @@
 
 
     // $ANTLR start "rule__PerspectivePart__UnorderedGroup_3__3"
-    // InternalPerspectiveDsl.g:20833:1: rule__PerspectivePart__UnorderedGroup_3__3 : rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__4 )? ;
+    // InternalPerspectiveDsl.g:20835:1: rule__PerspectivePart__UnorderedGroup_3__3 : rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__4 )? ;
     public final void rule__PerspectivePart__UnorderedGroup_3__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20837:1: ( rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__4 )? )
-            // InternalPerspectiveDsl.g:20838:2: rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__4 )?
+            // InternalPerspectiveDsl.g:20839:1: ( rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__4 )? )
+            // InternalPerspectiveDsl.g:20840:2: rule__PerspectivePart__UnorderedGroup_3__Impl ( rule__PerspectivePart__UnorderedGroup_3__4 )?
             {
             pushFollow(FOLLOW_142);
             rule__PerspectivePart__UnorderedGroup_3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalPerspectiveDsl.g:20839:2: ( rule__PerspectivePart__UnorderedGroup_3__4 )?
+            // InternalPerspectiveDsl.g:20841:2: ( rule__PerspectivePart__UnorderedGroup_3__4 )?
             int alt161=2;
             int LA161_0 = input.LA(1);
 
@@ -68393,14 +68393,14 @@
 
 
     // $ANTLR start "rule__PerspectivePart__UnorderedGroup_3__4"
-    // InternalPerspectiveDsl.g:20845:1: rule__PerspectivePart__UnorderedGroup_3__4 : rule__PerspectivePart__UnorderedGroup_3__Impl ;
+    // InternalPerspectiveDsl.g:20847:1: rule__PerspectivePart__UnorderedGroup_3__4 : rule__PerspectivePart__UnorderedGroup_3__Impl ;
     public final void rule__PerspectivePart__UnorderedGroup_3__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20849:1: ( rule__PerspectivePart__UnorderedGroup_3__Impl )
-            // InternalPerspectiveDsl.g:20850:2: rule__PerspectivePart__UnorderedGroup_3__Impl
+            // InternalPerspectiveDsl.g:20851:1: ( rule__PerspectivePart__UnorderedGroup_3__Impl )
+            // InternalPerspectiveDsl.g:20852:2: rule__PerspectivePart__UnorderedGroup_3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectivePart__UnorderedGroup_3__Impl();
@@ -68426,17 +68426,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__UnorderedGroup_4"
-    // InternalPerspectiveDsl.g:20857:1: rule__PerspectiveSearch__UnorderedGroup_4 : ( rule__PerspectiveSearch__UnorderedGroup_4__0 )? ;
+    // InternalPerspectiveDsl.g:20859:1: rule__PerspectiveSearch__UnorderedGroup_4 : ( rule__PerspectiveSearch__UnorderedGroup_4__0 )? ;
     public final void rule__PerspectiveSearch__UnorderedGroup_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         		getUnorderedGroupHelper().enter(grammarAccess.getPerspectiveSearchAccess().getUnorderedGroup_4());
         	
         try {
-            // InternalPerspectiveDsl.g:20862:1: ( ( rule__PerspectiveSearch__UnorderedGroup_4__0 )? )
-            // InternalPerspectiveDsl.g:20863:2: ( rule__PerspectiveSearch__UnorderedGroup_4__0 )?
+            // InternalPerspectiveDsl.g:20864:1: ( ( rule__PerspectiveSearch__UnorderedGroup_4__0 )? )
+            // InternalPerspectiveDsl.g:20865:2: ( rule__PerspectiveSearch__UnorderedGroup_4__0 )?
             {
-            // InternalPerspectiveDsl.g:20863:2: ( rule__PerspectiveSearch__UnorderedGroup_4__0 )?
+            // InternalPerspectiveDsl.g:20865:2: ( rule__PerspectiveSearch__UnorderedGroup_4__0 )?
             int alt162=2;
             int LA162_0 = input.LA(1);
 
@@ -68481,17 +68481,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__UnorderedGroup_4__Impl"
-    // InternalPerspectiveDsl.g:20871:1: rule__PerspectiveSearch__UnorderedGroup_4__Impl : ( ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_1__0 ) ) ) ) ) ;
+    // InternalPerspectiveDsl.g:20873:1: rule__PerspectiveSearch__UnorderedGroup_4__Impl : ( ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_1__0 ) ) ) ) ) ;
     public final void rule__PerspectiveSearch__UnorderedGroup_4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         		boolean selected = false;
         	
         try {
-            // InternalPerspectiveDsl.g:20876:1: ( ( ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_1__0 ) ) ) ) ) )
-            // InternalPerspectiveDsl.g:20877:3: ( ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_1__0 ) ) ) ) )
+            // InternalPerspectiveDsl.g:20878:1: ( ( ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_1__0 ) ) ) ) ) )
+            // InternalPerspectiveDsl.g:20879:3: ( ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_1__0 ) ) ) ) )
             {
-            // InternalPerspectiveDsl.g:20877:3: ( ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_1__0 ) ) ) ) )
+            // InternalPerspectiveDsl.g:20879:3: ( ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) ) ) | ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_1__0 ) ) ) ) )
             int alt163=2;
             int LA163_0 = input.LA(1);
 
@@ -68510,28 +68510,28 @@
             }
             switch (alt163) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:20878:3: ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20880:3: ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) ) )
                     {
-                    // InternalPerspectiveDsl.g:20878:3: ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) ) )
-                    // InternalPerspectiveDsl.g:20879:4: {...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) )
+                    // InternalPerspectiveDsl.g:20880:3: ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20881:4: {...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSearchAccess().getUnorderedGroup_4(), 0) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__PerspectiveSearch__UnorderedGroup_4__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSearchAccess().getUnorderedGroup_4(), 0)");
                     }
-                    // InternalPerspectiveDsl.g:20879:113: ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) )
-                    // InternalPerspectiveDsl.g:20880:5: ( ( rule__PerspectiveSearch__Group_4_0__0 ) )
+                    // InternalPerspectiveDsl.g:20881:113: ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) )
+                    // InternalPerspectiveDsl.g:20882:5: ( ( rule__PerspectiveSearch__Group_4_0__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getPerspectiveSearchAccess().getUnorderedGroup_4(), 0);
                     selected = true;
-                    // InternalPerspectiveDsl.g:20886:5: ( ( rule__PerspectiveSearch__Group_4_0__0 ) )
-                    // InternalPerspectiveDsl.g:20887:6: ( rule__PerspectiveSearch__Group_4_0__0 )
+                    // InternalPerspectiveDsl.g:20888:5: ( ( rule__PerspectiveSearch__Group_4_0__0 ) )
+                    // InternalPerspectiveDsl.g:20889:6: ( rule__PerspectiveSearch__Group_4_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveSearchAccess().getGroup_4_0()); 
                     }
-                    // InternalPerspectiveDsl.g:20888:6: ( rule__PerspectiveSearch__Group_4_0__0 )
-                    // InternalPerspectiveDsl.g:20888:7: rule__PerspectiveSearch__Group_4_0__0
+                    // InternalPerspectiveDsl.g:20890:6: ( rule__PerspectiveSearch__Group_4_0__0 )
+                    // InternalPerspectiveDsl.g:20890:7: rule__PerspectiveSearch__Group_4_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__PerspectiveSearch__Group_4_0__0();
@@ -68557,28 +68557,28 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:20893:3: ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_1__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20895:3: ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_1__0 ) ) ) )
                     {
-                    // InternalPerspectiveDsl.g:20893:3: ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_1__0 ) ) ) )
-                    // InternalPerspectiveDsl.g:20894:4: {...}? => ( ( ( rule__PerspectiveSearch__Group_4_1__0 ) ) )
+                    // InternalPerspectiveDsl.g:20895:3: ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_1__0 ) ) ) )
+                    // InternalPerspectiveDsl.g:20896:4: {...}? => ( ( ( rule__PerspectiveSearch__Group_4_1__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSearchAccess().getUnorderedGroup_4(), 1) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__PerspectiveSearch__UnorderedGroup_4__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSearchAccess().getUnorderedGroup_4(), 1)");
                     }
-                    // InternalPerspectiveDsl.g:20894:113: ( ( ( rule__PerspectiveSearch__Group_4_1__0 ) ) )
-                    // InternalPerspectiveDsl.g:20895:5: ( ( rule__PerspectiveSearch__Group_4_1__0 ) )
+                    // InternalPerspectiveDsl.g:20896:113: ( ( ( rule__PerspectiveSearch__Group_4_1__0 ) ) )
+                    // InternalPerspectiveDsl.g:20897:5: ( ( rule__PerspectiveSearch__Group_4_1__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getPerspectiveSearchAccess().getUnorderedGroup_4(), 1);
                     selected = true;
-                    // InternalPerspectiveDsl.g:20901:5: ( ( rule__PerspectiveSearch__Group_4_1__0 ) )
-                    // InternalPerspectiveDsl.g:20902:6: ( rule__PerspectiveSearch__Group_4_1__0 )
+                    // InternalPerspectiveDsl.g:20903:5: ( ( rule__PerspectiveSearch__Group_4_1__0 ) )
+                    // InternalPerspectiveDsl.g:20904:6: ( rule__PerspectiveSearch__Group_4_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPerspectiveSearchAccess().getGroup_4_1()); 
                     }
-                    // InternalPerspectiveDsl.g:20903:6: ( rule__PerspectiveSearch__Group_4_1__0 )
-                    // InternalPerspectiveDsl.g:20903:7: rule__PerspectiveSearch__Group_4_1__0
+                    // InternalPerspectiveDsl.g:20905:6: ( rule__PerspectiveSearch__Group_4_1__0 )
+                    // InternalPerspectiveDsl.g:20905:7: rule__PerspectiveSearch__Group_4_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__PerspectiveSearch__Group_4_1__0();
@@ -68627,21 +68627,21 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__UnorderedGroup_4__0"
-    // InternalPerspectiveDsl.g:20916:1: rule__PerspectiveSearch__UnorderedGroup_4__0 : rule__PerspectiveSearch__UnorderedGroup_4__Impl ( rule__PerspectiveSearch__UnorderedGroup_4__1 )? ;
+    // InternalPerspectiveDsl.g:20918:1: rule__PerspectiveSearch__UnorderedGroup_4__0 : rule__PerspectiveSearch__UnorderedGroup_4__Impl ( rule__PerspectiveSearch__UnorderedGroup_4__1 )? ;
     public final void rule__PerspectiveSearch__UnorderedGroup_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20920:1: ( rule__PerspectiveSearch__UnorderedGroup_4__Impl ( rule__PerspectiveSearch__UnorderedGroup_4__1 )? )
-            // InternalPerspectiveDsl.g:20921:2: rule__PerspectiveSearch__UnorderedGroup_4__Impl ( rule__PerspectiveSearch__UnorderedGroup_4__1 )?
+            // InternalPerspectiveDsl.g:20922:1: ( rule__PerspectiveSearch__UnorderedGroup_4__Impl ( rule__PerspectiveSearch__UnorderedGroup_4__1 )? )
+            // InternalPerspectiveDsl.g:20923:2: rule__PerspectiveSearch__UnorderedGroup_4__Impl ( rule__PerspectiveSearch__UnorderedGroup_4__1 )?
             {
             pushFollow(FOLLOW_143);
             rule__PerspectiveSearch__UnorderedGroup_4__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalPerspectiveDsl.g:20922:2: ( rule__PerspectiveSearch__UnorderedGroup_4__1 )?
+            // InternalPerspectiveDsl.g:20924:2: ( rule__PerspectiveSearch__UnorderedGroup_4__1 )?
             int alt164=2;
             int LA164_0 = input.LA(1);
 
@@ -68685,14 +68685,14 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__UnorderedGroup_4__1"
-    // InternalPerspectiveDsl.g:20928:1: rule__PerspectiveSearch__UnorderedGroup_4__1 : rule__PerspectiveSearch__UnorderedGroup_4__Impl ;
+    // InternalPerspectiveDsl.g:20930:1: rule__PerspectiveSearch__UnorderedGroup_4__1 : rule__PerspectiveSearch__UnorderedGroup_4__Impl ;
     public final void rule__PerspectiveSearch__UnorderedGroup_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20932:1: ( rule__PerspectiveSearch__UnorderedGroup_4__Impl )
-            // InternalPerspectiveDsl.g:20933:2: rule__PerspectiveSearch__UnorderedGroup_4__Impl
+            // InternalPerspectiveDsl.g:20934:1: ( rule__PerspectiveSearch__UnorderedGroup_4__Impl )
+            // InternalPerspectiveDsl.g:20935:2: rule__PerspectiveSearch__UnorderedGroup_4__Impl
             {
             pushFollow(FOLLOW_2);
             rule__PerspectiveSearch__UnorderedGroup_4__Impl();
@@ -68718,17 +68718,17 @@
 
 
     // $ANTLR start "rule__PerspectiveModel__ImportSectionAssignment_0"
-    // InternalPerspectiveDsl.g:20940:1: rule__PerspectiveModel__ImportSectionAssignment_0 : ( ruleXImportSection ) ;
+    // InternalPerspectiveDsl.g:20942:1: rule__PerspectiveModel__ImportSectionAssignment_0 : ( ruleXImportSection ) ;
     public final void rule__PerspectiveModel__ImportSectionAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20944:1: ( ( ruleXImportSection ) )
-            // InternalPerspectiveDsl.g:20945:2: ( ruleXImportSection )
+            // InternalPerspectiveDsl.g:20946:1: ( ( ruleXImportSection ) )
+            // InternalPerspectiveDsl.g:20947:2: ( ruleXImportSection )
             {
-            // InternalPerspectiveDsl.g:20945:2: ( ruleXImportSection )
-            // InternalPerspectiveDsl.g:20946:3: ruleXImportSection
+            // InternalPerspectiveDsl.g:20947:2: ( ruleXImportSection )
+            // InternalPerspectiveDsl.g:20948:3: ruleXImportSection
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveModelAccess().getImportSectionXImportSectionParserRuleCall_0_0()); 
@@ -68763,17 +68763,17 @@
 
 
     // $ANTLR start "rule__PerspectiveModel__PackagesAssignment_1"
-    // InternalPerspectiveDsl.g:20955:1: rule__PerspectiveModel__PackagesAssignment_1 : ( rulePerspectivePackage ) ;
+    // InternalPerspectiveDsl.g:20957:1: rule__PerspectiveModel__PackagesAssignment_1 : ( rulePerspectivePackage ) ;
     public final void rule__PerspectiveModel__PackagesAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20959:1: ( ( rulePerspectivePackage ) )
-            // InternalPerspectiveDsl.g:20960:2: ( rulePerspectivePackage )
+            // InternalPerspectiveDsl.g:20961:1: ( ( rulePerspectivePackage ) )
+            // InternalPerspectiveDsl.g:20962:2: ( rulePerspectivePackage )
             {
-            // InternalPerspectiveDsl.g:20960:2: ( rulePerspectivePackage )
-            // InternalPerspectiveDsl.g:20961:3: rulePerspectivePackage
+            // InternalPerspectiveDsl.g:20962:2: ( rulePerspectivePackage )
+            // InternalPerspectiveDsl.g:20963:3: rulePerspectivePackage
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveModelAccess().getPackagesPerspectivePackageParserRuleCall_1_0()); 
@@ -68808,17 +68808,17 @@
 
 
     // $ANTLR start "rule__PerspectivePackage__NameAssignment_2"
-    // InternalPerspectiveDsl.g:20970:1: rule__PerspectivePackage__NameAssignment_2 : ( ruleQualifiedName ) ;
+    // InternalPerspectiveDsl.g:20972:1: rule__PerspectivePackage__NameAssignment_2 : ( ruleQualifiedName ) ;
     public final void rule__PerspectivePackage__NameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20974:1: ( ( ruleQualifiedName ) )
-            // InternalPerspectiveDsl.g:20975:2: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:20976:1: ( ( ruleQualifiedName ) )
+            // InternalPerspectiveDsl.g:20977:2: ( ruleQualifiedName )
             {
-            // InternalPerspectiveDsl.g:20975:2: ( ruleQualifiedName )
-            // InternalPerspectiveDsl.g:20976:3: ruleQualifiedName
+            // InternalPerspectiveDsl.g:20977:2: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:20978:3: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePackageAccess().getNameQualifiedNameParserRuleCall_2_0()); 
@@ -68853,17 +68853,17 @@
 
 
     // $ANTLR start "rule__PerspectivePackage__PerspectivesAssignment_3_1"
-    // InternalPerspectiveDsl.g:20985:1: rule__PerspectivePackage__PerspectivesAssignment_3_1 : ( rulePerspective ) ;
+    // InternalPerspectiveDsl.g:20987:1: rule__PerspectivePackage__PerspectivesAssignment_3_1 : ( rulePerspective ) ;
     public final void rule__PerspectivePackage__PerspectivesAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:20989:1: ( ( rulePerspective ) )
-            // InternalPerspectiveDsl.g:20990:2: ( rulePerspective )
+            // InternalPerspectiveDsl.g:20991:1: ( ( rulePerspective ) )
+            // InternalPerspectiveDsl.g:20992:2: ( rulePerspective )
             {
-            // InternalPerspectiveDsl.g:20990:2: ( rulePerspective )
-            // InternalPerspectiveDsl.g:20991:3: rulePerspective
+            // InternalPerspectiveDsl.g:20992:2: ( rulePerspective )
+            // InternalPerspectiveDsl.g:20993:3: rulePerspective
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePackageAccess().getPerspectivesPerspectiveParserRuleCall_3_1_0()); 
@@ -68898,17 +68898,17 @@
 
 
     // $ANTLR start "rule__Perspective__NameAssignment_2"
-    // InternalPerspectiveDsl.g:21000:1: rule__Perspective__NameAssignment_2 : ( ruleTRANSLATABLEID ) ;
+    // InternalPerspectiveDsl.g:21002:1: rule__Perspective__NameAssignment_2 : ( ruleTRANSLATABLEID ) ;
     public final void rule__Perspective__NameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21004:1: ( ( ruleTRANSLATABLEID ) )
-            // InternalPerspectiveDsl.g:21005:2: ( ruleTRANSLATABLEID )
+            // InternalPerspectiveDsl.g:21006:1: ( ( ruleTRANSLATABLEID ) )
+            // InternalPerspectiveDsl.g:21007:2: ( ruleTRANSLATABLEID )
             {
-            // InternalPerspectiveDsl.g:21005:2: ( ruleTRANSLATABLEID )
-            // InternalPerspectiveDsl.g:21006:3: ruleTRANSLATABLEID
+            // InternalPerspectiveDsl.g:21007:2: ( ruleTRANSLATABLEID )
+            // InternalPerspectiveDsl.g:21008:3: ruleTRANSLATABLEID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getNameTRANSLATABLEIDParserRuleCall_2_0()); 
@@ -68943,23 +68943,23 @@
 
 
     // $ANTLR start "rule__Perspective__DescriptionAssignment_3_0"
-    // InternalPerspectiveDsl.g:21015:1: rule__Perspective__DescriptionAssignment_3_0 : ( ( 'describedBy' ) ) ;
+    // InternalPerspectiveDsl.g:21017:1: rule__Perspective__DescriptionAssignment_3_0 : ( ( 'describedBy' ) ) ;
     public final void rule__Perspective__DescriptionAssignment_3_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21019:1: ( ( ( 'describedBy' ) ) )
-            // InternalPerspectiveDsl.g:21020:2: ( ( 'describedBy' ) )
+            // InternalPerspectiveDsl.g:21021:1: ( ( ( 'describedBy' ) ) )
+            // InternalPerspectiveDsl.g:21022:2: ( ( 'describedBy' ) )
             {
-            // InternalPerspectiveDsl.g:21020:2: ( ( 'describedBy' ) )
-            // InternalPerspectiveDsl.g:21021:3: ( 'describedBy' )
+            // InternalPerspectiveDsl.g:21022:2: ( ( 'describedBy' ) )
+            // InternalPerspectiveDsl.g:21023:3: ( 'describedBy' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getDescriptionDescribedByKeyword_3_0_0()); 
             }
-            // InternalPerspectiveDsl.g:21022:3: ( 'describedBy' )
-            // InternalPerspectiveDsl.g:21023:4: 'describedBy'
+            // InternalPerspectiveDsl.g:21024:3: ( 'describedBy' )
+            // InternalPerspectiveDsl.g:21025:4: 'describedBy'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getDescriptionDescribedByKeyword_3_0_0()); 
@@ -68996,17 +68996,17 @@
 
 
     // $ANTLR start "rule__Perspective__DescriptionValueAssignment_3_1"
-    // InternalPerspectiveDsl.g:21034:1: rule__Perspective__DescriptionValueAssignment_3_1 : ( ruleTRANSLATABLESTRING ) ;
+    // InternalPerspectiveDsl.g:21036:1: rule__Perspective__DescriptionValueAssignment_3_1 : ( ruleTRANSLATABLESTRING ) ;
     public final void rule__Perspective__DescriptionValueAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21038:1: ( ( ruleTRANSLATABLESTRING ) )
-            // InternalPerspectiveDsl.g:21039:2: ( ruleTRANSLATABLESTRING )
+            // InternalPerspectiveDsl.g:21040:1: ( ( ruleTRANSLATABLESTRING ) )
+            // InternalPerspectiveDsl.g:21041:2: ( ruleTRANSLATABLESTRING )
             {
-            // InternalPerspectiveDsl.g:21039:2: ( ruleTRANSLATABLESTRING )
-            // InternalPerspectiveDsl.g:21040:3: ruleTRANSLATABLESTRING
+            // InternalPerspectiveDsl.g:21041:2: ( ruleTRANSLATABLESTRING )
+            // InternalPerspectiveDsl.g:21042:3: ruleTRANSLATABLESTRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getDescriptionValueTRANSLATABLESTRINGParserRuleCall_3_1_0()); 
@@ -69041,23 +69041,23 @@
 
 
     // $ANTLR start "rule__Perspective__ProcessAssignment_4_1"
-    // InternalPerspectiveDsl.g:21049:1: rule__Perspective__ProcessAssignment_4_1 : ( ( RULE_ID ) ) ;
+    // InternalPerspectiveDsl.g:21051:1: rule__Perspective__ProcessAssignment_4_1 : ( ( RULE_ID ) ) ;
     public final void rule__Perspective__ProcessAssignment_4_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21053:1: ( ( ( RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:21054:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21055:1: ( ( ( RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:21056:2: ( ( RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:21054:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21055:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21056:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21057:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getProcessBlipCrossReference_4_1_0()); 
             }
-            // InternalPerspectiveDsl.g:21056:3: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21057:4: RULE_ID
+            // InternalPerspectiveDsl.g:21058:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21059:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getProcessBlipIDTerminalRuleCall_4_1_0_1()); 
@@ -69094,23 +69094,23 @@
 
 
     // $ANTLR start "rule__Perspective__UserTaskAssignment_4_3"
-    // InternalPerspectiveDsl.g:21068:1: rule__Perspective__UserTaskAssignment_4_3 : ( ( RULE_ID ) ) ;
+    // InternalPerspectiveDsl.g:21070:1: rule__Perspective__UserTaskAssignment_4_3 : ( ( RULE_ID ) ) ;
     public final void rule__Perspective__UserTaskAssignment_4_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21072:1: ( ( ( RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:21073:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21074:1: ( ( ( RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:21075:2: ( ( RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:21073:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21074:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21075:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21076:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getUserTaskBlipUserTaskCrossReference_4_3_0()); 
             }
-            // InternalPerspectiveDsl.g:21075:3: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21076:4: RULE_ID
+            // InternalPerspectiveDsl.g:21077:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21078:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getUserTaskBlipUserTaskIDTerminalRuleCall_4_3_0_1()); 
@@ -69147,17 +69147,17 @@
 
 
     // $ANTLR start "rule__Perspective__IconURIAssignment_5_0_1"
-    // InternalPerspectiveDsl.g:21087:1: rule__Perspective__IconURIAssignment_5_0_1 : ( RULE_STRING ) ;
+    // InternalPerspectiveDsl.g:21089:1: rule__Perspective__IconURIAssignment_5_0_1 : ( RULE_STRING ) ;
     public final void rule__Perspective__IconURIAssignment_5_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21091:1: ( ( RULE_STRING ) )
-            // InternalPerspectiveDsl.g:21092:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21093:1: ( ( RULE_STRING ) )
+            // InternalPerspectiveDsl.g:21094:2: ( RULE_STRING )
             {
-            // InternalPerspectiveDsl.g:21092:2: ( RULE_STRING )
-            // InternalPerspectiveDsl.g:21093:3: RULE_STRING
+            // InternalPerspectiveDsl.g:21094:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21095:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getIconURISTRINGTerminalRuleCall_5_0_1_0()); 
@@ -69188,17 +69188,17 @@
 
 
     // $ANTLR start "rule__Perspective__AccessibilityPhraseAssignment_5_1_1"
-    // InternalPerspectiveDsl.g:21102:1: rule__Perspective__AccessibilityPhraseAssignment_5_1_1 : ( RULE_STRING ) ;
+    // InternalPerspectiveDsl.g:21104:1: rule__Perspective__AccessibilityPhraseAssignment_5_1_1 : ( RULE_STRING ) ;
     public final void rule__Perspective__AccessibilityPhraseAssignment_5_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21106:1: ( ( RULE_STRING ) )
-            // InternalPerspectiveDsl.g:21107:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21108:1: ( ( RULE_STRING ) )
+            // InternalPerspectiveDsl.g:21109:2: ( RULE_STRING )
             {
-            // InternalPerspectiveDsl.g:21107:2: ( RULE_STRING )
-            // InternalPerspectiveDsl.g:21108:3: RULE_STRING
+            // InternalPerspectiveDsl.g:21109:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21110:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getAccessibilityPhraseSTRINGTerminalRuleCall_5_1_1_0()); 
@@ -69229,23 +69229,23 @@
 
 
     // $ANTLR start "rule__Perspective__ToolbarAssignment_5_2_1"
-    // InternalPerspectiveDsl.g:21117:1: rule__Perspective__ToolbarAssignment_5_2_1 : ( ( RULE_ID ) ) ;
+    // InternalPerspectiveDsl.g:21119:1: rule__Perspective__ToolbarAssignment_5_2_1 : ( ( RULE_ID ) ) ;
     public final void rule__Perspective__ToolbarAssignment_5_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21121:1: ( ( ( RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:21122:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21123:1: ( ( ( RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:21124:2: ( ( RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:21122:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21123:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21124:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21125:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getToolbarActionToolbarCrossReference_5_2_1_0()); 
             }
-            // InternalPerspectiveDsl.g:21124:3: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21125:4: RULE_ID
+            // InternalPerspectiveDsl.g:21126:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21127:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getToolbarActionToolbarIDTerminalRuleCall_5_2_1_0_1()); 
@@ -69282,17 +69282,17 @@
 
 
     // $ANTLR start "rule__Perspective__ElementsAssignment_7"
-    // InternalPerspectiveDsl.g:21136:1: rule__Perspective__ElementsAssignment_7 : ( rulePerspectiveElement ) ;
+    // InternalPerspectiveDsl.g:21138:1: rule__Perspective__ElementsAssignment_7 : ( rulePerspectiveElement ) ;
     public final void rule__Perspective__ElementsAssignment_7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21140:1: ( ( rulePerspectiveElement ) )
-            // InternalPerspectiveDsl.g:21141:2: ( rulePerspectiveElement )
+            // InternalPerspectiveDsl.g:21142:1: ( ( rulePerspectiveElement ) )
+            // InternalPerspectiveDsl.g:21143:2: ( rulePerspectiveElement )
             {
-            // InternalPerspectiveDsl.g:21141:2: ( rulePerspectiveElement )
-            // InternalPerspectiveDsl.g:21142:3: rulePerspectiveElement
+            // InternalPerspectiveDsl.g:21143:2: ( rulePerspectiveElement )
+            // InternalPerspectiveDsl.g:21144:3: rulePerspectiveElement
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveAccess().getElementsPerspectiveElementParserRuleCall_7_0()); 
@@ -69327,17 +69327,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__ElementIdAssignment_2"
-    // InternalPerspectiveDsl.g:21151:1: rule__PerspectiveSashContainer__ElementIdAssignment_2 : ( RULE_ID ) ;
+    // InternalPerspectiveDsl.g:21153:1: rule__PerspectiveSashContainer__ElementIdAssignment_2 : ( RULE_ID ) ;
     public final void rule__PerspectiveSashContainer__ElementIdAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21155:1: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21156:2: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21157:1: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21158:2: ( RULE_ID )
             {
-            // InternalPerspectiveDsl.g:21156:2: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21157:3: RULE_ID
+            // InternalPerspectiveDsl.g:21158:2: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21159:3: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getElementIdIDTerminalRuleCall_2_0()); 
@@ -69368,17 +69368,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__OrientationAssignment_3_0_1"
-    // InternalPerspectiveDsl.g:21166:1: rule__PerspectiveSashContainer__OrientationAssignment_3_0_1 : ( ruleSashOrientation ) ;
+    // InternalPerspectiveDsl.g:21168:1: rule__PerspectiveSashContainer__OrientationAssignment_3_0_1 : ( ruleSashOrientation ) ;
     public final void rule__PerspectiveSashContainer__OrientationAssignment_3_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21170:1: ( ( ruleSashOrientation ) )
-            // InternalPerspectiveDsl.g:21171:2: ( ruleSashOrientation )
+            // InternalPerspectiveDsl.g:21172:1: ( ( ruleSashOrientation ) )
+            // InternalPerspectiveDsl.g:21173:2: ( ruleSashOrientation )
             {
-            // InternalPerspectiveDsl.g:21171:2: ( ruleSashOrientation )
-            // InternalPerspectiveDsl.g:21172:3: ruleSashOrientation
+            // InternalPerspectiveDsl.g:21173:2: ( ruleSashOrientation )
+            // InternalPerspectiveDsl.g:21174:3: ruleSashOrientation
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getOrientationSashOrientationEnumRuleCall_3_0_1_0()); 
@@ -69413,23 +69413,23 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__SelectedElementAssignment_3_1_1"
-    // InternalPerspectiveDsl.g:21181:1: rule__PerspectiveSashContainer__SelectedElementAssignment_3_1_1 : ( ( RULE_ID ) ) ;
+    // InternalPerspectiveDsl.g:21183:1: rule__PerspectiveSashContainer__SelectedElementAssignment_3_1_1 : ( ( RULE_ID ) ) ;
     public final void rule__PerspectiveSashContainer__SelectedElementAssignment_3_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21185:1: ( ( ( RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:21186:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21187:1: ( ( ( RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:21188:2: ( ( RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:21186:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21187:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21188:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21189:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getSelectedElementPerspectiveElementCrossReference_3_1_1_0()); 
             }
-            // InternalPerspectiveDsl.g:21188:3: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21189:4: RULE_ID
+            // InternalPerspectiveDsl.g:21190:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21191:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getSelectedElementPerspectiveElementIDTerminalRuleCall_3_1_1_0_1()); 
@@ -69466,17 +69466,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__ContainerDataAssignment_3_2_1"
-    // InternalPerspectiveDsl.g:21200:1: rule__PerspectiveSashContainer__ContainerDataAssignment_3_2_1 : ( RULE_STRING ) ;
+    // InternalPerspectiveDsl.g:21202:1: rule__PerspectiveSashContainer__ContainerDataAssignment_3_2_1 : ( RULE_STRING ) ;
     public final void rule__PerspectiveSashContainer__ContainerDataAssignment_3_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21204:1: ( ( RULE_STRING ) )
-            // InternalPerspectiveDsl.g:21205:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21206:1: ( ( RULE_STRING ) )
+            // InternalPerspectiveDsl.g:21207:2: ( RULE_STRING )
             {
-            // InternalPerspectiveDsl.g:21205:2: ( RULE_STRING )
-            // InternalPerspectiveDsl.g:21206:3: RULE_STRING
+            // InternalPerspectiveDsl.g:21207:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21208:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getContainerDataSTRINGTerminalRuleCall_3_2_1_0()); 
@@ -69507,17 +69507,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__AccessibilityPhraseAssignment_3_3_1"
-    // InternalPerspectiveDsl.g:21215:1: rule__PerspectiveSashContainer__AccessibilityPhraseAssignment_3_3_1 : ( RULE_STRING ) ;
+    // InternalPerspectiveDsl.g:21217:1: rule__PerspectiveSashContainer__AccessibilityPhraseAssignment_3_3_1 : ( RULE_STRING ) ;
     public final void rule__PerspectiveSashContainer__AccessibilityPhraseAssignment_3_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21219:1: ( ( RULE_STRING ) )
-            // InternalPerspectiveDsl.g:21220:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21221:1: ( ( RULE_STRING ) )
+            // InternalPerspectiveDsl.g:21222:2: ( RULE_STRING )
             {
-            // InternalPerspectiveDsl.g:21220:2: ( RULE_STRING )
-            // InternalPerspectiveDsl.g:21221:3: RULE_STRING
+            // InternalPerspectiveDsl.g:21222:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21223:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getAccessibilityPhraseSTRINGTerminalRuleCall_3_3_1_0()); 
@@ -69548,17 +69548,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSashContainer__ElementsAssignment_5"
-    // InternalPerspectiveDsl.g:21230:1: rule__PerspectiveSashContainer__ElementsAssignment_5 : ( rulePerspectiveElement ) ;
+    // InternalPerspectiveDsl.g:21232:1: rule__PerspectiveSashContainer__ElementsAssignment_5 : ( rulePerspectiveElement ) ;
     public final void rule__PerspectiveSashContainer__ElementsAssignment_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21234:1: ( ( rulePerspectiveElement ) )
-            // InternalPerspectiveDsl.g:21235:2: ( rulePerspectiveElement )
+            // InternalPerspectiveDsl.g:21236:1: ( ( rulePerspectiveElement ) )
+            // InternalPerspectiveDsl.g:21237:2: ( rulePerspectiveElement )
             {
-            // InternalPerspectiveDsl.g:21235:2: ( rulePerspectiveElement )
-            // InternalPerspectiveDsl.g:21236:3: rulePerspectiveElement
+            // InternalPerspectiveDsl.g:21237:2: ( rulePerspectiveElement )
+            // InternalPerspectiveDsl.g:21238:3: rulePerspectiveElement
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSashContainerAccess().getElementsPerspectiveElementParserRuleCall_5_0()); 
@@ -69593,17 +69593,17 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__ElementIdAssignment_2"
-    // InternalPerspectiveDsl.g:21245:1: rule__PerspectivePartStack__ElementIdAssignment_2 : ( RULE_ID ) ;
+    // InternalPerspectiveDsl.g:21247:1: rule__PerspectivePartStack__ElementIdAssignment_2 : ( RULE_ID ) ;
     public final void rule__PerspectivePartStack__ElementIdAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21249:1: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21250:2: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21251:1: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21252:2: ( RULE_ID )
             {
-            // InternalPerspectiveDsl.g:21250:2: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21251:3: RULE_ID
+            // InternalPerspectiveDsl.g:21252:2: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21253:3: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getElementIdIDTerminalRuleCall_2_0()); 
@@ -69634,23 +69634,23 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__SelectedElementAssignment_3_0_1"
-    // InternalPerspectiveDsl.g:21260:1: rule__PerspectivePartStack__SelectedElementAssignment_3_0_1 : ( ( RULE_ID ) ) ;
+    // InternalPerspectiveDsl.g:21262:1: rule__PerspectivePartStack__SelectedElementAssignment_3_0_1 : ( ( RULE_ID ) ) ;
     public final void rule__PerspectivePartStack__SelectedElementAssignment_3_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21264:1: ( ( ( RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:21265:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21266:1: ( ( ( RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:21267:2: ( ( RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:21265:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21266:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21267:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21268:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getSelectedElementPerspectivePartCrossReference_3_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:21267:3: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21268:4: RULE_ID
+            // InternalPerspectiveDsl.g:21269:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21270:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getSelectedElementPerspectivePartIDTerminalRuleCall_3_0_1_0_1()); 
@@ -69687,17 +69687,17 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__ContainerDataAssignment_3_1_1"
-    // InternalPerspectiveDsl.g:21279:1: rule__PerspectivePartStack__ContainerDataAssignment_3_1_1 : ( RULE_STRING ) ;
+    // InternalPerspectiveDsl.g:21281:1: rule__PerspectivePartStack__ContainerDataAssignment_3_1_1 : ( RULE_STRING ) ;
     public final void rule__PerspectivePartStack__ContainerDataAssignment_3_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21283:1: ( ( RULE_STRING ) )
-            // InternalPerspectiveDsl.g:21284:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21285:1: ( ( RULE_STRING ) )
+            // InternalPerspectiveDsl.g:21286:2: ( RULE_STRING )
             {
-            // InternalPerspectiveDsl.g:21284:2: ( RULE_STRING )
-            // InternalPerspectiveDsl.g:21285:3: RULE_STRING
+            // InternalPerspectiveDsl.g:21286:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21287:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getContainerDataSTRINGTerminalRuleCall_3_1_1_0()); 
@@ -69728,17 +69728,17 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__AccessibilityPhraseAssignment_3_2_1"
-    // InternalPerspectiveDsl.g:21294:1: rule__PerspectivePartStack__AccessibilityPhraseAssignment_3_2_1 : ( RULE_STRING ) ;
+    // InternalPerspectiveDsl.g:21296:1: rule__PerspectivePartStack__AccessibilityPhraseAssignment_3_2_1 : ( RULE_STRING ) ;
     public final void rule__PerspectivePartStack__AccessibilityPhraseAssignment_3_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21298:1: ( ( RULE_STRING ) )
-            // InternalPerspectiveDsl.g:21299:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21300:1: ( ( RULE_STRING ) )
+            // InternalPerspectiveDsl.g:21301:2: ( RULE_STRING )
             {
-            // InternalPerspectiveDsl.g:21299:2: ( RULE_STRING )
-            // InternalPerspectiveDsl.g:21300:3: RULE_STRING
+            // InternalPerspectiveDsl.g:21301:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21302:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getAccessibilityPhraseSTRINGTerminalRuleCall_3_2_1_0()); 
@@ -69769,17 +69769,17 @@
 
 
     // $ANTLR start "rule__PerspectivePartStack__ElementsAssignment_5"
-    // InternalPerspectiveDsl.g:21309:1: rule__PerspectivePartStack__ElementsAssignment_5 : ( rulePerspectiveElement ) ;
+    // InternalPerspectiveDsl.g:21311:1: rule__PerspectivePartStack__ElementsAssignment_5 : ( rulePerspectiveElement ) ;
     public final void rule__PerspectivePartStack__ElementsAssignment_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21313:1: ( ( rulePerspectiveElement ) )
-            // InternalPerspectiveDsl.g:21314:2: ( rulePerspectiveElement )
+            // InternalPerspectiveDsl.g:21315:1: ( ( rulePerspectiveElement ) )
+            // InternalPerspectiveDsl.g:21316:2: ( rulePerspectiveElement )
             {
-            // InternalPerspectiveDsl.g:21314:2: ( rulePerspectiveElement )
-            // InternalPerspectiveDsl.g:21315:3: rulePerspectiveElement
+            // InternalPerspectiveDsl.g:21316:2: ( rulePerspectiveElement )
+            // InternalPerspectiveDsl.g:21317:3: rulePerspectiveElement
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartStackAccess().getElementsPerspectiveElementParserRuleCall_5_0()); 
@@ -69814,17 +69814,17 @@
 
 
     // $ANTLR start "rule__PerspectivePart__ElementIdAssignment_2"
-    // InternalPerspectiveDsl.g:21324:1: rule__PerspectivePart__ElementIdAssignment_2 : ( ruleTRANSLATABLEID ) ;
+    // InternalPerspectiveDsl.g:21326:1: rule__PerspectivePart__ElementIdAssignment_2 : ( ruleTRANSLATABLEID ) ;
     public final void rule__PerspectivePart__ElementIdAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21328:1: ( ( ruleTRANSLATABLEID ) )
-            // InternalPerspectiveDsl.g:21329:2: ( ruleTRANSLATABLEID )
+            // InternalPerspectiveDsl.g:21330:1: ( ( ruleTRANSLATABLEID ) )
+            // InternalPerspectiveDsl.g:21331:2: ( ruleTRANSLATABLEID )
             {
-            // InternalPerspectiveDsl.g:21329:2: ( ruleTRANSLATABLEID )
-            // InternalPerspectiveDsl.g:21330:3: ruleTRANSLATABLEID
+            // InternalPerspectiveDsl.g:21331:2: ( ruleTRANSLATABLEID )
+            // InternalPerspectiveDsl.g:21332:3: ruleTRANSLATABLEID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getElementIdTRANSLATABLEIDParserRuleCall_2_0()); 
@@ -69859,17 +69859,17 @@
 
 
     // $ANTLR start "rule__PerspectivePart__ContainerDataAssignment_3_0_1"
-    // InternalPerspectiveDsl.g:21339:1: rule__PerspectivePart__ContainerDataAssignment_3_0_1 : ( RULE_STRING ) ;
+    // InternalPerspectiveDsl.g:21341:1: rule__PerspectivePart__ContainerDataAssignment_3_0_1 : ( RULE_STRING ) ;
     public final void rule__PerspectivePart__ContainerDataAssignment_3_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21343:1: ( ( RULE_STRING ) )
-            // InternalPerspectiveDsl.g:21344:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21345:1: ( ( RULE_STRING ) )
+            // InternalPerspectiveDsl.g:21346:2: ( RULE_STRING )
             {
-            // InternalPerspectiveDsl.g:21344:2: ( RULE_STRING )
-            // InternalPerspectiveDsl.g:21345:3: RULE_STRING
+            // InternalPerspectiveDsl.g:21346:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21347:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getContainerDataSTRINGTerminalRuleCall_3_0_1_0()); 
@@ -69900,17 +69900,17 @@
 
 
     // $ANTLR start "rule__PerspectivePart__AccessibilityPhraseAssignment_3_1_1"
-    // InternalPerspectiveDsl.g:21354:1: rule__PerspectivePart__AccessibilityPhraseAssignment_3_1_1 : ( RULE_STRING ) ;
+    // InternalPerspectiveDsl.g:21356:1: rule__PerspectivePart__AccessibilityPhraseAssignment_3_1_1 : ( RULE_STRING ) ;
     public final void rule__PerspectivePart__AccessibilityPhraseAssignment_3_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21358:1: ( ( RULE_STRING ) )
-            // InternalPerspectiveDsl.g:21359:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21360:1: ( ( RULE_STRING ) )
+            // InternalPerspectiveDsl.g:21361:2: ( RULE_STRING )
             {
-            // InternalPerspectiveDsl.g:21359:2: ( RULE_STRING )
-            // InternalPerspectiveDsl.g:21360:3: RULE_STRING
+            // InternalPerspectiveDsl.g:21361:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21362:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getAccessibilityPhraseSTRINGTerminalRuleCall_3_1_1_0()); 
@@ -69941,17 +69941,17 @@
 
 
     // $ANTLR start "rule__PerspectivePart__IconURIAssignment_3_2_1"
-    // InternalPerspectiveDsl.g:21369:1: rule__PerspectivePart__IconURIAssignment_3_2_1 : ( RULE_STRING ) ;
+    // InternalPerspectiveDsl.g:21371:1: rule__PerspectivePart__IconURIAssignment_3_2_1 : ( RULE_STRING ) ;
     public final void rule__PerspectivePart__IconURIAssignment_3_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21373:1: ( ( RULE_STRING ) )
-            // InternalPerspectiveDsl.g:21374:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21375:1: ( ( RULE_STRING ) )
+            // InternalPerspectiveDsl.g:21376:2: ( RULE_STRING )
             {
-            // InternalPerspectiveDsl.g:21374:2: ( RULE_STRING )
-            // InternalPerspectiveDsl.g:21375:3: RULE_STRING
+            // InternalPerspectiveDsl.g:21376:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21377:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getIconURISTRINGTerminalRuleCall_3_2_1_0()); 
@@ -69982,17 +69982,17 @@
 
 
     // $ANTLR start "rule__PerspectivePart__ViewAssignment_3_3_1"
-    // InternalPerspectiveDsl.g:21384:1: rule__PerspectivePart__ViewAssignment_3_3_1 : ( rulePerspectiveView ) ;
+    // InternalPerspectiveDsl.g:21386:1: rule__PerspectivePart__ViewAssignment_3_3_1 : ( rulePerspectiveView ) ;
     public final void rule__PerspectivePart__ViewAssignment_3_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21388:1: ( ( rulePerspectiveView ) )
-            // InternalPerspectiveDsl.g:21389:2: ( rulePerspectiveView )
+            // InternalPerspectiveDsl.g:21390:1: ( ( rulePerspectiveView ) )
+            // InternalPerspectiveDsl.g:21391:2: ( rulePerspectiveView )
             {
-            // InternalPerspectiveDsl.g:21389:2: ( rulePerspectiveView )
-            // InternalPerspectiveDsl.g:21390:3: rulePerspectiveView
+            // InternalPerspectiveDsl.g:21391:2: ( rulePerspectiveView )
+            // InternalPerspectiveDsl.g:21392:3: rulePerspectiveView
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getViewPerspectiveViewParserRuleCall_3_3_1_0()); 
@@ -70027,23 +70027,23 @@
 
 
     // $ANTLR start "rule__PerspectivePart__IsClosableAssignment_3_4"
-    // InternalPerspectiveDsl.g:21399:1: rule__PerspectivePart__IsClosableAssignment_3_4 : ( ( 'isClosable' ) ) ;
+    // InternalPerspectiveDsl.g:21401:1: rule__PerspectivePart__IsClosableAssignment_3_4 : ( ( 'isClosable' ) ) ;
     public final void rule__PerspectivePart__IsClosableAssignment_3_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21403:1: ( ( ( 'isClosable' ) ) )
-            // InternalPerspectiveDsl.g:21404:2: ( ( 'isClosable' ) )
+            // InternalPerspectiveDsl.g:21405:1: ( ( ( 'isClosable' ) ) )
+            // InternalPerspectiveDsl.g:21406:2: ( ( 'isClosable' ) )
             {
-            // InternalPerspectiveDsl.g:21404:2: ( ( 'isClosable' ) )
-            // InternalPerspectiveDsl.g:21405:3: ( 'isClosable' )
+            // InternalPerspectiveDsl.g:21406:2: ( ( 'isClosable' ) )
+            // InternalPerspectiveDsl.g:21407:3: ( 'isClosable' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getIsClosableIsClosableKeyword_3_4_0()); 
             }
-            // InternalPerspectiveDsl.g:21406:3: ( 'isClosable' )
-            // InternalPerspectiveDsl.g:21407:4: 'isClosable'
+            // InternalPerspectiveDsl.g:21408:3: ( 'isClosable' )
+            // InternalPerspectiveDsl.g:21409:4: 'isClosable'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectivePartAccess().getIsClosableIsClosableKeyword_3_4_0()); 
@@ -70080,23 +70080,23 @@
 
 
     // $ANTLR start "rule__PerspectiveSelection__RefAssignment_2"
-    // InternalPerspectiveDsl.g:21418:1: rule__PerspectiveSelection__RefAssignment_2 : ( ( RULE_ID ) ) ;
+    // InternalPerspectiveDsl.g:21420:1: rule__PerspectiveSelection__RefAssignment_2 : ( ( RULE_ID ) ) ;
     public final void rule__PerspectiveSelection__RefAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21422:1: ( ( ( RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:21423:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21424:1: ( ( ( RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:21425:2: ( ( RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:21423:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21424:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21425:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21426:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSelectionAccess().getRefTableCrossReference_2_0()); 
             }
-            // InternalPerspectiveDsl.g:21425:3: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21426:4: RULE_ID
+            // InternalPerspectiveDsl.g:21427:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21428:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSelectionAccess().getRefTableIDTerminalRuleCall_2_0_1()); 
@@ -70133,23 +70133,23 @@
 
 
     // $ANTLR start "rule__PerspectiveTable__RefAssignment_2"
-    // InternalPerspectiveDsl.g:21437:1: rule__PerspectiveTable__RefAssignment_2 : ( ( RULE_ID ) ) ;
+    // InternalPerspectiveDsl.g:21439:1: rule__PerspectiveTable__RefAssignment_2 : ( ( RULE_ID ) ) ;
     public final void rule__PerspectiveTable__RefAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21441:1: ( ( ( RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:21442:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21443:1: ( ( ( RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:21444:2: ( ( RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:21442:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21443:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21444:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21445:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTableAccess().getRefTableCrossReference_2_0()); 
             }
-            // InternalPerspectiveDsl.g:21444:3: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21445:4: RULE_ID
+            // InternalPerspectiveDsl.g:21446:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21447:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTableAccess().getRefTableIDTerminalRuleCall_2_0_1()); 
@@ -70186,23 +70186,23 @@
 
 
     // $ANTLR start "rule__PerspectiveGrid__RefAssignment_2"
-    // InternalPerspectiveDsl.g:21456:1: rule__PerspectiveGrid__RefAssignment_2 : ( ( RULE_ID ) ) ;
+    // InternalPerspectiveDsl.g:21458:1: rule__PerspectiveGrid__RefAssignment_2 : ( ( RULE_ID ) ) ;
     public final void rule__PerspectiveGrid__RefAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21460:1: ( ( ( RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:21461:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21462:1: ( ( ( RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:21463:2: ( ( RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:21461:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21462:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21463:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21464:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveGridAccess().getRefTableCrossReference_2_0()); 
             }
-            // InternalPerspectiveDsl.g:21463:3: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21464:4: RULE_ID
+            // InternalPerspectiveDsl.g:21465:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21466:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveGridAccess().getRefTableIDTerminalRuleCall_2_0_1()); 
@@ -70239,23 +70239,23 @@
 
 
     // $ANTLR start "rule__PerspectiveChart__RefAssignment_2"
-    // InternalPerspectiveDsl.g:21475:1: rule__PerspectiveChart__RefAssignment_2 : ( ( RULE_ID ) ) ;
+    // InternalPerspectiveDsl.g:21477:1: rule__PerspectiveChart__RefAssignment_2 : ( ( RULE_ID ) ) ;
     public final void rule__PerspectiveChart__RefAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21479:1: ( ( ( RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:21480:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21481:1: ( ( ( RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:21482:2: ( ( RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:21480:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21481:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21482:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21483:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveChartAccess().getRefChartCrossReference_2_0()); 
             }
-            // InternalPerspectiveDsl.g:21482:3: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21483:4: RULE_ID
+            // InternalPerspectiveDsl.g:21484:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21485:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveChartAccess().getRefChartIDTerminalRuleCall_2_0_1()); 
@@ -70292,23 +70292,23 @@
 
 
     // $ANTLR start "rule__PerspectiveReport__RefAssignment_2"
-    // InternalPerspectiveDsl.g:21494:1: rule__PerspectiveReport__RefAssignment_2 : ( ( RULE_ID ) ) ;
+    // InternalPerspectiveDsl.g:21496:1: rule__PerspectiveReport__RefAssignment_2 : ( ( RULE_ID ) ) ;
     public final void rule__PerspectiveReport__RefAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21498:1: ( ( ( RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:21499:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21500:1: ( ( ( RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:21501:2: ( ( RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:21499:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21500:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21501:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21502:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveReportAccess().getRefReportCrossReference_2_0()); 
             }
-            // InternalPerspectiveDsl.g:21501:3: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21502:4: RULE_ID
+            // InternalPerspectiveDsl.g:21503:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21504:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveReportAccess().getRefReportIDTerminalRuleCall_2_0_1()); 
@@ -70345,23 +70345,23 @@
 
 
     // $ANTLR start "rule__PerspectiveOrganization__RefAssignment_2"
-    // InternalPerspectiveDsl.g:21513:1: rule__PerspectiveOrganization__RefAssignment_2 : ( ( RULE_ID ) ) ;
+    // InternalPerspectiveDsl.g:21515:1: rule__PerspectiveOrganization__RefAssignment_2 : ( ( RULE_ID ) ) ;
     public final void rule__PerspectiveOrganization__RefAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21517:1: ( ( ( RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:21518:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21519:1: ( ( ( RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:21520:2: ( ( RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:21518:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21519:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21520:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21521:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveOrganizationAccess().getRefOrganizationCrossReference_2_0()); 
             }
-            // InternalPerspectiveDsl.g:21520:3: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21521:4: RULE_ID
+            // InternalPerspectiveDsl.g:21522:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21523:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveOrganizationAccess().getRefOrganizationIDTerminalRuleCall_2_0_1()); 
@@ -70398,23 +70398,23 @@
 
 
     // $ANTLR start "rule__PerspectiveTopology__RefAssignment_2"
-    // InternalPerspectiveDsl.g:21532:1: rule__PerspectiveTopology__RefAssignment_2 : ( ( RULE_ID ) ) ;
+    // InternalPerspectiveDsl.g:21534:1: rule__PerspectiveTopology__RefAssignment_2 : ( ( RULE_ID ) ) ;
     public final void rule__PerspectiveTopology__RefAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21536:1: ( ( ( RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:21537:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21538:1: ( ( ( RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:21539:2: ( ( RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:21537:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21538:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21539:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21540:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTopologyAccess().getRefTopologyCrossReference_2_0()); 
             }
-            // InternalPerspectiveDsl.g:21539:3: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21540:4: RULE_ID
+            // InternalPerspectiveDsl.g:21541:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21542:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTopologyAccess().getRefTopologyIDTerminalRuleCall_2_0_1()); 
@@ -70451,23 +70451,23 @@
 
 
     // $ANTLR start "rule__PerspectiveDialog__RefAssignment_2"
-    // InternalPerspectiveDsl.g:21551:1: rule__PerspectiveDialog__RefAssignment_2 : ( ( RULE_ID ) ) ;
+    // InternalPerspectiveDsl.g:21553:1: rule__PerspectiveDialog__RefAssignment_2 : ( ( RULE_ID ) ) ;
     public final void rule__PerspectiveDialog__RefAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21555:1: ( ( ( RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:21556:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21557:1: ( ( ( RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:21558:2: ( ( RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:21556:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21557:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21558:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21559:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveDialogAccess().getRefDialogCrossReference_2_0()); 
             }
-            // InternalPerspectiveDsl.g:21558:3: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21559:4: RULE_ID
+            // InternalPerspectiveDsl.g:21560:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21561:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveDialogAccess().getRefDialogIDTerminalRuleCall_2_0_1()); 
@@ -70504,23 +70504,23 @@
 
 
     // $ANTLR start "rule__PerspectiveKanban__DtoRefAssignment_3"
-    // InternalPerspectiveDsl.g:21570:1: rule__PerspectiveKanban__DtoRefAssignment_3 : ( ( RULE_ID ) ) ;
+    // InternalPerspectiveDsl.g:21572:1: rule__PerspectiveKanban__DtoRefAssignment_3 : ( ( RULE_ID ) ) ;
     public final void rule__PerspectiveKanban__DtoRefAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21574:1: ( ( ( RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:21575:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21576:1: ( ( ( RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:21577:2: ( ( RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:21575:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21576:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21577:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21578:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveKanbanAccess().getDtoRefLDtoCrossReference_3_0()); 
             }
-            // InternalPerspectiveDsl.g:21577:3: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21578:4: RULE_ID
+            // InternalPerspectiveDsl.g:21579:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21580:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveKanbanAccess().getDtoRefLDtoIDTerminalRuleCall_3_0_1()); 
@@ -70557,23 +70557,23 @@
 
 
     // $ANTLR start "rule__PerspectiveKanban__CardRefAssignment_5"
-    // InternalPerspectiveDsl.g:21589:1: rule__PerspectiveKanban__CardRefAssignment_5 : ( ( RULE_ID ) ) ;
+    // InternalPerspectiveDsl.g:21591:1: rule__PerspectiveKanban__CardRefAssignment_5 : ( ( RULE_ID ) ) ;
     public final void rule__PerspectiveKanban__CardRefAssignment_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21593:1: ( ( ( RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:21594:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21595:1: ( ( ( RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:21596:2: ( ( RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:21594:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21595:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21596:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21597:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveKanbanAccess().getCardRefDialogCrossReference_5_0()); 
             }
-            // InternalPerspectiveDsl.g:21596:3: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21597:4: RULE_ID
+            // InternalPerspectiveDsl.g:21598:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21599:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveKanbanAccess().getCardRefDialogIDTerminalRuleCall_5_0_1()); 
@@ -70610,23 +70610,23 @@
 
 
     // $ANTLR start "rule__PerspectiveKanban__DialogRefAssignment_7"
-    // InternalPerspectiveDsl.g:21608:1: rule__PerspectiveKanban__DialogRefAssignment_7 : ( ( RULE_ID ) ) ;
+    // InternalPerspectiveDsl.g:21610:1: rule__PerspectiveKanban__DialogRefAssignment_7 : ( ( RULE_ID ) ) ;
     public final void rule__PerspectiveKanban__DialogRefAssignment_7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21612:1: ( ( ( RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:21613:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21614:1: ( ( ( RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:21615:2: ( ( RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:21613:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21614:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21615:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21616:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveKanbanAccess().getDialogRefDialogCrossReference_7_0()); 
             }
-            // InternalPerspectiveDsl.g:21615:3: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21616:4: RULE_ID
+            // InternalPerspectiveDsl.g:21617:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21618:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveKanbanAccess().getDialogRefDialogIDTerminalRuleCall_7_0_1()); 
@@ -70663,23 +70663,23 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__DtoRefAssignment_3"
-    // InternalPerspectiveDsl.g:21627:1: rule__PerspectiveSearch__DtoRefAssignment_3 : ( ( RULE_ID ) ) ;
+    // InternalPerspectiveDsl.g:21629:1: rule__PerspectiveSearch__DtoRefAssignment_3 : ( ( RULE_ID ) ) ;
     public final void rule__PerspectiveSearch__DtoRefAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21631:1: ( ( ( RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:21632:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21633:1: ( ( ( RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:21634:2: ( ( RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:21632:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21633:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21634:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21635:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSearchAccess().getDtoRefLDtoCrossReference_3_0()); 
             }
-            // InternalPerspectiveDsl.g:21634:3: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21635:4: RULE_ID
+            // InternalPerspectiveDsl.g:21636:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21637:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSearchAccess().getDtoRefLDtoIDTerminalRuleCall_3_0_1()); 
@@ -70716,17 +70716,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__DepthAssignment_4_0_1"
-    // InternalPerspectiveDsl.g:21646:1: rule__PerspectiveSearch__DepthAssignment_4_0_1 : ( RULE_INT ) ;
+    // InternalPerspectiveDsl.g:21648:1: rule__PerspectiveSearch__DepthAssignment_4_0_1 : ( RULE_INT ) ;
     public final void rule__PerspectiveSearch__DepthAssignment_4_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21650:1: ( ( RULE_INT ) )
-            // InternalPerspectiveDsl.g:21651:2: ( RULE_INT )
+            // InternalPerspectiveDsl.g:21652:1: ( ( RULE_INT ) )
+            // InternalPerspectiveDsl.g:21653:2: ( RULE_INT )
             {
-            // InternalPerspectiveDsl.g:21651:2: ( RULE_INT )
-            // InternalPerspectiveDsl.g:21652:3: RULE_INT
+            // InternalPerspectiveDsl.g:21653:2: ( RULE_INT )
+            // InternalPerspectiveDsl.g:21654:3: RULE_INT
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSearchAccess().getDepthINTTerminalRuleCall_4_0_1_0()); 
@@ -70757,17 +70757,17 @@
 
 
     // $ANTLR start "rule__PerspectiveSearch__FilterColsAssignment_4_1_1"
-    // InternalPerspectiveDsl.g:21661:1: rule__PerspectiveSearch__FilterColsAssignment_4_1_1 : ( RULE_INT ) ;
+    // InternalPerspectiveDsl.g:21663:1: rule__PerspectiveSearch__FilterColsAssignment_4_1_1 : ( RULE_INT ) ;
     public final void rule__PerspectiveSearch__FilterColsAssignment_4_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21665:1: ( ( RULE_INT ) )
-            // InternalPerspectiveDsl.g:21666:2: ( RULE_INT )
+            // InternalPerspectiveDsl.g:21667:1: ( ( RULE_INT ) )
+            // InternalPerspectiveDsl.g:21668:2: ( RULE_INT )
             {
-            // InternalPerspectiveDsl.g:21666:2: ( RULE_INT )
-            // InternalPerspectiveDsl.g:21667:3: RULE_INT
+            // InternalPerspectiveDsl.g:21668:2: ( RULE_INT )
+            // InternalPerspectiveDsl.g:21669:3: RULE_INT
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveSearchAccess().getFilterColsINTTerminalRuleCall_4_1_1_0()); 
@@ -70798,36 +70798,36 @@
 
 
     // $ANTLR start "rule__PerspectiveDataInterchange__RefAssignment_2"
-    // InternalPerspectiveDsl.g:21676:1: rule__PerspectiveDataInterchange__RefAssignment_2 : ( ( RULE_ID ) ) ;
+    // InternalPerspectiveDsl.g:21678:1: rule__PerspectiveDataInterchange__RefAssignment_2 : ( ( RULE_ID ) ) ;
     public final void rule__PerspectiveDataInterchange__RefAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21680:1: ( ( ( RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:21681:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21682:1: ( ( ( RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:21683:2: ( ( RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:21681:2: ( ( RULE_ID ) )
-            // InternalPerspectiveDsl.g:21682:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21683:2: ( ( RULE_ID ) )
+            // InternalPerspectiveDsl.g:21684:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangePackageCrossReference_2_0()); 
+               before(grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangeGroupCrossReference_2_0()); 
             }
-            // InternalPerspectiveDsl.g:21683:3: ( RULE_ID )
-            // InternalPerspectiveDsl.g:21684:4: RULE_ID
+            // InternalPerspectiveDsl.g:21685:3: ( RULE_ID )
+            // InternalPerspectiveDsl.g:21686:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangePackageIDTerminalRuleCall_2_0_1()); 
+               before(grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangeGroupIDTerminalRuleCall_2_0_1()); 
             }
             match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangePackageIDTerminalRuleCall_2_0_1()); 
+               after(grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangeGroupIDTerminalRuleCall_2_0_1()); 
             }
 
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangePackageCrossReference_2_0()); 
+               after(grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangeGroupCrossReference_2_0()); 
             }
 
             }
@@ -70851,17 +70851,17 @@
 
 
     // $ANTLR start "rule__PerspectiveTitle__HtmlNameAssignment_2"
-    // InternalPerspectiveDsl.g:21695:1: rule__PerspectiveTitle__HtmlNameAssignment_2 : ( RULE_STRING ) ;
+    // InternalPerspectiveDsl.g:21697:1: rule__PerspectiveTitle__HtmlNameAssignment_2 : ( RULE_STRING ) ;
     public final void rule__PerspectiveTitle__HtmlNameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21699:1: ( ( RULE_STRING ) )
-            // InternalPerspectiveDsl.g:21700:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21701:1: ( ( RULE_STRING ) )
+            // InternalPerspectiveDsl.g:21702:2: ( RULE_STRING )
             {
-            // InternalPerspectiveDsl.g:21700:2: ( RULE_STRING )
-            // InternalPerspectiveDsl.g:21701:3: RULE_STRING
+            // InternalPerspectiveDsl.g:21702:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21703:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveTitleAccess().getHtmlNameSTRINGTerminalRuleCall_2_0()); 
@@ -70892,17 +70892,17 @@
 
 
     // $ANTLR start "rule__PerspectiveDashboard__NameAssignment_2"
-    // InternalPerspectiveDsl.g:21710:1: rule__PerspectiveDashboard__NameAssignment_2 : ( RULE_STRING ) ;
+    // InternalPerspectiveDsl.g:21712:1: rule__PerspectiveDashboard__NameAssignment_2 : ( RULE_STRING ) ;
     public final void rule__PerspectiveDashboard__NameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21714:1: ( ( RULE_STRING ) )
-            // InternalPerspectiveDsl.g:21715:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21716:1: ( ( RULE_STRING ) )
+            // InternalPerspectiveDsl.g:21717:2: ( RULE_STRING )
             {
-            // InternalPerspectiveDsl.g:21715:2: ( RULE_STRING )
-            // InternalPerspectiveDsl.g:21716:3: RULE_STRING
+            // InternalPerspectiveDsl.g:21717:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:21718:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPerspectiveDashboardAccess().getNameSTRINGTerminalRuleCall_2_0()); 
@@ -70933,23 +70933,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__StaticAssignment_2_0_0"
-    // InternalPerspectiveDsl.g:21725:1: rule__XImportDeclaration__StaticAssignment_2_0_0 : ( ( 'static' ) ) ;
+    // InternalPerspectiveDsl.g:21727:1: rule__XImportDeclaration__StaticAssignment_2_0_0 : ( ( 'static' ) ) ;
     public final void rule__XImportDeclaration__StaticAssignment_2_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21729:1: ( ( ( 'static' ) ) )
-            // InternalPerspectiveDsl.g:21730:2: ( ( 'static' ) )
+            // InternalPerspectiveDsl.g:21731:1: ( ( ( 'static' ) ) )
+            // InternalPerspectiveDsl.g:21732:2: ( ( 'static' ) )
             {
-            // InternalPerspectiveDsl.g:21730:2: ( ( 'static' ) )
-            // InternalPerspectiveDsl.g:21731:3: ( 'static' )
+            // InternalPerspectiveDsl.g:21732:2: ( ( 'static' ) )
+            // InternalPerspectiveDsl.g:21733:3: ( 'static' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:21732:3: ( 'static' )
-            // InternalPerspectiveDsl.g:21733:4: 'static'
+            // InternalPerspectiveDsl.g:21734:3: ( 'static' )
+            // InternalPerspectiveDsl.g:21735:4: 'static'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0()); 
@@ -70986,23 +70986,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__ExtensionAssignment_2_0_1"
-    // InternalPerspectiveDsl.g:21744:1: rule__XImportDeclaration__ExtensionAssignment_2_0_1 : ( ( 'extension' ) ) ;
+    // InternalPerspectiveDsl.g:21746:1: rule__XImportDeclaration__ExtensionAssignment_2_0_1 : ( ( 'extension' ) ) ;
     public final void rule__XImportDeclaration__ExtensionAssignment_2_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21748:1: ( ( ( 'extension' ) ) )
-            // InternalPerspectiveDsl.g:21749:2: ( ( 'extension' ) )
+            // InternalPerspectiveDsl.g:21750:1: ( ( ( 'extension' ) ) )
+            // InternalPerspectiveDsl.g:21751:2: ( ( 'extension' ) )
             {
-            // InternalPerspectiveDsl.g:21749:2: ( ( 'extension' ) )
-            // InternalPerspectiveDsl.g:21750:3: ( 'extension' )
+            // InternalPerspectiveDsl.g:21751:2: ( ( 'extension' ) )
+            // InternalPerspectiveDsl.g:21752:3: ( 'extension' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:21751:3: ( 'extension' )
-            // InternalPerspectiveDsl.g:21752:4: 'extension'
+            // InternalPerspectiveDsl.g:21753:3: ( 'extension' )
+            // InternalPerspectiveDsl.g:21754:4: 'extension'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0()); 
@@ -71039,23 +71039,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__ImportedTypeAssignment_2_0_2"
-    // InternalPerspectiveDsl.g:21763:1: rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 : ( ( ruleQualifiedNameInStaticImport ) ) ;
+    // InternalPerspectiveDsl.g:21765:1: rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 : ( ( ruleQualifiedNameInStaticImport ) ) ;
     public final void rule__XImportDeclaration__ImportedTypeAssignment_2_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21767:1: ( ( ( ruleQualifiedNameInStaticImport ) ) )
-            // InternalPerspectiveDsl.g:21768:2: ( ( ruleQualifiedNameInStaticImport ) )
+            // InternalPerspectiveDsl.g:21769:1: ( ( ( ruleQualifiedNameInStaticImport ) ) )
+            // InternalPerspectiveDsl.g:21770:2: ( ( ruleQualifiedNameInStaticImport ) )
             {
-            // InternalPerspectiveDsl.g:21768:2: ( ( ruleQualifiedNameInStaticImport ) )
-            // InternalPerspectiveDsl.g:21769:3: ( ruleQualifiedNameInStaticImport )
+            // InternalPerspectiveDsl.g:21770:2: ( ( ruleQualifiedNameInStaticImport ) )
+            // InternalPerspectiveDsl.g:21771:3: ( ruleQualifiedNameInStaticImport )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_0_2_0()); 
             }
-            // InternalPerspectiveDsl.g:21770:3: ( ruleQualifiedNameInStaticImport )
-            // InternalPerspectiveDsl.g:21771:4: ruleQualifiedNameInStaticImport
+            // InternalPerspectiveDsl.g:21772:3: ( ruleQualifiedNameInStaticImport )
+            // InternalPerspectiveDsl.g:21773:4: ruleQualifiedNameInStaticImport
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameInStaticImportParserRuleCall_2_0_2_0_1()); 
@@ -71096,23 +71096,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__WildcardAssignment_2_0_3_0"
-    // InternalPerspectiveDsl.g:21782:1: rule__XImportDeclaration__WildcardAssignment_2_0_3_0 : ( ( '*' ) ) ;
+    // InternalPerspectiveDsl.g:21784:1: rule__XImportDeclaration__WildcardAssignment_2_0_3_0 : ( ( '*' ) ) ;
     public final void rule__XImportDeclaration__WildcardAssignment_2_0_3_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21786:1: ( ( ( '*' ) ) )
-            // InternalPerspectiveDsl.g:21787:2: ( ( '*' ) )
+            // InternalPerspectiveDsl.g:21788:1: ( ( ( '*' ) ) )
+            // InternalPerspectiveDsl.g:21789:2: ( ( '*' ) )
             {
-            // InternalPerspectiveDsl.g:21787:2: ( ( '*' ) )
-            // InternalPerspectiveDsl.g:21788:3: ( '*' )
+            // InternalPerspectiveDsl.g:21789:2: ( ( '*' ) )
+            // InternalPerspectiveDsl.g:21790:3: ( '*' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0()); 
             }
-            // InternalPerspectiveDsl.g:21789:3: ( '*' )
-            // InternalPerspectiveDsl.g:21790:4: '*'
+            // InternalPerspectiveDsl.g:21791:3: ( '*' )
+            // InternalPerspectiveDsl.g:21792:4: '*'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0()); 
@@ -71149,17 +71149,17 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__MemberNameAssignment_2_0_3_1"
-    // InternalPerspectiveDsl.g:21801:1: rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 : ( ruleValidID ) ;
+    // InternalPerspectiveDsl.g:21803:1: rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 : ( ruleValidID ) ;
     public final void rule__XImportDeclaration__MemberNameAssignment_2_0_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21805:1: ( ( ruleValidID ) )
-            // InternalPerspectiveDsl.g:21806:2: ( ruleValidID )
+            // InternalPerspectiveDsl.g:21807:1: ( ( ruleValidID ) )
+            // InternalPerspectiveDsl.g:21808:2: ( ruleValidID )
             {
-            // InternalPerspectiveDsl.g:21806:2: ( ruleValidID )
-            // InternalPerspectiveDsl.g:21807:3: ruleValidID
+            // InternalPerspectiveDsl.g:21808:2: ( ruleValidID )
+            // InternalPerspectiveDsl.g:21809:3: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_2_0_3_1_0()); 
@@ -71194,23 +71194,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__ImportedTypeAssignment_2_1"
-    // InternalPerspectiveDsl.g:21816:1: rule__XImportDeclaration__ImportedTypeAssignment_2_1 : ( ( ruleQualifiedName ) ) ;
+    // InternalPerspectiveDsl.g:21818:1: rule__XImportDeclaration__ImportedTypeAssignment_2_1 : ( ( ruleQualifiedName ) ) ;
     public final void rule__XImportDeclaration__ImportedTypeAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21820:1: ( ( ( ruleQualifiedName ) ) )
-            // InternalPerspectiveDsl.g:21821:2: ( ( ruleQualifiedName ) )
+            // InternalPerspectiveDsl.g:21822:1: ( ( ( ruleQualifiedName ) ) )
+            // InternalPerspectiveDsl.g:21823:2: ( ( ruleQualifiedName ) )
             {
-            // InternalPerspectiveDsl.g:21821:2: ( ( ruleQualifiedName ) )
-            // InternalPerspectiveDsl.g:21822:3: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:21823:2: ( ( ruleQualifiedName ) )
+            // InternalPerspectiveDsl.g:21824:3: ( ruleQualifiedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_1_0()); 
             }
-            // InternalPerspectiveDsl.g:21823:3: ( ruleQualifiedName )
-            // InternalPerspectiveDsl.g:21824:4: ruleQualifiedName
+            // InternalPerspectiveDsl.g:21825:3: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:21826:4: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameParserRuleCall_2_1_0_1()); 
@@ -71251,17 +71251,17 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__ImportedNamespaceAssignment_2_2"
-    // InternalPerspectiveDsl.g:21835:1: rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 : ( ruleQualifiedNameWithWildcard ) ;
+    // InternalPerspectiveDsl.g:21837:1: rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 : ( ruleQualifiedNameWithWildcard ) ;
     public final void rule__XImportDeclaration__ImportedNamespaceAssignment_2_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21839:1: ( ( ruleQualifiedNameWithWildcard ) )
-            // InternalPerspectiveDsl.g:21840:2: ( ruleQualifiedNameWithWildcard )
+            // InternalPerspectiveDsl.g:21841:1: ( ( ruleQualifiedNameWithWildcard ) )
+            // InternalPerspectiveDsl.g:21842:2: ( ruleQualifiedNameWithWildcard )
             {
-            // InternalPerspectiveDsl.g:21840:2: ( ruleQualifiedNameWithWildcard )
-            // InternalPerspectiveDsl.g:21841:3: ruleQualifiedNameWithWildcard
+            // InternalPerspectiveDsl.g:21842:2: ( ruleQualifiedNameWithWildcard )
+            // InternalPerspectiveDsl.g:21843:3: ruleQualifiedNameWithWildcard
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_2_2_0()); 
@@ -71296,23 +71296,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__FqnImportAssignment_2_3_0"
-    // InternalPerspectiveDsl.g:21850:1: rule__XImportDeclaration__FqnImportAssignment_2_3_0 : ( ( 'ns' ) ) ;
+    // InternalPerspectiveDsl.g:21852:1: rule__XImportDeclaration__FqnImportAssignment_2_3_0 : ( ( 'ns' ) ) ;
     public final void rule__XImportDeclaration__FqnImportAssignment_2_3_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21854:1: ( ( ( 'ns' ) ) )
-            // InternalPerspectiveDsl.g:21855:2: ( ( 'ns' ) )
+            // InternalPerspectiveDsl.g:21856:1: ( ( ( 'ns' ) ) )
+            // InternalPerspectiveDsl.g:21857:2: ( ( 'ns' ) )
             {
-            // InternalPerspectiveDsl.g:21855:2: ( ( 'ns' ) )
-            // InternalPerspectiveDsl.g:21856:3: ( 'ns' )
+            // InternalPerspectiveDsl.g:21857:2: ( ( 'ns' ) )
+            // InternalPerspectiveDsl.g:21858:3: ( 'ns' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0()); 
             }
-            // InternalPerspectiveDsl.g:21857:3: ( 'ns' )
-            // InternalPerspectiveDsl.g:21858:4: 'ns'
+            // InternalPerspectiveDsl.g:21859:3: ( 'ns' )
+            // InternalPerspectiveDsl.g:21860:4: 'ns'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0()); 
@@ -71349,17 +71349,17 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1"
-    // InternalPerspectiveDsl.g:21869:1: rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 : ( ruleQualifiedName ) ;
+    // InternalPerspectiveDsl.g:21871:1: rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 : ( ruleQualifiedName ) ;
     public final void rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21873:1: ( ( ruleQualifiedName ) )
-            // InternalPerspectiveDsl.g:21874:2: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:21875:1: ( ( ruleQualifiedName ) )
+            // InternalPerspectiveDsl.g:21876:2: ( ruleQualifiedName )
             {
-            // InternalPerspectiveDsl.g:21874:2: ( ruleQualifiedName )
-            // InternalPerspectiveDsl.g:21875:3: ruleQualifiedName
+            // InternalPerspectiveDsl.g:21876:2: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:21877:3: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameQualifiedNameParserRuleCall_2_3_1_0()); 
@@ -71394,23 +71394,23 @@
 
 
     // $ANTLR start "rule__XAnnotation__AnnotationTypeAssignment_2"
-    // InternalPerspectiveDsl.g:21884:1: rule__XAnnotation__AnnotationTypeAssignment_2 : ( ( ruleQualifiedName ) ) ;
+    // InternalPerspectiveDsl.g:21886:1: rule__XAnnotation__AnnotationTypeAssignment_2 : ( ( ruleQualifiedName ) ) ;
     public final void rule__XAnnotation__AnnotationTypeAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21888:1: ( ( ( ruleQualifiedName ) ) )
-            // InternalPerspectiveDsl.g:21889:2: ( ( ruleQualifiedName ) )
+            // InternalPerspectiveDsl.g:21890:1: ( ( ( ruleQualifiedName ) ) )
+            // InternalPerspectiveDsl.g:21891:2: ( ( ruleQualifiedName ) )
             {
-            // InternalPerspectiveDsl.g:21889:2: ( ( ruleQualifiedName ) )
-            // InternalPerspectiveDsl.g:21890:3: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:21891:2: ( ( ruleQualifiedName ) )
+            // InternalPerspectiveDsl.g:21892:3: ( ruleQualifiedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeCrossReference_2_0()); 
             }
-            // InternalPerspectiveDsl.g:21891:3: ( ruleQualifiedName )
-            // InternalPerspectiveDsl.g:21892:4: ruleQualifiedName
+            // InternalPerspectiveDsl.g:21893:3: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:21894:4: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeQualifiedNameParserRuleCall_2_0_1()); 
@@ -71451,17 +71451,17 @@
 
 
     // $ANTLR start "rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0"
-    // InternalPerspectiveDsl.g:21903:1: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 : ( ruleXAnnotationElementValuePair ) ;
+    // InternalPerspectiveDsl.g:21905:1: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 : ( ruleXAnnotationElementValuePair ) ;
     public final void rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21907:1: ( ( ruleXAnnotationElementValuePair ) )
-            // InternalPerspectiveDsl.g:21908:2: ( ruleXAnnotationElementValuePair )
+            // InternalPerspectiveDsl.g:21909:1: ( ( ruleXAnnotationElementValuePair ) )
+            // InternalPerspectiveDsl.g:21910:2: ( ruleXAnnotationElementValuePair )
             {
-            // InternalPerspectiveDsl.g:21908:2: ( ruleXAnnotationElementValuePair )
-            // InternalPerspectiveDsl.g:21909:3: ruleXAnnotationElementValuePair
+            // InternalPerspectiveDsl.g:21910:2: ( ruleXAnnotationElementValuePair )
+            // InternalPerspectiveDsl.g:21911:3: ruleXAnnotationElementValuePair
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0()); 
@@ -71496,17 +71496,17 @@
 
 
     // $ANTLR start "rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1"
-    // InternalPerspectiveDsl.g:21918:1: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 : ( ruleXAnnotationElementValuePair ) ;
+    // InternalPerspectiveDsl.g:21920:1: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 : ( ruleXAnnotationElementValuePair ) ;
     public final void rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21922:1: ( ( ruleXAnnotationElementValuePair ) )
-            // InternalPerspectiveDsl.g:21923:2: ( ruleXAnnotationElementValuePair )
+            // InternalPerspectiveDsl.g:21924:1: ( ( ruleXAnnotationElementValuePair ) )
+            // InternalPerspectiveDsl.g:21925:2: ( ruleXAnnotationElementValuePair )
             {
-            // InternalPerspectiveDsl.g:21923:2: ( ruleXAnnotationElementValuePair )
-            // InternalPerspectiveDsl.g:21924:3: ruleXAnnotationElementValuePair
+            // InternalPerspectiveDsl.g:21925:2: ( ruleXAnnotationElementValuePair )
+            // InternalPerspectiveDsl.g:21926:3: ruleXAnnotationElementValuePair
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0()); 
@@ -71541,17 +71541,17 @@
 
 
     // $ANTLR start "rule__XAnnotation__ValueAssignment_3_1_1"
-    // InternalPerspectiveDsl.g:21933:1: rule__XAnnotation__ValueAssignment_3_1_1 : ( ruleXAnnotationElementValueOrCommaList ) ;
+    // InternalPerspectiveDsl.g:21935:1: rule__XAnnotation__ValueAssignment_3_1_1 : ( ruleXAnnotationElementValueOrCommaList ) ;
     public final void rule__XAnnotation__ValueAssignment_3_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21937:1: ( ( ruleXAnnotationElementValueOrCommaList ) )
-            // InternalPerspectiveDsl.g:21938:2: ( ruleXAnnotationElementValueOrCommaList )
+            // InternalPerspectiveDsl.g:21939:1: ( ( ruleXAnnotationElementValueOrCommaList ) )
+            // InternalPerspectiveDsl.g:21940:2: ( ruleXAnnotationElementValueOrCommaList )
             {
-            // InternalPerspectiveDsl.g:21938:2: ( ruleXAnnotationElementValueOrCommaList )
-            // InternalPerspectiveDsl.g:21939:3: ruleXAnnotationElementValueOrCommaList
+            // InternalPerspectiveDsl.g:21940:2: ( ruleXAnnotationElementValueOrCommaList )
+            // InternalPerspectiveDsl.g:21941:3: ruleXAnnotationElementValueOrCommaList
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0()); 
@@ -71586,23 +71586,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__ElementAssignment_0_0_0"
-    // InternalPerspectiveDsl.g:21948:1: rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 : ( ( ruleValidID ) ) ;
+    // InternalPerspectiveDsl.g:21950:1: rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 : ( ( ruleValidID ) ) ;
     public final void rule__XAnnotationElementValuePair__ElementAssignment_0_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21952:1: ( ( ( ruleValidID ) ) )
-            // InternalPerspectiveDsl.g:21953:2: ( ( ruleValidID ) )
+            // InternalPerspectiveDsl.g:21954:1: ( ( ( ruleValidID ) ) )
+            // InternalPerspectiveDsl.g:21955:2: ( ( ruleValidID ) )
             {
-            // InternalPerspectiveDsl.g:21953:2: ( ( ruleValidID ) )
-            // InternalPerspectiveDsl.g:21954:3: ( ruleValidID )
+            // InternalPerspectiveDsl.g:21955:2: ( ( ruleValidID ) )
+            // InternalPerspectiveDsl.g:21956:3: ( ruleValidID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationCrossReference_0_0_0_0()); 
             }
-            // InternalPerspectiveDsl.g:21955:3: ( ruleValidID )
-            // InternalPerspectiveDsl.g:21956:4: ruleValidID
+            // InternalPerspectiveDsl.g:21957:3: ( ruleValidID )
+            // InternalPerspectiveDsl.g:21958:4: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationValidIDParserRuleCall_0_0_0_0_1()); 
@@ -71643,17 +71643,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__ValueAssignment_1"
-    // InternalPerspectiveDsl.g:21967:1: rule__XAnnotationElementValuePair__ValueAssignment_1 : ( ruleXAnnotationElementValue ) ;
+    // InternalPerspectiveDsl.g:21969:1: rule__XAnnotationElementValuePair__ValueAssignment_1 : ( ruleXAnnotationElementValue ) ;
     public final void rule__XAnnotationElementValuePair__ValueAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21971:1: ( ( ruleXAnnotationElementValue ) )
-            // InternalPerspectiveDsl.g:21972:2: ( ruleXAnnotationElementValue )
+            // InternalPerspectiveDsl.g:21973:1: ( ( ruleXAnnotationElementValue ) )
+            // InternalPerspectiveDsl.g:21974:2: ( ruleXAnnotationElementValue )
             {
-            // InternalPerspectiveDsl.g:21972:2: ( ruleXAnnotationElementValue )
-            // InternalPerspectiveDsl.g:21973:3: ruleXAnnotationElementValue
+            // InternalPerspectiveDsl.g:21974:2: ( ruleXAnnotationElementValue )
+            // InternalPerspectiveDsl.g:21975:3: ruleXAnnotationElementValue
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairAccess().getValueXAnnotationElementValueParserRuleCall_1_0()); 
@@ -71688,17 +71688,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0"
-    // InternalPerspectiveDsl.g:21982:1: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 : ( ruleXAnnotationOrExpression ) ;
+    // InternalPerspectiveDsl.g:21984:1: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 : ( ruleXAnnotationOrExpression ) ;
     public final void rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:21986:1: ( ( ruleXAnnotationOrExpression ) )
-            // InternalPerspectiveDsl.g:21987:2: ( ruleXAnnotationOrExpression )
+            // InternalPerspectiveDsl.g:21988:1: ( ( ruleXAnnotationOrExpression ) )
+            // InternalPerspectiveDsl.g:21989:2: ( ruleXAnnotationOrExpression )
             {
-            // InternalPerspectiveDsl.g:21987:2: ( ruleXAnnotationOrExpression )
-            // InternalPerspectiveDsl.g:21988:3: ruleXAnnotationOrExpression
+            // InternalPerspectiveDsl.g:21989:2: ( ruleXAnnotationOrExpression )
+            // InternalPerspectiveDsl.g:21990:3: ruleXAnnotationOrExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0()); 
@@ -71733,17 +71733,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1"
-    // InternalPerspectiveDsl.g:21997:1: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 : ( ruleXAnnotationOrExpression ) ;
+    // InternalPerspectiveDsl.g:21999:1: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 : ( ruleXAnnotationOrExpression ) ;
     public final void rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22001:1: ( ( ruleXAnnotationOrExpression ) )
-            // InternalPerspectiveDsl.g:22002:2: ( ruleXAnnotationOrExpression )
+            // InternalPerspectiveDsl.g:22003:1: ( ( ruleXAnnotationOrExpression ) )
+            // InternalPerspectiveDsl.g:22004:2: ( ruleXAnnotationOrExpression )
             {
-            // InternalPerspectiveDsl.g:22002:2: ( ruleXAnnotationOrExpression )
-            // InternalPerspectiveDsl.g:22003:3: ruleXAnnotationOrExpression
+            // InternalPerspectiveDsl.g:22004:2: ( ruleXAnnotationOrExpression )
+            // InternalPerspectiveDsl.g:22005:3: ruleXAnnotationOrExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0()); 
@@ -71778,17 +71778,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1"
-    // InternalPerspectiveDsl.g:22012:1: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 : ( ruleXAnnotationOrExpression ) ;
+    // InternalPerspectiveDsl.g:22014:1: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 : ( ruleXAnnotationOrExpression ) ;
     public final void rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22016:1: ( ( ruleXAnnotationOrExpression ) )
-            // InternalPerspectiveDsl.g:22017:2: ( ruleXAnnotationOrExpression )
+            // InternalPerspectiveDsl.g:22018:1: ( ( ruleXAnnotationOrExpression ) )
+            // InternalPerspectiveDsl.g:22019:2: ( ruleXAnnotationOrExpression )
             {
-            // InternalPerspectiveDsl.g:22017:2: ( ruleXAnnotationOrExpression )
-            // InternalPerspectiveDsl.g:22018:3: ruleXAnnotationOrExpression
+            // InternalPerspectiveDsl.g:22019:2: ( ruleXAnnotationOrExpression )
+            // InternalPerspectiveDsl.g:22020:3: ruleXAnnotationOrExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0()); 
@@ -71823,17 +71823,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__ElementsAssignment_0_1_0"
-    // InternalPerspectiveDsl.g:22027:1: rule__XAnnotationElementValue__ElementsAssignment_0_1_0 : ( ruleXAnnotationOrExpression ) ;
+    // InternalPerspectiveDsl.g:22029:1: rule__XAnnotationElementValue__ElementsAssignment_0_1_0 : ( ruleXAnnotationOrExpression ) ;
     public final void rule__XAnnotationElementValue__ElementsAssignment_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22031:1: ( ( ruleXAnnotationOrExpression ) )
-            // InternalPerspectiveDsl.g:22032:2: ( ruleXAnnotationOrExpression )
+            // InternalPerspectiveDsl.g:22033:1: ( ( ruleXAnnotationOrExpression ) )
+            // InternalPerspectiveDsl.g:22034:2: ( ruleXAnnotationOrExpression )
             {
-            // InternalPerspectiveDsl.g:22032:2: ( ruleXAnnotationOrExpression )
-            // InternalPerspectiveDsl.g:22033:3: ruleXAnnotationOrExpression
+            // InternalPerspectiveDsl.g:22034:2: ( ruleXAnnotationOrExpression )
+            // InternalPerspectiveDsl.g:22035:3: ruleXAnnotationOrExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0()); 
@@ -71868,17 +71868,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1"
-    // InternalPerspectiveDsl.g:22042:1: rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 : ( ruleXAnnotationOrExpression ) ;
+    // InternalPerspectiveDsl.g:22044:1: rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 : ( ruleXAnnotationOrExpression ) ;
     public final void rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22046:1: ( ( ruleXAnnotationOrExpression ) )
-            // InternalPerspectiveDsl.g:22047:2: ( ruleXAnnotationOrExpression )
+            // InternalPerspectiveDsl.g:22048:1: ( ( ruleXAnnotationOrExpression ) )
+            // InternalPerspectiveDsl.g:22049:2: ( ruleXAnnotationOrExpression )
             {
-            // InternalPerspectiveDsl.g:22047:2: ( ruleXAnnotationOrExpression )
-            // InternalPerspectiveDsl.g:22048:3: ruleXAnnotationOrExpression
+            // InternalPerspectiveDsl.g:22049:2: ( ruleXAnnotationOrExpression )
+            // InternalPerspectiveDsl.g:22050:3: ruleXAnnotationOrExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0()); 
@@ -71913,23 +71913,23 @@
 
 
     // $ANTLR start "rule__XAssignment__FeatureAssignment_0_1"
-    // InternalPerspectiveDsl.g:22057:1: rule__XAssignment__FeatureAssignment_0_1 : ( ( ruleFeatureCallID ) ) ;
+    // InternalPerspectiveDsl.g:22059:1: rule__XAssignment__FeatureAssignment_0_1 : ( ( ruleFeatureCallID ) ) ;
     public final void rule__XAssignment__FeatureAssignment_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22061:1: ( ( ( ruleFeatureCallID ) ) )
-            // InternalPerspectiveDsl.g:22062:2: ( ( ruleFeatureCallID ) )
+            // InternalPerspectiveDsl.g:22063:1: ( ( ( ruleFeatureCallID ) ) )
+            // InternalPerspectiveDsl.g:22064:2: ( ( ruleFeatureCallID ) )
             {
-            // InternalPerspectiveDsl.g:22062:2: ( ( ruleFeatureCallID ) )
-            // InternalPerspectiveDsl.g:22063:3: ( ruleFeatureCallID )
+            // InternalPerspectiveDsl.g:22064:2: ( ( ruleFeatureCallID ) )
+            // InternalPerspectiveDsl.g:22065:3: ( ruleFeatureCallID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:22064:3: ( ruleFeatureCallID )
-            // InternalPerspectiveDsl.g:22065:4: ruleFeatureCallID
+            // InternalPerspectiveDsl.g:22066:3: ( ruleFeatureCallID )
+            // InternalPerspectiveDsl.g:22067:4: ruleFeatureCallID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementFeatureCallIDParserRuleCall_0_1_0_1()); 
@@ -71970,17 +71970,17 @@
 
 
     // $ANTLR start "rule__XAssignment__ValueAssignment_0_3"
-    // InternalPerspectiveDsl.g:22076:1: rule__XAssignment__ValueAssignment_0_3 : ( ruleXAssignment ) ;
+    // InternalPerspectiveDsl.g:22078:1: rule__XAssignment__ValueAssignment_0_3 : ( ruleXAssignment ) ;
     public final void rule__XAssignment__ValueAssignment_0_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22080:1: ( ( ruleXAssignment ) )
-            // InternalPerspectiveDsl.g:22081:2: ( ruleXAssignment )
+            // InternalPerspectiveDsl.g:22082:1: ( ( ruleXAssignment ) )
+            // InternalPerspectiveDsl.g:22083:2: ( ruleXAssignment )
             {
-            // InternalPerspectiveDsl.g:22081:2: ( ruleXAssignment )
-            // InternalPerspectiveDsl.g:22082:3: ruleXAssignment
+            // InternalPerspectiveDsl.g:22083:2: ( ruleXAssignment )
+            // InternalPerspectiveDsl.g:22084:3: ruleXAssignment
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getValueXAssignmentParserRuleCall_0_3_0()); 
@@ -72015,23 +72015,23 @@
 
 
     // $ANTLR start "rule__XAssignment__FeatureAssignment_1_1_0_0_1"
-    // InternalPerspectiveDsl.g:22091:1: rule__XAssignment__FeatureAssignment_1_1_0_0_1 : ( ( ruleOpMultiAssign ) ) ;
+    // InternalPerspectiveDsl.g:22093:1: rule__XAssignment__FeatureAssignment_1_1_0_0_1 : ( ( ruleOpMultiAssign ) ) ;
     public final void rule__XAssignment__FeatureAssignment_1_1_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22095:1: ( ( ( ruleOpMultiAssign ) ) )
-            // InternalPerspectiveDsl.g:22096:2: ( ( ruleOpMultiAssign ) )
+            // InternalPerspectiveDsl.g:22097:1: ( ( ( ruleOpMultiAssign ) ) )
+            // InternalPerspectiveDsl.g:22098:2: ( ( ruleOpMultiAssign ) )
             {
-            // InternalPerspectiveDsl.g:22096:2: ( ( ruleOpMultiAssign ) )
-            // InternalPerspectiveDsl.g:22097:3: ( ruleOpMultiAssign )
+            // InternalPerspectiveDsl.g:22098:2: ( ( ruleOpMultiAssign ) )
+            // InternalPerspectiveDsl.g:22099:3: ( ruleOpMultiAssign )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:22098:3: ( ruleOpMultiAssign )
-            // InternalPerspectiveDsl.g:22099:4: ruleOpMultiAssign
+            // InternalPerspectiveDsl.g:22100:3: ( ruleOpMultiAssign )
+            // InternalPerspectiveDsl.g:22101:4: ruleOpMultiAssign
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementOpMultiAssignParserRuleCall_1_1_0_0_1_0_1()); 
@@ -72072,17 +72072,17 @@
 
 
     // $ANTLR start "rule__XAssignment__RightOperandAssignment_1_1_1"
-    // InternalPerspectiveDsl.g:22110:1: rule__XAssignment__RightOperandAssignment_1_1_1 : ( ruleXAssignment ) ;
+    // InternalPerspectiveDsl.g:22112:1: rule__XAssignment__RightOperandAssignment_1_1_1 : ( ruleXAssignment ) ;
     public final void rule__XAssignment__RightOperandAssignment_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22114:1: ( ( ruleXAssignment ) )
-            // InternalPerspectiveDsl.g:22115:2: ( ruleXAssignment )
+            // InternalPerspectiveDsl.g:22116:1: ( ( ruleXAssignment ) )
+            // InternalPerspectiveDsl.g:22117:2: ( ruleXAssignment )
             {
-            // InternalPerspectiveDsl.g:22115:2: ( ruleXAssignment )
-            // InternalPerspectiveDsl.g:22116:3: ruleXAssignment
+            // InternalPerspectiveDsl.g:22117:2: ( ruleXAssignment )
+            // InternalPerspectiveDsl.g:22118:3: ruleXAssignment
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getRightOperandXAssignmentParserRuleCall_1_1_1_0()); 
@@ -72117,23 +72117,23 @@
 
 
     // $ANTLR start "rule__XOrExpression__FeatureAssignment_1_0_0_1"
-    // InternalPerspectiveDsl.g:22125:1: rule__XOrExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpOr ) ) ;
+    // InternalPerspectiveDsl.g:22127:1: rule__XOrExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpOr ) ) ;
     public final void rule__XOrExpression__FeatureAssignment_1_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22129:1: ( ( ( ruleOpOr ) ) )
-            // InternalPerspectiveDsl.g:22130:2: ( ( ruleOpOr ) )
+            // InternalPerspectiveDsl.g:22131:1: ( ( ( ruleOpOr ) ) )
+            // InternalPerspectiveDsl.g:22132:2: ( ( ruleOpOr ) )
             {
-            // InternalPerspectiveDsl.g:22130:2: ( ( ruleOpOr ) )
-            // InternalPerspectiveDsl.g:22131:3: ( ruleOpOr )
+            // InternalPerspectiveDsl.g:22132:2: ( ( ruleOpOr ) )
+            // InternalPerspectiveDsl.g:22133:3: ( ruleOpOr )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:22132:3: ( ruleOpOr )
-            // InternalPerspectiveDsl.g:22133:4: ruleOpOr
+            // InternalPerspectiveDsl.g:22134:3: ( ruleOpOr )
+            // InternalPerspectiveDsl.g:22135:4: ruleOpOr
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementOpOrParserRuleCall_1_0_0_1_0_1()); 
@@ -72174,17 +72174,17 @@
 
 
     // $ANTLR start "rule__XOrExpression__RightOperandAssignment_1_1"
-    // InternalPerspectiveDsl.g:22144:1: rule__XOrExpression__RightOperandAssignment_1_1 : ( ruleXAndExpression ) ;
+    // InternalPerspectiveDsl.g:22146:1: rule__XOrExpression__RightOperandAssignment_1_1 : ( ruleXAndExpression ) ;
     public final void rule__XOrExpression__RightOperandAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22148:1: ( ( ruleXAndExpression ) )
-            // InternalPerspectiveDsl.g:22149:2: ( ruleXAndExpression )
+            // InternalPerspectiveDsl.g:22150:1: ( ( ruleXAndExpression ) )
+            // InternalPerspectiveDsl.g:22151:2: ( ruleXAndExpression )
             {
-            // InternalPerspectiveDsl.g:22149:2: ( ruleXAndExpression )
-            // InternalPerspectiveDsl.g:22150:3: ruleXAndExpression
+            // InternalPerspectiveDsl.g:22151:2: ( ruleXAndExpression )
+            // InternalPerspectiveDsl.g:22152:3: ruleXAndExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0()); 
@@ -72219,23 +72219,23 @@
 
 
     // $ANTLR start "rule__XAndExpression__FeatureAssignment_1_0_0_1"
-    // InternalPerspectiveDsl.g:22159:1: rule__XAndExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpAnd ) ) ;
+    // InternalPerspectiveDsl.g:22161:1: rule__XAndExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpAnd ) ) ;
     public final void rule__XAndExpression__FeatureAssignment_1_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22163:1: ( ( ( ruleOpAnd ) ) )
-            // InternalPerspectiveDsl.g:22164:2: ( ( ruleOpAnd ) )
+            // InternalPerspectiveDsl.g:22165:1: ( ( ( ruleOpAnd ) ) )
+            // InternalPerspectiveDsl.g:22166:2: ( ( ruleOpAnd ) )
             {
-            // InternalPerspectiveDsl.g:22164:2: ( ( ruleOpAnd ) )
-            // InternalPerspectiveDsl.g:22165:3: ( ruleOpAnd )
+            // InternalPerspectiveDsl.g:22166:2: ( ( ruleOpAnd ) )
+            // InternalPerspectiveDsl.g:22167:3: ( ruleOpAnd )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:22166:3: ( ruleOpAnd )
-            // InternalPerspectiveDsl.g:22167:4: ruleOpAnd
+            // InternalPerspectiveDsl.g:22168:3: ( ruleOpAnd )
+            // InternalPerspectiveDsl.g:22169:4: ruleOpAnd
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementOpAndParserRuleCall_1_0_0_1_0_1()); 
@@ -72276,17 +72276,17 @@
 
 
     // $ANTLR start "rule__XAndExpression__RightOperandAssignment_1_1"
-    // InternalPerspectiveDsl.g:22178:1: rule__XAndExpression__RightOperandAssignment_1_1 : ( ruleXEqualityExpression ) ;
+    // InternalPerspectiveDsl.g:22180:1: rule__XAndExpression__RightOperandAssignment_1_1 : ( ruleXEqualityExpression ) ;
     public final void rule__XAndExpression__RightOperandAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22182:1: ( ( ruleXEqualityExpression ) )
-            // InternalPerspectiveDsl.g:22183:2: ( ruleXEqualityExpression )
+            // InternalPerspectiveDsl.g:22184:1: ( ( ruleXEqualityExpression ) )
+            // InternalPerspectiveDsl.g:22185:2: ( ruleXEqualityExpression )
             {
-            // InternalPerspectiveDsl.g:22183:2: ( ruleXEqualityExpression )
-            // InternalPerspectiveDsl.g:22184:3: ruleXEqualityExpression
+            // InternalPerspectiveDsl.g:22185:2: ( ruleXEqualityExpression )
+            // InternalPerspectiveDsl.g:22186:3: ruleXEqualityExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0()); 
@@ -72321,23 +72321,23 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__FeatureAssignment_1_0_0_1"
-    // InternalPerspectiveDsl.g:22193:1: rule__XEqualityExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpEquality ) ) ;
+    // InternalPerspectiveDsl.g:22195:1: rule__XEqualityExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpEquality ) ) ;
     public final void rule__XEqualityExpression__FeatureAssignment_1_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22197:1: ( ( ( ruleOpEquality ) ) )
-            // InternalPerspectiveDsl.g:22198:2: ( ( ruleOpEquality ) )
+            // InternalPerspectiveDsl.g:22199:1: ( ( ( ruleOpEquality ) ) )
+            // InternalPerspectiveDsl.g:22200:2: ( ( ruleOpEquality ) )
             {
-            // InternalPerspectiveDsl.g:22198:2: ( ( ruleOpEquality ) )
-            // InternalPerspectiveDsl.g:22199:3: ( ruleOpEquality )
+            // InternalPerspectiveDsl.g:22200:2: ( ( ruleOpEquality ) )
+            // InternalPerspectiveDsl.g:22201:3: ( ruleOpEquality )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:22200:3: ( ruleOpEquality )
-            // InternalPerspectiveDsl.g:22201:4: ruleOpEquality
+            // InternalPerspectiveDsl.g:22202:3: ( ruleOpEquality )
+            // InternalPerspectiveDsl.g:22203:4: ruleOpEquality
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementOpEqualityParserRuleCall_1_0_0_1_0_1()); 
@@ -72378,17 +72378,17 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__RightOperandAssignment_1_1"
-    // InternalPerspectiveDsl.g:22212:1: rule__XEqualityExpression__RightOperandAssignment_1_1 : ( ruleXRelationalExpression ) ;
+    // InternalPerspectiveDsl.g:22214:1: rule__XEqualityExpression__RightOperandAssignment_1_1 : ( ruleXRelationalExpression ) ;
     public final void rule__XEqualityExpression__RightOperandAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22216:1: ( ( ruleXRelationalExpression ) )
-            // InternalPerspectiveDsl.g:22217:2: ( ruleXRelationalExpression )
+            // InternalPerspectiveDsl.g:22218:1: ( ( ruleXRelationalExpression ) )
+            // InternalPerspectiveDsl.g:22219:2: ( ruleXRelationalExpression )
             {
-            // InternalPerspectiveDsl.g:22217:2: ( ruleXRelationalExpression )
-            // InternalPerspectiveDsl.g:22218:3: ruleXRelationalExpression
+            // InternalPerspectiveDsl.g:22219:2: ( ruleXRelationalExpression )
+            // InternalPerspectiveDsl.g:22220:3: ruleXRelationalExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0()); 
@@ -72423,17 +72423,17 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__TypeAssignment_1_0_1"
-    // InternalPerspectiveDsl.g:22227:1: rule__XRelationalExpression__TypeAssignment_1_0_1 : ( ruleJvmTypeReference ) ;
+    // InternalPerspectiveDsl.g:22229:1: rule__XRelationalExpression__TypeAssignment_1_0_1 : ( ruleJvmTypeReference ) ;
     public final void rule__XRelationalExpression__TypeAssignment_1_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22231:1: ( ( ruleJvmTypeReference ) )
-            // InternalPerspectiveDsl.g:22232:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:22233:1: ( ( ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:22234:2: ( ruleJvmTypeReference )
             {
-            // InternalPerspectiveDsl.g:22232:2: ( ruleJvmTypeReference )
-            // InternalPerspectiveDsl.g:22233:3: ruleJvmTypeReference
+            // InternalPerspectiveDsl.g:22234:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:22235:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0()); 
@@ -72468,23 +72468,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1"
-    // InternalPerspectiveDsl.g:22242:1: rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 : ( ( ruleOpCompare ) ) ;
+    // InternalPerspectiveDsl.g:22244:1: rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 : ( ( ruleOpCompare ) ) ;
     public final void rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22246:1: ( ( ( ruleOpCompare ) ) )
-            // InternalPerspectiveDsl.g:22247:2: ( ( ruleOpCompare ) )
+            // InternalPerspectiveDsl.g:22248:1: ( ( ( ruleOpCompare ) ) )
+            // InternalPerspectiveDsl.g:22249:2: ( ( ruleOpCompare ) )
             {
-            // InternalPerspectiveDsl.g:22247:2: ( ( ruleOpCompare ) )
-            // InternalPerspectiveDsl.g:22248:3: ( ruleOpCompare )
+            // InternalPerspectiveDsl.g:22249:2: ( ( ruleOpCompare ) )
+            // InternalPerspectiveDsl.g:22250:3: ( ruleOpCompare )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:22249:3: ( ruleOpCompare )
-            // InternalPerspectiveDsl.g:22250:4: ruleOpCompare
+            // InternalPerspectiveDsl.g:22251:3: ( ruleOpCompare )
+            // InternalPerspectiveDsl.g:22252:4: ruleOpCompare
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementOpCompareParserRuleCall_1_1_0_0_1_0_1()); 
@@ -72525,17 +72525,17 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__RightOperandAssignment_1_1_1"
-    // InternalPerspectiveDsl.g:22261:1: rule__XRelationalExpression__RightOperandAssignment_1_1_1 : ( ruleXOtherOperatorExpression ) ;
+    // InternalPerspectiveDsl.g:22263:1: rule__XRelationalExpression__RightOperandAssignment_1_1_1 : ( ruleXOtherOperatorExpression ) ;
     public final void rule__XRelationalExpression__RightOperandAssignment_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22265:1: ( ( ruleXOtherOperatorExpression ) )
-            // InternalPerspectiveDsl.g:22266:2: ( ruleXOtherOperatorExpression )
+            // InternalPerspectiveDsl.g:22267:1: ( ( ruleXOtherOperatorExpression ) )
+            // InternalPerspectiveDsl.g:22268:2: ( ruleXOtherOperatorExpression )
             {
-            // InternalPerspectiveDsl.g:22266:2: ( ruleXOtherOperatorExpression )
-            // InternalPerspectiveDsl.g:22267:3: ruleXOtherOperatorExpression
+            // InternalPerspectiveDsl.g:22268:2: ( ruleXOtherOperatorExpression )
+            // InternalPerspectiveDsl.g:22269:3: ruleXOtherOperatorExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0()); 
@@ -72570,23 +72570,23 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1"
-    // InternalPerspectiveDsl.g:22276:1: rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpOther ) ) ;
+    // InternalPerspectiveDsl.g:22278:1: rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpOther ) ) ;
     public final void rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22280:1: ( ( ( ruleOpOther ) ) )
-            // InternalPerspectiveDsl.g:22281:2: ( ( ruleOpOther ) )
+            // InternalPerspectiveDsl.g:22282:1: ( ( ( ruleOpOther ) ) )
+            // InternalPerspectiveDsl.g:22283:2: ( ( ruleOpOther ) )
             {
-            // InternalPerspectiveDsl.g:22281:2: ( ( ruleOpOther ) )
-            // InternalPerspectiveDsl.g:22282:3: ( ruleOpOther )
+            // InternalPerspectiveDsl.g:22283:2: ( ( ruleOpOther ) )
+            // InternalPerspectiveDsl.g:22284:3: ( ruleOpOther )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:22283:3: ( ruleOpOther )
-            // InternalPerspectiveDsl.g:22284:4: ruleOpOther
+            // InternalPerspectiveDsl.g:22285:3: ( ruleOpOther )
+            // InternalPerspectiveDsl.g:22286:4: ruleOpOther
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementOpOtherParserRuleCall_1_0_0_1_0_1()); 
@@ -72627,17 +72627,17 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__RightOperandAssignment_1_1"
-    // InternalPerspectiveDsl.g:22295:1: rule__XOtherOperatorExpression__RightOperandAssignment_1_1 : ( ruleXAdditiveExpression ) ;
+    // InternalPerspectiveDsl.g:22297:1: rule__XOtherOperatorExpression__RightOperandAssignment_1_1 : ( ruleXAdditiveExpression ) ;
     public final void rule__XOtherOperatorExpression__RightOperandAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22299:1: ( ( ruleXAdditiveExpression ) )
-            // InternalPerspectiveDsl.g:22300:2: ( ruleXAdditiveExpression )
+            // InternalPerspectiveDsl.g:22301:1: ( ( ruleXAdditiveExpression ) )
+            // InternalPerspectiveDsl.g:22302:2: ( ruleXAdditiveExpression )
             {
-            // InternalPerspectiveDsl.g:22300:2: ( ruleXAdditiveExpression )
-            // InternalPerspectiveDsl.g:22301:3: ruleXAdditiveExpression
+            // InternalPerspectiveDsl.g:22302:2: ( ruleXAdditiveExpression )
+            // InternalPerspectiveDsl.g:22303:3: ruleXAdditiveExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0()); 
@@ -72672,23 +72672,23 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__FeatureAssignment_1_0_0_1"
-    // InternalPerspectiveDsl.g:22310:1: rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpAdd ) ) ;
+    // InternalPerspectiveDsl.g:22312:1: rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpAdd ) ) ;
     public final void rule__XAdditiveExpression__FeatureAssignment_1_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22314:1: ( ( ( ruleOpAdd ) ) )
-            // InternalPerspectiveDsl.g:22315:2: ( ( ruleOpAdd ) )
+            // InternalPerspectiveDsl.g:22316:1: ( ( ( ruleOpAdd ) ) )
+            // InternalPerspectiveDsl.g:22317:2: ( ( ruleOpAdd ) )
             {
-            // InternalPerspectiveDsl.g:22315:2: ( ( ruleOpAdd ) )
-            // InternalPerspectiveDsl.g:22316:3: ( ruleOpAdd )
+            // InternalPerspectiveDsl.g:22317:2: ( ( ruleOpAdd ) )
+            // InternalPerspectiveDsl.g:22318:3: ( ruleOpAdd )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:22317:3: ( ruleOpAdd )
-            // InternalPerspectiveDsl.g:22318:4: ruleOpAdd
+            // InternalPerspectiveDsl.g:22319:3: ( ruleOpAdd )
+            // InternalPerspectiveDsl.g:22320:4: ruleOpAdd
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementOpAddParserRuleCall_1_0_0_1_0_1()); 
@@ -72729,17 +72729,17 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__RightOperandAssignment_1_1"
-    // InternalPerspectiveDsl.g:22329:1: rule__XAdditiveExpression__RightOperandAssignment_1_1 : ( ruleXMultiplicativeExpression ) ;
+    // InternalPerspectiveDsl.g:22331:1: rule__XAdditiveExpression__RightOperandAssignment_1_1 : ( ruleXMultiplicativeExpression ) ;
     public final void rule__XAdditiveExpression__RightOperandAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22333:1: ( ( ruleXMultiplicativeExpression ) )
-            // InternalPerspectiveDsl.g:22334:2: ( ruleXMultiplicativeExpression )
+            // InternalPerspectiveDsl.g:22335:1: ( ( ruleXMultiplicativeExpression ) )
+            // InternalPerspectiveDsl.g:22336:2: ( ruleXMultiplicativeExpression )
             {
-            // InternalPerspectiveDsl.g:22334:2: ( ruleXMultiplicativeExpression )
-            // InternalPerspectiveDsl.g:22335:3: ruleXMultiplicativeExpression
+            // InternalPerspectiveDsl.g:22336:2: ( ruleXMultiplicativeExpression )
+            // InternalPerspectiveDsl.g:22337:3: ruleXMultiplicativeExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0()); 
@@ -72774,23 +72774,23 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1"
-    // InternalPerspectiveDsl.g:22344:1: rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpMulti ) ) ;
+    // InternalPerspectiveDsl.g:22346:1: rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpMulti ) ) ;
     public final void rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22348:1: ( ( ( ruleOpMulti ) ) )
-            // InternalPerspectiveDsl.g:22349:2: ( ( ruleOpMulti ) )
+            // InternalPerspectiveDsl.g:22350:1: ( ( ( ruleOpMulti ) ) )
+            // InternalPerspectiveDsl.g:22351:2: ( ( ruleOpMulti ) )
             {
-            // InternalPerspectiveDsl.g:22349:2: ( ( ruleOpMulti ) )
-            // InternalPerspectiveDsl.g:22350:3: ( ruleOpMulti )
+            // InternalPerspectiveDsl.g:22351:2: ( ( ruleOpMulti ) )
+            // InternalPerspectiveDsl.g:22352:3: ( ruleOpMulti )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:22351:3: ( ruleOpMulti )
-            // InternalPerspectiveDsl.g:22352:4: ruleOpMulti
+            // InternalPerspectiveDsl.g:22353:3: ( ruleOpMulti )
+            // InternalPerspectiveDsl.g:22354:4: ruleOpMulti
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementOpMultiParserRuleCall_1_0_0_1_0_1()); 
@@ -72831,17 +72831,17 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__RightOperandAssignment_1_1"
-    // InternalPerspectiveDsl.g:22363:1: rule__XMultiplicativeExpression__RightOperandAssignment_1_1 : ( ruleXUnaryOperation ) ;
+    // InternalPerspectiveDsl.g:22365:1: rule__XMultiplicativeExpression__RightOperandAssignment_1_1 : ( ruleXUnaryOperation ) ;
     public final void rule__XMultiplicativeExpression__RightOperandAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22367:1: ( ( ruleXUnaryOperation ) )
-            // InternalPerspectiveDsl.g:22368:2: ( ruleXUnaryOperation )
+            // InternalPerspectiveDsl.g:22369:1: ( ( ruleXUnaryOperation ) )
+            // InternalPerspectiveDsl.g:22370:2: ( ruleXUnaryOperation )
             {
-            // InternalPerspectiveDsl.g:22368:2: ( ruleXUnaryOperation )
-            // InternalPerspectiveDsl.g:22369:3: ruleXUnaryOperation
+            // InternalPerspectiveDsl.g:22370:2: ( ruleXUnaryOperation )
+            // InternalPerspectiveDsl.g:22371:3: ruleXUnaryOperation
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0()); 
@@ -72876,23 +72876,23 @@
 
 
     // $ANTLR start "rule__XUnaryOperation__FeatureAssignment_0_1"
-    // InternalPerspectiveDsl.g:22378:1: rule__XUnaryOperation__FeatureAssignment_0_1 : ( ( ruleOpUnary ) ) ;
+    // InternalPerspectiveDsl.g:22380:1: rule__XUnaryOperation__FeatureAssignment_0_1 : ( ( ruleOpUnary ) ) ;
     public final void rule__XUnaryOperation__FeatureAssignment_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22382:1: ( ( ( ruleOpUnary ) ) )
-            // InternalPerspectiveDsl.g:22383:2: ( ( ruleOpUnary ) )
+            // InternalPerspectiveDsl.g:22384:1: ( ( ( ruleOpUnary ) ) )
+            // InternalPerspectiveDsl.g:22385:2: ( ( ruleOpUnary ) )
             {
-            // InternalPerspectiveDsl.g:22383:2: ( ( ruleOpUnary ) )
-            // InternalPerspectiveDsl.g:22384:3: ( ruleOpUnary )
+            // InternalPerspectiveDsl.g:22385:2: ( ( ruleOpUnary ) )
+            // InternalPerspectiveDsl.g:22386:3: ( ruleOpUnary )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:22385:3: ( ruleOpUnary )
-            // InternalPerspectiveDsl.g:22386:4: ruleOpUnary
+            // InternalPerspectiveDsl.g:22387:3: ( ruleOpUnary )
+            // InternalPerspectiveDsl.g:22388:4: ruleOpUnary
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementOpUnaryParserRuleCall_0_1_0_1()); 
@@ -72933,17 +72933,17 @@
 
 
     // $ANTLR start "rule__XUnaryOperation__OperandAssignment_0_2"
-    // InternalPerspectiveDsl.g:22397:1: rule__XUnaryOperation__OperandAssignment_0_2 : ( ruleXUnaryOperation ) ;
+    // InternalPerspectiveDsl.g:22399:1: rule__XUnaryOperation__OperandAssignment_0_2 : ( ruleXUnaryOperation ) ;
     public final void rule__XUnaryOperation__OperandAssignment_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22401:1: ( ( ruleXUnaryOperation ) )
-            // InternalPerspectiveDsl.g:22402:2: ( ruleXUnaryOperation )
+            // InternalPerspectiveDsl.g:22403:1: ( ( ruleXUnaryOperation ) )
+            // InternalPerspectiveDsl.g:22404:2: ( ruleXUnaryOperation )
             {
-            // InternalPerspectiveDsl.g:22402:2: ( ruleXUnaryOperation )
-            // InternalPerspectiveDsl.g:22403:3: ruleXUnaryOperation
+            // InternalPerspectiveDsl.g:22404:2: ( ruleXUnaryOperation )
+            // InternalPerspectiveDsl.g:22405:3: ruleXUnaryOperation
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXUnaryOperationAccess().getOperandXUnaryOperationParserRuleCall_0_2_0()); 
@@ -72978,17 +72978,17 @@
 
 
     // $ANTLR start "rule__XCastedExpression__TypeAssignment_1_1"
-    // InternalPerspectiveDsl.g:22412:1: rule__XCastedExpression__TypeAssignment_1_1 : ( ruleJvmTypeReference ) ;
+    // InternalPerspectiveDsl.g:22414:1: rule__XCastedExpression__TypeAssignment_1_1 : ( ruleJvmTypeReference ) ;
     public final void rule__XCastedExpression__TypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22416:1: ( ( ruleJvmTypeReference ) )
-            // InternalPerspectiveDsl.g:22417:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:22418:1: ( ( ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:22419:2: ( ruleJvmTypeReference )
             {
-            // InternalPerspectiveDsl.g:22417:2: ( ruleJvmTypeReference )
-            // InternalPerspectiveDsl.g:22418:3: ruleJvmTypeReference
+            // InternalPerspectiveDsl.g:22419:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:22420:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0()); 
@@ -73023,23 +73023,23 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__FeatureAssignment_1_0_1"
-    // InternalPerspectiveDsl.g:22427:1: rule__XPostfixOperation__FeatureAssignment_1_0_1 : ( ( ruleOpPostfix ) ) ;
+    // InternalPerspectiveDsl.g:22429:1: rule__XPostfixOperation__FeatureAssignment_1_0_1 : ( ( ruleOpPostfix ) ) ;
     public final void rule__XPostfixOperation__FeatureAssignment_1_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22431:1: ( ( ( ruleOpPostfix ) ) )
-            // InternalPerspectiveDsl.g:22432:2: ( ( ruleOpPostfix ) )
+            // InternalPerspectiveDsl.g:22433:1: ( ( ( ruleOpPostfix ) ) )
+            // InternalPerspectiveDsl.g:22434:2: ( ( ruleOpPostfix ) )
             {
-            // InternalPerspectiveDsl.g:22432:2: ( ( ruleOpPostfix ) )
-            // InternalPerspectiveDsl.g:22433:3: ( ruleOpPostfix )
+            // InternalPerspectiveDsl.g:22434:2: ( ( ruleOpPostfix ) )
+            // InternalPerspectiveDsl.g:22435:3: ( ruleOpPostfix )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:22434:3: ( ruleOpPostfix )
-            // InternalPerspectiveDsl.g:22435:4: ruleOpPostfix
+            // InternalPerspectiveDsl.g:22436:3: ( ruleOpPostfix )
+            // InternalPerspectiveDsl.g:22437:4: ruleOpPostfix
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementOpPostfixParserRuleCall_1_0_1_0_1()); 
@@ -73080,23 +73080,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1"
-    // InternalPerspectiveDsl.g:22446:1: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 : ( ( '::' ) ) ;
+    // InternalPerspectiveDsl.g:22448:1: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 : ( ( '::' ) ) ;
     public final void rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22450:1: ( ( ( '::' ) ) )
-            // InternalPerspectiveDsl.g:22451:2: ( ( '::' ) )
+            // InternalPerspectiveDsl.g:22452:1: ( ( ( '::' ) ) )
+            // InternalPerspectiveDsl.g:22453:2: ( ( '::' ) )
             {
-            // InternalPerspectiveDsl.g:22451:2: ( ( '::' ) )
-            // InternalPerspectiveDsl.g:22452:3: ( '::' )
+            // InternalPerspectiveDsl.g:22453:2: ( ( '::' ) )
+            // InternalPerspectiveDsl.g:22454:3: ( '::' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0()); 
             }
-            // InternalPerspectiveDsl.g:22453:3: ( '::' )
-            // InternalPerspectiveDsl.g:22454:4: '::'
+            // InternalPerspectiveDsl.g:22455:3: ( '::' )
+            // InternalPerspectiveDsl.g:22456:4: '::'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0()); 
@@ -73133,23 +73133,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2"
-    // InternalPerspectiveDsl.g:22465:1: rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 : ( ( ruleFeatureCallID ) ) ;
+    // InternalPerspectiveDsl.g:22467:1: rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 : ( ( ruleFeatureCallID ) ) ;
     public final void rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22469:1: ( ( ( ruleFeatureCallID ) ) )
-            // InternalPerspectiveDsl.g:22470:2: ( ( ruleFeatureCallID ) )
+            // InternalPerspectiveDsl.g:22471:1: ( ( ( ruleFeatureCallID ) ) )
+            // InternalPerspectiveDsl.g:22472:2: ( ( ruleFeatureCallID ) )
             {
-            // InternalPerspectiveDsl.g:22470:2: ( ( ruleFeatureCallID ) )
-            // InternalPerspectiveDsl.g:22471:3: ( ruleFeatureCallID )
+            // InternalPerspectiveDsl.g:22472:2: ( ( ruleFeatureCallID ) )
+            // InternalPerspectiveDsl.g:22473:3: ( ruleFeatureCallID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_0_2_0()); 
             }
-            // InternalPerspectiveDsl.g:22472:3: ( ruleFeatureCallID )
-            // InternalPerspectiveDsl.g:22473:4: ruleFeatureCallID
+            // InternalPerspectiveDsl.g:22474:3: ( ruleFeatureCallID )
+            // InternalPerspectiveDsl.g:22475:4: ruleFeatureCallID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementFeatureCallIDParserRuleCall_1_0_0_0_2_0_1()); 
@@ -73190,17 +73190,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__ValueAssignment_1_0_1"
-    // InternalPerspectiveDsl.g:22484:1: rule__XMemberFeatureCall__ValueAssignment_1_0_1 : ( ruleXAssignment ) ;
+    // InternalPerspectiveDsl.g:22486:1: rule__XMemberFeatureCall__ValueAssignment_1_0_1 : ( ruleXAssignment ) ;
     public final void rule__XMemberFeatureCall__ValueAssignment_1_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22488:1: ( ( ruleXAssignment ) )
-            // InternalPerspectiveDsl.g:22489:2: ( ruleXAssignment )
+            // InternalPerspectiveDsl.g:22490:1: ( ( ruleXAssignment ) )
+            // InternalPerspectiveDsl.g:22491:2: ( ruleXAssignment )
             {
-            // InternalPerspectiveDsl.g:22489:2: ( ruleXAssignment )
-            // InternalPerspectiveDsl.g:22490:3: ruleXAssignment
+            // InternalPerspectiveDsl.g:22491:2: ( ruleXAssignment )
+            // InternalPerspectiveDsl.g:22492:3: ruleXAssignment
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0()); 
@@ -73235,23 +73235,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1"
-    // InternalPerspectiveDsl.g:22499:1: rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 : ( ( '?.' ) ) ;
+    // InternalPerspectiveDsl.g:22501:1: rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 : ( ( '?.' ) ) ;
     public final void rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22503:1: ( ( ( '?.' ) ) )
-            // InternalPerspectiveDsl.g:22504:2: ( ( '?.' ) )
+            // InternalPerspectiveDsl.g:22505:1: ( ( ( '?.' ) ) )
+            // InternalPerspectiveDsl.g:22506:2: ( ( '?.' ) )
             {
-            // InternalPerspectiveDsl.g:22504:2: ( ( '?.' ) )
-            // InternalPerspectiveDsl.g:22505:3: ( '?.' )
+            // InternalPerspectiveDsl.g:22506:2: ( ( '?.' ) )
+            // InternalPerspectiveDsl.g:22507:3: ( '?.' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0()); 
             }
-            // InternalPerspectiveDsl.g:22506:3: ( '?.' )
-            // InternalPerspectiveDsl.g:22507:4: '?.'
+            // InternalPerspectiveDsl.g:22508:3: ( '?.' )
+            // InternalPerspectiveDsl.g:22509:4: '?.'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0()); 
@@ -73288,23 +73288,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2"
-    // InternalPerspectiveDsl.g:22518:1: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 : ( ( '::' ) ) ;
+    // InternalPerspectiveDsl.g:22520:1: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 : ( ( '::' ) ) ;
     public final void rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22522:1: ( ( ( '::' ) ) )
-            // InternalPerspectiveDsl.g:22523:2: ( ( '::' ) )
+            // InternalPerspectiveDsl.g:22524:1: ( ( ( '::' ) ) )
+            // InternalPerspectiveDsl.g:22525:2: ( ( '::' ) )
             {
-            // InternalPerspectiveDsl.g:22523:2: ( ( '::' ) )
-            // InternalPerspectiveDsl.g:22524:3: ( '::' )
+            // InternalPerspectiveDsl.g:22525:2: ( ( '::' ) )
+            // InternalPerspectiveDsl.g:22526:3: ( '::' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0()); 
             }
-            // InternalPerspectiveDsl.g:22525:3: ( '::' )
-            // InternalPerspectiveDsl.g:22526:4: '::'
+            // InternalPerspectiveDsl.g:22527:3: ( '::' )
+            // InternalPerspectiveDsl.g:22528:4: '::'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0()); 
@@ -73341,17 +73341,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1"
-    // InternalPerspectiveDsl.g:22537:1: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalPerspectiveDsl.g:22539:1: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22541:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalPerspectiveDsl.g:22542:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:22543:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalPerspectiveDsl.g:22544:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalPerspectiveDsl.g:22542:2: ( ruleJvmArgumentTypeReference )
-            // InternalPerspectiveDsl.g:22543:3: ruleJvmArgumentTypeReference
+            // InternalPerspectiveDsl.g:22544:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:22545:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0()); 
@@ -73386,17 +73386,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1"
-    // InternalPerspectiveDsl.g:22552:1: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalPerspectiveDsl.g:22554:1: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22556:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalPerspectiveDsl.g:22557:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:22558:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalPerspectiveDsl.g:22559:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalPerspectiveDsl.g:22557:2: ( ruleJvmArgumentTypeReference )
-            // InternalPerspectiveDsl.g:22558:3: ruleJvmArgumentTypeReference
+            // InternalPerspectiveDsl.g:22559:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:22560:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0()); 
@@ -73431,23 +73431,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__FeatureAssignment_1_1_2"
-    // InternalPerspectiveDsl.g:22567:1: rule__XMemberFeatureCall__FeatureAssignment_1_1_2 : ( ( ruleIdOrSuper ) ) ;
+    // InternalPerspectiveDsl.g:22569:1: rule__XMemberFeatureCall__FeatureAssignment_1_1_2 : ( ( ruleIdOrSuper ) ) ;
     public final void rule__XMemberFeatureCall__FeatureAssignment_1_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22571:1: ( ( ( ruleIdOrSuper ) ) )
-            // InternalPerspectiveDsl.g:22572:2: ( ( ruleIdOrSuper ) )
+            // InternalPerspectiveDsl.g:22573:1: ( ( ( ruleIdOrSuper ) ) )
+            // InternalPerspectiveDsl.g:22574:2: ( ( ruleIdOrSuper ) )
             {
-            // InternalPerspectiveDsl.g:22572:2: ( ( ruleIdOrSuper ) )
-            // InternalPerspectiveDsl.g:22573:3: ( ruleIdOrSuper )
+            // InternalPerspectiveDsl.g:22574:2: ( ( ruleIdOrSuper ) )
+            // InternalPerspectiveDsl.g:22575:3: ( ruleIdOrSuper )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_2_0()); 
             }
-            // InternalPerspectiveDsl.g:22574:3: ( ruleIdOrSuper )
-            // InternalPerspectiveDsl.g:22575:4: ruleIdOrSuper
+            // InternalPerspectiveDsl.g:22576:3: ( ruleIdOrSuper )
+            // InternalPerspectiveDsl.g:22577:4: ruleIdOrSuper
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementIdOrSuperParserRuleCall_1_1_2_0_1()); 
@@ -73488,23 +73488,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0"
-    // InternalPerspectiveDsl.g:22586:1: rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 : ( ( '(' ) ) ;
+    // InternalPerspectiveDsl.g:22588:1: rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 : ( ( '(' ) ) ;
     public final void rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22590:1: ( ( ( '(' ) ) )
-            // InternalPerspectiveDsl.g:22591:2: ( ( '(' ) )
+            // InternalPerspectiveDsl.g:22592:1: ( ( ( '(' ) ) )
+            // InternalPerspectiveDsl.g:22593:2: ( ( '(' ) )
             {
-            // InternalPerspectiveDsl.g:22591:2: ( ( '(' ) )
-            // InternalPerspectiveDsl.g:22592:3: ( '(' )
+            // InternalPerspectiveDsl.g:22593:2: ( ( '(' ) )
+            // InternalPerspectiveDsl.g:22594:3: ( '(' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0()); 
             }
-            // InternalPerspectiveDsl.g:22593:3: ( '(' )
-            // InternalPerspectiveDsl.g:22594:4: '('
+            // InternalPerspectiveDsl.g:22595:3: ( '(' )
+            // InternalPerspectiveDsl.g:22596:4: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0()); 
@@ -73541,17 +73541,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0"
-    // InternalPerspectiveDsl.g:22605:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 : ( ruleXShortClosure ) ;
+    // InternalPerspectiveDsl.g:22607:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 : ( ruleXShortClosure ) ;
     public final void rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22609:1: ( ( ruleXShortClosure ) )
-            // InternalPerspectiveDsl.g:22610:2: ( ruleXShortClosure )
+            // InternalPerspectiveDsl.g:22611:1: ( ( ruleXShortClosure ) )
+            // InternalPerspectiveDsl.g:22612:2: ( ruleXShortClosure )
             {
-            // InternalPerspectiveDsl.g:22610:2: ( ruleXShortClosure )
-            // InternalPerspectiveDsl.g:22611:3: ruleXShortClosure
+            // InternalPerspectiveDsl.g:22612:2: ( ruleXShortClosure )
+            // InternalPerspectiveDsl.g:22613:3: ruleXShortClosure
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0()); 
@@ -73586,17 +73586,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0"
-    // InternalPerspectiveDsl.g:22620:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:22622:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 : ( ruleXExpression ) ;
     public final void rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22624:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:22625:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22626:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:22627:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:22625:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:22626:3: ruleXExpression
+            // InternalPerspectiveDsl.g:22627:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22628:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0()); 
@@ -73631,17 +73631,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1"
-    // InternalPerspectiveDsl.g:22635:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:22637:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 : ( ruleXExpression ) ;
     public final void rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22639:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:22640:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22641:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:22642:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:22640:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:22641:3: ruleXExpression
+            // InternalPerspectiveDsl.g:22642:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22643:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0()); 
@@ -73676,17 +73676,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4"
-    // InternalPerspectiveDsl.g:22650:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 : ( ruleXClosure ) ;
+    // InternalPerspectiveDsl.g:22652:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 : ( ruleXClosure ) ;
     public final void rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22654:1: ( ( ruleXClosure ) )
-            // InternalPerspectiveDsl.g:22655:2: ( ruleXClosure )
+            // InternalPerspectiveDsl.g:22656:1: ( ( ruleXClosure ) )
+            // InternalPerspectiveDsl.g:22657:2: ( ruleXClosure )
             {
-            // InternalPerspectiveDsl.g:22655:2: ( ruleXClosure )
-            // InternalPerspectiveDsl.g:22656:3: ruleXClosure
+            // InternalPerspectiveDsl.g:22657:2: ( ruleXClosure )
+            // InternalPerspectiveDsl.g:22658:3: ruleXClosure
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0()); 
@@ -73721,17 +73721,17 @@
 
 
     // $ANTLR start "rule__XSetLiteral__ElementsAssignment_3_0"
-    // InternalPerspectiveDsl.g:22665:1: rule__XSetLiteral__ElementsAssignment_3_0 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:22667:1: rule__XSetLiteral__ElementsAssignment_3_0 : ( ruleXExpression ) ;
     public final void rule__XSetLiteral__ElementsAssignment_3_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22669:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:22670:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22671:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:22672:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:22670:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:22671:3: ruleXExpression
+            // InternalPerspectiveDsl.g:22672:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22673:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0()); 
@@ -73766,17 +73766,17 @@
 
 
     // $ANTLR start "rule__XSetLiteral__ElementsAssignment_3_1_1"
-    // InternalPerspectiveDsl.g:22680:1: rule__XSetLiteral__ElementsAssignment_3_1_1 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:22682:1: rule__XSetLiteral__ElementsAssignment_3_1_1 : ( ruleXExpression ) ;
     public final void rule__XSetLiteral__ElementsAssignment_3_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22684:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:22685:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22686:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:22687:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:22685:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:22686:3: ruleXExpression
+            // InternalPerspectiveDsl.g:22687:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22688:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0()); 
@@ -73811,17 +73811,17 @@
 
 
     // $ANTLR start "rule__XListLiteral__ElementsAssignment_3_0"
-    // InternalPerspectiveDsl.g:22695:1: rule__XListLiteral__ElementsAssignment_3_0 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:22697:1: rule__XListLiteral__ElementsAssignment_3_0 : ( ruleXExpression ) ;
     public final void rule__XListLiteral__ElementsAssignment_3_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22699:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:22700:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22701:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:22702:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:22700:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:22701:3: ruleXExpression
+            // InternalPerspectiveDsl.g:22702:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22703:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0()); 
@@ -73856,17 +73856,17 @@
 
 
     // $ANTLR start "rule__XListLiteral__ElementsAssignment_3_1_1"
-    // InternalPerspectiveDsl.g:22710:1: rule__XListLiteral__ElementsAssignment_3_1_1 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:22712:1: rule__XListLiteral__ElementsAssignment_3_1_1 : ( ruleXExpression ) ;
     public final void rule__XListLiteral__ElementsAssignment_3_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22714:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:22715:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22716:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:22717:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:22715:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:22716:3: ruleXExpression
+            // InternalPerspectiveDsl.g:22717:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22718:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0()); 
@@ -73901,17 +73901,17 @@
 
 
     // $ANTLR start "rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0"
-    // InternalPerspectiveDsl.g:22725:1: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 : ( ruleJvmFormalParameter ) ;
+    // InternalPerspectiveDsl.g:22727:1: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 : ( ruleJvmFormalParameter ) ;
     public final void rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22729:1: ( ( ruleJvmFormalParameter ) )
-            // InternalPerspectiveDsl.g:22730:2: ( ruleJvmFormalParameter )
+            // InternalPerspectiveDsl.g:22731:1: ( ( ruleJvmFormalParameter ) )
+            // InternalPerspectiveDsl.g:22732:2: ( ruleJvmFormalParameter )
             {
-            // InternalPerspectiveDsl.g:22730:2: ( ruleJvmFormalParameter )
-            // InternalPerspectiveDsl.g:22731:3: ruleJvmFormalParameter
+            // InternalPerspectiveDsl.g:22732:2: ( ruleJvmFormalParameter )
+            // InternalPerspectiveDsl.g:22733:3: ruleJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0()); 
@@ -73946,17 +73946,17 @@
 
 
     // $ANTLR start "rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1"
-    // InternalPerspectiveDsl.g:22740:1: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 : ( ruleJvmFormalParameter ) ;
+    // InternalPerspectiveDsl.g:22742:1: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 : ( ruleJvmFormalParameter ) ;
     public final void rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22744:1: ( ( ruleJvmFormalParameter ) )
-            // InternalPerspectiveDsl.g:22745:2: ( ruleJvmFormalParameter )
+            // InternalPerspectiveDsl.g:22746:1: ( ( ruleJvmFormalParameter ) )
+            // InternalPerspectiveDsl.g:22747:2: ( ruleJvmFormalParameter )
             {
-            // InternalPerspectiveDsl.g:22745:2: ( ruleJvmFormalParameter )
-            // InternalPerspectiveDsl.g:22746:3: ruleJvmFormalParameter
+            // InternalPerspectiveDsl.g:22747:2: ( ruleJvmFormalParameter )
+            // InternalPerspectiveDsl.g:22748:3: ruleJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0()); 
@@ -73991,23 +73991,23 @@
 
 
     // $ANTLR start "rule__XClosure__ExplicitSyntaxAssignment_1_0_1"
-    // InternalPerspectiveDsl.g:22755:1: rule__XClosure__ExplicitSyntaxAssignment_1_0_1 : ( ( '|' ) ) ;
+    // InternalPerspectiveDsl.g:22757:1: rule__XClosure__ExplicitSyntaxAssignment_1_0_1 : ( ( '|' ) ) ;
     public final void rule__XClosure__ExplicitSyntaxAssignment_1_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22759:1: ( ( ( '|' ) ) )
-            // InternalPerspectiveDsl.g:22760:2: ( ( '|' ) )
+            // InternalPerspectiveDsl.g:22761:1: ( ( ( '|' ) ) )
+            // InternalPerspectiveDsl.g:22762:2: ( ( '|' ) )
             {
-            // InternalPerspectiveDsl.g:22760:2: ( ( '|' ) )
-            // InternalPerspectiveDsl.g:22761:3: ( '|' )
+            // InternalPerspectiveDsl.g:22762:2: ( ( '|' ) )
+            // InternalPerspectiveDsl.g:22763:3: ( '|' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0()); 
             }
-            // InternalPerspectiveDsl.g:22762:3: ( '|' )
-            // InternalPerspectiveDsl.g:22763:4: '|'
+            // InternalPerspectiveDsl.g:22764:3: ( '|' )
+            // InternalPerspectiveDsl.g:22765:4: '|'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0()); 
@@ -74044,17 +74044,17 @@
 
 
     // $ANTLR start "rule__XClosure__ExpressionAssignment_2"
-    // InternalPerspectiveDsl.g:22774:1: rule__XClosure__ExpressionAssignment_2 : ( ruleXExpressionInClosure ) ;
+    // InternalPerspectiveDsl.g:22776:1: rule__XClosure__ExpressionAssignment_2 : ( ruleXExpressionInClosure ) ;
     public final void rule__XClosure__ExpressionAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22778:1: ( ( ruleXExpressionInClosure ) )
-            // InternalPerspectiveDsl.g:22779:2: ( ruleXExpressionInClosure )
+            // InternalPerspectiveDsl.g:22780:1: ( ( ruleXExpressionInClosure ) )
+            // InternalPerspectiveDsl.g:22781:2: ( ruleXExpressionInClosure )
             {
-            // InternalPerspectiveDsl.g:22779:2: ( ruleXExpressionInClosure )
-            // InternalPerspectiveDsl.g:22780:3: ruleXExpressionInClosure
+            // InternalPerspectiveDsl.g:22781:2: ( ruleXExpressionInClosure )
+            // InternalPerspectiveDsl.g:22782:3: ruleXExpressionInClosure
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0()); 
@@ -74089,17 +74089,17 @@
 
 
     // $ANTLR start "rule__XExpressionInClosure__ExpressionsAssignment_1_0"
-    // InternalPerspectiveDsl.g:22789:1: rule__XExpressionInClosure__ExpressionsAssignment_1_0 : ( ruleXExpressionOrVarDeclaration ) ;
+    // InternalPerspectiveDsl.g:22791:1: rule__XExpressionInClosure__ExpressionsAssignment_1_0 : ( ruleXExpressionOrVarDeclaration ) ;
     public final void rule__XExpressionInClosure__ExpressionsAssignment_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22793:1: ( ( ruleXExpressionOrVarDeclaration ) )
-            // InternalPerspectiveDsl.g:22794:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalPerspectiveDsl.g:22795:1: ( ( ruleXExpressionOrVarDeclaration ) )
+            // InternalPerspectiveDsl.g:22796:2: ( ruleXExpressionOrVarDeclaration )
             {
-            // InternalPerspectiveDsl.g:22794:2: ( ruleXExpressionOrVarDeclaration )
-            // InternalPerspectiveDsl.g:22795:3: ruleXExpressionOrVarDeclaration
+            // InternalPerspectiveDsl.g:22796:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalPerspectiveDsl.g:22797:3: ruleXExpressionOrVarDeclaration
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0()); 
@@ -74134,17 +74134,17 @@
 
 
     // $ANTLR start "rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0"
-    // InternalPerspectiveDsl.g:22804:1: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 : ( ruleJvmFormalParameter ) ;
+    // InternalPerspectiveDsl.g:22806:1: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 : ( ruleJvmFormalParameter ) ;
     public final void rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22808:1: ( ( ruleJvmFormalParameter ) )
-            // InternalPerspectiveDsl.g:22809:2: ( ruleJvmFormalParameter )
+            // InternalPerspectiveDsl.g:22810:1: ( ( ruleJvmFormalParameter ) )
+            // InternalPerspectiveDsl.g:22811:2: ( ruleJvmFormalParameter )
             {
-            // InternalPerspectiveDsl.g:22809:2: ( ruleJvmFormalParameter )
-            // InternalPerspectiveDsl.g:22810:3: ruleJvmFormalParameter
+            // InternalPerspectiveDsl.g:22811:2: ( ruleJvmFormalParameter )
+            // InternalPerspectiveDsl.g:22812:3: ruleJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0()); 
@@ -74179,17 +74179,17 @@
 
 
     // $ANTLR start "rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1"
-    // InternalPerspectiveDsl.g:22819:1: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 : ( ruleJvmFormalParameter ) ;
+    // InternalPerspectiveDsl.g:22821:1: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 : ( ruleJvmFormalParameter ) ;
     public final void rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22823:1: ( ( ruleJvmFormalParameter ) )
-            // InternalPerspectiveDsl.g:22824:2: ( ruleJvmFormalParameter )
+            // InternalPerspectiveDsl.g:22825:1: ( ( ruleJvmFormalParameter ) )
+            // InternalPerspectiveDsl.g:22826:2: ( ruleJvmFormalParameter )
             {
-            // InternalPerspectiveDsl.g:22824:2: ( ruleJvmFormalParameter )
-            // InternalPerspectiveDsl.g:22825:3: ruleJvmFormalParameter
+            // InternalPerspectiveDsl.g:22826:2: ( ruleJvmFormalParameter )
+            // InternalPerspectiveDsl.g:22827:3: ruleJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0()); 
@@ -74224,23 +74224,23 @@
 
 
     // $ANTLR start "rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2"
-    // InternalPerspectiveDsl.g:22834:1: rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 : ( ( '|' ) ) ;
+    // InternalPerspectiveDsl.g:22836:1: rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 : ( ( '|' ) ) ;
     public final void rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22838:1: ( ( ( '|' ) ) )
-            // InternalPerspectiveDsl.g:22839:2: ( ( '|' ) )
+            // InternalPerspectiveDsl.g:22840:1: ( ( ( '|' ) ) )
+            // InternalPerspectiveDsl.g:22841:2: ( ( '|' ) )
             {
-            // InternalPerspectiveDsl.g:22839:2: ( ( '|' ) )
-            // InternalPerspectiveDsl.g:22840:3: ( '|' )
+            // InternalPerspectiveDsl.g:22841:2: ( ( '|' ) )
+            // InternalPerspectiveDsl.g:22842:3: ( '|' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0()); 
             }
-            // InternalPerspectiveDsl.g:22841:3: ( '|' )
-            // InternalPerspectiveDsl.g:22842:4: '|'
+            // InternalPerspectiveDsl.g:22843:3: ( '|' )
+            // InternalPerspectiveDsl.g:22844:4: '|'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0()); 
@@ -74277,17 +74277,17 @@
 
 
     // $ANTLR start "rule__XShortClosure__ExpressionAssignment_1"
-    // InternalPerspectiveDsl.g:22853:1: rule__XShortClosure__ExpressionAssignment_1 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:22855:1: rule__XShortClosure__ExpressionAssignment_1 : ( ruleXExpression ) ;
     public final void rule__XShortClosure__ExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22857:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:22858:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22859:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:22860:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:22858:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:22859:3: ruleXExpression
+            // InternalPerspectiveDsl.g:22860:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22861:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getExpressionXExpressionParserRuleCall_1_0()); 
@@ -74322,17 +74322,17 @@
 
 
     // $ANTLR start "rule__XIfExpression__IfAssignment_3"
-    // InternalPerspectiveDsl.g:22868:1: rule__XIfExpression__IfAssignment_3 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:22870:1: rule__XIfExpression__IfAssignment_3 : ( ruleXExpression ) ;
     public final void rule__XIfExpression__IfAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22872:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:22873:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22874:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:22875:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:22873:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:22874:3: ruleXExpression
+            // InternalPerspectiveDsl.g:22875:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22876:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0()); 
@@ -74367,17 +74367,17 @@
 
 
     // $ANTLR start "rule__XIfExpression__ThenAssignment_5"
-    // InternalPerspectiveDsl.g:22883:1: rule__XIfExpression__ThenAssignment_5 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:22885:1: rule__XIfExpression__ThenAssignment_5 : ( ruleXExpression ) ;
     public final void rule__XIfExpression__ThenAssignment_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22887:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:22888:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22889:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:22890:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:22888:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:22889:3: ruleXExpression
+            // InternalPerspectiveDsl.g:22890:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22891:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0()); 
@@ -74412,17 +74412,17 @@
 
 
     // $ANTLR start "rule__XIfExpression__ElseAssignment_6_1"
-    // InternalPerspectiveDsl.g:22898:1: rule__XIfExpression__ElseAssignment_6_1 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:22900:1: rule__XIfExpression__ElseAssignment_6_1 : ( ruleXExpression ) ;
     public final void rule__XIfExpression__ElseAssignment_6_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22902:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:22903:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22904:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:22905:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:22903:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:22904:3: ruleXExpression
+            // InternalPerspectiveDsl.g:22905:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22906:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getElseXExpressionParserRuleCall_6_1_0()); 
@@ -74457,17 +74457,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1"
-    // InternalPerspectiveDsl.g:22913:1: rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 : ( ruleJvmFormalParameter ) ;
+    // InternalPerspectiveDsl.g:22915:1: rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 : ( ruleJvmFormalParameter ) ;
     public final void rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22917:1: ( ( ruleJvmFormalParameter ) )
-            // InternalPerspectiveDsl.g:22918:2: ( ruleJvmFormalParameter )
+            // InternalPerspectiveDsl.g:22919:1: ( ( ruleJvmFormalParameter ) )
+            // InternalPerspectiveDsl.g:22920:2: ( ruleJvmFormalParameter )
             {
-            // InternalPerspectiveDsl.g:22918:2: ( ruleJvmFormalParameter )
-            // InternalPerspectiveDsl.g:22919:3: ruleJvmFormalParameter
+            // InternalPerspectiveDsl.g:22920:2: ( ruleJvmFormalParameter )
+            // InternalPerspectiveDsl.g:22921:3: ruleJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0()); 
@@ -74502,17 +74502,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__SwitchAssignment_2_0_1"
-    // InternalPerspectiveDsl.g:22928:1: rule__XSwitchExpression__SwitchAssignment_2_0_1 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:22930:1: rule__XSwitchExpression__SwitchAssignment_2_0_1 : ( ruleXExpression ) ;
     public final void rule__XSwitchExpression__SwitchAssignment_2_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22932:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:22933:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22934:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:22935:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:22933:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:22934:3: ruleXExpression
+            // InternalPerspectiveDsl.g:22935:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22936:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0()); 
@@ -74547,17 +74547,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0"
-    // InternalPerspectiveDsl.g:22943:1: rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 : ( ruleJvmFormalParameter ) ;
+    // InternalPerspectiveDsl.g:22945:1: rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 : ( ruleJvmFormalParameter ) ;
     public final void rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22947:1: ( ( ruleJvmFormalParameter ) )
-            // InternalPerspectiveDsl.g:22948:2: ( ruleJvmFormalParameter )
+            // InternalPerspectiveDsl.g:22949:1: ( ( ruleJvmFormalParameter ) )
+            // InternalPerspectiveDsl.g:22950:2: ( ruleJvmFormalParameter )
             {
-            // InternalPerspectiveDsl.g:22948:2: ( ruleJvmFormalParameter )
-            // InternalPerspectiveDsl.g:22949:3: ruleJvmFormalParameter
+            // InternalPerspectiveDsl.g:22950:2: ( ruleJvmFormalParameter )
+            // InternalPerspectiveDsl.g:22951:3: ruleJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0()); 
@@ -74592,17 +74592,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__SwitchAssignment_2_1_1"
-    // InternalPerspectiveDsl.g:22958:1: rule__XSwitchExpression__SwitchAssignment_2_1_1 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:22960:1: rule__XSwitchExpression__SwitchAssignment_2_1_1 : ( ruleXExpression ) ;
     public final void rule__XSwitchExpression__SwitchAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22962:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:22963:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22964:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:22965:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:22963:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:22964:3: ruleXExpression
+            // InternalPerspectiveDsl.g:22965:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22966:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0()); 
@@ -74637,17 +74637,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__CasesAssignment_4"
-    // InternalPerspectiveDsl.g:22973:1: rule__XSwitchExpression__CasesAssignment_4 : ( ruleXCasePart ) ;
+    // InternalPerspectiveDsl.g:22975:1: rule__XSwitchExpression__CasesAssignment_4 : ( ruleXCasePart ) ;
     public final void rule__XSwitchExpression__CasesAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22977:1: ( ( ruleXCasePart ) )
-            // InternalPerspectiveDsl.g:22978:2: ( ruleXCasePart )
+            // InternalPerspectiveDsl.g:22979:1: ( ( ruleXCasePart ) )
+            // InternalPerspectiveDsl.g:22980:2: ( ruleXCasePart )
             {
-            // InternalPerspectiveDsl.g:22978:2: ( ruleXCasePart )
-            // InternalPerspectiveDsl.g:22979:3: ruleXCasePart
+            // InternalPerspectiveDsl.g:22980:2: ( ruleXCasePart )
+            // InternalPerspectiveDsl.g:22981:3: ruleXCasePart
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0()); 
@@ -74682,17 +74682,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__DefaultAssignment_5_2"
-    // InternalPerspectiveDsl.g:22988:1: rule__XSwitchExpression__DefaultAssignment_5_2 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:22990:1: rule__XSwitchExpression__DefaultAssignment_5_2 : ( ruleXExpression ) ;
     public final void rule__XSwitchExpression__DefaultAssignment_5_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:22992:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:22993:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22994:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:22995:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:22993:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:22994:3: ruleXExpression
+            // InternalPerspectiveDsl.g:22995:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:22996:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0()); 
@@ -74727,17 +74727,17 @@
 
 
     // $ANTLR start "rule__XCasePart__TypeGuardAssignment_1"
-    // InternalPerspectiveDsl.g:23003:1: rule__XCasePart__TypeGuardAssignment_1 : ( ruleJvmTypeReference ) ;
+    // InternalPerspectiveDsl.g:23005:1: rule__XCasePart__TypeGuardAssignment_1 : ( ruleJvmTypeReference ) ;
     public final void rule__XCasePart__TypeGuardAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23007:1: ( ( ruleJvmTypeReference ) )
-            // InternalPerspectiveDsl.g:23008:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:23009:1: ( ( ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:23010:2: ( ruleJvmTypeReference )
             {
-            // InternalPerspectiveDsl.g:23008:2: ( ruleJvmTypeReference )
-            // InternalPerspectiveDsl.g:23009:3: ruleJvmTypeReference
+            // InternalPerspectiveDsl.g:23010:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:23011:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0()); 
@@ -74772,17 +74772,17 @@
 
 
     // $ANTLR start "rule__XCasePart__CaseAssignment_2_1"
-    // InternalPerspectiveDsl.g:23018:1: rule__XCasePart__CaseAssignment_2_1 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23020:1: rule__XCasePart__CaseAssignment_2_1 : ( ruleXExpression ) ;
     public final void rule__XCasePart__CaseAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23022:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23023:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23024:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23025:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23023:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23024:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23025:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23026:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0()); 
@@ -74817,17 +74817,17 @@
 
 
     // $ANTLR start "rule__XCasePart__ThenAssignment_3_0_1"
-    // InternalPerspectiveDsl.g:23033:1: rule__XCasePart__ThenAssignment_3_0_1 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23035:1: rule__XCasePart__ThenAssignment_3_0_1 : ( ruleXExpression ) ;
     public final void rule__XCasePart__ThenAssignment_3_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23037:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23038:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23039:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23040:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23038:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23039:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23040:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23041:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getThenXExpressionParserRuleCall_3_0_1_0()); 
@@ -74862,23 +74862,23 @@
 
 
     // $ANTLR start "rule__XCasePart__FallThroughAssignment_3_1"
-    // InternalPerspectiveDsl.g:23048:1: rule__XCasePart__FallThroughAssignment_3_1 : ( ( ',' ) ) ;
+    // InternalPerspectiveDsl.g:23050:1: rule__XCasePart__FallThroughAssignment_3_1 : ( ( ',' ) ) ;
     public final void rule__XCasePart__FallThroughAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23052:1: ( ( ( ',' ) ) )
-            // InternalPerspectiveDsl.g:23053:2: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:23054:1: ( ( ( ',' ) ) )
+            // InternalPerspectiveDsl.g:23055:2: ( ( ',' ) )
             {
-            // InternalPerspectiveDsl.g:23053:2: ( ( ',' ) )
-            // InternalPerspectiveDsl.g:23054:3: ( ',' )
+            // InternalPerspectiveDsl.g:23055:2: ( ( ',' ) )
+            // InternalPerspectiveDsl.g:23056:3: ( ',' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0()); 
             }
-            // InternalPerspectiveDsl.g:23055:3: ( ',' )
-            // InternalPerspectiveDsl.g:23056:4: ','
+            // InternalPerspectiveDsl.g:23057:3: ( ',' )
+            // InternalPerspectiveDsl.g:23058:4: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0()); 
@@ -74915,17 +74915,17 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__DeclaredParamAssignment_0_0_3"
-    // InternalPerspectiveDsl.g:23067:1: rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 : ( ruleJvmFormalParameter ) ;
+    // InternalPerspectiveDsl.g:23069:1: rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 : ( ruleJvmFormalParameter ) ;
     public final void rule__XForLoopExpression__DeclaredParamAssignment_0_0_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23071:1: ( ( ruleJvmFormalParameter ) )
-            // InternalPerspectiveDsl.g:23072:2: ( ruleJvmFormalParameter )
+            // InternalPerspectiveDsl.g:23073:1: ( ( ruleJvmFormalParameter ) )
+            // InternalPerspectiveDsl.g:23074:2: ( ruleJvmFormalParameter )
             {
-            // InternalPerspectiveDsl.g:23072:2: ( ruleJvmFormalParameter )
-            // InternalPerspectiveDsl.g:23073:3: ruleJvmFormalParameter
+            // InternalPerspectiveDsl.g:23074:2: ( ruleJvmFormalParameter )
+            // InternalPerspectiveDsl.g:23075:3: ruleJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0()); 
@@ -74960,17 +74960,17 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__ForExpressionAssignment_1"
-    // InternalPerspectiveDsl.g:23082:1: rule__XForLoopExpression__ForExpressionAssignment_1 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23084:1: rule__XForLoopExpression__ForExpressionAssignment_1 : ( ruleXExpression ) ;
     public final void rule__XForLoopExpression__ForExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23086:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23087:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23088:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23089:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23087:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23088:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23089:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23090:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0()); 
@@ -75005,17 +75005,17 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__EachExpressionAssignment_3"
-    // InternalPerspectiveDsl.g:23097:1: rule__XForLoopExpression__EachExpressionAssignment_3 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23099:1: rule__XForLoopExpression__EachExpressionAssignment_3 : ( ruleXExpression ) ;
     public final void rule__XForLoopExpression__EachExpressionAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23101:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23102:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23103:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23104:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23102:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23103:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23104:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23105:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_3_0()); 
@@ -75050,17 +75050,17 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0"
-    // InternalPerspectiveDsl.g:23112:1: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 : ( ruleXExpressionOrVarDeclaration ) ;
+    // InternalPerspectiveDsl.g:23114:1: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 : ( ruleXExpressionOrVarDeclaration ) ;
     public final void rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23116:1: ( ( ruleXExpressionOrVarDeclaration ) )
-            // InternalPerspectiveDsl.g:23117:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalPerspectiveDsl.g:23118:1: ( ( ruleXExpressionOrVarDeclaration ) )
+            // InternalPerspectiveDsl.g:23119:2: ( ruleXExpressionOrVarDeclaration )
             {
-            // InternalPerspectiveDsl.g:23117:2: ( ruleXExpressionOrVarDeclaration )
-            // InternalPerspectiveDsl.g:23118:3: ruleXExpressionOrVarDeclaration
+            // InternalPerspectiveDsl.g:23119:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalPerspectiveDsl.g:23120:3: ruleXExpressionOrVarDeclaration
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0()); 
@@ -75095,17 +75095,17 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1"
-    // InternalPerspectiveDsl.g:23127:1: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 : ( ruleXExpressionOrVarDeclaration ) ;
+    // InternalPerspectiveDsl.g:23129:1: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 : ( ruleXExpressionOrVarDeclaration ) ;
     public final void rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23131:1: ( ( ruleXExpressionOrVarDeclaration ) )
-            // InternalPerspectiveDsl.g:23132:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalPerspectiveDsl.g:23133:1: ( ( ruleXExpressionOrVarDeclaration ) )
+            // InternalPerspectiveDsl.g:23134:2: ( ruleXExpressionOrVarDeclaration )
             {
-            // InternalPerspectiveDsl.g:23132:2: ( ruleXExpressionOrVarDeclaration )
-            // InternalPerspectiveDsl.g:23133:3: ruleXExpressionOrVarDeclaration
+            // InternalPerspectiveDsl.g:23134:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalPerspectiveDsl.g:23135:3: ruleXExpressionOrVarDeclaration
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0()); 
@@ -75140,17 +75140,17 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__ExpressionAssignment_5"
-    // InternalPerspectiveDsl.g:23142:1: rule__XBasicForLoopExpression__ExpressionAssignment_5 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23144:1: rule__XBasicForLoopExpression__ExpressionAssignment_5 : ( ruleXExpression ) ;
     public final void rule__XBasicForLoopExpression__ExpressionAssignment_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23146:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23147:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23148:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23149:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23147:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23148:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23149:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23150:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0()); 
@@ -75185,17 +75185,17 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0"
-    // InternalPerspectiveDsl.g:23157:1: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23159:1: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 : ( ruleXExpression ) ;
     public final void rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23161:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23162:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23163:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23164:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23162:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23163:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23164:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23165:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0()); 
@@ -75230,17 +75230,17 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1"
-    // InternalPerspectiveDsl.g:23172:1: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23174:1: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 : ( ruleXExpression ) ;
     public final void rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23176:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23177:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23178:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23179:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23177:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23178:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23179:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23180:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0()); 
@@ -75275,17 +75275,17 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__EachExpressionAssignment_9"
-    // InternalPerspectiveDsl.g:23187:1: rule__XBasicForLoopExpression__EachExpressionAssignment_9 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23189:1: rule__XBasicForLoopExpression__EachExpressionAssignment_9 : ( ruleXExpression ) ;
     public final void rule__XBasicForLoopExpression__EachExpressionAssignment_9() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23191:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23192:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23193:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23194:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23192:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23193:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23194:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23195:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_9_0()); 
@@ -75320,17 +75320,17 @@
 
 
     // $ANTLR start "rule__XWhileExpression__PredicateAssignment_3"
-    // InternalPerspectiveDsl.g:23202:1: rule__XWhileExpression__PredicateAssignment_3 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23204:1: rule__XWhileExpression__PredicateAssignment_3 : ( ruleXExpression ) ;
     public final void rule__XWhileExpression__PredicateAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23206:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23207:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23208:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23209:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23207:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23208:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23209:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23210:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0()); 
@@ -75365,17 +75365,17 @@
 
 
     // $ANTLR start "rule__XWhileExpression__BodyAssignment_5"
-    // InternalPerspectiveDsl.g:23217:1: rule__XWhileExpression__BodyAssignment_5 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23219:1: rule__XWhileExpression__BodyAssignment_5 : ( ruleXExpression ) ;
     public final void rule__XWhileExpression__BodyAssignment_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23221:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23222:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23223:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23224:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23222:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23223:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23224:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23225:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionAccess().getBodyXExpressionParserRuleCall_5_0()); 
@@ -75410,17 +75410,17 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__BodyAssignment_2"
-    // InternalPerspectiveDsl.g:23232:1: rule__XDoWhileExpression__BodyAssignment_2 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23234:1: rule__XDoWhileExpression__BodyAssignment_2 : ( ruleXExpression ) ;
     public final void rule__XDoWhileExpression__BodyAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23236:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23237:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23238:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23239:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23237:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23238:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23239:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23240:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0()); 
@@ -75455,17 +75455,17 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__PredicateAssignment_5"
-    // InternalPerspectiveDsl.g:23247:1: rule__XDoWhileExpression__PredicateAssignment_5 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23249:1: rule__XDoWhileExpression__PredicateAssignment_5 : ( ruleXExpression ) ;
     public final void rule__XDoWhileExpression__PredicateAssignment_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23251:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23252:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23253:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23254:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23252:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23253:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23254:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23255:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0()); 
@@ -75500,17 +75500,17 @@
 
 
     // $ANTLR start "rule__XBlockExpression__ExpressionsAssignment_2_0"
-    // InternalPerspectiveDsl.g:23262:1: rule__XBlockExpression__ExpressionsAssignment_2_0 : ( ruleXExpressionOrVarDeclaration ) ;
+    // InternalPerspectiveDsl.g:23264:1: rule__XBlockExpression__ExpressionsAssignment_2_0 : ( ruleXExpressionOrVarDeclaration ) ;
     public final void rule__XBlockExpression__ExpressionsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23266:1: ( ( ruleXExpressionOrVarDeclaration ) )
-            // InternalPerspectiveDsl.g:23267:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalPerspectiveDsl.g:23268:1: ( ( ruleXExpressionOrVarDeclaration ) )
+            // InternalPerspectiveDsl.g:23269:2: ( ruleXExpressionOrVarDeclaration )
             {
-            // InternalPerspectiveDsl.g:23267:2: ( ruleXExpressionOrVarDeclaration )
-            // InternalPerspectiveDsl.g:23268:3: ruleXExpressionOrVarDeclaration
+            // InternalPerspectiveDsl.g:23269:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalPerspectiveDsl.g:23270:3: ruleXExpressionOrVarDeclaration
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0()); 
@@ -75545,23 +75545,23 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__WriteableAssignment_1_0"
-    // InternalPerspectiveDsl.g:23277:1: rule__XVariableDeclaration__WriteableAssignment_1_0 : ( ( 'var' ) ) ;
+    // InternalPerspectiveDsl.g:23279:1: rule__XVariableDeclaration__WriteableAssignment_1_0 : ( ( 'var' ) ) ;
     public final void rule__XVariableDeclaration__WriteableAssignment_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23281:1: ( ( ( 'var' ) ) )
-            // InternalPerspectiveDsl.g:23282:2: ( ( 'var' ) )
+            // InternalPerspectiveDsl.g:23283:1: ( ( ( 'var' ) ) )
+            // InternalPerspectiveDsl.g:23284:2: ( ( 'var' ) )
             {
-            // InternalPerspectiveDsl.g:23282:2: ( ( 'var' ) )
-            // InternalPerspectiveDsl.g:23283:3: ( 'var' )
+            // InternalPerspectiveDsl.g:23284:2: ( ( 'var' ) )
+            // InternalPerspectiveDsl.g:23285:3: ( 'var' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0()); 
             }
-            // InternalPerspectiveDsl.g:23284:3: ( 'var' )
-            // InternalPerspectiveDsl.g:23285:4: 'var'
+            // InternalPerspectiveDsl.g:23286:3: ( 'var' )
+            // InternalPerspectiveDsl.g:23287:4: 'var'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0()); 
@@ -75598,17 +75598,17 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__TypeAssignment_2_0_0_0"
-    // InternalPerspectiveDsl.g:23296:1: rule__XVariableDeclaration__TypeAssignment_2_0_0_0 : ( ruleJvmTypeReference ) ;
+    // InternalPerspectiveDsl.g:23298:1: rule__XVariableDeclaration__TypeAssignment_2_0_0_0 : ( ruleJvmTypeReference ) ;
     public final void rule__XVariableDeclaration__TypeAssignment_2_0_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23300:1: ( ( ruleJvmTypeReference ) )
-            // InternalPerspectiveDsl.g:23301:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:23302:1: ( ( ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:23303:2: ( ruleJvmTypeReference )
             {
-            // InternalPerspectiveDsl.g:23301:2: ( ruleJvmTypeReference )
-            // InternalPerspectiveDsl.g:23302:3: ruleJvmTypeReference
+            // InternalPerspectiveDsl.g:23303:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:23304:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getTypeJvmTypeReferenceParserRuleCall_2_0_0_0_0()); 
@@ -75643,17 +75643,17 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__NameAssignment_2_0_0_1"
-    // InternalPerspectiveDsl.g:23311:1: rule__XVariableDeclaration__NameAssignment_2_0_0_1 : ( ruleValidID ) ;
+    // InternalPerspectiveDsl.g:23313:1: rule__XVariableDeclaration__NameAssignment_2_0_0_1 : ( ruleValidID ) ;
     public final void rule__XVariableDeclaration__NameAssignment_2_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23315:1: ( ( ruleValidID ) )
-            // InternalPerspectiveDsl.g:23316:2: ( ruleValidID )
+            // InternalPerspectiveDsl.g:23317:1: ( ( ruleValidID ) )
+            // InternalPerspectiveDsl.g:23318:2: ( ruleValidID )
             {
-            // InternalPerspectiveDsl.g:23316:2: ( ruleValidID )
-            // InternalPerspectiveDsl.g:23317:3: ruleValidID
+            // InternalPerspectiveDsl.g:23318:2: ( ruleValidID )
+            // InternalPerspectiveDsl.g:23319:3: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0()); 
@@ -75688,17 +75688,17 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__NameAssignment_2_1"
-    // InternalPerspectiveDsl.g:23326:1: rule__XVariableDeclaration__NameAssignment_2_1 : ( ruleValidID ) ;
+    // InternalPerspectiveDsl.g:23328:1: rule__XVariableDeclaration__NameAssignment_2_1 : ( ruleValidID ) ;
     public final void rule__XVariableDeclaration__NameAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23330:1: ( ( ruleValidID ) )
-            // InternalPerspectiveDsl.g:23331:2: ( ruleValidID )
+            // InternalPerspectiveDsl.g:23332:1: ( ( ruleValidID ) )
+            // InternalPerspectiveDsl.g:23333:2: ( ruleValidID )
             {
-            // InternalPerspectiveDsl.g:23331:2: ( ruleValidID )
-            // InternalPerspectiveDsl.g:23332:3: ruleValidID
+            // InternalPerspectiveDsl.g:23333:2: ( ruleValidID )
+            // InternalPerspectiveDsl.g:23334:3: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0()); 
@@ -75733,17 +75733,17 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__RightAssignment_3_1"
-    // InternalPerspectiveDsl.g:23341:1: rule__XVariableDeclaration__RightAssignment_3_1 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23343:1: rule__XVariableDeclaration__RightAssignment_3_1 : ( ruleXExpression ) ;
     public final void rule__XVariableDeclaration__RightAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23345:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23346:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23347:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23348:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23346:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23347:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23348:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23349:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getRightXExpressionParserRuleCall_3_1_0()); 
@@ -75778,17 +75778,17 @@
 
 
     // $ANTLR start "rule__JvmFormalParameter__ParameterTypeAssignment_0"
-    // InternalPerspectiveDsl.g:23356:1: rule__JvmFormalParameter__ParameterTypeAssignment_0 : ( ruleJvmTypeReference ) ;
+    // InternalPerspectiveDsl.g:23358:1: rule__JvmFormalParameter__ParameterTypeAssignment_0 : ( ruleJvmTypeReference ) ;
     public final void rule__JvmFormalParameter__ParameterTypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23360:1: ( ( ruleJvmTypeReference ) )
-            // InternalPerspectiveDsl.g:23361:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:23362:1: ( ( ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:23363:2: ( ruleJvmTypeReference )
             {
-            // InternalPerspectiveDsl.g:23361:2: ( ruleJvmTypeReference )
-            // InternalPerspectiveDsl.g:23362:3: ruleJvmTypeReference
+            // InternalPerspectiveDsl.g:23363:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:23364:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); 
@@ -75823,17 +75823,17 @@
 
 
     // $ANTLR start "rule__JvmFormalParameter__NameAssignment_1"
-    // InternalPerspectiveDsl.g:23371:1: rule__JvmFormalParameter__NameAssignment_1 : ( ruleValidID ) ;
+    // InternalPerspectiveDsl.g:23373:1: rule__JvmFormalParameter__NameAssignment_1 : ( ruleValidID ) ;
     public final void rule__JvmFormalParameter__NameAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23375:1: ( ( ruleValidID ) )
-            // InternalPerspectiveDsl.g:23376:2: ( ruleValidID )
+            // InternalPerspectiveDsl.g:23377:1: ( ( ruleValidID ) )
+            // InternalPerspectiveDsl.g:23378:2: ( ruleValidID )
             {
-            // InternalPerspectiveDsl.g:23376:2: ( ruleValidID )
-            // InternalPerspectiveDsl.g:23377:3: ruleValidID
+            // InternalPerspectiveDsl.g:23378:2: ( ruleValidID )
+            // InternalPerspectiveDsl.g:23379:3: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0()); 
@@ -75868,17 +75868,17 @@
 
 
     // $ANTLR start "rule__FullJvmFormalParameter__ParameterTypeAssignment_0"
-    // InternalPerspectiveDsl.g:23386:1: rule__FullJvmFormalParameter__ParameterTypeAssignment_0 : ( ruleJvmTypeReference ) ;
+    // InternalPerspectiveDsl.g:23388:1: rule__FullJvmFormalParameter__ParameterTypeAssignment_0 : ( ruleJvmTypeReference ) ;
     public final void rule__FullJvmFormalParameter__ParameterTypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23390:1: ( ( ruleJvmTypeReference ) )
-            // InternalPerspectiveDsl.g:23391:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:23392:1: ( ( ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:23393:2: ( ruleJvmTypeReference )
             {
-            // InternalPerspectiveDsl.g:23391:2: ( ruleJvmTypeReference )
-            // InternalPerspectiveDsl.g:23392:3: ruleJvmTypeReference
+            // InternalPerspectiveDsl.g:23393:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:23394:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); 
@@ -75913,17 +75913,17 @@
 
 
     // $ANTLR start "rule__FullJvmFormalParameter__NameAssignment_1"
-    // InternalPerspectiveDsl.g:23401:1: rule__FullJvmFormalParameter__NameAssignment_1 : ( ruleValidID ) ;
+    // InternalPerspectiveDsl.g:23403:1: rule__FullJvmFormalParameter__NameAssignment_1 : ( ruleValidID ) ;
     public final void rule__FullJvmFormalParameter__NameAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23405:1: ( ( ruleValidID ) )
-            // InternalPerspectiveDsl.g:23406:2: ( ruleValidID )
+            // InternalPerspectiveDsl.g:23407:1: ( ( ruleValidID ) )
+            // InternalPerspectiveDsl.g:23408:2: ( ruleValidID )
             {
-            // InternalPerspectiveDsl.g:23406:2: ( ruleValidID )
-            // InternalPerspectiveDsl.g:23407:3: ruleValidID
+            // InternalPerspectiveDsl.g:23408:2: ( ruleValidID )
+            // InternalPerspectiveDsl.g:23409:3: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFullJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0()); 
@@ -75958,17 +75958,17 @@
 
 
     // $ANTLR start "rule__XFeatureCall__TypeArgumentsAssignment_1_1"
-    // InternalPerspectiveDsl.g:23416:1: rule__XFeatureCall__TypeArgumentsAssignment_1_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalPerspectiveDsl.g:23418:1: rule__XFeatureCall__TypeArgumentsAssignment_1_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__XFeatureCall__TypeArgumentsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23420:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalPerspectiveDsl.g:23421:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:23422:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalPerspectiveDsl.g:23423:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalPerspectiveDsl.g:23421:2: ( ruleJvmArgumentTypeReference )
-            // InternalPerspectiveDsl.g:23422:3: ruleJvmArgumentTypeReference
+            // InternalPerspectiveDsl.g:23423:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:23424:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); 
@@ -76003,17 +76003,17 @@
 
 
     // $ANTLR start "rule__XFeatureCall__TypeArgumentsAssignment_1_2_1"
-    // InternalPerspectiveDsl.g:23431:1: rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalPerspectiveDsl.g:23433:1: rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__XFeatureCall__TypeArgumentsAssignment_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23435:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalPerspectiveDsl.g:23436:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:23437:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalPerspectiveDsl.g:23438:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalPerspectiveDsl.g:23436:2: ( ruleJvmArgumentTypeReference )
-            // InternalPerspectiveDsl.g:23437:3: ruleJvmArgumentTypeReference
+            // InternalPerspectiveDsl.g:23438:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:23439:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0()); 
@@ -76048,23 +76048,23 @@
 
 
     // $ANTLR start "rule__XFeatureCall__FeatureAssignment_2"
-    // InternalPerspectiveDsl.g:23446:1: rule__XFeatureCall__FeatureAssignment_2 : ( ( ruleIdOrSuper ) ) ;
+    // InternalPerspectiveDsl.g:23448:1: rule__XFeatureCall__FeatureAssignment_2 : ( ( ruleIdOrSuper ) ) ;
     public final void rule__XFeatureCall__FeatureAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23450:1: ( ( ( ruleIdOrSuper ) ) )
-            // InternalPerspectiveDsl.g:23451:2: ( ( ruleIdOrSuper ) )
+            // InternalPerspectiveDsl.g:23452:1: ( ( ( ruleIdOrSuper ) ) )
+            // InternalPerspectiveDsl.g:23453:2: ( ( ruleIdOrSuper ) )
             {
-            // InternalPerspectiveDsl.g:23451:2: ( ( ruleIdOrSuper ) )
-            // InternalPerspectiveDsl.g:23452:3: ( ruleIdOrSuper )
+            // InternalPerspectiveDsl.g:23453:2: ( ( ruleIdOrSuper ) )
+            // InternalPerspectiveDsl.g:23454:3: ( ruleIdOrSuper )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_2_0()); 
             }
-            // InternalPerspectiveDsl.g:23453:3: ( ruleIdOrSuper )
-            // InternalPerspectiveDsl.g:23454:4: ruleIdOrSuper
+            // InternalPerspectiveDsl.g:23455:3: ( ruleIdOrSuper )
+            // InternalPerspectiveDsl.g:23456:4: ruleIdOrSuper
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementIdOrSuperParserRuleCall_2_0_1()); 
@@ -76105,23 +76105,23 @@
 
 
     // $ANTLR start "rule__XFeatureCall__ExplicitOperationCallAssignment_3_0"
-    // InternalPerspectiveDsl.g:23465:1: rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 : ( ( '(' ) ) ;
+    // InternalPerspectiveDsl.g:23467:1: rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 : ( ( '(' ) ) ;
     public final void rule__XFeatureCall__ExplicitOperationCallAssignment_3_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23469:1: ( ( ( '(' ) ) )
-            // InternalPerspectiveDsl.g:23470:2: ( ( '(' ) )
+            // InternalPerspectiveDsl.g:23471:1: ( ( ( '(' ) ) )
+            // InternalPerspectiveDsl.g:23472:2: ( ( '(' ) )
             {
-            // InternalPerspectiveDsl.g:23470:2: ( ( '(' ) )
-            // InternalPerspectiveDsl.g:23471:3: ( '(' )
+            // InternalPerspectiveDsl.g:23472:2: ( ( '(' ) )
+            // InternalPerspectiveDsl.g:23473:3: ( '(' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0()); 
             }
-            // InternalPerspectiveDsl.g:23472:3: ( '(' )
-            // InternalPerspectiveDsl.g:23473:4: '('
+            // InternalPerspectiveDsl.g:23474:3: ( '(' )
+            // InternalPerspectiveDsl.g:23475:4: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0()); 
@@ -76158,17 +76158,17 @@
 
 
     // $ANTLR start "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0"
-    // InternalPerspectiveDsl.g:23484:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 : ( ruleXShortClosure ) ;
+    // InternalPerspectiveDsl.g:23486:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 : ( ruleXShortClosure ) ;
     public final void rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23488:1: ( ( ruleXShortClosure ) )
-            // InternalPerspectiveDsl.g:23489:2: ( ruleXShortClosure )
+            // InternalPerspectiveDsl.g:23490:1: ( ( ruleXShortClosure ) )
+            // InternalPerspectiveDsl.g:23491:2: ( ruleXShortClosure )
             {
-            // InternalPerspectiveDsl.g:23489:2: ( ruleXShortClosure )
-            // InternalPerspectiveDsl.g:23490:3: ruleXShortClosure
+            // InternalPerspectiveDsl.g:23491:2: ( ruleXShortClosure )
+            // InternalPerspectiveDsl.g:23492:3: ruleXShortClosure
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0()); 
@@ -76203,17 +76203,17 @@
 
 
     // $ANTLR start "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0"
-    // InternalPerspectiveDsl.g:23499:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23501:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 : ( ruleXExpression ) ;
     public final void rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23503:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23504:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23505:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23506:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23504:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23505:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23506:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23507:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0()); 
@@ -76248,17 +76248,17 @@
 
 
     // $ANTLR start "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1"
-    // InternalPerspectiveDsl.g:23514:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23516:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 : ( ruleXExpression ) ;
     public final void rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23518:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23519:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23520:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23521:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23519:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23520:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23521:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23522:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0()); 
@@ -76293,17 +76293,17 @@
 
 
     // $ANTLR start "rule__XFeatureCall__FeatureCallArgumentsAssignment_4"
-    // InternalPerspectiveDsl.g:23529:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_4 : ( ruleXClosure ) ;
+    // InternalPerspectiveDsl.g:23531:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_4 : ( ruleXClosure ) ;
     public final void rule__XFeatureCall__FeatureCallArgumentsAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23533:1: ( ( ruleXClosure ) )
-            // InternalPerspectiveDsl.g:23534:2: ( ruleXClosure )
+            // InternalPerspectiveDsl.g:23535:1: ( ( ruleXClosure ) )
+            // InternalPerspectiveDsl.g:23536:2: ( ruleXClosure )
             {
-            // InternalPerspectiveDsl.g:23534:2: ( ruleXClosure )
-            // InternalPerspectiveDsl.g:23535:3: ruleXClosure
+            // InternalPerspectiveDsl.g:23536:2: ( ruleXClosure )
+            // InternalPerspectiveDsl.g:23537:3: ruleXClosure
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXClosureParserRuleCall_4_0()); 
@@ -76338,23 +76338,23 @@
 
 
     // $ANTLR start "rule__XConstructorCall__ConstructorAssignment_2"
-    // InternalPerspectiveDsl.g:23544:1: rule__XConstructorCall__ConstructorAssignment_2 : ( ( ruleQualifiedName ) ) ;
+    // InternalPerspectiveDsl.g:23546:1: rule__XConstructorCall__ConstructorAssignment_2 : ( ( ruleQualifiedName ) ) ;
     public final void rule__XConstructorCall__ConstructorAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23548:1: ( ( ( ruleQualifiedName ) ) )
-            // InternalPerspectiveDsl.g:23549:2: ( ( ruleQualifiedName ) )
+            // InternalPerspectiveDsl.g:23550:1: ( ( ( ruleQualifiedName ) ) )
+            // InternalPerspectiveDsl.g:23551:2: ( ( ruleQualifiedName ) )
             {
-            // InternalPerspectiveDsl.g:23549:2: ( ( ruleQualifiedName ) )
-            // InternalPerspectiveDsl.g:23550:3: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:23551:2: ( ( ruleQualifiedName ) )
+            // InternalPerspectiveDsl.g:23552:3: ( ruleQualifiedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorCrossReference_2_0()); 
             }
-            // InternalPerspectiveDsl.g:23551:3: ( ruleQualifiedName )
-            // InternalPerspectiveDsl.g:23552:4: ruleQualifiedName
+            // InternalPerspectiveDsl.g:23553:3: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:23554:4: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorQualifiedNameParserRuleCall_2_0_1()); 
@@ -76395,17 +76395,17 @@
 
 
     // $ANTLR start "rule__XConstructorCall__TypeArgumentsAssignment_3_1"
-    // InternalPerspectiveDsl.g:23563:1: rule__XConstructorCall__TypeArgumentsAssignment_3_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalPerspectiveDsl.g:23565:1: rule__XConstructorCall__TypeArgumentsAssignment_3_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__XConstructorCall__TypeArgumentsAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23567:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalPerspectiveDsl.g:23568:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:23569:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalPerspectiveDsl.g:23570:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalPerspectiveDsl.g:23568:2: ( ruleJvmArgumentTypeReference )
-            // InternalPerspectiveDsl.g:23569:3: ruleJvmArgumentTypeReference
+            // InternalPerspectiveDsl.g:23570:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:23571:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0()); 
@@ -76440,17 +76440,17 @@
 
 
     // $ANTLR start "rule__XConstructorCall__TypeArgumentsAssignment_3_2_1"
-    // InternalPerspectiveDsl.g:23578:1: rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalPerspectiveDsl.g:23580:1: rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__XConstructorCall__TypeArgumentsAssignment_3_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23582:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalPerspectiveDsl.g:23583:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:23584:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalPerspectiveDsl.g:23585:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalPerspectiveDsl.g:23583:2: ( ruleJvmArgumentTypeReference )
-            // InternalPerspectiveDsl.g:23584:3: ruleJvmArgumentTypeReference
+            // InternalPerspectiveDsl.g:23585:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:23586:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0()); 
@@ -76485,23 +76485,23 @@
 
 
     // $ANTLR start "rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0"
-    // InternalPerspectiveDsl.g:23593:1: rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 : ( ( '(' ) ) ;
+    // InternalPerspectiveDsl.g:23595:1: rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 : ( ( '(' ) ) ;
     public final void rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23597:1: ( ( ( '(' ) ) )
-            // InternalPerspectiveDsl.g:23598:2: ( ( '(' ) )
+            // InternalPerspectiveDsl.g:23599:1: ( ( ( '(' ) ) )
+            // InternalPerspectiveDsl.g:23600:2: ( ( '(' ) )
             {
-            // InternalPerspectiveDsl.g:23598:2: ( ( '(' ) )
-            // InternalPerspectiveDsl.g:23599:3: ( '(' )
+            // InternalPerspectiveDsl.g:23600:2: ( ( '(' ) )
+            // InternalPerspectiveDsl.g:23601:3: ( '(' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0()); 
             }
-            // InternalPerspectiveDsl.g:23600:3: ( '(' )
-            // InternalPerspectiveDsl.g:23601:4: '('
+            // InternalPerspectiveDsl.g:23602:3: ( '(' )
+            // InternalPerspectiveDsl.g:23603:4: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0()); 
@@ -76538,17 +76538,17 @@
 
 
     // $ANTLR start "rule__XConstructorCall__ArgumentsAssignment_4_1_0"
-    // InternalPerspectiveDsl.g:23612:1: rule__XConstructorCall__ArgumentsAssignment_4_1_0 : ( ruleXShortClosure ) ;
+    // InternalPerspectiveDsl.g:23614:1: rule__XConstructorCall__ArgumentsAssignment_4_1_0 : ( ruleXShortClosure ) ;
     public final void rule__XConstructorCall__ArgumentsAssignment_4_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23616:1: ( ( ruleXShortClosure ) )
-            // InternalPerspectiveDsl.g:23617:2: ( ruleXShortClosure )
+            // InternalPerspectiveDsl.g:23618:1: ( ( ruleXShortClosure ) )
+            // InternalPerspectiveDsl.g:23619:2: ( ruleXShortClosure )
             {
-            // InternalPerspectiveDsl.g:23617:2: ( ruleXShortClosure )
-            // InternalPerspectiveDsl.g:23618:3: ruleXShortClosure
+            // InternalPerspectiveDsl.g:23619:2: ( ruleXShortClosure )
+            // InternalPerspectiveDsl.g:23620:3: ruleXShortClosure
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0()); 
@@ -76583,17 +76583,17 @@
 
 
     // $ANTLR start "rule__XConstructorCall__ArgumentsAssignment_4_1_1_0"
-    // InternalPerspectiveDsl.g:23627:1: rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23629:1: rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 : ( ruleXExpression ) ;
     public final void rule__XConstructorCall__ArgumentsAssignment_4_1_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23631:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23632:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23633:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23634:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23632:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23633:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23634:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23635:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0()); 
@@ -76628,17 +76628,17 @@
 
 
     // $ANTLR start "rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1"
-    // InternalPerspectiveDsl.g:23642:1: rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23644:1: rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 : ( ruleXExpression ) ;
     public final void rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23646:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23647:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23648:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23649:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23647:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23648:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23649:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23650:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0()); 
@@ -76673,17 +76673,17 @@
 
 
     // $ANTLR start "rule__XConstructorCall__ArgumentsAssignment_5"
-    // InternalPerspectiveDsl.g:23657:1: rule__XConstructorCall__ArgumentsAssignment_5 : ( ruleXClosure ) ;
+    // InternalPerspectiveDsl.g:23659:1: rule__XConstructorCall__ArgumentsAssignment_5 : ( ruleXClosure ) ;
     public final void rule__XConstructorCall__ArgumentsAssignment_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23661:1: ( ( ruleXClosure ) )
-            // InternalPerspectiveDsl.g:23662:2: ( ruleXClosure )
+            // InternalPerspectiveDsl.g:23663:1: ( ( ruleXClosure ) )
+            // InternalPerspectiveDsl.g:23664:2: ( ruleXClosure )
             {
-            // InternalPerspectiveDsl.g:23662:2: ( ruleXClosure )
-            // InternalPerspectiveDsl.g:23663:3: ruleXClosure
+            // InternalPerspectiveDsl.g:23664:2: ( ruleXClosure )
+            // InternalPerspectiveDsl.g:23665:3: ruleXClosure
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getArgumentsXClosureParserRuleCall_5_0()); 
@@ -76718,23 +76718,23 @@
 
 
     // $ANTLR start "rule__XBooleanLiteral__IsTrueAssignment_1_1"
-    // InternalPerspectiveDsl.g:23672:1: rule__XBooleanLiteral__IsTrueAssignment_1_1 : ( ( 'true' ) ) ;
+    // InternalPerspectiveDsl.g:23674:1: rule__XBooleanLiteral__IsTrueAssignment_1_1 : ( ( 'true' ) ) ;
     public final void rule__XBooleanLiteral__IsTrueAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23676:1: ( ( ( 'true' ) ) )
-            // InternalPerspectiveDsl.g:23677:2: ( ( 'true' ) )
+            // InternalPerspectiveDsl.g:23678:1: ( ( ( 'true' ) ) )
+            // InternalPerspectiveDsl.g:23679:2: ( ( 'true' ) )
             {
-            // InternalPerspectiveDsl.g:23677:2: ( ( 'true' ) )
-            // InternalPerspectiveDsl.g:23678:3: ( 'true' )
+            // InternalPerspectiveDsl.g:23679:2: ( ( 'true' ) )
+            // InternalPerspectiveDsl.g:23680:3: ( 'true' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0()); 
             }
-            // InternalPerspectiveDsl.g:23679:3: ( 'true' )
-            // InternalPerspectiveDsl.g:23680:4: 'true'
+            // InternalPerspectiveDsl.g:23681:3: ( 'true' )
+            // InternalPerspectiveDsl.g:23682:4: 'true'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0()); 
@@ -76771,17 +76771,17 @@
 
 
     // $ANTLR start "rule__XNumberLiteral__ValueAssignment_1"
-    // InternalPerspectiveDsl.g:23691:1: rule__XNumberLiteral__ValueAssignment_1 : ( ruleNumber ) ;
+    // InternalPerspectiveDsl.g:23693:1: rule__XNumberLiteral__ValueAssignment_1 : ( ruleNumber ) ;
     public final void rule__XNumberLiteral__ValueAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23695:1: ( ( ruleNumber ) )
-            // InternalPerspectiveDsl.g:23696:2: ( ruleNumber )
+            // InternalPerspectiveDsl.g:23697:1: ( ( ruleNumber ) )
+            // InternalPerspectiveDsl.g:23698:2: ( ruleNumber )
             {
-            // InternalPerspectiveDsl.g:23696:2: ( ruleNumber )
-            // InternalPerspectiveDsl.g:23697:3: ruleNumber
+            // InternalPerspectiveDsl.g:23698:2: ( ruleNumber )
+            // InternalPerspectiveDsl.g:23699:3: ruleNumber
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXNumberLiteralAccess().getValueNumberParserRuleCall_1_0()); 
@@ -76816,17 +76816,17 @@
 
 
     // $ANTLR start "rule__XStringLiteral__ValueAssignment_1"
-    // InternalPerspectiveDsl.g:23706:1: rule__XStringLiteral__ValueAssignment_1 : ( RULE_STRING ) ;
+    // InternalPerspectiveDsl.g:23708:1: rule__XStringLiteral__ValueAssignment_1 : ( RULE_STRING ) ;
     public final void rule__XStringLiteral__ValueAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23710:1: ( ( RULE_STRING ) )
-            // InternalPerspectiveDsl.g:23711:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:23712:1: ( ( RULE_STRING ) )
+            // InternalPerspectiveDsl.g:23713:2: ( RULE_STRING )
             {
-            // InternalPerspectiveDsl.g:23711:2: ( RULE_STRING )
-            // InternalPerspectiveDsl.g:23712:3: RULE_STRING
+            // InternalPerspectiveDsl.g:23713:2: ( RULE_STRING )
+            // InternalPerspectiveDsl.g:23714:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXStringLiteralAccess().getValueSTRINGTerminalRuleCall_1_0()); 
@@ -76857,23 +76857,23 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__TypeAssignment_3"
-    // InternalPerspectiveDsl.g:23721:1: rule__XTypeLiteral__TypeAssignment_3 : ( ( ruleQualifiedName ) ) ;
+    // InternalPerspectiveDsl.g:23723:1: rule__XTypeLiteral__TypeAssignment_3 : ( ( ruleQualifiedName ) ) ;
     public final void rule__XTypeLiteral__TypeAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23725:1: ( ( ( ruleQualifiedName ) ) )
-            // InternalPerspectiveDsl.g:23726:2: ( ( ruleQualifiedName ) )
+            // InternalPerspectiveDsl.g:23727:1: ( ( ( ruleQualifiedName ) ) )
+            // InternalPerspectiveDsl.g:23728:2: ( ( ruleQualifiedName ) )
             {
-            // InternalPerspectiveDsl.g:23726:2: ( ( ruleQualifiedName ) )
-            // InternalPerspectiveDsl.g:23727:3: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:23728:2: ( ( ruleQualifiedName ) )
+            // InternalPerspectiveDsl.g:23729:3: ( ruleQualifiedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeCrossReference_3_0()); 
             }
-            // InternalPerspectiveDsl.g:23728:3: ( ruleQualifiedName )
-            // InternalPerspectiveDsl.g:23729:4: ruleQualifiedName
+            // InternalPerspectiveDsl.g:23730:3: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:23731:4: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeQualifiedNameParserRuleCall_3_0_1()); 
@@ -76914,17 +76914,17 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__ArrayDimensionsAssignment_4"
-    // InternalPerspectiveDsl.g:23740:1: rule__XTypeLiteral__ArrayDimensionsAssignment_4 : ( ruleArrayBrackets ) ;
+    // InternalPerspectiveDsl.g:23742:1: rule__XTypeLiteral__ArrayDimensionsAssignment_4 : ( ruleArrayBrackets ) ;
     public final void rule__XTypeLiteral__ArrayDimensionsAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23744:1: ( ( ruleArrayBrackets ) )
-            // InternalPerspectiveDsl.g:23745:2: ( ruleArrayBrackets )
+            // InternalPerspectiveDsl.g:23746:1: ( ( ruleArrayBrackets ) )
+            // InternalPerspectiveDsl.g:23747:2: ( ruleArrayBrackets )
             {
-            // InternalPerspectiveDsl.g:23745:2: ( ruleArrayBrackets )
-            // InternalPerspectiveDsl.g:23746:3: ruleArrayBrackets
+            // InternalPerspectiveDsl.g:23747:2: ( ruleArrayBrackets )
+            // InternalPerspectiveDsl.g:23748:3: ruleArrayBrackets
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0()); 
@@ -76959,17 +76959,17 @@
 
 
     // $ANTLR start "rule__XThrowExpression__ExpressionAssignment_2"
-    // InternalPerspectiveDsl.g:23755:1: rule__XThrowExpression__ExpressionAssignment_2 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23757:1: rule__XThrowExpression__ExpressionAssignment_2 : ( ruleXExpression ) ;
     public final void rule__XThrowExpression__ExpressionAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23759:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23760:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23761:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23762:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23760:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23761:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23762:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23763:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXThrowExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); 
@@ -77004,17 +77004,17 @@
 
 
     // $ANTLR start "rule__XReturnExpression__ExpressionAssignment_2"
-    // InternalPerspectiveDsl.g:23770:1: rule__XReturnExpression__ExpressionAssignment_2 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23772:1: rule__XReturnExpression__ExpressionAssignment_2 : ( ruleXExpression ) ;
     public final void rule__XReturnExpression__ExpressionAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23774:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23775:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23776:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23777:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23775:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23776:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23777:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23778:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXReturnExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); 
@@ -77049,17 +77049,17 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__ExpressionAssignment_2"
-    // InternalPerspectiveDsl.g:23785:1: rule__XTryCatchFinallyExpression__ExpressionAssignment_2 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23787:1: rule__XTryCatchFinallyExpression__ExpressionAssignment_2 : ( ruleXExpression ) ;
     public final void rule__XTryCatchFinallyExpression__ExpressionAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23789:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23790:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23791:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23792:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23790:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23791:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23792:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23793:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); 
@@ -77094,17 +77094,17 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0"
-    // InternalPerspectiveDsl.g:23800:1: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 : ( ruleXCatchClause ) ;
+    // InternalPerspectiveDsl.g:23802:1: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 : ( ruleXCatchClause ) ;
     public final void rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23804:1: ( ( ruleXCatchClause ) )
-            // InternalPerspectiveDsl.g:23805:2: ( ruleXCatchClause )
+            // InternalPerspectiveDsl.g:23806:1: ( ( ruleXCatchClause ) )
+            // InternalPerspectiveDsl.g:23807:2: ( ruleXCatchClause )
             {
-            // InternalPerspectiveDsl.g:23805:2: ( ruleXCatchClause )
-            // InternalPerspectiveDsl.g:23806:3: ruleXCatchClause
+            // InternalPerspectiveDsl.g:23807:2: ( ruleXCatchClause )
+            // InternalPerspectiveDsl.g:23808:3: ruleXCatchClause
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0()); 
@@ -77139,17 +77139,17 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1"
-    // InternalPerspectiveDsl.g:23815:1: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23817:1: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 : ( ruleXExpression ) ;
     public final void rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23819:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23820:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23821:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23822:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23820:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23821:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23822:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23823:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_0_1_1_0()); 
@@ -77184,17 +77184,17 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1"
-    // InternalPerspectiveDsl.g:23830:1: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23832:1: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 : ( ruleXExpression ) ;
     public final void rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23834:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23835:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23836:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23837:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23835:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23836:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23837:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23838:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_1_1_0()); 
@@ -77229,17 +77229,17 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__ParamAssignment_1"
-    // InternalPerspectiveDsl.g:23845:1: rule__XSynchronizedExpression__ParamAssignment_1 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23847:1: rule__XSynchronizedExpression__ParamAssignment_1 : ( ruleXExpression ) ;
     public final void rule__XSynchronizedExpression__ParamAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23849:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23850:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23851:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23852:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23850:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23851:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23852:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23853:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0()); 
@@ -77274,17 +77274,17 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__ExpressionAssignment_3"
-    // InternalPerspectiveDsl.g:23860:1: rule__XSynchronizedExpression__ExpressionAssignment_3 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23862:1: rule__XSynchronizedExpression__ExpressionAssignment_3 : ( ruleXExpression ) ;
     public final void rule__XSynchronizedExpression__ExpressionAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23864:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23865:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23866:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23867:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23865:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23866:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23867:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23868:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getExpressionXExpressionParserRuleCall_3_0()); 
@@ -77319,17 +77319,17 @@
 
 
     // $ANTLR start "rule__XCatchClause__DeclaredParamAssignment_2"
-    // InternalPerspectiveDsl.g:23875:1: rule__XCatchClause__DeclaredParamAssignment_2 : ( ruleFullJvmFormalParameter ) ;
+    // InternalPerspectiveDsl.g:23877:1: rule__XCatchClause__DeclaredParamAssignment_2 : ( ruleFullJvmFormalParameter ) ;
     public final void rule__XCatchClause__DeclaredParamAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23879:1: ( ( ruleFullJvmFormalParameter ) )
-            // InternalPerspectiveDsl.g:23880:2: ( ruleFullJvmFormalParameter )
+            // InternalPerspectiveDsl.g:23881:1: ( ( ruleFullJvmFormalParameter ) )
+            // InternalPerspectiveDsl.g:23882:2: ( ruleFullJvmFormalParameter )
             {
-            // InternalPerspectiveDsl.g:23880:2: ( ruleFullJvmFormalParameter )
-            // InternalPerspectiveDsl.g:23881:3: ruleFullJvmFormalParameter
+            // InternalPerspectiveDsl.g:23882:2: ( ruleFullJvmFormalParameter )
+            // InternalPerspectiveDsl.g:23883:3: ruleFullJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCatchClauseAccess().getDeclaredParamFullJvmFormalParameterParserRuleCall_2_0()); 
@@ -77364,17 +77364,17 @@
 
 
     // $ANTLR start "rule__XCatchClause__ExpressionAssignment_4"
-    // InternalPerspectiveDsl.g:23890:1: rule__XCatchClause__ExpressionAssignment_4 : ( ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:23892:1: rule__XCatchClause__ExpressionAssignment_4 : ( ruleXExpression ) ;
     public final void rule__XCatchClause__ExpressionAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23894:1: ( ( ruleXExpression ) )
-            // InternalPerspectiveDsl.g:23895:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23896:1: ( ( ruleXExpression ) )
+            // InternalPerspectiveDsl.g:23897:2: ( ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:23895:2: ( ruleXExpression )
-            // InternalPerspectiveDsl.g:23896:3: ruleXExpression
+            // InternalPerspectiveDsl.g:23897:2: ( ruleXExpression )
+            // InternalPerspectiveDsl.g:23898:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCatchClauseAccess().getExpressionXExpressionParserRuleCall_4_0()); 
@@ -77409,17 +77409,17 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0"
-    // InternalPerspectiveDsl.g:23905:1: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 : ( ruleJvmTypeReference ) ;
+    // InternalPerspectiveDsl.g:23907:1: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 : ( ruleJvmTypeReference ) ;
     public final void rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23909:1: ( ( ruleJvmTypeReference ) )
-            // InternalPerspectiveDsl.g:23910:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:23911:1: ( ( ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:23912:2: ( ruleJvmTypeReference )
             {
-            // InternalPerspectiveDsl.g:23910:2: ( ruleJvmTypeReference )
-            // InternalPerspectiveDsl.g:23911:3: ruleJvmTypeReference
+            // InternalPerspectiveDsl.g:23912:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:23913:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0()); 
@@ -77454,17 +77454,17 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1"
-    // InternalPerspectiveDsl.g:23920:1: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 : ( ruleJvmTypeReference ) ;
+    // InternalPerspectiveDsl.g:23922:1: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 : ( ruleJvmTypeReference ) ;
     public final void rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23924:1: ( ( ruleJvmTypeReference ) )
-            // InternalPerspectiveDsl.g:23925:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:23926:1: ( ( ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:23927:2: ( ruleJvmTypeReference )
             {
-            // InternalPerspectiveDsl.g:23925:2: ( ruleJvmTypeReference )
-            // InternalPerspectiveDsl.g:23926:3: ruleJvmTypeReference
+            // InternalPerspectiveDsl.g:23927:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:23928:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0()); 
@@ -77499,17 +77499,17 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__ReturnTypeAssignment_2"
-    // InternalPerspectiveDsl.g:23935:1: rule__XFunctionTypeRef__ReturnTypeAssignment_2 : ( ruleJvmTypeReference ) ;
+    // InternalPerspectiveDsl.g:23937:1: rule__XFunctionTypeRef__ReturnTypeAssignment_2 : ( ruleJvmTypeReference ) ;
     public final void rule__XFunctionTypeRef__ReturnTypeAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23939:1: ( ( ruleJvmTypeReference ) )
-            // InternalPerspectiveDsl.g:23940:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:23941:1: ( ( ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:23942:2: ( ruleJvmTypeReference )
             {
-            // InternalPerspectiveDsl.g:23940:2: ( ruleJvmTypeReference )
-            // InternalPerspectiveDsl.g:23941:3: ruleJvmTypeReference
+            // InternalPerspectiveDsl.g:23942:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:23943:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0()); 
@@ -77544,23 +77544,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__TypeAssignment_0"
-    // InternalPerspectiveDsl.g:23950:1: rule__JvmParameterizedTypeReference__TypeAssignment_0 : ( ( ruleQualifiedName ) ) ;
+    // InternalPerspectiveDsl.g:23952:1: rule__JvmParameterizedTypeReference__TypeAssignment_0 : ( ( ruleQualifiedName ) ) ;
     public final void rule__JvmParameterizedTypeReference__TypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23954:1: ( ( ( ruleQualifiedName ) ) )
-            // InternalPerspectiveDsl.g:23955:2: ( ( ruleQualifiedName ) )
+            // InternalPerspectiveDsl.g:23956:1: ( ( ( ruleQualifiedName ) ) )
+            // InternalPerspectiveDsl.g:23957:2: ( ( ruleQualifiedName ) )
             {
-            // InternalPerspectiveDsl.g:23955:2: ( ( ruleQualifiedName ) )
-            // InternalPerspectiveDsl.g:23956:3: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:23957:2: ( ( ruleQualifiedName ) )
+            // InternalPerspectiveDsl.g:23958:3: ( ruleQualifiedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0()); 
             }
-            // InternalPerspectiveDsl.g:23957:3: ( ruleQualifiedName )
-            // InternalPerspectiveDsl.g:23958:4: ruleQualifiedName
+            // InternalPerspectiveDsl.g:23959:3: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:23960:4: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeQualifiedNameParserRuleCall_0_0_1()); 
@@ -77601,17 +77601,17 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1"
-    // InternalPerspectiveDsl.g:23969:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalPerspectiveDsl.g:23971:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23973:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalPerspectiveDsl.g:23974:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:23975:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalPerspectiveDsl.g:23976:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalPerspectiveDsl.g:23974:2: ( ruleJvmArgumentTypeReference )
-            // InternalPerspectiveDsl.g:23975:3: ruleJvmArgumentTypeReference
+            // InternalPerspectiveDsl.g:23976:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:23977:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); 
@@ -77646,17 +77646,17 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1"
-    // InternalPerspectiveDsl.g:23984:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalPerspectiveDsl.g:23986:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:23988:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalPerspectiveDsl.g:23989:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:23990:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalPerspectiveDsl.g:23991:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalPerspectiveDsl.g:23989:2: ( ruleJvmArgumentTypeReference )
-            // InternalPerspectiveDsl.g:23990:3: ruleJvmArgumentTypeReference
+            // InternalPerspectiveDsl.g:23991:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:23992:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0()); 
@@ -77691,23 +77691,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1"
-    // InternalPerspectiveDsl.g:23999:1: rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 : ( ( ruleValidID ) ) ;
+    // InternalPerspectiveDsl.g:24001:1: rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 : ( ( ruleValidID ) ) ;
     public final void rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:24003:1: ( ( ( ruleValidID ) ) )
-            // InternalPerspectiveDsl.g:24004:2: ( ( ruleValidID ) )
+            // InternalPerspectiveDsl.g:24005:1: ( ( ( ruleValidID ) ) )
+            // InternalPerspectiveDsl.g:24006:2: ( ( ruleValidID ) )
             {
-            // InternalPerspectiveDsl.g:24004:2: ( ( ruleValidID ) )
-            // InternalPerspectiveDsl.g:24005:3: ( ruleValidID )
+            // InternalPerspectiveDsl.g:24006:2: ( ( ruleValidID ) )
+            // InternalPerspectiveDsl.g:24007:3: ( ruleValidID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0()); 
             }
-            // InternalPerspectiveDsl.g:24006:3: ( ruleValidID )
-            // InternalPerspectiveDsl.g:24007:4: ruleValidID
+            // InternalPerspectiveDsl.g:24008:3: ( ruleValidID )
+            // InternalPerspectiveDsl.g:24009:4: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeValidIDParserRuleCall_1_4_1_0_1()); 
@@ -77748,17 +77748,17 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1"
-    // InternalPerspectiveDsl.g:24018:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalPerspectiveDsl.g:24020:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:24022:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalPerspectiveDsl.g:24023:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:24024:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalPerspectiveDsl.g:24025:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalPerspectiveDsl.g:24023:2: ( ruleJvmArgumentTypeReference )
-            // InternalPerspectiveDsl.g:24024:3: ruleJvmArgumentTypeReference
+            // InternalPerspectiveDsl.g:24025:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:24026:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0()); 
@@ -77793,17 +77793,17 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1"
-    // InternalPerspectiveDsl.g:24033:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalPerspectiveDsl.g:24035:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:24037:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalPerspectiveDsl.g:24038:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:24039:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalPerspectiveDsl.g:24040:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalPerspectiveDsl.g:24038:2: ( ruleJvmArgumentTypeReference )
-            // InternalPerspectiveDsl.g:24039:3: ruleJvmArgumentTypeReference
+            // InternalPerspectiveDsl.g:24040:2: ( ruleJvmArgumentTypeReference )
+            // InternalPerspectiveDsl.g:24041:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0()); 
@@ -77838,17 +77838,17 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0"
-    // InternalPerspectiveDsl.g:24048:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 : ( ruleJvmUpperBound ) ;
+    // InternalPerspectiveDsl.g:24050:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 : ( ruleJvmUpperBound ) ;
     public final void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:24052:1: ( ( ruleJvmUpperBound ) )
-            // InternalPerspectiveDsl.g:24053:2: ( ruleJvmUpperBound )
+            // InternalPerspectiveDsl.g:24054:1: ( ( ruleJvmUpperBound ) )
+            // InternalPerspectiveDsl.g:24055:2: ( ruleJvmUpperBound )
             {
-            // InternalPerspectiveDsl.g:24053:2: ( ruleJvmUpperBound )
-            // InternalPerspectiveDsl.g:24054:3: ruleJvmUpperBound
+            // InternalPerspectiveDsl.g:24055:2: ( ruleJvmUpperBound )
+            // InternalPerspectiveDsl.g:24056:3: ruleJvmUpperBound
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0()); 
@@ -77883,17 +77883,17 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1"
-    // InternalPerspectiveDsl.g:24063:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 : ( ruleJvmUpperBoundAnded ) ;
+    // InternalPerspectiveDsl.g:24065:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 : ( ruleJvmUpperBoundAnded ) ;
     public final void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:24067:1: ( ( ruleJvmUpperBoundAnded ) )
-            // InternalPerspectiveDsl.g:24068:2: ( ruleJvmUpperBoundAnded )
+            // InternalPerspectiveDsl.g:24069:1: ( ( ruleJvmUpperBoundAnded ) )
+            // InternalPerspectiveDsl.g:24070:2: ( ruleJvmUpperBoundAnded )
             {
-            // InternalPerspectiveDsl.g:24068:2: ( ruleJvmUpperBoundAnded )
-            // InternalPerspectiveDsl.g:24069:3: ruleJvmUpperBoundAnded
+            // InternalPerspectiveDsl.g:24070:2: ( ruleJvmUpperBoundAnded )
+            // InternalPerspectiveDsl.g:24071:3: ruleJvmUpperBoundAnded
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0()); 
@@ -77928,17 +77928,17 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0"
-    // InternalPerspectiveDsl.g:24078:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 : ( ruleJvmLowerBound ) ;
+    // InternalPerspectiveDsl.g:24080:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 : ( ruleJvmLowerBound ) ;
     public final void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:24082:1: ( ( ruleJvmLowerBound ) )
-            // InternalPerspectiveDsl.g:24083:2: ( ruleJvmLowerBound )
+            // InternalPerspectiveDsl.g:24084:1: ( ( ruleJvmLowerBound ) )
+            // InternalPerspectiveDsl.g:24085:2: ( ruleJvmLowerBound )
             {
-            // InternalPerspectiveDsl.g:24083:2: ( ruleJvmLowerBound )
-            // InternalPerspectiveDsl.g:24084:3: ruleJvmLowerBound
+            // InternalPerspectiveDsl.g:24085:2: ( ruleJvmLowerBound )
+            // InternalPerspectiveDsl.g:24086:3: ruleJvmLowerBound
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0()); 
@@ -77973,17 +77973,17 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1"
-    // InternalPerspectiveDsl.g:24093:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 : ( ruleJvmLowerBoundAnded ) ;
+    // InternalPerspectiveDsl.g:24095:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 : ( ruleJvmLowerBoundAnded ) ;
     public final void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:24097:1: ( ( ruleJvmLowerBoundAnded ) )
-            // InternalPerspectiveDsl.g:24098:2: ( ruleJvmLowerBoundAnded )
+            // InternalPerspectiveDsl.g:24099:1: ( ( ruleJvmLowerBoundAnded ) )
+            // InternalPerspectiveDsl.g:24100:2: ( ruleJvmLowerBoundAnded )
             {
-            // InternalPerspectiveDsl.g:24098:2: ( ruleJvmLowerBoundAnded )
-            // InternalPerspectiveDsl.g:24099:3: ruleJvmLowerBoundAnded
+            // InternalPerspectiveDsl.g:24100:2: ( ruleJvmLowerBoundAnded )
+            // InternalPerspectiveDsl.g:24101:3: ruleJvmLowerBoundAnded
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0()); 
@@ -78018,17 +78018,17 @@
 
 
     // $ANTLR start "rule__JvmUpperBound__TypeReferenceAssignment_1"
-    // InternalPerspectiveDsl.g:24108:1: rule__JvmUpperBound__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
+    // InternalPerspectiveDsl.g:24110:1: rule__JvmUpperBound__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
     public final void rule__JvmUpperBound__TypeReferenceAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:24112:1: ( ( ruleJvmTypeReference ) )
-            // InternalPerspectiveDsl.g:24113:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:24114:1: ( ( ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:24115:2: ( ruleJvmTypeReference )
             {
-            // InternalPerspectiveDsl.g:24113:2: ( ruleJvmTypeReference )
-            // InternalPerspectiveDsl.g:24114:3: ruleJvmTypeReference
+            // InternalPerspectiveDsl.g:24115:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:24116:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
@@ -78063,17 +78063,17 @@
 
 
     // $ANTLR start "rule__JvmUpperBoundAnded__TypeReferenceAssignment_1"
-    // InternalPerspectiveDsl.g:24123:1: rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
+    // InternalPerspectiveDsl.g:24125:1: rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
     public final void rule__JvmUpperBoundAnded__TypeReferenceAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:24127:1: ( ( ruleJvmTypeReference ) )
-            // InternalPerspectiveDsl.g:24128:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:24129:1: ( ( ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:24130:2: ( ruleJvmTypeReference )
             {
-            // InternalPerspectiveDsl.g:24128:2: ( ruleJvmTypeReference )
-            // InternalPerspectiveDsl.g:24129:3: ruleJvmTypeReference
+            // InternalPerspectiveDsl.g:24130:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:24131:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
@@ -78108,17 +78108,17 @@
 
 
     // $ANTLR start "rule__JvmLowerBound__TypeReferenceAssignment_1"
-    // InternalPerspectiveDsl.g:24138:1: rule__JvmLowerBound__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
+    // InternalPerspectiveDsl.g:24140:1: rule__JvmLowerBound__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
     public final void rule__JvmLowerBound__TypeReferenceAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:24142:1: ( ( ruleJvmTypeReference ) )
-            // InternalPerspectiveDsl.g:24143:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:24144:1: ( ( ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:24145:2: ( ruleJvmTypeReference )
             {
-            // InternalPerspectiveDsl.g:24143:2: ( ruleJvmTypeReference )
-            // InternalPerspectiveDsl.g:24144:3: ruleJvmTypeReference
+            // InternalPerspectiveDsl.g:24145:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:24146:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
@@ -78153,17 +78153,17 @@
 
 
     // $ANTLR start "rule__JvmLowerBoundAnded__TypeReferenceAssignment_1"
-    // InternalPerspectiveDsl.g:24153:1: rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
+    // InternalPerspectiveDsl.g:24155:1: rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
     public final void rule__JvmLowerBoundAnded__TypeReferenceAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:24157:1: ( ( ruleJvmTypeReference ) )
-            // InternalPerspectiveDsl.g:24158:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:24159:1: ( ( ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:24160:2: ( ruleJvmTypeReference )
             {
-            // InternalPerspectiveDsl.g:24158:2: ( ruleJvmTypeReference )
-            // InternalPerspectiveDsl.g:24159:3: ruleJvmTypeReference
+            // InternalPerspectiveDsl.g:24160:2: ( ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:24161:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
@@ -78198,17 +78198,17 @@
 
 
     // $ANTLR start "rule__XImportSection__ImportDeclarationsAssignment"
-    // InternalPerspectiveDsl.g:24168:1: rule__XImportSection__ImportDeclarationsAssignment : ( ruleXImportDeclaration ) ;
+    // InternalPerspectiveDsl.g:24170:1: rule__XImportSection__ImportDeclarationsAssignment : ( ruleXImportDeclaration ) ;
     public final void rule__XImportSection__ImportDeclarationsAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalPerspectiveDsl.g:24172:1: ( ( ruleXImportDeclaration ) )
-            // InternalPerspectiveDsl.g:24173:2: ( ruleXImportDeclaration )
+            // InternalPerspectiveDsl.g:24174:1: ( ( ruleXImportDeclaration ) )
+            // InternalPerspectiveDsl.g:24175:2: ( ruleXImportDeclaration )
             {
-            // InternalPerspectiveDsl.g:24173:2: ( ruleXImportDeclaration )
-            // InternalPerspectiveDsl.g:24174:3: ruleXImportDeclaration
+            // InternalPerspectiveDsl.g:24175:2: ( ruleXImportDeclaration )
+            // InternalPerspectiveDsl.g:24176:3: ruleXImportDeclaration
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportSectionAccess().getImportDeclarationsXImportDeclarationParserRuleCall_0()); 
@@ -78243,17 +78243,17 @@
 
     // $ANTLR start synpred23_InternalPerspectiveDsl
     public final void synpred23_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:2939:2: ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) )
-        // InternalPerspectiveDsl.g:2939:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
+        // InternalPerspectiveDsl.g:2941:2: ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) )
+        // InternalPerspectiveDsl.g:2941:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
         {
-        // InternalPerspectiveDsl.g:2939:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
-        // InternalPerspectiveDsl.g:2940:3: ( rule__XAnnotation__Group_3_1_0__0 )
+        // InternalPerspectiveDsl.g:2941:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
+        // InternalPerspectiveDsl.g:2942:3: ( rule__XAnnotation__Group_3_1_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); 
         }
-        // InternalPerspectiveDsl.g:2941:3: ( rule__XAnnotation__Group_3_1_0__0 )
-        // InternalPerspectiveDsl.g:2941:4: rule__XAnnotation__Group_3_1_0__0
+        // InternalPerspectiveDsl.g:2943:3: ( rule__XAnnotation__Group_3_1_0__0 )
+        // InternalPerspectiveDsl.g:2943:4: rule__XAnnotation__Group_3_1_0__0
         {
         pushFollow(FOLLOW_2);
         rule__XAnnotation__Group_3_1_0__0();
@@ -78273,17 +78273,17 @@
 
     // $ANTLR start synpred24_InternalPerspectiveDsl
     public final void synpred24_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:2960:2: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) )
-        // InternalPerspectiveDsl.g:2960:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
+        // InternalPerspectiveDsl.g:2962:2: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) )
+        // InternalPerspectiveDsl.g:2962:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
         {
-        // InternalPerspectiveDsl.g:2960:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
-        // InternalPerspectiveDsl.g:2961:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
+        // InternalPerspectiveDsl.g:2962:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
+        // InternalPerspectiveDsl.g:2963:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); 
         }
-        // InternalPerspectiveDsl.g:2962:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
-        // InternalPerspectiveDsl.g:2962:4: rule__XAnnotationElementValueOrCommaList__Group_0__0
+        // InternalPerspectiveDsl.g:2964:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
+        // InternalPerspectiveDsl.g:2964:4: rule__XAnnotationElementValueOrCommaList__Group_0__0
         {
         pushFollow(FOLLOW_2);
         rule__XAnnotationElementValueOrCommaList__Group_0__0();
@@ -78303,17 +78303,17 @@
 
     // $ANTLR start synpred25_InternalPerspectiveDsl
     public final void synpred25_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:2981:2: ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) )
-        // InternalPerspectiveDsl.g:2981:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
+        // InternalPerspectiveDsl.g:2983:2: ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) )
+        // InternalPerspectiveDsl.g:2983:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
         {
-        // InternalPerspectiveDsl.g:2981:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
-        // InternalPerspectiveDsl.g:2982:3: ( rule__XAnnotationElementValue__Group_0__0 )
+        // InternalPerspectiveDsl.g:2983:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
+        // InternalPerspectiveDsl.g:2984:3: ( rule__XAnnotationElementValue__Group_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); 
         }
-        // InternalPerspectiveDsl.g:2983:3: ( rule__XAnnotationElementValue__Group_0__0 )
-        // InternalPerspectiveDsl.g:2983:4: rule__XAnnotationElementValue__Group_0__0
+        // InternalPerspectiveDsl.g:2985:3: ( rule__XAnnotationElementValue__Group_0__0 )
+        // InternalPerspectiveDsl.g:2985:4: rule__XAnnotationElementValue__Group_0__0
         {
         pushFollow(FOLLOW_2);
         rule__XAnnotationElementValue__Group_0__0();
@@ -78333,17 +78333,17 @@
 
     // $ANTLR start synpred50_InternalPerspectiveDsl
     public final void synpred50_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:3266:2: ( ( ( rule__OpOther__Group_6_1_0__0 ) ) )
-        // InternalPerspectiveDsl.g:3266:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
+        // InternalPerspectiveDsl.g:3268:2: ( ( ( rule__OpOther__Group_6_1_0__0 ) ) )
+        // InternalPerspectiveDsl.g:3268:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
         {
-        // InternalPerspectiveDsl.g:3266:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
-        // InternalPerspectiveDsl.g:3267:3: ( rule__OpOther__Group_6_1_0__0 )
+        // InternalPerspectiveDsl.g:3268:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
+        // InternalPerspectiveDsl.g:3269:3: ( rule__OpOther__Group_6_1_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); 
         }
-        // InternalPerspectiveDsl.g:3268:3: ( rule__OpOther__Group_6_1_0__0 )
-        // InternalPerspectiveDsl.g:3268:4: rule__OpOther__Group_6_1_0__0
+        // InternalPerspectiveDsl.g:3270:3: ( rule__OpOther__Group_6_1_0__0 )
+        // InternalPerspectiveDsl.g:3270:4: rule__OpOther__Group_6_1_0__0
         {
         pushFollow(FOLLOW_2);
         rule__OpOther__Group_6_1_0__0();
@@ -78363,11 +78363,11 @@
 
     // $ANTLR start synpred51_InternalPerspectiveDsl
     public final void synpred51_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:3272:2: ( ( '<' ) )
-        // InternalPerspectiveDsl.g:3272:2: ( '<' )
+        // InternalPerspectiveDsl.g:3274:2: ( ( '<' ) )
+        // InternalPerspectiveDsl.g:3274:2: ( '<' )
         {
-        // InternalPerspectiveDsl.g:3272:2: ( '<' )
-        // InternalPerspectiveDsl.g:3273:3: '<'
+        // InternalPerspectiveDsl.g:3274:2: ( '<' )
+        // InternalPerspectiveDsl.g:3275:3: '<'
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); 
@@ -78383,17 +78383,17 @@
 
     // $ANTLR start synpred64_InternalPerspectiveDsl
     public final void synpred64_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:3485:2: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) )
-        // InternalPerspectiveDsl.g:3485:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
+        // InternalPerspectiveDsl.g:3487:2: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) )
+        // InternalPerspectiveDsl.g:3487:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
         {
-        // InternalPerspectiveDsl.g:3485:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
-        // InternalPerspectiveDsl.g:3486:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
+        // InternalPerspectiveDsl.g:3487:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
+        // InternalPerspectiveDsl.g:3488:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0()); 
         }
-        // InternalPerspectiveDsl.g:3487:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
-        // InternalPerspectiveDsl.g:3487:4: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0
+        // InternalPerspectiveDsl.g:3489:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
+        // InternalPerspectiveDsl.g:3489:4: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0
         {
         pushFollow(FOLLOW_2);
         rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0();
@@ -78413,17 +78413,17 @@
 
     // $ANTLR start synpred72_InternalPerspectiveDsl
     public final void synpred72_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:3548:2: ( ( ( ruleXForLoopExpression ) ) )
-        // InternalPerspectiveDsl.g:3548:2: ( ( ruleXForLoopExpression ) )
+        // InternalPerspectiveDsl.g:3550:2: ( ( ( ruleXForLoopExpression ) ) )
+        // InternalPerspectiveDsl.g:3550:2: ( ( ruleXForLoopExpression ) )
         {
-        // InternalPerspectiveDsl.g:3548:2: ( ( ruleXForLoopExpression ) )
-        // InternalPerspectiveDsl.g:3549:3: ( ruleXForLoopExpression )
+        // InternalPerspectiveDsl.g:3550:2: ( ( ruleXForLoopExpression ) )
+        // InternalPerspectiveDsl.g:3551:3: ( ruleXForLoopExpression )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); 
         }
-        // InternalPerspectiveDsl.g:3550:3: ( ruleXForLoopExpression )
-        // InternalPerspectiveDsl.g:3550:4: ruleXForLoopExpression
+        // InternalPerspectiveDsl.g:3552:3: ( ruleXForLoopExpression )
+        // InternalPerspectiveDsl.g:3552:4: ruleXForLoopExpression
         {
         pushFollow(FOLLOW_2);
         ruleXForLoopExpression();
@@ -78443,11 +78443,11 @@
 
     // $ANTLR start synpred73_InternalPerspectiveDsl
     public final void synpred73_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:3554:2: ( ( ruleXBasicForLoopExpression ) )
-        // InternalPerspectiveDsl.g:3554:2: ( ruleXBasicForLoopExpression )
+        // InternalPerspectiveDsl.g:3556:2: ( ( ruleXBasicForLoopExpression ) )
+        // InternalPerspectiveDsl.g:3556:2: ( ruleXBasicForLoopExpression )
         {
-        // InternalPerspectiveDsl.g:3554:2: ( ruleXBasicForLoopExpression )
-        // InternalPerspectiveDsl.g:3555:3: ruleXBasicForLoopExpression
+        // InternalPerspectiveDsl.g:3556:2: ( ruleXBasicForLoopExpression )
+        // InternalPerspectiveDsl.g:3557:3: ruleXBasicForLoopExpression
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); 
@@ -78467,17 +78467,17 @@
 
     // $ANTLR start synpred86_InternalPerspectiveDsl
     public final void synpred86_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:3677:2: ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) )
-        // InternalPerspectiveDsl.g:3677:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
+        // InternalPerspectiveDsl.g:3679:2: ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) )
+        // InternalPerspectiveDsl.g:3679:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
         {
-        // InternalPerspectiveDsl.g:3677:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
-        // InternalPerspectiveDsl.g:3678:3: ( rule__XSwitchExpression__Group_2_0__0 )
+        // InternalPerspectiveDsl.g:3679:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
+        // InternalPerspectiveDsl.g:3680:3: ( rule__XSwitchExpression__Group_2_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0()); 
         }
-        // InternalPerspectiveDsl.g:3679:3: ( rule__XSwitchExpression__Group_2_0__0 )
-        // InternalPerspectiveDsl.g:3679:4: rule__XSwitchExpression__Group_2_0__0
+        // InternalPerspectiveDsl.g:3681:3: ( rule__XSwitchExpression__Group_2_0__0 )
+        // InternalPerspectiveDsl.g:3681:4: rule__XSwitchExpression__Group_2_0__0
         {
         pushFollow(FOLLOW_2);
         rule__XSwitchExpression__Group_2_0__0();
@@ -78497,17 +78497,17 @@
 
     // $ANTLR start synpred90_InternalPerspectiveDsl
     public final void synpred90_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:3761:2: ( ( ( rule__XVariableDeclaration__Group_2_0__0 ) ) )
-        // InternalPerspectiveDsl.g:3761:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
+        // InternalPerspectiveDsl.g:3763:2: ( ( ( rule__XVariableDeclaration__Group_2_0__0 ) ) )
+        // InternalPerspectiveDsl.g:3763:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
         {
-        // InternalPerspectiveDsl.g:3761:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
-        // InternalPerspectiveDsl.g:3762:3: ( rule__XVariableDeclaration__Group_2_0__0 )
+        // InternalPerspectiveDsl.g:3763:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
+        // InternalPerspectiveDsl.g:3764:3: ( rule__XVariableDeclaration__Group_2_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0()); 
         }
-        // InternalPerspectiveDsl.g:3763:3: ( rule__XVariableDeclaration__Group_2_0__0 )
-        // InternalPerspectiveDsl.g:3763:4: rule__XVariableDeclaration__Group_2_0__0
+        // InternalPerspectiveDsl.g:3765:3: ( rule__XVariableDeclaration__Group_2_0__0 )
+        // InternalPerspectiveDsl.g:3765:4: rule__XVariableDeclaration__Group_2_0__0
         {
         pushFollow(FOLLOW_2);
         rule__XVariableDeclaration__Group_2_0__0();
@@ -78527,17 +78527,17 @@
 
     // $ANTLR start synpred91_InternalPerspectiveDsl
     public final void synpred91_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:3782:2: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) )
-        // InternalPerspectiveDsl.g:3782:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
+        // InternalPerspectiveDsl.g:3784:2: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) )
+        // InternalPerspectiveDsl.g:3784:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
         {
-        // InternalPerspectiveDsl.g:3782:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
-        // InternalPerspectiveDsl.g:3783:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
+        // InternalPerspectiveDsl.g:3784:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
+        // InternalPerspectiveDsl.g:3785:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0()); 
         }
-        // InternalPerspectiveDsl.g:3784:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
-        // InternalPerspectiveDsl.g:3784:4: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0
+        // InternalPerspectiveDsl.g:3786:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
+        // InternalPerspectiveDsl.g:3786:4: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0
         {
         pushFollow(FOLLOW_2);
         rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0();
@@ -78557,17 +78557,17 @@
 
     // $ANTLR start synpred97_InternalPerspectiveDsl
     public final void synpred97_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:3863:2: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) )
-        // InternalPerspectiveDsl.g:3863:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
+        // InternalPerspectiveDsl.g:3865:2: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) )
+        // InternalPerspectiveDsl.g:3865:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
         {
-        // InternalPerspectiveDsl.g:3863:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
-        // InternalPerspectiveDsl.g:3864:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
+        // InternalPerspectiveDsl.g:3865:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
+        // InternalPerspectiveDsl.g:3866:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0()); 
         }
-        // InternalPerspectiveDsl.g:3865:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
-        // InternalPerspectiveDsl.g:3865:4: rule__XConstructorCall__ArgumentsAssignment_4_1_0
+        // InternalPerspectiveDsl.g:3867:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
+        // InternalPerspectiveDsl.g:3867:4: rule__XConstructorCall__ArgumentsAssignment_4_1_0
         {
         pushFollow(FOLLOW_2);
         rule__XConstructorCall__ArgumentsAssignment_4_1_0();
@@ -78587,8 +78587,8 @@
 
     // $ANTLR start synpred127_InternalPerspectiveDsl
     public final void synpred127_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:9034:3: ( rule__XAssignment__Group_1_1__0 )
-        // InternalPerspectiveDsl.g:9034:3: rule__XAssignment__Group_1_1__0
+        // InternalPerspectiveDsl.g:9036:3: ( rule__XAssignment__Group_1_1__0 )
+        // InternalPerspectiveDsl.g:9036:3: rule__XAssignment__Group_1_1__0
         {
         pushFollow(FOLLOW_2);
         rule__XAssignment__Group_1_1__0();
@@ -78602,8 +78602,8 @@
 
     // $ANTLR start synpred129_InternalPerspectiveDsl
     public final void synpred129_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:9385:3: ( rule__XOrExpression__Group_1__0 )
-        // InternalPerspectiveDsl.g:9385:3: rule__XOrExpression__Group_1__0
+        // InternalPerspectiveDsl.g:9387:3: ( rule__XOrExpression__Group_1__0 )
+        // InternalPerspectiveDsl.g:9387:3: rule__XOrExpression__Group_1__0
         {
         pushFollow(FOLLOW_2);
         rule__XOrExpression__Group_1__0();
@@ -78617,8 +78617,8 @@
 
     // $ANTLR start synpred130_InternalPerspectiveDsl
     public final void synpred130_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:9574:3: ( rule__XAndExpression__Group_1__0 )
-        // InternalPerspectiveDsl.g:9574:3: rule__XAndExpression__Group_1__0
+        // InternalPerspectiveDsl.g:9576:3: ( rule__XAndExpression__Group_1__0 )
+        // InternalPerspectiveDsl.g:9576:3: rule__XAndExpression__Group_1__0
         {
         pushFollow(FOLLOW_2);
         rule__XAndExpression__Group_1__0();
@@ -78632,8 +78632,8 @@
 
     // $ANTLR start synpred131_InternalPerspectiveDsl
     public final void synpred131_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:9763:3: ( rule__XEqualityExpression__Group_1__0 )
-        // InternalPerspectiveDsl.g:9763:3: rule__XEqualityExpression__Group_1__0
+        // InternalPerspectiveDsl.g:9765:3: ( rule__XEqualityExpression__Group_1__0 )
+        // InternalPerspectiveDsl.g:9765:3: rule__XEqualityExpression__Group_1__0
         {
         pushFollow(FOLLOW_2);
         rule__XEqualityExpression__Group_1__0();
@@ -78647,8 +78647,8 @@
 
     // $ANTLR start synpred132_InternalPerspectiveDsl
     public final void synpred132_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:9952:3: ( rule__XRelationalExpression__Alternatives_1 )
-        // InternalPerspectiveDsl.g:9952:3: rule__XRelationalExpression__Alternatives_1
+        // InternalPerspectiveDsl.g:9954:3: ( rule__XRelationalExpression__Alternatives_1 )
+        // InternalPerspectiveDsl.g:9954:3: rule__XRelationalExpression__Alternatives_1
         {
         pushFollow(FOLLOW_2);
         rule__XRelationalExpression__Alternatives_1();
@@ -78662,8 +78662,8 @@
 
     // $ANTLR start synpred133_InternalPerspectiveDsl
     public final void synpred133_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:10330:3: ( rule__XOtherOperatorExpression__Group_1__0 )
-        // InternalPerspectiveDsl.g:10330:3: rule__XOtherOperatorExpression__Group_1__0
+        // InternalPerspectiveDsl.g:10332:3: ( rule__XOtherOperatorExpression__Group_1__0 )
+        // InternalPerspectiveDsl.g:10332:3: rule__XOtherOperatorExpression__Group_1__0
         {
         pushFollow(FOLLOW_2);
         rule__XOtherOperatorExpression__Group_1__0();
@@ -78677,8 +78677,8 @@
 
     // $ANTLR start synpred134_InternalPerspectiveDsl
     public final void synpred134_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:10843:3: ( rule__XAdditiveExpression__Group_1__0 )
-        // InternalPerspectiveDsl.g:10843:3: rule__XAdditiveExpression__Group_1__0
+        // InternalPerspectiveDsl.g:10845:3: ( rule__XAdditiveExpression__Group_1__0 )
+        // InternalPerspectiveDsl.g:10845:3: rule__XAdditiveExpression__Group_1__0
         {
         pushFollow(FOLLOW_2);
         rule__XAdditiveExpression__Group_1__0();
@@ -78692,8 +78692,8 @@
 
     // $ANTLR start synpred135_InternalPerspectiveDsl
     public final void synpred135_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:11032:3: ( rule__XMultiplicativeExpression__Group_1__0 )
-        // InternalPerspectiveDsl.g:11032:3: rule__XMultiplicativeExpression__Group_1__0
+        // InternalPerspectiveDsl.g:11034:3: ( rule__XMultiplicativeExpression__Group_1__0 )
+        // InternalPerspectiveDsl.g:11034:3: rule__XMultiplicativeExpression__Group_1__0
         {
         pushFollow(FOLLOW_2);
         rule__XMultiplicativeExpression__Group_1__0();
@@ -78707,8 +78707,8 @@
 
     // $ANTLR start synpred136_InternalPerspectiveDsl
     public final void synpred136_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:11302:3: ( rule__XCastedExpression__Group_1__0 )
-        // InternalPerspectiveDsl.g:11302:3: rule__XCastedExpression__Group_1__0
+        // InternalPerspectiveDsl.g:11304:3: ( rule__XCastedExpression__Group_1__0 )
+        // InternalPerspectiveDsl.g:11304:3: rule__XCastedExpression__Group_1__0
         {
         pushFollow(FOLLOW_2);
         rule__XCastedExpression__Group_1__0();
@@ -78722,8 +78722,8 @@
 
     // $ANTLR start synpred137_InternalPerspectiveDsl
     public final void synpred137_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:11491:3: ( rule__XPostfixOperation__Group_1__0 )
-        // InternalPerspectiveDsl.g:11491:3: rule__XPostfixOperation__Group_1__0
+        // InternalPerspectiveDsl.g:11493:3: ( rule__XPostfixOperation__Group_1__0 )
+        // InternalPerspectiveDsl.g:11493:3: rule__XPostfixOperation__Group_1__0
         {
         pushFollow(FOLLOW_2);
         rule__XPostfixOperation__Group_1__0();
@@ -78737,8 +78737,8 @@
 
     // $ANTLR start synpred138_InternalPerspectiveDsl
     public final void synpred138_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:11626:3: ( rule__XMemberFeatureCall__Alternatives_1 )
-        // InternalPerspectiveDsl.g:11626:3: rule__XMemberFeatureCall__Alternatives_1
+        // InternalPerspectiveDsl.g:11628:3: ( rule__XMemberFeatureCall__Alternatives_1 )
+        // InternalPerspectiveDsl.g:11628:3: rule__XMemberFeatureCall__Alternatives_1
         {
         pushFollow(FOLLOW_2);
         rule__XMemberFeatureCall__Alternatives_1();
@@ -78752,8 +78752,8 @@
 
     // $ANTLR start synpred140_InternalPerspectiveDsl
     public final void synpred140_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:11924:3: ( rule__XMemberFeatureCall__Group_1_1_3__0 )
-        // InternalPerspectiveDsl.g:11924:3: rule__XMemberFeatureCall__Group_1_1_3__0
+        // InternalPerspectiveDsl.g:11926:3: ( rule__XMemberFeatureCall__Group_1_1_3__0 )
+        // InternalPerspectiveDsl.g:11926:3: rule__XMemberFeatureCall__Group_1_1_3__0
         {
         pushFollow(FOLLOW_2);
         rule__XMemberFeatureCall__Group_1_1_3__0();
@@ -78767,8 +78767,8 @@
 
     // $ANTLR start synpred141_InternalPerspectiveDsl
     public final void synpred141_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:11950:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )
-        // InternalPerspectiveDsl.g:11950:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4
+        // InternalPerspectiveDsl.g:11952:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )
+        // InternalPerspectiveDsl.g:11952:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4
         {
         pushFollow(FOLLOW_2);
         rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4();
@@ -78782,8 +78782,8 @@
 
     // $ANTLR start synpred149_InternalPerspectiveDsl
     public final void synpred149_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:12923:3: ( rule__XClosure__Group_1__0 )
-        // InternalPerspectiveDsl.g:12923:3: rule__XClosure__Group_1__0
+        // InternalPerspectiveDsl.g:12925:3: ( rule__XClosure__Group_1__0 )
+        // InternalPerspectiveDsl.g:12925:3: rule__XClosure__Group_1__0
         {
         pushFollow(FOLLOW_2);
         rule__XClosure__Group_1__0();
@@ -78797,8 +78797,8 @@
 
     // $ANTLR start synpred156_InternalPerspectiveDsl
     public final void synpred156_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:13894:3: ( rule__XIfExpression__Group_6__0 )
-        // InternalPerspectiveDsl.g:13894:3: rule__XIfExpression__Group_6__0
+        // InternalPerspectiveDsl.g:13896:3: ( rule__XIfExpression__Group_6__0 )
+        // InternalPerspectiveDsl.g:13896:3: rule__XIfExpression__Group_6__0
         {
         pushFollow(FOLLOW_2);
         rule__XIfExpression__Group_6__0();
@@ -78812,8 +78812,8 @@
 
     // $ANTLR start synpred159_InternalPerspectiveDsl
     public final void synpred159_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:14354:3: ( rule__XSwitchExpression__Group_2_1_0__0 )
-        // InternalPerspectiveDsl.g:14354:3: rule__XSwitchExpression__Group_2_1_0__0
+        // InternalPerspectiveDsl.g:14356:3: ( rule__XSwitchExpression__Group_2_1_0__0 )
+        // InternalPerspectiveDsl.g:14356:3: rule__XSwitchExpression__Group_2_1_0__0
         {
         pushFollow(FOLLOW_2);
         rule__XSwitchExpression__Group_2_1_0__0();
@@ -78827,8 +78827,8 @@
 
     // $ANTLR start synpred172_InternalPerspectiveDsl
     public final void synpred172_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:16487:3: ( rule__XFeatureCall__Group_3__0 )
-        // InternalPerspectiveDsl.g:16487:3: rule__XFeatureCall__Group_3__0
+        // InternalPerspectiveDsl.g:16489:3: ( rule__XFeatureCall__Group_3__0 )
+        // InternalPerspectiveDsl.g:16489:3: rule__XFeatureCall__Group_3__0
         {
         pushFollow(FOLLOW_2);
         rule__XFeatureCall__Group_3__0();
@@ -78842,8 +78842,8 @@
 
     // $ANTLR start synpred173_InternalPerspectiveDsl
     public final void synpred173_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:16513:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )
-        // InternalPerspectiveDsl.g:16513:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_4
+        // InternalPerspectiveDsl.g:16515:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )
+        // InternalPerspectiveDsl.g:16515:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_4
         {
         pushFollow(FOLLOW_2);
         rule__XFeatureCall__FeatureCallArgumentsAssignment_4();
@@ -78857,8 +78857,8 @@
 
     // $ANTLR start synpred177_InternalPerspectiveDsl
     public final void synpred177_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:16973:3: ( rule__XConstructorCall__Group_3__0 )
-        // InternalPerspectiveDsl.g:16973:3: rule__XConstructorCall__Group_3__0
+        // InternalPerspectiveDsl.g:16975:3: ( rule__XConstructorCall__Group_3__0 )
+        // InternalPerspectiveDsl.g:16975:3: rule__XConstructorCall__Group_3__0
         {
         pushFollow(FOLLOW_2);
         rule__XConstructorCall__Group_3__0();
@@ -78872,8 +78872,8 @@
 
     // $ANTLR start synpred178_InternalPerspectiveDsl
     public final void synpred178_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:17000:3: ( rule__XConstructorCall__Group_4__0 )
-        // InternalPerspectiveDsl.g:17000:3: rule__XConstructorCall__Group_4__0
+        // InternalPerspectiveDsl.g:17002:3: ( rule__XConstructorCall__Group_4__0 )
+        // InternalPerspectiveDsl.g:17002:3: rule__XConstructorCall__Group_4__0
         {
         pushFollow(FOLLOW_2);
         rule__XConstructorCall__Group_4__0();
@@ -78887,8 +78887,8 @@
 
     // $ANTLR start synpred179_InternalPerspectiveDsl
     public final void synpred179_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:17026:3: ( rule__XConstructorCall__ArgumentsAssignment_5 )
-        // InternalPerspectiveDsl.g:17026:3: rule__XConstructorCall__ArgumentsAssignment_5
+        // InternalPerspectiveDsl.g:17028:3: ( rule__XConstructorCall__ArgumentsAssignment_5 )
+        // InternalPerspectiveDsl.g:17028:3: rule__XConstructorCall__ArgumentsAssignment_5
         {
         pushFollow(FOLLOW_2);
         rule__XConstructorCall__ArgumentsAssignment_5();
@@ -78902,8 +78902,8 @@
 
     // $ANTLR start synpred184_InternalPerspectiveDsl
     public final void synpred184_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:17917:3: ( rule__XReturnExpression__ExpressionAssignment_2 )
-        // InternalPerspectiveDsl.g:17917:3: rule__XReturnExpression__ExpressionAssignment_2
+        // InternalPerspectiveDsl.g:17919:3: ( rule__XReturnExpression__ExpressionAssignment_2 )
+        // InternalPerspectiveDsl.g:17919:3: rule__XReturnExpression__ExpressionAssignment_2
         {
         pushFollow(FOLLOW_2);
         rule__XReturnExpression__ExpressionAssignment_2();
@@ -78917,8 +78917,8 @@
 
     // $ANTLR start synpred185_InternalPerspectiveDsl
     public final void synpred185_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:18059:4: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )
-        // InternalPerspectiveDsl.g:18059:4: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0
+        // InternalPerspectiveDsl.g:18061:4: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )
+        // InternalPerspectiveDsl.g:18061:4: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0
         {
         pushFollow(FOLLOW_2);
         rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0();
@@ -78932,8 +78932,8 @@
 
     // $ANTLR start synpred186_InternalPerspectiveDsl
     public final void synpred186_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:18086:3: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )
-        // InternalPerspectiveDsl.g:18086:3: rule__XTryCatchFinallyExpression__Group_3_0_1__0
+        // InternalPerspectiveDsl.g:18088:3: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )
+        // InternalPerspectiveDsl.g:18088:3: rule__XTryCatchFinallyExpression__Group_3_0_1__0
         {
         pushFollow(FOLLOW_2);
         rule__XTryCatchFinallyExpression__Group_3_0_1__0();
@@ -78947,8 +78947,8 @@
 
     // $ANTLR start synpred187_InternalPerspectiveDsl
     public final void synpred187_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:18599:3: ( rule__QualifiedName__Group_1__0 )
-        // InternalPerspectiveDsl.g:18599:3: rule__QualifiedName__Group_1__0
+        // InternalPerspectiveDsl.g:18601:3: ( rule__QualifiedName__Group_1__0 )
+        // InternalPerspectiveDsl.g:18601:3: rule__QualifiedName__Group_1__0
         {
         pushFollow(FOLLOW_2);
         rule__QualifiedName__Group_1__0();
@@ -78962,8 +78962,8 @@
 
     // $ANTLR start synpred189_InternalPerspectiveDsl
     public final void synpred189_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:18815:3: ( rule__JvmTypeReference__Group_0_1__0 )
-        // InternalPerspectiveDsl.g:18815:3: rule__JvmTypeReference__Group_0_1__0
+        // InternalPerspectiveDsl.g:18817:3: ( rule__JvmTypeReference__Group_0_1__0 )
+        // InternalPerspectiveDsl.g:18817:3: rule__JvmTypeReference__Group_0_1__0
         {
         pushFollow(FOLLOW_2);
         rule__JvmTypeReference__Group_0_1__0();
@@ -78977,8 +78977,8 @@
 
     // $ANTLR start synpred193_InternalPerspectiveDsl
     public final void synpred193_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:19274:3: ( rule__JvmParameterizedTypeReference__Group_1__0 )
-        // InternalPerspectiveDsl.g:19274:3: rule__JvmParameterizedTypeReference__Group_1__0
+        // InternalPerspectiveDsl.g:19276:3: ( rule__JvmParameterizedTypeReference__Group_1__0 )
+        // InternalPerspectiveDsl.g:19276:3: rule__JvmParameterizedTypeReference__Group_1__0
         {
         pushFollow(FOLLOW_2);
         rule__JvmParameterizedTypeReference__Group_1__0();
@@ -78992,8 +78992,8 @@
 
     // $ANTLR start synpred195_InternalPerspectiveDsl
     public final void synpred195_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:19409:3: ( rule__JvmParameterizedTypeReference__Group_1_4__0 )
-        // InternalPerspectiveDsl.g:19409:3: rule__JvmParameterizedTypeReference__Group_1_4__0
+        // InternalPerspectiveDsl.g:19411:3: ( rule__JvmParameterizedTypeReference__Group_1_4__0 )
+        // InternalPerspectiveDsl.g:19411:3: rule__JvmParameterizedTypeReference__Group_1_4__0
         {
         pushFollow(FOLLOW_2);
         rule__JvmParameterizedTypeReference__Group_1_4__0();
@@ -79007,8 +79007,8 @@
 
     // $ANTLR start synpred196_InternalPerspectiveDsl
     public final void synpred196_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:19544:3: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )
-        // InternalPerspectiveDsl.g:19544:3: rule__JvmParameterizedTypeReference__Group_1_4_2__0
+        // InternalPerspectiveDsl.g:19546:3: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )
+        // InternalPerspectiveDsl.g:19546:3: rule__JvmParameterizedTypeReference__Group_1_4_2__0
         {
         pushFollow(FOLLOW_2);
         rule__JvmParameterizedTypeReference__Group_1_4_2__0();
@@ -79022,8 +79022,8 @@
 
     // $ANTLR start synpred201_InternalPerspectiveDsl
     public final void synpred201_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20342:2: ( rule__Perspective__UnorderedGroup_5__0 )
-        // InternalPerspectiveDsl.g:20342:2: rule__Perspective__UnorderedGroup_5__0
+        // InternalPerspectiveDsl.g:20344:2: ( rule__Perspective__UnorderedGroup_5__0 )
+        // InternalPerspectiveDsl.g:20344:2: rule__Perspective__UnorderedGroup_5__0
         {
         pushFollow(FOLLOW_2);
         rule__Perspective__UnorderedGroup_5__0();
@@ -79037,28 +79037,28 @@
 
     // $ANTLR start synpred202_InternalPerspectiveDsl
     public final void synpred202_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20357:3: ( ({...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) ) ) )
-        // InternalPerspectiveDsl.g:20357:3: ({...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20359:3: ( ({...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) ) ) )
+        // InternalPerspectiveDsl.g:20359:3: ({...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) ) )
         {
-        // InternalPerspectiveDsl.g:20357:3: ({...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) ) )
-        // InternalPerspectiveDsl.g:20358:4: {...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) )
+        // InternalPerspectiveDsl.g:20359:3: ({...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20360:4: {...}? => ( ( ( rule__Perspective__Group_5_0__0 ) ) )
         {
         if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 0) ) {
             if (state.backtracking>0) {state.failed=true; return ;}
             throw new FailedPredicateException(input, "synpred202_InternalPerspectiveDsl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 0)");
         }
-        // InternalPerspectiveDsl.g:20358:107: ( ( ( rule__Perspective__Group_5_0__0 ) ) )
-        // InternalPerspectiveDsl.g:20359:5: ( ( rule__Perspective__Group_5_0__0 ) )
+        // InternalPerspectiveDsl.g:20360:107: ( ( ( rule__Perspective__Group_5_0__0 ) ) )
+        // InternalPerspectiveDsl.g:20361:5: ( ( rule__Perspective__Group_5_0__0 ) )
         {
         getUnorderedGroupHelper().select(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 0);
-        // InternalPerspectiveDsl.g:20365:5: ( ( rule__Perspective__Group_5_0__0 ) )
-        // InternalPerspectiveDsl.g:20366:6: ( rule__Perspective__Group_5_0__0 )
+        // InternalPerspectiveDsl.g:20367:5: ( ( rule__Perspective__Group_5_0__0 ) )
+        // InternalPerspectiveDsl.g:20368:6: ( rule__Perspective__Group_5_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPerspectiveAccess().getGroup_5_0()); 
         }
-        // InternalPerspectiveDsl.g:20367:6: ( rule__Perspective__Group_5_0__0 )
-        // InternalPerspectiveDsl.g:20367:7: rule__Perspective__Group_5_0__0
+        // InternalPerspectiveDsl.g:20369:6: ( rule__Perspective__Group_5_0__0 )
+        // InternalPerspectiveDsl.g:20369:7: rule__Perspective__Group_5_0__0
         {
         pushFollow(FOLLOW_2);
         rule__Perspective__Group_5_0__0();
@@ -79084,28 +79084,28 @@
 
     // $ANTLR start synpred203_InternalPerspectiveDsl
     public final void synpred203_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20372:3: ( ({...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) ) ) )
-        // InternalPerspectiveDsl.g:20372:3: ({...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20374:3: ( ({...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) ) ) )
+        // InternalPerspectiveDsl.g:20374:3: ({...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) ) )
         {
-        // InternalPerspectiveDsl.g:20372:3: ({...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) ) )
-        // InternalPerspectiveDsl.g:20373:4: {...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) )
+        // InternalPerspectiveDsl.g:20374:3: ({...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20375:4: {...}? => ( ( ( rule__Perspective__Group_5_1__0 ) ) )
         {
         if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 1) ) {
             if (state.backtracking>0) {state.failed=true; return ;}
             throw new FailedPredicateException(input, "synpred203_InternalPerspectiveDsl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 1)");
         }
-        // InternalPerspectiveDsl.g:20373:107: ( ( ( rule__Perspective__Group_5_1__0 ) ) )
-        // InternalPerspectiveDsl.g:20374:5: ( ( rule__Perspective__Group_5_1__0 ) )
+        // InternalPerspectiveDsl.g:20375:107: ( ( ( rule__Perspective__Group_5_1__0 ) ) )
+        // InternalPerspectiveDsl.g:20376:5: ( ( rule__Perspective__Group_5_1__0 ) )
         {
         getUnorderedGroupHelper().select(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 1);
-        // InternalPerspectiveDsl.g:20380:5: ( ( rule__Perspective__Group_5_1__0 ) )
-        // InternalPerspectiveDsl.g:20381:6: ( rule__Perspective__Group_5_1__0 )
+        // InternalPerspectiveDsl.g:20382:5: ( ( rule__Perspective__Group_5_1__0 ) )
+        // InternalPerspectiveDsl.g:20383:6: ( rule__Perspective__Group_5_1__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPerspectiveAccess().getGroup_5_1()); 
         }
-        // InternalPerspectiveDsl.g:20382:6: ( rule__Perspective__Group_5_1__0 )
-        // InternalPerspectiveDsl.g:20382:7: rule__Perspective__Group_5_1__0
+        // InternalPerspectiveDsl.g:20384:6: ( rule__Perspective__Group_5_1__0 )
+        // InternalPerspectiveDsl.g:20384:7: rule__Perspective__Group_5_1__0
         {
         pushFollow(FOLLOW_2);
         rule__Perspective__Group_5_1__0();
@@ -79131,8 +79131,8 @@
 
     // $ANTLR start synpred204_InternalPerspectiveDsl
     public final void synpred204_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20416:2: ( rule__Perspective__UnorderedGroup_5__1 )
-        // InternalPerspectiveDsl.g:20416:2: rule__Perspective__UnorderedGroup_5__1
+        // InternalPerspectiveDsl.g:20418:2: ( rule__Perspective__UnorderedGroup_5__1 )
+        // InternalPerspectiveDsl.g:20418:2: rule__Perspective__UnorderedGroup_5__1
         {
         pushFollow(FOLLOW_2);
         rule__Perspective__UnorderedGroup_5__1();
@@ -79146,8 +79146,8 @@
 
     // $ANTLR start synpred205_InternalPerspectiveDsl
     public final void synpred205_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20428:2: ( rule__Perspective__UnorderedGroup_5__2 )
-        // InternalPerspectiveDsl.g:20428:2: rule__Perspective__UnorderedGroup_5__2
+        // InternalPerspectiveDsl.g:20430:2: ( rule__Perspective__UnorderedGroup_5__2 )
+        // InternalPerspectiveDsl.g:20430:2: rule__Perspective__UnorderedGroup_5__2
         {
         pushFollow(FOLLOW_2);
         rule__Perspective__UnorderedGroup_5__2();
@@ -79161,8 +79161,8 @@
 
     // $ANTLR start synpred206_InternalPerspectiveDsl
     public final void synpred206_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20452:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3__0 )
-        // InternalPerspectiveDsl.g:20452:2: rule__PerspectiveSashContainer__UnorderedGroup_3__0
+        // InternalPerspectiveDsl.g:20454:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3__0 )
+        // InternalPerspectiveDsl.g:20454:2: rule__PerspectiveSashContainer__UnorderedGroup_3__0
         {
         pushFollow(FOLLOW_2);
         rule__PerspectiveSashContainer__UnorderedGroup_3__0();
@@ -79176,28 +79176,28 @@
 
     // $ANTLR start synpred207_InternalPerspectiveDsl
     public final void synpred207_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20467:3: ( ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) ) ) )
-        // InternalPerspectiveDsl.g:20467:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20469:3: ( ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) ) ) )
+        // InternalPerspectiveDsl.g:20469:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) ) )
         {
-        // InternalPerspectiveDsl.g:20467:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) ) )
-        // InternalPerspectiveDsl.g:20468:4: {...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) )
+        // InternalPerspectiveDsl.g:20469:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20470:4: {...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) )
         {
         if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 0) ) {
             if (state.backtracking>0) {state.failed=true; return ;}
             throw new FailedPredicateException(input, "synpred207_InternalPerspectiveDsl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 0)");
         }
-        // InternalPerspectiveDsl.g:20468:120: ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) )
-        // InternalPerspectiveDsl.g:20469:5: ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) )
+        // InternalPerspectiveDsl.g:20470:120: ( ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) ) )
+        // InternalPerspectiveDsl.g:20471:5: ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) )
         {
         getUnorderedGroupHelper().select(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 0);
-        // InternalPerspectiveDsl.g:20475:5: ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) )
-        // InternalPerspectiveDsl.g:20476:6: ( rule__PerspectiveSashContainer__Group_3_0__0 )
+        // InternalPerspectiveDsl.g:20477:5: ( ( rule__PerspectiveSashContainer__Group_3_0__0 ) )
+        // InternalPerspectiveDsl.g:20478:6: ( rule__PerspectiveSashContainer__Group_3_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPerspectiveSashContainerAccess().getGroup_3_0()); 
         }
-        // InternalPerspectiveDsl.g:20477:6: ( rule__PerspectiveSashContainer__Group_3_0__0 )
-        // InternalPerspectiveDsl.g:20477:7: rule__PerspectiveSashContainer__Group_3_0__0
+        // InternalPerspectiveDsl.g:20479:6: ( rule__PerspectiveSashContainer__Group_3_0__0 )
+        // InternalPerspectiveDsl.g:20479:7: rule__PerspectiveSashContainer__Group_3_0__0
         {
         pushFollow(FOLLOW_2);
         rule__PerspectiveSashContainer__Group_3_0__0();
@@ -79223,28 +79223,28 @@
 
     // $ANTLR start synpred208_InternalPerspectiveDsl
     public final void synpred208_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20482:3: ( ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) ) ) )
-        // InternalPerspectiveDsl.g:20482:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20484:3: ( ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) ) ) )
+        // InternalPerspectiveDsl.g:20484:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) ) )
         {
-        // InternalPerspectiveDsl.g:20482:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) ) )
-        // InternalPerspectiveDsl.g:20483:4: {...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) )
+        // InternalPerspectiveDsl.g:20484:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20485:4: {...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) )
         {
         if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 1) ) {
             if (state.backtracking>0) {state.failed=true; return ;}
             throw new FailedPredicateException(input, "synpred208_InternalPerspectiveDsl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 1)");
         }
-        // InternalPerspectiveDsl.g:20483:120: ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) )
-        // InternalPerspectiveDsl.g:20484:5: ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) )
+        // InternalPerspectiveDsl.g:20485:120: ( ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) ) )
+        // InternalPerspectiveDsl.g:20486:5: ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) )
         {
         getUnorderedGroupHelper().select(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 1);
-        // InternalPerspectiveDsl.g:20490:5: ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) )
-        // InternalPerspectiveDsl.g:20491:6: ( rule__PerspectiveSashContainer__Group_3_1__0 )
+        // InternalPerspectiveDsl.g:20492:5: ( ( rule__PerspectiveSashContainer__Group_3_1__0 ) )
+        // InternalPerspectiveDsl.g:20493:6: ( rule__PerspectiveSashContainer__Group_3_1__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPerspectiveSashContainerAccess().getGroup_3_1()); 
         }
-        // InternalPerspectiveDsl.g:20492:6: ( rule__PerspectiveSashContainer__Group_3_1__0 )
-        // InternalPerspectiveDsl.g:20492:7: rule__PerspectiveSashContainer__Group_3_1__0
+        // InternalPerspectiveDsl.g:20494:6: ( rule__PerspectiveSashContainer__Group_3_1__0 )
+        // InternalPerspectiveDsl.g:20494:7: rule__PerspectiveSashContainer__Group_3_1__0
         {
         pushFollow(FOLLOW_2);
         rule__PerspectiveSashContainer__Group_3_1__0();
@@ -79270,28 +79270,28 @@
 
     // $ANTLR start synpred209_InternalPerspectiveDsl
     public final void synpred209_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20497:3: ( ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) ) ) )
-        // InternalPerspectiveDsl.g:20497:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20499:3: ( ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) ) ) )
+        // InternalPerspectiveDsl.g:20499:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) ) )
         {
-        // InternalPerspectiveDsl.g:20497:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) ) )
-        // InternalPerspectiveDsl.g:20498:4: {...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) )
+        // InternalPerspectiveDsl.g:20499:3: ({...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20500:4: {...}? => ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) )
         {
         if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 2) ) {
             if (state.backtracking>0) {state.failed=true; return ;}
             throw new FailedPredicateException(input, "synpred209_InternalPerspectiveDsl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 2)");
         }
-        // InternalPerspectiveDsl.g:20498:120: ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) )
-        // InternalPerspectiveDsl.g:20499:5: ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) )
+        // InternalPerspectiveDsl.g:20500:120: ( ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) ) )
+        // InternalPerspectiveDsl.g:20501:5: ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) )
         {
         getUnorderedGroupHelper().select(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 2);
-        // InternalPerspectiveDsl.g:20505:5: ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) )
-        // InternalPerspectiveDsl.g:20506:6: ( rule__PerspectiveSashContainer__Group_3_2__0 )
+        // InternalPerspectiveDsl.g:20507:5: ( ( rule__PerspectiveSashContainer__Group_3_2__0 ) )
+        // InternalPerspectiveDsl.g:20508:6: ( rule__PerspectiveSashContainer__Group_3_2__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPerspectiveSashContainerAccess().getGroup_3_2()); 
         }
-        // InternalPerspectiveDsl.g:20507:6: ( rule__PerspectiveSashContainer__Group_3_2__0 )
-        // InternalPerspectiveDsl.g:20507:7: rule__PerspectiveSashContainer__Group_3_2__0
+        // InternalPerspectiveDsl.g:20509:6: ( rule__PerspectiveSashContainer__Group_3_2__0 )
+        // InternalPerspectiveDsl.g:20509:7: rule__PerspectiveSashContainer__Group_3_2__0
         {
         pushFollow(FOLLOW_2);
         rule__PerspectiveSashContainer__Group_3_2__0();
@@ -79317,8 +79317,8 @@
 
     // $ANTLR start synpred210_InternalPerspectiveDsl
     public final void synpred210_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20541:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3__1 )
-        // InternalPerspectiveDsl.g:20541:2: rule__PerspectiveSashContainer__UnorderedGroup_3__1
+        // InternalPerspectiveDsl.g:20543:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3__1 )
+        // InternalPerspectiveDsl.g:20543:2: rule__PerspectiveSashContainer__UnorderedGroup_3__1
         {
         pushFollow(FOLLOW_2);
         rule__PerspectiveSashContainer__UnorderedGroup_3__1();
@@ -79332,8 +79332,8 @@
 
     // $ANTLR start synpred211_InternalPerspectiveDsl
     public final void synpred211_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20553:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3__2 )
-        // InternalPerspectiveDsl.g:20553:2: rule__PerspectiveSashContainer__UnorderedGroup_3__2
+        // InternalPerspectiveDsl.g:20555:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3__2 )
+        // InternalPerspectiveDsl.g:20555:2: rule__PerspectiveSashContainer__UnorderedGroup_3__2
         {
         pushFollow(FOLLOW_2);
         rule__PerspectiveSashContainer__UnorderedGroup_3__2();
@@ -79347,8 +79347,8 @@
 
     // $ANTLR start synpred212_InternalPerspectiveDsl
     public final void synpred212_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20565:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3__3 )
-        // InternalPerspectiveDsl.g:20565:2: rule__PerspectiveSashContainer__UnorderedGroup_3__3
+        // InternalPerspectiveDsl.g:20567:2: ( rule__PerspectiveSashContainer__UnorderedGroup_3__3 )
+        // InternalPerspectiveDsl.g:20567:2: rule__PerspectiveSashContainer__UnorderedGroup_3__3
         {
         pushFollow(FOLLOW_2);
         rule__PerspectiveSashContainer__UnorderedGroup_3__3();
@@ -79362,8 +79362,8 @@
 
     // $ANTLR start synpred213_InternalPerspectiveDsl
     public final void synpred213_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20589:2: ( rule__PerspectivePartStack__UnorderedGroup_3__0 )
-        // InternalPerspectiveDsl.g:20589:2: rule__PerspectivePartStack__UnorderedGroup_3__0
+        // InternalPerspectiveDsl.g:20591:2: ( rule__PerspectivePartStack__UnorderedGroup_3__0 )
+        // InternalPerspectiveDsl.g:20591:2: rule__PerspectivePartStack__UnorderedGroup_3__0
         {
         pushFollow(FOLLOW_2);
         rule__PerspectivePartStack__UnorderedGroup_3__0();
@@ -79377,28 +79377,28 @@
 
     // $ANTLR start synpred214_InternalPerspectiveDsl
     public final void synpred214_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20604:3: ( ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) ) ) )
-        // InternalPerspectiveDsl.g:20604:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20606:3: ( ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) ) ) )
+        // InternalPerspectiveDsl.g:20606:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) ) )
         {
-        // InternalPerspectiveDsl.g:20604:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) ) )
-        // InternalPerspectiveDsl.g:20605:4: {...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) )
+        // InternalPerspectiveDsl.g:20606:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20607:4: {...}? => ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) )
         {
         if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 0) ) {
             if (state.backtracking>0) {state.failed=true; return ;}
             throw new FailedPredicateException(input, "synpred214_InternalPerspectiveDsl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 0)");
         }
-        // InternalPerspectiveDsl.g:20605:116: ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) )
-        // InternalPerspectiveDsl.g:20606:5: ( ( rule__PerspectivePartStack__Group_3_0__0 ) )
+        // InternalPerspectiveDsl.g:20607:116: ( ( ( rule__PerspectivePartStack__Group_3_0__0 ) ) )
+        // InternalPerspectiveDsl.g:20608:5: ( ( rule__PerspectivePartStack__Group_3_0__0 ) )
         {
         getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 0);
-        // InternalPerspectiveDsl.g:20612:5: ( ( rule__PerspectivePartStack__Group_3_0__0 ) )
-        // InternalPerspectiveDsl.g:20613:6: ( rule__PerspectivePartStack__Group_3_0__0 )
+        // InternalPerspectiveDsl.g:20614:5: ( ( rule__PerspectivePartStack__Group_3_0__0 ) )
+        // InternalPerspectiveDsl.g:20615:6: ( rule__PerspectivePartStack__Group_3_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPerspectivePartStackAccess().getGroup_3_0()); 
         }
-        // InternalPerspectiveDsl.g:20614:6: ( rule__PerspectivePartStack__Group_3_0__0 )
-        // InternalPerspectiveDsl.g:20614:7: rule__PerspectivePartStack__Group_3_0__0
+        // InternalPerspectiveDsl.g:20616:6: ( rule__PerspectivePartStack__Group_3_0__0 )
+        // InternalPerspectiveDsl.g:20616:7: rule__PerspectivePartStack__Group_3_0__0
         {
         pushFollow(FOLLOW_2);
         rule__PerspectivePartStack__Group_3_0__0();
@@ -79424,28 +79424,28 @@
 
     // $ANTLR start synpred215_InternalPerspectiveDsl
     public final void synpred215_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20619:3: ( ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) ) ) )
-        // InternalPerspectiveDsl.g:20619:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20621:3: ( ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) ) ) )
+        // InternalPerspectiveDsl.g:20621:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) ) )
         {
-        // InternalPerspectiveDsl.g:20619:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) ) )
-        // InternalPerspectiveDsl.g:20620:4: {...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) )
+        // InternalPerspectiveDsl.g:20621:3: ({...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20622:4: {...}? => ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) )
         {
         if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 1) ) {
             if (state.backtracking>0) {state.failed=true; return ;}
             throw new FailedPredicateException(input, "synpred215_InternalPerspectiveDsl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 1)");
         }
-        // InternalPerspectiveDsl.g:20620:116: ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) )
-        // InternalPerspectiveDsl.g:20621:5: ( ( rule__PerspectivePartStack__Group_3_1__0 ) )
+        // InternalPerspectiveDsl.g:20622:116: ( ( ( rule__PerspectivePartStack__Group_3_1__0 ) ) )
+        // InternalPerspectiveDsl.g:20623:5: ( ( rule__PerspectivePartStack__Group_3_1__0 ) )
         {
         getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 1);
-        // InternalPerspectiveDsl.g:20627:5: ( ( rule__PerspectivePartStack__Group_3_1__0 ) )
-        // InternalPerspectiveDsl.g:20628:6: ( rule__PerspectivePartStack__Group_3_1__0 )
+        // InternalPerspectiveDsl.g:20629:5: ( ( rule__PerspectivePartStack__Group_3_1__0 ) )
+        // InternalPerspectiveDsl.g:20630:6: ( rule__PerspectivePartStack__Group_3_1__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPerspectivePartStackAccess().getGroup_3_1()); 
         }
-        // InternalPerspectiveDsl.g:20629:6: ( rule__PerspectivePartStack__Group_3_1__0 )
-        // InternalPerspectiveDsl.g:20629:7: rule__PerspectivePartStack__Group_3_1__0
+        // InternalPerspectiveDsl.g:20631:6: ( rule__PerspectivePartStack__Group_3_1__0 )
+        // InternalPerspectiveDsl.g:20631:7: rule__PerspectivePartStack__Group_3_1__0
         {
         pushFollow(FOLLOW_2);
         rule__PerspectivePartStack__Group_3_1__0();
@@ -79471,8 +79471,8 @@
 
     // $ANTLR start synpred216_InternalPerspectiveDsl
     public final void synpred216_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20663:2: ( rule__PerspectivePartStack__UnorderedGroup_3__1 )
-        // InternalPerspectiveDsl.g:20663:2: rule__PerspectivePartStack__UnorderedGroup_3__1
+        // InternalPerspectiveDsl.g:20665:2: ( rule__PerspectivePartStack__UnorderedGroup_3__1 )
+        // InternalPerspectiveDsl.g:20665:2: rule__PerspectivePartStack__UnorderedGroup_3__1
         {
         pushFollow(FOLLOW_2);
         rule__PerspectivePartStack__UnorderedGroup_3__1();
@@ -79486,8 +79486,8 @@
 
     // $ANTLR start synpred217_InternalPerspectiveDsl
     public final void synpred217_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20675:2: ( rule__PerspectivePartStack__UnorderedGroup_3__2 )
-        // InternalPerspectiveDsl.g:20675:2: rule__PerspectivePartStack__UnorderedGroup_3__2
+        // InternalPerspectiveDsl.g:20677:2: ( rule__PerspectivePartStack__UnorderedGroup_3__2 )
+        // InternalPerspectiveDsl.g:20677:2: rule__PerspectivePartStack__UnorderedGroup_3__2
         {
         pushFollow(FOLLOW_2);
         rule__PerspectivePartStack__UnorderedGroup_3__2();
@@ -79501,8 +79501,8 @@
 
     // $ANTLR start synpred218_InternalPerspectiveDsl
     public final void synpred218_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20699:2: ( rule__PerspectivePart__UnorderedGroup_3__0 )
-        // InternalPerspectiveDsl.g:20699:2: rule__PerspectivePart__UnorderedGroup_3__0
+        // InternalPerspectiveDsl.g:20701:2: ( rule__PerspectivePart__UnorderedGroup_3__0 )
+        // InternalPerspectiveDsl.g:20701:2: rule__PerspectivePart__UnorderedGroup_3__0
         {
         pushFollow(FOLLOW_2);
         rule__PerspectivePart__UnorderedGroup_3__0();
@@ -79516,28 +79516,28 @@
 
     // $ANTLR start synpred219_InternalPerspectiveDsl
     public final void synpred219_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20714:3: ( ({...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) ) ) )
-        // InternalPerspectiveDsl.g:20714:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20716:3: ( ({...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) ) ) )
+        // InternalPerspectiveDsl.g:20716:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) ) )
         {
-        // InternalPerspectiveDsl.g:20714:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) ) )
-        // InternalPerspectiveDsl.g:20715:4: {...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) )
+        // InternalPerspectiveDsl.g:20716:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20717:4: {...}? => ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) )
         {
         if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 0) ) {
             if (state.backtracking>0) {state.failed=true; return ;}
             throw new FailedPredicateException(input, "synpred219_InternalPerspectiveDsl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 0)");
         }
-        // InternalPerspectiveDsl.g:20715:111: ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) )
-        // InternalPerspectiveDsl.g:20716:5: ( ( rule__PerspectivePart__Group_3_0__0 ) )
+        // InternalPerspectiveDsl.g:20717:111: ( ( ( rule__PerspectivePart__Group_3_0__0 ) ) )
+        // InternalPerspectiveDsl.g:20718:5: ( ( rule__PerspectivePart__Group_3_0__0 ) )
         {
         getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 0);
-        // InternalPerspectiveDsl.g:20722:5: ( ( rule__PerspectivePart__Group_3_0__0 ) )
-        // InternalPerspectiveDsl.g:20723:6: ( rule__PerspectivePart__Group_3_0__0 )
+        // InternalPerspectiveDsl.g:20724:5: ( ( rule__PerspectivePart__Group_3_0__0 ) )
+        // InternalPerspectiveDsl.g:20725:6: ( rule__PerspectivePart__Group_3_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPerspectivePartAccess().getGroup_3_0()); 
         }
-        // InternalPerspectiveDsl.g:20724:6: ( rule__PerspectivePart__Group_3_0__0 )
-        // InternalPerspectiveDsl.g:20724:7: rule__PerspectivePart__Group_3_0__0
+        // InternalPerspectiveDsl.g:20726:6: ( rule__PerspectivePart__Group_3_0__0 )
+        // InternalPerspectiveDsl.g:20726:7: rule__PerspectivePart__Group_3_0__0
         {
         pushFollow(FOLLOW_2);
         rule__PerspectivePart__Group_3_0__0();
@@ -79563,28 +79563,28 @@
 
     // $ANTLR start synpred220_InternalPerspectiveDsl
     public final void synpred220_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20729:3: ( ({...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) ) ) )
-        // InternalPerspectiveDsl.g:20729:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20731:3: ( ({...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) ) ) )
+        // InternalPerspectiveDsl.g:20731:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) ) )
         {
-        // InternalPerspectiveDsl.g:20729:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) ) )
-        // InternalPerspectiveDsl.g:20730:4: {...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) )
+        // InternalPerspectiveDsl.g:20731:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20732:4: {...}? => ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) )
         {
         if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 1) ) {
             if (state.backtracking>0) {state.failed=true; return ;}
             throw new FailedPredicateException(input, "synpred220_InternalPerspectiveDsl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 1)");
         }
-        // InternalPerspectiveDsl.g:20730:111: ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) )
-        // InternalPerspectiveDsl.g:20731:5: ( ( rule__PerspectivePart__Group_3_1__0 ) )
+        // InternalPerspectiveDsl.g:20732:111: ( ( ( rule__PerspectivePart__Group_3_1__0 ) ) )
+        // InternalPerspectiveDsl.g:20733:5: ( ( rule__PerspectivePart__Group_3_1__0 ) )
         {
         getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 1);
-        // InternalPerspectiveDsl.g:20737:5: ( ( rule__PerspectivePart__Group_3_1__0 ) )
-        // InternalPerspectiveDsl.g:20738:6: ( rule__PerspectivePart__Group_3_1__0 )
+        // InternalPerspectiveDsl.g:20739:5: ( ( rule__PerspectivePart__Group_3_1__0 ) )
+        // InternalPerspectiveDsl.g:20740:6: ( rule__PerspectivePart__Group_3_1__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPerspectivePartAccess().getGroup_3_1()); 
         }
-        // InternalPerspectiveDsl.g:20739:6: ( rule__PerspectivePart__Group_3_1__0 )
-        // InternalPerspectiveDsl.g:20739:7: rule__PerspectivePart__Group_3_1__0
+        // InternalPerspectiveDsl.g:20741:6: ( rule__PerspectivePart__Group_3_1__0 )
+        // InternalPerspectiveDsl.g:20741:7: rule__PerspectivePart__Group_3_1__0
         {
         pushFollow(FOLLOW_2);
         rule__PerspectivePart__Group_3_1__0();
@@ -79610,28 +79610,28 @@
 
     // $ANTLR start synpred221_InternalPerspectiveDsl
     public final void synpred221_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20744:3: ( ({...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) ) ) )
-        // InternalPerspectiveDsl.g:20744:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20746:3: ( ({...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) ) ) )
+        // InternalPerspectiveDsl.g:20746:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) ) )
         {
-        // InternalPerspectiveDsl.g:20744:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) ) )
-        // InternalPerspectiveDsl.g:20745:4: {...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) )
+        // InternalPerspectiveDsl.g:20746:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20747:4: {...}? => ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) )
         {
         if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 2) ) {
             if (state.backtracking>0) {state.failed=true; return ;}
             throw new FailedPredicateException(input, "synpred221_InternalPerspectiveDsl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 2)");
         }
-        // InternalPerspectiveDsl.g:20745:111: ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) )
-        // InternalPerspectiveDsl.g:20746:5: ( ( rule__PerspectivePart__Group_3_2__0 ) )
+        // InternalPerspectiveDsl.g:20747:111: ( ( ( rule__PerspectivePart__Group_3_2__0 ) ) )
+        // InternalPerspectiveDsl.g:20748:5: ( ( rule__PerspectivePart__Group_3_2__0 ) )
         {
         getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 2);
-        // InternalPerspectiveDsl.g:20752:5: ( ( rule__PerspectivePart__Group_3_2__0 ) )
-        // InternalPerspectiveDsl.g:20753:6: ( rule__PerspectivePart__Group_3_2__0 )
+        // InternalPerspectiveDsl.g:20754:5: ( ( rule__PerspectivePart__Group_3_2__0 ) )
+        // InternalPerspectiveDsl.g:20755:6: ( rule__PerspectivePart__Group_3_2__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPerspectivePartAccess().getGroup_3_2()); 
         }
-        // InternalPerspectiveDsl.g:20754:6: ( rule__PerspectivePart__Group_3_2__0 )
-        // InternalPerspectiveDsl.g:20754:7: rule__PerspectivePart__Group_3_2__0
+        // InternalPerspectiveDsl.g:20756:6: ( rule__PerspectivePart__Group_3_2__0 )
+        // InternalPerspectiveDsl.g:20756:7: rule__PerspectivePart__Group_3_2__0
         {
         pushFollow(FOLLOW_2);
         rule__PerspectivePart__Group_3_2__0();
@@ -79657,28 +79657,28 @@
 
     // $ANTLR start synpred222_InternalPerspectiveDsl
     public final void synpred222_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20759:3: ( ({...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) ) ) )
-        // InternalPerspectiveDsl.g:20759:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20761:3: ( ({...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) ) ) )
+        // InternalPerspectiveDsl.g:20761:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) ) )
         {
-        // InternalPerspectiveDsl.g:20759:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) ) )
-        // InternalPerspectiveDsl.g:20760:4: {...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) )
+        // InternalPerspectiveDsl.g:20761:3: ({...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20762:4: {...}? => ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) )
         {
         if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 3) ) {
             if (state.backtracking>0) {state.failed=true; return ;}
             throw new FailedPredicateException(input, "synpred222_InternalPerspectiveDsl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 3)");
         }
-        // InternalPerspectiveDsl.g:20760:111: ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) )
-        // InternalPerspectiveDsl.g:20761:5: ( ( rule__PerspectivePart__Group_3_3__0 ) )
+        // InternalPerspectiveDsl.g:20762:111: ( ( ( rule__PerspectivePart__Group_3_3__0 ) ) )
+        // InternalPerspectiveDsl.g:20763:5: ( ( rule__PerspectivePart__Group_3_3__0 ) )
         {
         getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 3);
-        // InternalPerspectiveDsl.g:20767:5: ( ( rule__PerspectivePart__Group_3_3__0 ) )
-        // InternalPerspectiveDsl.g:20768:6: ( rule__PerspectivePart__Group_3_3__0 )
+        // InternalPerspectiveDsl.g:20769:5: ( ( rule__PerspectivePart__Group_3_3__0 ) )
+        // InternalPerspectiveDsl.g:20770:6: ( rule__PerspectivePart__Group_3_3__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPerspectivePartAccess().getGroup_3_3()); 
         }
-        // InternalPerspectiveDsl.g:20769:6: ( rule__PerspectivePart__Group_3_3__0 )
-        // InternalPerspectiveDsl.g:20769:7: rule__PerspectivePart__Group_3_3__0
+        // InternalPerspectiveDsl.g:20771:6: ( rule__PerspectivePart__Group_3_3__0 )
+        // InternalPerspectiveDsl.g:20771:7: rule__PerspectivePart__Group_3_3__0
         {
         pushFollow(FOLLOW_2);
         rule__PerspectivePart__Group_3_3__0();
@@ -79704,8 +79704,8 @@
 
     // $ANTLR start synpred223_InternalPerspectiveDsl
     public final void synpred223_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20803:2: ( rule__PerspectivePart__UnorderedGroup_3__1 )
-        // InternalPerspectiveDsl.g:20803:2: rule__PerspectivePart__UnorderedGroup_3__1
+        // InternalPerspectiveDsl.g:20805:2: ( rule__PerspectivePart__UnorderedGroup_3__1 )
+        // InternalPerspectiveDsl.g:20805:2: rule__PerspectivePart__UnorderedGroup_3__1
         {
         pushFollow(FOLLOW_2);
         rule__PerspectivePart__UnorderedGroup_3__1();
@@ -79719,8 +79719,8 @@
 
     // $ANTLR start synpred224_InternalPerspectiveDsl
     public final void synpred224_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20815:2: ( rule__PerspectivePart__UnorderedGroup_3__2 )
-        // InternalPerspectiveDsl.g:20815:2: rule__PerspectivePart__UnorderedGroup_3__2
+        // InternalPerspectiveDsl.g:20817:2: ( rule__PerspectivePart__UnorderedGroup_3__2 )
+        // InternalPerspectiveDsl.g:20817:2: rule__PerspectivePart__UnorderedGroup_3__2
         {
         pushFollow(FOLLOW_2);
         rule__PerspectivePart__UnorderedGroup_3__2();
@@ -79734,8 +79734,8 @@
 
     // $ANTLR start synpred225_InternalPerspectiveDsl
     public final void synpred225_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20827:2: ( rule__PerspectivePart__UnorderedGroup_3__3 )
-        // InternalPerspectiveDsl.g:20827:2: rule__PerspectivePart__UnorderedGroup_3__3
+        // InternalPerspectiveDsl.g:20829:2: ( rule__PerspectivePart__UnorderedGroup_3__3 )
+        // InternalPerspectiveDsl.g:20829:2: rule__PerspectivePart__UnorderedGroup_3__3
         {
         pushFollow(FOLLOW_2);
         rule__PerspectivePart__UnorderedGroup_3__3();
@@ -79749,8 +79749,8 @@
 
     // $ANTLR start synpred226_InternalPerspectiveDsl
     public final void synpred226_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20839:2: ( rule__PerspectivePart__UnorderedGroup_3__4 )
-        // InternalPerspectiveDsl.g:20839:2: rule__PerspectivePart__UnorderedGroup_3__4
+        // InternalPerspectiveDsl.g:20841:2: ( rule__PerspectivePart__UnorderedGroup_3__4 )
+        // InternalPerspectiveDsl.g:20841:2: rule__PerspectivePart__UnorderedGroup_3__4
         {
         pushFollow(FOLLOW_2);
         rule__PerspectivePart__UnorderedGroup_3__4();
@@ -79764,8 +79764,8 @@
 
     // $ANTLR start synpred227_InternalPerspectiveDsl
     public final void synpred227_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20863:2: ( rule__PerspectiveSearch__UnorderedGroup_4__0 )
-        // InternalPerspectiveDsl.g:20863:2: rule__PerspectiveSearch__UnorderedGroup_4__0
+        // InternalPerspectiveDsl.g:20865:2: ( rule__PerspectiveSearch__UnorderedGroup_4__0 )
+        // InternalPerspectiveDsl.g:20865:2: rule__PerspectiveSearch__UnorderedGroup_4__0
         {
         pushFollow(FOLLOW_2);
         rule__PerspectiveSearch__UnorderedGroup_4__0();
@@ -79779,28 +79779,28 @@
 
     // $ANTLR start synpred228_InternalPerspectiveDsl
     public final void synpred228_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20878:3: ( ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) ) ) )
-        // InternalPerspectiveDsl.g:20878:3: ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20880:3: ( ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) ) ) )
+        // InternalPerspectiveDsl.g:20880:3: ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) ) )
         {
-        // InternalPerspectiveDsl.g:20878:3: ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) ) )
-        // InternalPerspectiveDsl.g:20879:4: {...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) )
+        // InternalPerspectiveDsl.g:20880:3: ({...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) ) )
+        // InternalPerspectiveDsl.g:20881:4: {...}? => ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) )
         {
         if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSearchAccess().getUnorderedGroup_4(), 0) ) {
             if (state.backtracking>0) {state.failed=true; return ;}
             throw new FailedPredicateException(input, "synpred228_InternalPerspectiveDsl", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSearchAccess().getUnorderedGroup_4(), 0)");
         }
-        // InternalPerspectiveDsl.g:20879:113: ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) )
-        // InternalPerspectiveDsl.g:20880:5: ( ( rule__PerspectiveSearch__Group_4_0__0 ) )
+        // InternalPerspectiveDsl.g:20881:113: ( ( ( rule__PerspectiveSearch__Group_4_0__0 ) ) )
+        // InternalPerspectiveDsl.g:20882:5: ( ( rule__PerspectiveSearch__Group_4_0__0 ) )
         {
         getUnorderedGroupHelper().select(grammarAccess.getPerspectiveSearchAccess().getUnorderedGroup_4(), 0);
-        // InternalPerspectiveDsl.g:20886:5: ( ( rule__PerspectiveSearch__Group_4_0__0 ) )
-        // InternalPerspectiveDsl.g:20887:6: ( rule__PerspectiveSearch__Group_4_0__0 )
+        // InternalPerspectiveDsl.g:20888:5: ( ( rule__PerspectiveSearch__Group_4_0__0 ) )
+        // InternalPerspectiveDsl.g:20889:6: ( rule__PerspectiveSearch__Group_4_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getPerspectiveSearchAccess().getGroup_4_0()); 
         }
-        // InternalPerspectiveDsl.g:20888:6: ( rule__PerspectiveSearch__Group_4_0__0 )
-        // InternalPerspectiveDsl.g:20888:7: rule__PerspectiveSearch__Group_4_0__0
+        // InternalPerspectiveDsl.g:20890:6: ( rule__PerspectiveSearch__Group_4_0__0 )
+        // InternalPerspectiveDsl.g:20890:7: rule__PerspectiveSearch__Group_4_0__0
         {
         pushFollow(FOLLOW_2);
         rule__PerspectiveSearch__Group_4_0__0();
@@ -79826,8 +79826,8 @@
 
     // $ANTLR start synpred229_InternalPerspectiveDsl
     public final void synpred229_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:20922:2: ( rule__PerspectiveSearch__UnorderedGroup_4__1 )
-        // InternalPerspectiveDsl.g:20922:2: rule__PerspectiveSearch__UnorderedGroup_4__1
+        // InternalPerspectiveDsl.g:20924:2: ( rule__PerspectiveSearch__UnorderedGroup_4__1 )
+        // InternalPerspectiveDsl.g:20924:2: rule__PerspectiveSearch__UnorderedGroup_4__1
         {
         pushFollow(FOLLOW_2);
         rule__PerspectiveSearch__UnorderedGroup_4__1();
@@ -80887,7 +80887,7 @@
             this.transition = dfa_7;
         }
         public String getDescription() {
-            return "2880:1: rule__XImportDeclaration__Alternatives_2 : ( ( ( rule__XImportDeclaration__Group_2_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) ) | ( ( rule__XImportDeclaration__Group_2_3__0 ) ) );";
+            return "2882:1: rule__XImportDeclaration__Alternatives_2 : ( ( ( rule__XImportDeclaration__Group_2_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) ) | ( ( rule__XImportDeclaration__Group_2_3__0 ) ) );";
         }
     }
     static final String dfa_8s = "\43\uffff";
@@ -80954,7 +80954,7 @@
             this.transition = dfa_13;
         }
         public String getDescription() {
-            return "2934:1: rule__XAnnotation__Alternatives_3_1 : ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) );";
+            return "2936:1: rule__XAnnotation__Alternatives_3_1 : ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -81036,7 +81036,7 @@
             this.transition = dfa_14;
         }
         public String getDescription() {
-            return "2955:1: rule__XAnnotationElementValueOrCommaList__Alternatives : ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) );";
+            return "2957:1: rule__XAnnotationElementValueOrCommaList__Alternatives : ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -81080,7 +81080,7 @@
             this.transition = dfa_14;
         }
         public String getDescription() {
-            return "2976:1: rule__XAnnotationElementValue__Alternatives : ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) );";
+            return "2978:1: rule__XAnnotationElementValue__Alternatives : ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -81149,7 +81149,7 @@
             this.transition = dfa_20;
         }
         public String getDescription() {
-            return "3177:1: rule__OpOther__Alternatives : ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) );";
+            return "3179:1: rule__OpOther__Alternatives : ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) );";
         }
     }
     static final String dfa_21s = "\12\uffff";
@@ -81193,7 +81193,7 @@
             this.transition = dfa_27;
         }
         public String getDescription() {
-            return "3411:1: rule__XMemberFeatureCall__Alternatives_1 : ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) );";
+            return "3413:1: rule__XMemberFeatureCall__Alternatives_1 : ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) );";
         }
     }
     static final String dfa_28s = "\1\4\2\0\40\uffff";
@@ -81257,7 +81257,7 @@
             this.transition = dfa_32;
         }
         public String getDescription() {
-            return "3480:1: rule__XMemberFeatureCall__Alternatives_1_1_3_1 : ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) ) );";
+            return "3482:1: rule__XMemberFeatureCall__Alternatives_1_1_3_1 : ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -81362,7 +81362,7 @@
             this.transition = dfa_38;
         }
         public String getDescription() {
-            return "3501:1: rule__XPrimaryExpression__Alternatives : ( ( ruleXConstructorCall ) | ( ruleXBlockExpression ) | ( ruleXSwitchExpression ) | ( ( ruleXSynchronizedExpression ) ) | ( ruleXFeatureCall ) | ( ruleXLiteral ) | ( ruleXIfExpression ) | ( ( ruleXForLoopExpression ) ) | ( ruleXBasicForLoopExpression ) | ( ruleXWhileExpression ) | ( ruleXDoWhileExpression ) | ( ruleXThrowExpression ) | ( ruleXReturnExpression ) | ( ruleXTryCatchFinallyExpression ) | ( ruleXParenthesizedExpression ) );";
+            return "3503:1: rule__XPrimaryExpression__Alternatives : ( ( ruleXConstructorCall ) | ( ruleXBlockExpression ) | ( ruleXSwitchExpression ) | ( ( ruleXSynchronizedExpression ) ) | ( ruleXFeatureCall ) | ( ruleXLiteral ) | ( ruleXIfExpression ) | ( ( ruleXForLoopExpression ) ) | ( ruleXBasicForLoopExpression ) | ( ruleXWhileExpression ) | ( ruleXDoWhileExpression ) | ( ruleXThrowExpression ) | ( ruleXReturnExpression ) | ( ruleXTryCatchFinallyExpression ) | ( ruleXParenthesizedExpression ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -81444,7 +81444,7 @@
             this.transition = dfa_39;
         }
         public String getDescription() {
-            return "3672:1: rule__XSwitchExpression__Alternatives_2 : ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) | ( ( rule__XSwitchExpression__Group_2_1__0 ) ) );";
+            return "3674:1: rule__XSwitchExpression__Alternatives_2 : ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) | ( ( rule__XSwitchExpression__Group_2_1__0 ) ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -81488,7 +81488,7 @@
             this.transition = dfa_32;
         }
         public String getDescription() {
-            return "3777:1: rule__XFeatureCall__Alternatives_3_1 : ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) | ( ( rule__XFeatureCall__Group_3_1_1__0 ) ) );";
+            return "3779:1: rule__XFeatureCall__Alternatives_3_1 : ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) | ( ( rule__XFeatureCall__Group_3_1_1__0 ) ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -81547,7 +81547,7 @@
             this.transition = dfa_32;
         }
         public String getDescription() {
-            return "3858:1: rule__XConstructorCall__Alternatives_4_1 : ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) | ( ( rule__XConstructorCall__Group_4_1_1__0 ) ) );";
+            return "3860:1: rule__XConstructorCall__Alternatives_4_1 : ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) | ( ( rule__XConstructorCall__Group_4_1_1__0 ) ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -81629,7 +81629,7 @@
             this.transition = dfa_45;
         }
         public String getDescription() {
-            return "9034:2: ( rule__XAssignment__Group_1_1__0 )?";
+            return "9036:2: ( rule__XAssignment__Group_1_1__0 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -81787,7 +81787,7 @@
             this.transition = dfa_51;
         }
         public String getDescription() {
-            return "()* loopback of 10330:2: ( rule__XOtherOperatorExpression__Group_1__0 )*";
+            return "()* loopback of 10332:2: ( rule__XOtherOperatorExpression__Group_1__0 )*";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -82030,7 +82030,7 @@
             this.transition = dfa_58;
         }
         public String getDescription() {
-            return "11924:2: ( rule__XMemberFeatureCall__Group_1_1_3__0 )?";
+            return "11926:2: ( rule__XMemberFeatureCall__Group_1_1_3__0 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -82155,7 +82155,7 @@
             this.transition = dfa_59;
         }
         public String getDescription() {
-            return "11950:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )?";
+            return "11952:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -82251,7 +82251,7 @@
             this.transition = dfa_65;
         }
         public String getDescription() {
-            return "12923:2: ( rule__XClosure__Group_1__0 )?";
+            return "12925:2: ( rule__XClosure__Group_1__0 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -82358,7 +82358,7 @@
             this.transition = dfa_71;
         }
         public String getDescription() {
-            return "14354:2: ( rule__XSwitchExpression__Group_2_1_0__0 )?";
+            return "14356:2: ( rule__XSwitchExpression__Group_2_1_0__0 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -82417,7 +82417,7 @@
             this.transition = dfa_58;
         }
         public String getDescription() {
-            return "16487:2: ( rule__XFeatureCall__Group_3__0 )?";
+            return "16489:2: ( rule__XFeatureCall__Group_3__0 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -82461,7 +82461,7 @@
             this.transition = dfa_59;
         }
         public String getDescription() {
-            return "16513:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )?";
+            return "16515:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -82586,7 +82586,7 @@
             this.transition = dfa_72;
         }
         public String getDescription() {
-            return "16973:2: ( rule__XConstructorCall__Group_3__0 )?";
+            return "16975:2: ( rule__XConstructorCall__Group_3__0 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -82630,7 +82630,7 @@
             this.transition = dfa_58;
         }
         public String getDescription() {
-            return "17000:2: ( rule__XConstructorCall__Group_4__0 )?";
+            return "17002:2: ( rule__XConstructorCall__Group_4__0 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -82674,7 +82674,7 @@
             this.transition = dfa_59;
         }
         public String getDescription() {
-            return "17026:2: ( rule__XConstructorCall__ArgumentsAssignment_5 )?";
+            return "17028:2: ( rule__XConstructorCall__ArgumentsAssignment_5 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -82809,7 +82809,7 @@
             this.transition = dfa_78;
         }
         public String getDescription() {
-            return "17917:2: ( rule__XReturnExpression__ExpressionAssignment_2 )?";
+            return "17919:2: ( rule__XReturnExpression__ExpressionAssignment_2 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -83413,7 +83413,7 @@
             this.transition = dfa_85;
         }
         public String getDescription() {
-            return "19274:2: ( rule__JvmParameterizedTypeReference__Group_1__0 )?";
+            return "19276:2: ( rule__JvmParameterizedTypeReference__Group_1__0 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -83457,7 +83457,7 @@
             this.transition = dfa_85;
         }
         public String getDescription() {
-            return "19544:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )?";
+            return "19546:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
diff --git a/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/contentassist/IconNameTextApplier.java b/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/contentassist/IconNameTextApplier.java
index 8febbd1..2f18a94 100644
--- a/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/contentassist/IconNameTextApplier.java
+++ b/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/contentassist/IconNameTextApplier.java
@@ -2,10 +2,10 @@
  * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
  * 
  *  All rights reserved. This program and the accompanying materials
- *  are made available under the terms of the Eclipse Public License 2.0 
+ *  are made available under the terms of the Eclipse Public License 2.0
  *  which accompanies this distribution, and is available at
  *  https://www.eclipse.org/legal/epl-2.0/
- *
+ * 
  *  SPDX-License-Identifier: EPL-2.0
  * 
  *  Contributors:
diff --git a/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/contentassist/PerspectiveDslProposalProvider.java b/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/contentassist/PerspectiveDslProposalProvider.java
index 94b5ee9..7559f3c 100644
--- a/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/contentassist/PerspectiveDslProposalProvider.java
+++ b/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/contentassist/PerspectiveDslProposalProvider.java
@@ -2,10 +2,10 @@
  * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
  * 
  *  All rights reserved. This program and the accompanying materials
- *  are made available under the terms of the Eclipse Public License 2.0 
+ *  are made available under the terms of the Eclipse Public License 2.0
  *  which accompanies this distribution, and is available at
  *  https://www.eclipse.org/legal/epl-2.0/
- *
+ * 
  *  SPDX-License-Identifier: EPL-2.0
  * 
  *  Contributors:
diff --git a/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/converter/E4PerspectiveToDSLConverter.java b/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/converter/E4PerspectiveToDSLConverter.java
index 48846bf..0e23210 100644
--- a/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/converter/E4PerspectiveToDSLConverter.java
+++ b/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/converter/E4PerspectiveToDSLConverter.java
@@ -2,10 +2,10 @@
  * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
  * 
  *  All rights reserved. This program and the accompanying materials
- *  are made available under the terms of the Eclipse Public License 2.0 
+ *  are made available under the terms of the Eclipse Public License 2.0
  *  which accompanies this distribution, and is available at
  *  https://www.eclipse.org/legal/epl-2.0/
- *
+ * 
  *  SPDX-License-Identifier: EPL-2.0
  * 
  *  Contributors:
diff --git a/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/labeling/PerspectiveDslDescriptionLabelProvider.java b/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/labeling/PerspectiveDslDescriptionLabelProvider.java
index 8e3219e..155df34 100644
--- a/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/labeling/PerspectiveDslDescriptionLabelProvider.java
+++ b/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/labeling/PerspectiveDslDescriptionLabelProvider.java
@@ -2,10 +2,10 @@
  * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
  * 
  *  All rights reserved. This program and the accompanying materials
- *  are made available under the terms of the Eclipse Public License 2.0 
+ *  are made available under the terms of the Eclipse Public License 2.0
  *  which accompanies this distribution, and is available at
  *  https://www.eclipse.org/legal/epl-2.0/
- *
+ * 
  *  SPDX-License-Identifier: EPL-2.0
  * 
  *  Contributors:
diff --git a/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/labeling/PerspectiveDslLabelProvider.java b/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/labeling/PerspectiveDslLabelProvider.java
index 19d7368..e948a74 100644
--- a/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/labeling/PerspectiveDslLabelProvider.java
+++ b/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/labeling/PerspectiveDslLabelProvider.java
@@ -2,10 +2,10 @@
  * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
  * 
  *  All rights reserved. This program and the accompanying materials
- *  are made available under the terms of the Eclipse Public License 2.0 
+ *  are made available under the terms of the Eclipse Public License 2.0
  *  which accompanies this distribution, and is available at
  *  https://www.eclipse.org/legal/epl-2.0/
- *
+ * 
  *  SPDX-License-Identifier: EPL-2.0
  * 
  *  Contributors:
diff --git a/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/outline/PerspectiveDslOutlineTreeProvider.java b/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/outline/PerspectiveDslOutlineTreeProvider.java
index 234916c..ce7e826 100644
--- a/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/outline/PerspectiveDslOutlineTreeProvider.java
+++ b/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/outline/PerspectiveDslOutlineTreeProvider.java
@@ -2,10 +2,10 @@
  * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
  * 
  *  All rights reserved. This program and the accompanying materials
- *  are made available under the terms of the Eclipse Public License 2.0 
+ *  are made available under the terms of the Eclipse Public License 2.0
  *  which accompanies this distribution, and is available at
  *  https://www.eclipse.org/legal/epl-2.0/
- *
+ * 
  *  SPDX-License-Identifier: EPL-2.0
  * 
  *  Contributors:
diff --git a/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/quickfix/PerspectiveDslQuickfixProvider.java b/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/quickfix/PerspectiveDslQuickfixProvider.java
index 80fdd3c..e3ccd9b 100644
--- a/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/quickfix/PerspectiveDslQuickfixProvider.java
+++ b/org.eclipse.osbp.xtext.perspective.ui/xtend-gen/org/eclipse/osbp/xtext/perspective/ui/quickfix/PerspectiveDslQuickfixProvider.java
@@ -2,10 +2,10 @@
  * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
  * 
  *  All rights reserved. This program and the accompanying materials
- *  are made available under the terms of the Eclipse Public License 2.0 
+ *  are made available under the terms of the Eclipse Public License 2.0
  *  which accompanies this distribution, and is available at
  *  https://www.eclipse.org/legal/epl-2.0/
- *
+ * 
  *  SPDX-License-Identifier: EPL-2.0
  * 
  *  Contributors:
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/Perspective.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/Perspective.java
index 2d89a39..02e6c0f 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/Perspective.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/Perspective.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveBPMN.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveBPMN.java
index 0aff1a4..de7e034 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveBPMN.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveBPMN.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveBase.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveBase.java
index cabac19..e4ec0d9 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveBase.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveBase.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveChart.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveChart.java
index 0071183..f9763d3 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveChart.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveChart.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDashboard.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDashboard.java
index c7b6bff..dffe3f9 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDashboard.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDashboard.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDataInterchange.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDataInterchange.java
index 634b6a5..3611bb5 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDataInterchange.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDataInterchange.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
@@ -15,7 +15,7 @@
  */
 package org.eclipse.osbp.xtext.perspective;
 
-import org.eclipse.osbp.xtext.datainterchange.DataInterchangePackage;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeGroup;
 
 import org.eclipse.xtext.common.types.JvmTypeReference;
 
@@ -46,12 +46,12 @@
 	 * </p>
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Ref</em>' reference.
-	 * @see #setRef(DataInterchangePackage)
+	 * @see #setRef(DataInterchangeGroup)
 	 * @see org.eclipse.osbp.xtext.perspective.PerspectiveDslPackage#getPerspectiveDataInterchange_Ref()
 	 * @model
 	 * @generated
 	 */
-	DataInterchangePackage getRef();
+	DataInterchangeGroup getRef();
 
 	/**
 	 * Sets the value of the '{@link org.eclipse.osbp.xtext.perspective.PerspectiveDataInterchange#getRef <em>Ref</em>}' reference.
@@ -61,7 +61,7 @@
 	 * @see #getRef()
 	 * @generated
 	 */
-	void setRef(DataInterchangePackage value);
+	void setRef(DataInterchangeGroup value);
 
 	/**
 	 * Returns the value of the '<em><b>Ref Type Jvm</b></em>' containment reference.
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDialog.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDialog.java
index 15d7df3..930a866 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDialog.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDialog.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDslFactory.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDslFactory.java
index 2786576..f15951f 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDslFactory.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDslFactory.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDslPackage.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDslPackage.java
index f25aaae..3d06e11 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDslPackage.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDslPackage.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
@@ -39,7 +39,7 @@
  * <!-- end-user-doc -->
  * @see org.eclipse.osbp.xtext.perspective.PerspectiveDslFactory
  * @model kind="package"
- *        annotation="http://www.eclipse.org/emf/2002/GenModel fileExtensions='perspective' modelName='PerspectiveDsl' prefix='PerspectiveDsl' updateClasspath='false' loadInitialization='false' literalsInterface='true' copyrightText='Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)\r\n All rights reserved. This program and the accompanying materials \r\n are made available under the terms of the Eclipse Public License 2.0  \r\n which accompanies this distribution, and is available at \r\n https://www.eclipse.org/legal/epl-v2.0/ \r\n\r\nSPDX-License-Identifier: EPL-2.0 \r\n\r\n Based on ideas from Xtext, Xtend, Xcore\r\n  \r\n Contributors:  \r\n \t\tJoerg Riegel - Initial implementation \r\n ' basePackage='org.eclipse.osbp.xtext'"
+ *        annotation="http://www.eclipse.org/emf/2002/GenModel fileExtensions='perspective' modelName='PerspectiveDsl' prefix='PerspectiveDsl' updateClasspath='false' loadInitialization='false' literalsInterface='true' copyrightText='Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)\r\n All rights reserved. This program and the accompanying materials \r\n are made available under the terms of the Eclipse Public License 2.0  \r\n which accompanies this distribution, and is available at \r\n https://www.eclipse.org/legal/epl-2.0/ \r\n \r\n SPDX-License-Identifier: EPL-2.0 \r\n\r\n Based on ideas from Xtext, Xtend, Xcore\r\n  \r\n Contributors:  \r\n \t\tJoerg Riegel - Initial implementation \r\n ' basePackage='org.eclipse.osbp.xtext'"
  *        annotation="http://www.eclipse.org/emf/2002/Ecore rootPackage='perspectivedsl'"
  * @generated
  */
@@ -203,7 +203,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int PERSPECTIVE_PACKAGE___ERESOLVE_PROXY__OBJECT = OSBPTypesPackage.LPACKAGE___ERESOLVE_PROXY__INTERNALEOBJECT;
+	int PERSPECTIVE_PACKAGE___ERESOLVE_PROXY__INTERNALEOBJECT = OSBPTypesPackage.LPACKAGE___ERESOLVE_PROXY__INTERNALEOBJECT;
 
 	/**
 	 * The number of operations of the '<em>Perspective Package</em>' class.
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveElement.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveElement.java
index 4666f37..189fa55 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveElement.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveElement.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveGrid.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveGrid.java
index 9433d04..7d63ba1 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveGrid.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveGrid.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveKanban.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveKanban.java
index a229cc8..8308186 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveKanban.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveKanban.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveLazyResolver.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveLazyResolver.java
index 72f929a..18dfb55 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveLazyResolver.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveLazyResolver.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveModel.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveModel.java
index 8db9e50..13c50c6 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveModel.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveModel.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveOrganization.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveOrganization.java
index 622e6a8..402d193 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveOrganization.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveOrganization.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectivePackage.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectivePackage.java
index 1f2f258..9dfc599 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectivePackage.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectivePackage.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectivePart.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectivePart.java
index 329912b..1989648 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectivePart.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectivePart.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectivePartStack.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectivePartStack.java
index aa87cc3..70f12b8 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectivePartStack.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectivePartStack.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveReport.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveReport.java
index f36401c..9f70306 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveReport.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveReport.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveSashContainer.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveSashContainer.java
index 2d0b8c7..6d4ac36 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveSashContainer.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveSashContainer.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveSearch.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveSearch.java
index ceea502..648e92a 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveSearch.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveSearch.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveSelection.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveSelection.java
index 809a4e6..1a3ea5a 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveSelection.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveSelection.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveTable.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveTable.java
index 4628a87..0c2e56c 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveTable.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveTable.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveTitle.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveTitle.java
index 6cebb93..aae90ef 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveTitle.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveTitle.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveTopology.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveTopology.java
index 6b08727..556dcfe 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveTopology.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveTopology.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveView.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveView.java
index 859e4a2..7f9b7b4 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveView.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveView.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveWelcome.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveWelcome.java
index 92e490e..e810c11 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveWelcome.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/PerspectiveWelcome.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/SashOrientation.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/SashOrientation.java
index b85e6b7..967b36b 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/SashOrientation.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/SashOrientation.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveBPMNImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveBPMNImpl.java
index f1cbbde..69dceab 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveBPMNImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveBPMNImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveBaseImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveBaseImpl.java
index 2a4ffba..194af74 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveBaseImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveBaseImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveChartImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveChartImpl.java
index 619df30..af7265d 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveChartImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveChartImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDashboardImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDashboardImpl.java
index 64648d2..14e7c44 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDashboardImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDashboardImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDataInterchangeImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDataInterchangeImpl.java
index 1a66aad..d764e53 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDataInterchangeImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDataInterchangeImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
@@ -23,7 +23,7 @@
 
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 
-import org.eclipse.osbp.xtext.datainterchange.DataInterchangePackage;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeGroup;
 
 import org.eclipse.osbp.xtext.perspective.PerspectiveDataInterchange;
 import org.eclipse.osbp.xtext.perspective.PerspectiveDslPackage;
@@ -53,7 +53,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected DataInterchangePackage ref;
+	protected DataInterchangeGroup ref;
 
 	/**
 	 * The cached value of the '{@link #getRefTypeJvm() <em>Ref Type Jvm</em>}' containment reference.
@@ -89,10 +89,10 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public DataInterchangePackage getRef() {
+	public DataInterchangeGroup getRef() {
 		if (ref != null && ref.eIsProxy()) {
 			InternalEObject oldRef = (InternalEObject)ref;
-			ref = (DataInterchangePackage)eResolveProxy(oldRef);
+			ref = (DataInterchangeGroup)eResolveProxy(oldRef);
 			if (ref != oldRef) {
 				if (eNotificationRequired())
 					eNotify(new ENotificationImpl(this, Notification.RESOLVE, PerspectiveDslPackage.PERSPECTIVE_DATA_INTERCHANGE__REF, oldRef, ref));
@@ -106,7 +106,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public DataInterchangePackage basicGetRef() {
+	public DataInterchangeGroup basicGetRef() {
 		return ref;
 	}
 
@@ -115,8 +115,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public void setRef(DataInterchangePackage newRef) {
-		DataInterchangePackage oldRef = ref;
+	public void setRef(DataInterchangeGroup newRef) {
+		DataInterchangeGroup oldRef = ref;
 		ref = newRef;
 		if (eNotificationRequired())
 			eNotify(new ENotificationImpl(this, Notification.SET, PerspectiveDslPackage.PERSPECTIVE_DATA_INTERCHANGE__REF, oldRef, ref));
@@ -229,7 +229,7 @@
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case PerspectiveDslPackage.PERSPECTIVE_DATA_INTERCHANGE__REF:
-				setRef((DataInterchangePackage)newValue);
+				setRef((DataInterchangeGroup)newValue);
 				return;
 			case PerspectiveDslPackage.PERSPECTIVE_DATA_INTERCHANGE__REF_TYPE_JVM:
 				setRefTypeJvm((JvmTypeReference)newValue);
@@ -247,7 +247,7 @@
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case PerspectiveDslPackage.PERSPECTIVE_DATA_INTERCHANGE__REF:
-				setRef((DataInterchangePackage)null);
+				setRef((DataInterchangeGroup)null);
 				return;
 			case PerspectiveDslPackage.PERSPECTIVE_DATA_INTERCHANGE__REF_TYPE_JVM:
 				setRefTypeJvm((JvmTypeReference)null);
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDialogImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDialogImpl.java
index 261ca51..c0e645c 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDialogImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDialogImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDslFactoryImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDslFactoryImpl.java
index 9dbd748..288f889 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDslFactoryImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDslFactoryImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDslPackageImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDslPackageImpl.java
index ecead62..a1b0f93 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDslPackageImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveDslPackageImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
@@ -1326,7 +1326,7 @@
 		initEAttribute(getPerspectiveSearch_FilterCols(), theEcorePackage.getEInt(), "filterCols", null, 0, 1, PerspectiveSearch.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(perspectiveDataInterchangeEClass, PerspectiveDataInterchange.class, "PerspectiveDataInterchange", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getPerspectiveDataInterchange_Ref(), theDataDSLPackage.getDataInterchangePackage(), null, "ref", null, 0, 1, PerspectiveDataInterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getPerspectiveDataInterchange_Ref(), theDataDSLPackage.getDataInterchangeGroup(), null, "ref", null, 0, 1, PerspectiveDataInterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getPerspectiveDataInterchange_RefTypeJvm(), theTypesPackage.getJvmTypeReference(), null, "refTypeJvm", null, 0, 1, PerspectiveDataInterchange.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(perspectiveTitleEClass, PerspectiveTitle.class, "PerspectiveTitle", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveElementImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveElementImpl.java
index ea8e184..f8ccde2 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveElementImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveElementImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveGridImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveGridImpl.java
index 73fff34..d16a039 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveGridImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveGridImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveImpl.java
index 0bd02c0..c184685 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveKanbanImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveKanbanImpl.java
index 0ccabfa..8ea36e5 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveKanbanImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveKanbanImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveLazyResolverImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveLazyResolverImpl.java
index 90ac89c..5d4d21c 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveLazyResolverImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveLazyResolverImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveModelImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveModelImpl.java
index fe903d1..612ac91 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveModelImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveModelImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveOrganizationImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveOrganizationImpl.java
index 687f7c6..9035466 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveOrganizationImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveOrganizationImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectivePackageImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectivePackageImpl.java
index 64070be..fd15492 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectivePackageImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectivePackageImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectivePartImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectivePartImpl.java
index f038fbe..7d5d575 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectivePartImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectivePartImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectivePartStackImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectivePartStackImpl.java
index 31921f6..c912f65 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectivePartStackImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectivePartStackImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveReportImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveReportImpl.java
index 00d5f4f..361ef95 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveReportImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveReportImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveSashContainerImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveSashContainerImpl.java
index 0772fa5..2e959ea 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveSashContainerImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveSashContainerImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveSearchImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveSearchImpl.java
index 0f31151..571fd8d 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveSearchImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveSearchImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveSelectionImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveSelectionImpl.java
index a41ebc6..c6c5fec 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveSelectionImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveSelectionImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveTableImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveTableImpl.java
index b1da528..08ff57f 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveTableImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveTableImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveTitleImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveTitleImpl.java
index dae7be5..e8e2a33 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveTitleImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveTitleImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveTopologyImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveTopologyImpl.java
index edddfaa..3cd754b 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveTopologyImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveTopologyImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveWelcomeImpl.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveWelcomeImpl.java
index e9ca9bd..565acd8 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveWelcomeImpl.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/impl/PerspectiveWelcomeImpl.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/util/PerspectiveDslAdapterFactory.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/util/PerspectiveDslAdapterFactory.java
index 2acee37..b4cbda8 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/util/PerspectiveDslAdapterFactory.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/util/PerspectiveDslAdapterFactory.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/util/PerspectiveDslSwitch.java b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/util/PerspectiveDslSwitch.java
index dc2e669..ca22010 100644
--- a/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/util/PerspectiveDslSwitch.java
+++ b/org.eclipse.osbp.xtext.perspective/emf-gen/org/eclipse/osbp/xtext/perspective/util/PerspectiveDslSwitch.java
@@ -4,7 +4,7 @@
  *  are made available under the terms of the Eclipse Public License 2.0  
  *  which accompanies this distribution, and is available at 
  *  https://www.eclipse.org/legal/epl-2.0/ 
- * 
+ *  
  *  SPDX-License-Identifier: EPL-2.0 
  * 
  *  Based on ideas from Xtext, Xtend, Xcore
diff --git a/org.eclipse.osbp.xtext.perspective/model/PerspectiveDsl.xcore b/org.eclipse.osbp.xtext.perspective/model/PerspectiveDsl.xcore
index 3f8415a..7e72fda 100644
--- a/org.eclipse.osbp.xtext.perspective/model/PerspectiveDsl.xcore
+++ b/org.eclipse.osbp.xtext.perspective/model/PerspectiveDsl.xcore
@@ -29,7 +29,7 @@
 import org.eclipse.osbp.xtext.reportdsl.Report
 import org.eclipse.osbp.xtext.table.Table
 import org.eclipse.osbp.xtext.topologydsl.Topology
-import org.eclipse.osbp.xtext.datainterchange.DataInterchangePackage
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeGroup
 import org.eclipse.osbp.xtext.action.ActionToolbar
 import org.eclipse.osbp.dsl.semantic.dto.LDto
 import org.eclipse.emf.ecore.EObject
@@ -157,7 +157,7 @@
 }
 
 class PerspectiveDataInterchange extends PerspectiveView {
-	refers DataInterchangePackage ref
+	refers DataInterchangeGroup ref
 	contains resolving  JvmTypeReference refTypeJvm
 }
 
diff --git a/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDsl.xtextbin b/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDsl.xtextbin
index 8a74297..8e9d081 100644
--- a/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDsl.xtextbin
+++ b/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/PerspectiveDsl.xtextbin
Binary files differ
diff --git a/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/parser/antlr/internal/InternalPerspectiveDsl.g b/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/parser/antlr/internal/InternalPerspectiveDsl.g
index 04cf9c1..faa3bdb 100644
--- a/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/parser/antlr/internal/InternalPerspectiveDsl.g
+++ b/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/parser/antlr/internal/InternalPerspectiveDsl.g
@@ -3,9 +3,11 @@
  *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
  *                                                                            
  *  All rights reserved. This program and the accompanying materials           
- *  are made available under the terms of the Eclipse Public License v1.0       
+ *  are made available under the terms of the Eclipse Public License 2.0        
  *  which accompanies this distribution, and is available at                  
- *  http://www.eclipse.org/legal/epl-v10.html                                 
+ *  https://www.eclipse.org/legal/epl-2.0/                                 
+ *                                 
+ *  SPDX-License-Identifier: EPL-2.0                                 
  *                                                                            
  *  Contributors:                                                      
  * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
@@ -1929,7 +1931,7 @@
 				}
 				otherlv_2=RULE_ID
 				{
-					newLeafNode(otherlv_2, grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangePackageCrossReference_2_0());
+					newLeafNode(otherlv_2, grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangeGroupCrossReference_2_0());
 				}
 			)
 		)
diff --git a/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/parser/antlr/internal/InternalPerspectiveDslLexer.java b/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/parser/antlr/internal/InternalPerspectiveDslLexer.java
index e5d6661..d82ac46 100644
--- a/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/parser/antlr/internal/InternalPerspectiveDslLexer.java
+++ b/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/parser/antlr/internal/InternalPerspectiveDslLexer.java
@@ -2525,10 +2525,10 @@
         try {
             int _type = RULE_HEX;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalPerspectiveDsl.g:8971:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
-            // InternalPerspectiveDsl.g:8971:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            // InternalPerspectiveDsl.g:8973:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
+            // InternalPerspectiveDsl.g:8973:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
             {
-            // InternalPerspectiveDsl.g:8971:12: ( '0x' | '0X' )
+            // InternalPerspectiveDsl.g:8973:12: ( '0x' | '0X' )
             int alt1=2;
             int LA1_0 = input.LA(1);
 
@@ -2556,7 +2556,7 @@
             }
             switch (alt1) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:8971:13: '0x'
+                    // InternalPerspectiveDsl.g:8973:13: '0x'
                     {
                     match("0x"); 
 
@@ -2564,7 +2564,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:8971:18: '0X'
+                    // InternalPerspectiveDsl.g:8973:18: '0X'
                     {
                     match("0X"); 
 
@@ -2574,7 +2574,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:8971:24: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+
+            // InternalPerspectiveDsl.g:8973:24: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+
             int cnt2=0;
             loop2:
             do {
@@ -2612,7 +2612,7 @@
                 cnt2++;
             } while (true);
 
-            // InternalPerspectiveDsl.g:8971:58: ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            // InternalPerspectiveDsl.g:8973:58: ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
             int alt4=2;
             int LA4_0 = input.LA(1);
 
@@ -2621,10 +2621,10 @@
             }
             switch (alt4) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:8971:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    // InternalPerspectiveDsl.g:8973:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
                     {
                     match('#'); 
-                    // InternalPerspectiveDsl.g:8971:63: ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    // InternalPerspectiveDsl.g:8973:63: ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
                     int alt3=2;
                     int LA3_0 = input.LA(1);
 
@@ -2642,7 +2642,7 @@
                     }
                     switch (alt3) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:8971:64: ( 'b' | 'B' ) ( 'i' | 'I' )
+                            // InternalPerspectiveDsl.g:8973:64: ( 'b' | 'B' ) ( 'i' | 'I' )
                             {
                             if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
                                 input.consume();
@@ -2666,7 +2666,7 @@
                             }
                             break;
                         case 2 :
-                            // InternalPerspectiveDsl.g:8971:84: ( 'l' | 'L' )
+                            // InternalPerspectiveDsl.g:8973:84: ( 'l' | 'L' )
                             {
                             if ( input.LA(1)=='L'||input.LA(1)=='l' ) {
                                 input.consume();
@@ -2705,11 +2705,11 @@
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalPerspectiveDsl.g:8973:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
-            // InternalPerspectiveDsl.g:8973:12: '0' .. '9' ( '0' .. '9' | '_' )*
+            // InternalPerspectiveDsl.g:8975:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
+            // InternalPerspectiveDsl.g:8975:12: '0' .. '9' ( '0' .. '9' | '_' )*
             {
             matchRange('0','9'); 
-            // InternalPerspectiveDsl.g:8973:21: ( '0' .. '9' | '_' )*
+            // InternalPerspectiveDsl.g:8975:21: ( '0' .. '9' | '_' )*
             loop5:
             do {
                 int alt5=2;
@@ -2758,11 +2758,11 @@
         try {
             int _type = RULE_DECIMAL;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalPerspectiveDsl.g:8975:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
-            // InternalPerspectiveDsl.g:8975:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            // InternalPerspectiveDsl.g:8977:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
+            // InternalPerspectiveDsl.g:8977:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
             {
             mRULE_INT(); 
-            // InternalPerspectiveDsl.g:8975:25: ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )?
+            // InternalPerspectiveDsl.g:8977:25: ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )?
             int alt7=2;
             int LA7_0 = input.LA(1);
 
@@ -2771,7 +2771,7 @@
             }
             switch (alt7) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:8975:26: ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT
+                    // InternalPerspectiveDsl.g:8977:26: ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT
                     {
                     if ( input.LA(1)=='E'||input.LA(1)=='e' ) {
                         input.consume();
@@ -2782,7 +2782,7 @@
                         recover(mse);
                         throw mse;}
 
-                    // InternalPerspectiveDsl.g:8975:36: ( '+' | '-' )?
+                    // InternalPerspectiveDsl.g:8977:36: ( '+' | '-' )?
                     int alt6=2;
                     int LA6_0 = input.LA(1);
 
@@ -2815,7 +2815,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:8975:58: ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            // InternalPerspectiveDsl.g:8977:58: ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
             int alt8=3;
             int LA8_0 = input.LA(1);
 
@@ -2827,7 +2827,7 @@
             }
             switch (alt8) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:8975:59: ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' )
+                    // InternalPerspectiveDsl.g:8977:59: ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' )
                     {
                     if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
                         input.consume();
@@ -2851,7 +2851,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:8975:87: ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' )
+                    // InternalPerspectiveDsl.g:8977:87: ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' )
                     {
                     if ( input.LA(1)=='D'||input.LA(1)=='F'||input.LA(1)=='L'||input.LA(1)=='d'||input.LA(1)=='f'||input.LA(1)=='l' ) {
                         input.consume();
@@ -2884,10 +2884,10 @@
         try {
             int _type = RULE_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalPerspectiveDsl.g:8977:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
-            // InternalPerspectiveDsl.g:8977:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            // InternalPerspectiveDsl.g:8979:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
+            // InternalPerspectiveDsl.g:8979:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
             {
-            // InternalPerspectiveDsl.g:8977:11: ( '^' )?
+            // InternalPerspectiveDsl.g:8979:11: ( '^' )?
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -2896,7 +2896,7 @@
             }
             switch (alt9) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:8977:11: '^'
+                    // InternalPerspectiveDsl.g:8979:11: '^'
                     {
                     match('^'); 
 
@@ -2914,7 +2914,7 @@
                 recover(mse);
                 throw mse;}
 
-            // InternalPerspectiveDsl.g:8977:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            // InternalPerspectiveDsl.g:8979:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
             loop10:
             do {
                 int alt10=2;
@@ -2963,10 +2963,10 @@
         try {
             int _type = RULE_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalPerspectiveDsl.g:8979:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
-            // InternalPerspectiveDsl.g:8979:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            // InternalPerspectiveDsl.g:8981:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
+            // InternalPerspectiveDsl.g:8981:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
             {
-            // InternalPerspectiveDsl.g:8979:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            // InternalPerspectiveDsl.g:8981:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
             int alt15=2;
             int LA15_0 = input.LA(1);
 
@@ -2984,10 +2984,10 @@
             }
             switch (alt15) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:8979:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
+                    // InternalPerspectiveDsl.g:8981:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
                     {
                     match('\"'); 
-                    // InternalPerspectiveDsl.g:8979:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+                    // InternalPerspectiveDsl.g:8981:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
                     loop11:
                     do {
                         int alt11=3;
@@ -3003,7 +3003,7 @@
 
                         switch (alt11) {
                     	case 1 :
-                    	    // InternalPerspectiveDsl.g:8979:21: '\\\\' .
+                    	    // InternalPerspectiveDsl.g:8981:21: '\\\\' .
                     	    {
                     	    match('\\'); 
                     	    matchAny(); 
@@ -3011,7 +3011,7 @@
                     	    }
                     	    break;
                     	case 2 :
-                    	    // InternalPerspectiveDsl.g:8979:28: ~ ( ( '\\\\' | '\"' ) )
+                    	    // InternalPerspectiveDsl.g:8981:28: ~ ( ( '\\\\' | '\"' ) )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                     	        input.consume();
@@ -3031,7 +3031,7 @@
                         }
                     } while (true);
 
-                    // InternalPerspectiveDsl.g:8979:44: ( '\"' )?
+                    // InternalPerspectiveDsl.g:8981:44: ( '\"' )?
                     int alt12=2;
                     int LA12_0 = input.LA(1);
 
@@ -3040,7 +3040,7 @@
                     }
                     switch (alt12) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:8979:44: '\"'
+                            // InternalPerspectiveDsl.g:8981:44: '\"'
                             {
                             match('\"'); 
 
@@ -3053,10 +3053,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:8979:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
+                    // InternalPerspectiveDsl.g:8981:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
                     {
                     match('\''); 
-                    // InternalPerspectiveDsl.g:8979:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+                    // InternalPerspectiveDsl.g:8981:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
                     loop13:
                     do {
                         int alt13=3;
@@ -3072,7 +3072,7 @@
 
                         switch (alt13) {
                     	case 1 :
-                    	    // InternalPerspectiveDsl.g:8979:55: '\\\\' .
+                    	    // InternalPerspectiveDsl.g:8981:55: '\\\\' .
                     	    {
                     	    match('\\'); 
                     	    matchAny(); 
@@ -3080,7 +3080,7 @@
                     	    }
                     	    break;
                     	case 2 :
-                    	    // InternalPerspectiveDsl.g:8979:62: ~ ( ( '\\\\' | '\\'' ) )
+                    	    // InternalPerspectiveDsl.g:8981:62: ~ ( ( '\\\\' | '\\'' ) )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                     	        input.consume();
@@ -3100,7 +3100,7 @@
                         }
                     } while (true);
 
-                    // InternalPerspectiveDsl.g:8979:79: ( '\\'' )?
+                    // InternalPerspectiveDsl.g:8981:79: ( '\\'' )?
                     int alt14=2;
                     int LA14_0 = input.LA(1);
 
@@ -3109,7 +3109,7 @@
                     }
                     switch (alt14) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:8979:79: '\\''
+                            // InternalPerspectiveDsl.g:8981:79: '\\''
                             {
                             match('\''); 
 
@@ -3140,12 +3140,12 @@
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalPerspectiveDsl.g:8981:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // InternalPerspectiveDsl.g:8981:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // InternalPerspectiveDsl.g:8983:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalPerspectiveDsl.g:8983:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*"); 
 
-            // InternalPerspectiveDsl.g:8981:24: ( options {greedy=false; } : . )*
+            // InternalPerspectiveDsl.g:8983:24: ( options {greedy=false; } : . )*
             loop16:
             do {
                 int alt16=2;
@@ -3170,7 +3170,7 @@
 
                 switch (alt16) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:8981:52: .
+            	    // InternalPerspectiveDsl.g:8983:52: .
             	    {
             	    matchAny(); 
 
@@ -3200,12 +3200,12 @@
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalPerspectiveDsl.g:8983:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // InternalPerspectiveDsl.g:8983:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // InternalPerspectiveDsl.g:8985:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalPerspectiveDsl.g:8985:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("//"); 
 
-            // InternalPerspectiveDsl.g:8983:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // InternalPerspectiveDsl.g:8985:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop17:
             do {
                 int alt17=2;
@@ -3218,7 +3218,7 @@
 
                 switch (alt17) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:8983:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // InternalPerspectiveDsl.g:8985:24: ~ ( ( '\\n' | '\\r' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -3238,7 +3238,7 @@
                 }
             } while (true);
 
-            // InternalPerspectiveDsl.g:8983:40: ( ( '\\r' )? '\\n' )?
+            // InternalPerspectiveDsl.g:8985:40: ( ( '\\r' )? '\\n' )?
             int alt19=2;
             int LA19_0 = input.LA(1);
 
@@ -3247,9 +3247,9 @@
             }
             switch (alt19) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:8983:41: ( '\\r' )? '\\n'
+                    // InternalPerspectiveDsl.g:8985:41: ( '\\r' )? '\\n'
                     {
-                    // InternalPerspectiveDsl.g:8983:41: ( '\\r' )?
+                    // InternalPerspectiveDsl.g:8985:41: ( '\\r' )?
                     int alt18=2;
                     int LA18_0 = input.LA(1);
 
@@ -3258,7 +3258,7 @@
                     }
                     switch (alt18) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:8983:41: '\\r'
+                            // InternalPerspectiveDsl.g:8985:41: '\\r'
                             {
                             match('\r'); 
 
@@ -3290,10 +3290,10 @@
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalPerspectiveDsl.g:8985:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // InternalPerspectiveDsl.g:8985:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalPerspectiveDsl.g:8987:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalPerspectiveDsl.g:8987:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // InternalPerspectiveDsl.g:8985:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalPerspectiveDsl.g:8987:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt20=0;
             loop20:
             do {
@@ -3347,8 +3347,8 @@
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalPerspectiveDsl.g:8987:16: ( . )
-            // InternalPerspectiveDsl.g:8987:18: .
+            // InternalPerspectiveDsl.g:8989:16: ( . )
+            // InternalPerspectiveDsl.g:8989:18: .
             {
             matchAny(); 
 
diff --git a/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/parser/antlr/internal/InternalPerspectiveDslParser.java b/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/parser/antlr/internal/InternalPerspectiveDslParser.java
index 780b81e..314e4a0 100644
--- a/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/parser/antlr/internal/InternalPerspectiveDslParser.java
+++ b/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/parser/antlr/internal/InternalPerspectiveDslParser.java
@@ -207,7 +207,7 @@
 
 
     // $ANTLR start "entryRulePerspectiveModel"
-    // InternalPerspectiveDsl.g:78:1: entryRulePerspectiveModel returns [EObject current=null] : iv_rulePerspectiveModel= rulePerspectiveModel EOF ;
+    // InternalPerspectiveDsl.g:80:1: entryRulePerspectiveModel returns [EObject current=null] : iv_rulePerspectiveModel= rulePerspectiveModel EOF ;
     public final EObject entryRulePerspectiveModel() throws RecognitionException {
         EObject current = null;
 
@@ -215,8 +215,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:78:57: (iv_rulePerspectiveModel= rulePerspectiveModel EOF )
-            // InternalPerspectiveDsl.g:79:2: iv_rulePerspectiveModel= rulePerspectiveModel EOF
+            // InternalPerspectiveDsl.g:80:57: (iv_rulePerspectiveModel= rulePerspectiveModel EOF )
+            // InternalPerspectiveDsl.g:81:2: iv_rulePerspectiveModel= rulePerspectiveModel EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveModelRule()); 
@@ -247,7 +247,7 @@
 
 
     // $ANTLR start "rulePerspectiveModel"
-    // InternalPerspectiveDsl.g:85:1: rulePerspectiveModel returns [EObject current=null] : ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= rulePerspectivePackage ) )* ) ;
+    // InternalPerspectiveDsl.g:87:1: rulePerspectiveModel returns [EObject current=null] : ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= rulePerspectivePackage ) )* ) ;
     public final EObject rulePerspectiveModel() throws RecognitionException {
         EObject current = null;
 
@@ -260,13 +260,13 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:91:2: ( ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= rulePerspectivePackage ) )* ) )
-            // InternalPerspectiveDsl.g:92:2: ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= rulePerspectivePackage ) )* )
+            // InternalPerspectiveDsl.g:93:2: ( ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= rulePerspectivePackage ) )* ) )
+            // InternalPerspectiveDsl.g:94:2: ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= rulePerspectivePackage ) )* )
             {
-            // InternalPerspectiveDsl.g:92:2: ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= rulePerspectivePackage ) )* )
-            // InternalPerspectiveDsl.g:93:3: ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= rulePerspectivePackage ) )*
+            // InternalPerspectiveDsl.g:94:2: ( ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= rulePerspectivePackage ) )* )
+            // InternalPerspectiveDsl.g:95:3: ( (lv_importSection_0_0= ruleXImportSection ) )? ( (lv_packages_1_0= rulePerspectivePackage ) )*
             {
-            // InternalPerspectiveDsl.g:93:3: ( (lv_importSection_0_0= ruleXImportSection ) )?
+            // InternalPerspectiveDsl.g:95:3: ( (lv_importSection_0_0= ruleXImportSection ) )?
             int alt1=2;
             int LA1_0 = input.LA(1);
 
@@ -275,10 +275,10 @@
             }
             switch (alt1) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:94:4: (lv_importSection_0_0= ruleXImportSection )
+                    // InternalPerspectiveDsl.g:96:4: (lv_importSection_0_0= ruleXImportSection )
                     {
-                    // InternalPerspectiveDsl.g:94:4: (lv_importSection_0_0= ruleXImportSection )
-                    // InternalPerspectiveDsl.g:95:5: lv_importSection_0_0= ruleXImportSection
+                    // InternalPerspectiveDsl.g:96:4: (lv_importSection_0_0= ruleXImportSection )
+                    // InternalPerspectiveDsl.g:97:5: lv_importSection_0_0= ruleXImportSection
                     {
                     if ( state.backtracking==0 ) {
 
@@ -312,7 +312,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:112:3: ( (lv_packages_1_0= rulePerspectivePackage ) )*
+            // InternalPerspectiveDsl.g:114:3: ( (lv_packages_1_0= rulePerspectivePackage ) )*
             loop2:
             do {
                 int alt2=2;
@@ -325,10 +325,10 @@
 
                 switch (alt2) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:113:4: (lv_packages_1_0= rulePerspectivePackage )
+            	    // InternalPerspectiveDsl.g:115:4: (lv_packages_1_0= rulePerspectivePackage )
             	    {
-            	    // InternalPerspectiveDsl.g:113:4: (lv_packages_1_0= rulePerspectivePackage )
-            	    // InternalPerspectiveDsl.g:114:5: lv_packages_1_0= rulePerspectivePackage
+            	    // InternalPerspectiveDsl.g:115:4: (lv_packages_1_0= rulePerspectivePackage )
+            	    // InternalPerspectiveDsl.g:116:5: lv_packages_1_0= rulePerspectivePackage
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -390,7 +390,7 @@
 
 
     // $ANTLR start "entryRulePerspectivePackage"
-    // InternalPerspectiveDsl.g:135:1: entryRulePerspectivePackage returns [EObject current=null] : iv_rulePerspectivePackage= rulePerspectivePackage EOF ;
+    // InternalPerspectiveDsl.g:137:1: entryRulePerspectivePackage returns [EObject current=null] : iv_rulePerspectivePackage= rulePerspectivePackage EOF ;
     public final EObject entryRulePerspectivePackage() throws RecognitionException {
         EObject current = null;
 
@@ -398,8 +398,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:135:59: (iv_rulePerspectivePackage= rulePerspectivePackage EOF )
-            // InternalPerspectiveDsl.g:136:2: iv_rulePerspectivePackage= rulePerspectivePackage EOF
+            // InternalPerspectiveDsl.g:137:59: (iv_rulePerspectivePackage= rulePerspectivePackage EOF )
+            // InternalPerspectiveDsl.g:138:2: iv_rulePerspectivePackage= rulePerspectivePackage EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectivePackageRule()); 
@@ -430,7 +430,7 @@
 
 
     // $ANTLR start "rulePerspectivePackage"
-    // InternalPerspectiveDsl.g:142:1: rulePerspectivePackage returns [EObject current=null] : ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_perspectives_4_0= rulePerspective ) )* otherlv_5= '}' )? ) ;
+    // InternalPerspectiveDsl.g:144:1: rulePerspectivePackage returns [EObject current=null] : ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_perspectives_4_0= rulePerspective ) )* otherlv_5= '}' )? ) ;
     public final EObject rulePerspectivePackage() throws RecognitionException {
         EObject current = null;
 
@@ -446,14 +446,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:148:2: ( ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_perspectives_4_0= rulePerspective ) )* otherlv_5= '}' )? ) )
-            // InternalPerspectiveDsl.g:149:2: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_perspectives_4_0= rulePerspective ) )* otherlv_5= '}' )? )
+            // InternalPerspectiveDsl.g:150:2: ( ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_perspectives_4_0= rulePerspective ) )* otherlv_5= '}' )? ) )
+            // InternalPerspectiveDsl.g:151:2: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_perspectives_4_0= rulePerspective ) )* otherlv_5= '}' )? )
             {
-            // InternalPerspectiveDsl.g:149:2: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_perspectives_4_0= rulePerspective ) )* otherlv_5= '}' )? )
-            // InternalPerspectiveDsl.g:150:3: () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_perspectives_4_0= rulePerspective ) )* otherlv_5= '}' )?
+            // InternalPerspectiveDsl.g:151:2: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_perspectives_4_0= rulePerspective ) )* otherlv_5= '}' )? )
+            // InternalPerspectiveDsl.g:152:3: () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) (otherlv_3= '{' ( (lv_perspectives_4_0= rulePerspective ) )* otherlv_5= '}' )?
             {
-            // InternalPerspectiveDsl.g:150:3: ()
-            // InternalPerspectiveDsl.g:151:4: 
+            // InternalPerspectiveDsl.g:152:3: ()
+            // InternalPerspectiveDsl.g:153:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -471,11 +471,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getPerspectivePackageAccess().getPackageKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:161:3: ( (lv_name_2_0= ruleQualifiedName ) )
-            // InternalPerspectiveDsl.g:162:4: (lv_name_2_0= ruleQualifiedName )
+            // InternalPerspectiveDsl.g:163:3: ( (lv_name_2_0= ruleQualifiedName ) )
+            // InternalPerspectiveDsl.g:164:4: (lv_name_2_0= ruleQualifiedName )
             {
-            // InternalPerspectiveDsl.g:162:4: (lv_name_2_0= ruleQualifiedName )
-            // InternalPerspectiveDsl.g:163:5: lv_name_2_0= ruleQualifiedName
+            // InternalPerspectiveDsl.g:164:4: (lv_name_2_0= ruleQualifiedName )
+            // InternalPerspectiveDsl.g:165:5: lv_name_2_0= ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
 
@@ -506,7 +506,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:180:3: (otherlv_3= '{' ( (lv_perspectives_4_0= rulePerspective ) )* otherlv_5= '}' )?
+            // InternalPerspectiveDsl.g:182:3: (otherlv_3= '{' ( (lv_perspectives_4_0= rulePerspective ) )* otherlv_5= '}' )?
             int alt4=2;
             int LA4_0 = input.LA(1);
 
@@ -515,7 +515,7 @@
             }
             switch (alt4) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:181:4: otherlv_3= '{' ( (lv_perspectives_4_0= rulePerspective ) )* otherlv_5= '}'
+                    // InternalPerspectiveDsl.g:183:4: otherlv_3= '{' ( (lv_perspectives_4_0= rulePerspective ) )* otherlv_5= '}'
                     {
                     otherlv_3=(Token)match(input,14,FOLLOW_6); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -523,7 +523,7 @@
                       				newLeafNode(otherlv_3, grammarAccess.getPerspectivePackageAccess().getLeftCurlyBracketKeyword_3_0());
                       			
                     }
-                    // InternalPerspectiveDsl.g:185:4: ( (lv_perspectives_4_0= rulePerspective ) )*
+                    // InternalPerspectiveDsl.g:187:4: ( (lv_perspectives_4_0= rulePerspective ) )*
                     loop3:
                     do {
                         int alt3=2;
@@ -536,10 +536,10 @@
 
                         switch (alt3) {
                     	case 1 :
-                    	    // InternalPerspectiveDsl.g:186:5: (lv_perspectives_4_0= rulePerspective )
+                    	    // InternalPerspectiveDsl.g:188:5: (lv_perspectives_4_0= rulePerspective )
                     	    {
-                    	    // InternalPerspectiveDsl.g:186:5: (lv_perspectives_4_0= rulePerspective )
-                    	    // InternalPerspectiveDsl.g:187:6: lv_perspectives_4_0= rulePerspective
+                    	    // InternalPerspectiveDsl.g:188:5: (lv_perspectives_4_0= rulePerspective )
+                    	    // InternalPerspectiveDsl.g:189:6: lv_perspectives_4_0= rulePerspective
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -613,7 +613,7 @@
 
 
     // $ANTLR start "entryRulePerspective"
-    // InternalPerspectiveDsl.g:213:1: entryRulePerspective returns [EObject current=null] : iv_rulePerspective= rulePerspective EOF ;
+    // InternalPerspectiveDsl.g:215:1: entryRulePerspective returns [EObject current=null] : iv_rulePerspective= rulePerspective EOF ;
     public final EObject entryRulePerspective() throws RecognitionException {
         EObject current = null;
 
@@ -621,8 +621,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:213:52: (iv_rulePerspective= rulePerspective EOF )
-            // InternalPerspectiveDsl.g:214:2: iv_rulePerspective= rulePerspective EOF
+            // InternalPerspectiveDsl.g:215:52: (iv_rulePerspective= rulePerspective EOF )
+            // InternalPerspectiveDsl.g:216:2: iv_rulePerspective= rulePerspective EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveRule()); 
@@ -653,7 +653,7 @@
 
 
     // $ANTLR start "rulePerspective"
-    // InternalPerspectiveDsl.g:220:1: rulePerspective returns [EObject current=null] : ( () otherlv_1= 'perspective' ( (lv_name_2_0= ruleTRANSLATABLEID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_5= 'process' ( (otherlv_6= RULE_ID ) ) otherlv_7= 'usertask' ( (otherlv_8= RULE_ID ) ) )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* ) ) ) otherlv_16= '{' ( (lv_elements_17_0= rulePerspectiveElement ) )* otherlv_18= '}' ) ;
+    // InternalPerspectiveDsl.g:222:1: rulePerspective returns [EObject current=null] : ( () otherlv_1= 'perspective' ( (lv_name_2_0= ruleTRANSLATABLEID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_5= 'process' ( (otherlv_6= RULE_ID ) ) otherlv_7= 'usertask' ( (otherlv_8= RULE_ID ) ) )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* ) ) ) otherlv_16= '{' ( (lv_elements_17_0= rulePerspectiveElement ) )* otherlv_18= '}' ) ;
     public final EObject rulePerspective() throws RecognitionException {
         EObject current = null;
 
@@ -682,14 +682,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:226:2: ( ( () otherlv_1= 'perspective' ( (lv_name_2_0= ruleTRANSLATABLEID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_5= 'process' ( (otherlv_6= RULE_ID ) ) otherlv_7= 'usertask' ( (otherlv_8= RULE_ID ) ) )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* ) ) ) otherlv_16= '{' ( (lv_elements_17_0= rulePerspectiveElement ) )* otherlv_18= '}' ) )
-            // InternalPerspectiveDsl.g:227:2: ( () otherlv_1= 'perspective' ( (lv_name_2_0= ruleTRANSLATABLEID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_5= 'process' ( (otherlv_6= RULE_ID ) ) otherlv_7= 'usertask' ( (otherlv_8= RULE_ID ) ) )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* ) ) ) otherlv_16= '{' ( (lv_elements_17_0= rulePerspectiveElement ) )* otherlv_18= '}' )
+            // InternalPerspectiveDsl.g:228:2: ( ( () otherlv_1= 'perspective' ( (lv_name_2_0= ruleTRANSLATABLEID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_5= 'process' ( (otherlv_6= RULE_ID ) ) otherlv_7= 'usertask' ( (otherlv_8= RULE_ID ) ) )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* ) ) ) otherlv_16= '{' ( (lv_elements_17_0= rulePerspectiveElement ) )* otherlv_18= '}' ) )
+            // InternalPerspectiveDsl.g:229:2: ( () otherlv_1= 'perspective' ( (lv_name_2_0= ruleTRANSLATABLEID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_5= 'process' ( (otherlv_6= RULE_ID ) ) otherlv_7= 'usertask' ( (otherlv_8= RULE_ID ) ) )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* ) ) ) otherlv_16= '{' ( (lv_elements_17_0= rulePerspectiveElement ) )* otherlv_18= '}' )
             {
-            // InternalPerspectiveDsl.g:227:2: ( () otherlv_1= 'perspective' ( (lv_name_2_0= ruleTRANSLATABLEID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_5= 'process' ( (otherlv_6= RULE_ID ) ) otherlv_7= 'usertask' ( (otherlv_8= RULE_ID ) ) )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* ) ) ) otherlv_16= '{' ( (lv_elements_17_0= rulePerspectiveElement ) )* otherlv_18= '}' )
-            // InternalPerspectiveDsl.g:228:3: () otherlv_1= 'perspective' ( (lv_name_2_0= ruleTRANSLATABLEID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_5= 'process' ( (otherlv_6= RULE_ID ) ) otherlv_7= 'usertask' ( (otherlv_8= RULE_ID ) ) )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* ) ) ) otherlv_16= '{' ( (lv_elements_17_0= rulePerspectiveElement ) )* otherlv_18= '}'
+            // InternalPerspectiveDsl.g:229:2: ( () otherlv_1= 'perspective' ( (lv_name_2_0= ruleTRANSLATABLEID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_5= 'process' ( (otherlv_6= RULE_ID ) ) otherlv_7= 'usertask' ( (otherlv_8= RULE_ID ) ) )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* ) ) ) otherlv_16= '{' ( (lv_elements_17_0= rulePerspectiveElement ) )* otherlv_18= '}' )
+            // InternalPerspectiveDsl.g:230:3: () otherlv_1= 'perspective' ( (lv_name_2_0= ruleTRANSLATABLEID ) ) ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) ) )? (otherlv_5= 'process' ( (otherlv_6= RULE_ID ) ) otherlv_7= 'usertask' ( (otherlv_8= RULE_ID ) ) )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* ) ) ) otherlv_16= '{' ( (lv_elements_17_0= rulePerspectiveElement ) )* otherlv_18= '}'
             {
-            // InternalPerspectiveDsl.g:228:3: ()
-            // InternalPerspectiveDsl.g:229:4: 
+            // InternalPerspectiveDsl.g:230:3: ()
+            // InternalPerspectiveDsl.g:231:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -707,11 +707,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getPerspectiveAccess().getPerspectiveKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:239:3: ( (lv_name_2_0= ruleTRANSLATABLEID ) )
-            // InternalPerspectiveDsl.g:240:4: (lv_name_2_0= ruleTRANSLATABLEID )
+            // InternalPerspectiveDsl.g:241:3: ( (lv_name_2_0= ruleTRANSLATABLEID ) )
+            // InternalPerspectiveDsl.g:242:4: (lv_name_2_0= ruleTRANSLATABLEID )
             {
-            // InternalPerspectiveDsl.g:240:4: (lv_name_2_0= ruleTRANSLATABLEID )
-            // InternalPerspectiveDsl.g:241:5: lv_name_2_0= ruleTRANSLATABLEID
+            // InternalPerspectiveDsl.g:242:4: (lv_name_2_0= ruleTRANSLATABLEID )
+            // InternalPerspectiveDsl.g:243:5: lv_name_2_0= ruleTRANSLATABLEID
             {
             if ( state.backtracking==0 ) {
 
@@ -742,7 +742,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:258:3: ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) ) )?
+            // InternalPerspectiveDsl.g:260:3: ( ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) ) )?
             int alt5=2;
             int LA5_0 = input.LA(1);
 
@@ -751,13 +751,13 @@
             }
             switch (alt5) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:259:4: ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) )
+                    // InternalPerspectiveDsl.g:261:4: ( (lv_description_3_0= 'describedBy' ) ) ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) )
                     {
-                    // InternalPerspectiveDsl.g:259:4: ( (lv_description_3_0= 'describedBy' ) )
-                    // InternalPerspectiveDsl.g:260:5: (lv_description_3_0= 'describedBy' )
+                    // InternalPerspectiveDsl.g:261:4: ( (lv_description_3_0= 'describedBy' ) )
+                    // InternalPerspectiveDsl.g:262:5: (lv_description_3_0= 'describedBy' )
                     {
-                    // InternalPerspectiveDsl.g:260:5: (lv_description_3_0= 'describedBy' )
-                    // InternalPerspectiveDsl.g:261:6: lv_description_3_0= 'describedBy'
+                    // InternalPerspectiveDsl.g:262:5: (lv_description_3_0= 'describedBy' )
+                    // InternalPerspectiveDsl.g:263:6: lv_description_3_0= 'describedBy'
                     {
                     lv_description_3_0=(Token)match(input,17,FOLLOW_8); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -779,11 +779,11 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:273:4: ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) )
-                    // InternalPerspectiveDsl.g:274:5: (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING )
+                    // InternalPerspectiveDsl.g:275:4: ( (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING ) )
+                    // InternalPerspectiveDsl.g:276:5: (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING )
                     {
-                    // InternalPerspectiveDsl.g:274:5: (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING )
-                    // InternalPerspectiveDsl.g:275:6: lv_descriptionValue_4_0= ruleTRANSLATABLESTRING
+                    // InternalPerspectiveDsl.g:276:5: (lv_descriptionValue_4_0= ruleTRANSLATABLESTRING )
+                    // InternalPerspectiveDsl.g:277:6: lv_descriptionValue_4_0= ruleTRANSLATABLESTRING
                     {
                     if ( state.backtracking==0 ) {
 
@@ -820,7 +820,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:293:3: (otherlv_5= 'process' ( (otherlv_6= RULE_ID ) ) otherlv_7= 'usertask' ( (otherlv_8= RULE_ID ) ) )?
+            // InternalPerspectiveDsl.g:295:3: (otherlv_5= 'process' ( (otherlv_6= RULE_ID ) ) otherlv_7= 'usertask' ( (otherlv_8= RULE_ID ) ) )?
             int alt6=2;
             int LA6_0 = input.LA(1);
 
@@ -829,7 +829,7 @@
             }
             switch (alt6) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:294:4: otherlv_5= 'process' ( (otherlv_6= RULE_ID ) ) otherlv_7= 'usertask' ( (otherlv_8= RULE_ID ) )
+                    // InternalPerspectiveDsl.g:296:4: otherlv_5= 'process' ( (otherlv_6= RULE_ID ) ) otherlv_7= 'usertask' ( (otherlv_8= RULE_ID ) )
                     {
                     otherlv_5=(Token)match(input,18,FOLLOW_4); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -837,11 +837,11 @@
                       				newLeafNode(otherlv_5, grammarAccess.getPerspectiveAccess().getProcessKeyword_4_0());
                       			
                     }
-                    // InternalPerspectiveDsl.g:298:4: ( (otherlv_6= RULE_ID ) )
-                    // InternalPerspectiveDsl.g:299:5: (otherlv_6= RULE_ID )
+                    // InternalPerspectiveDsl.g:300:4: ( (otherlv_6= RULE_ID ) )
+                    // InternalPerspectiveDsl.g:301:5: (otherlv_6= RULE_ID )
                     {
-                    // InternalPerspectiveDsl.g:299:5: (otherlv_6= RULE_ID )
-                    // InternalPerspectiveDsl.g:300:6: otherlv_6= RULE_ID
+                    // InternalPerspectiveDsl.g:301:5: (otherlv_6= RULE_ID )
+                    // InternalPerspectiveDsl.g:302:6: otherlv_6= RULE_ID
                     {
                     if ( state.backtracking==0 ) {
 
@@ -868,11 +868,11 @@
                       				newLeafNode(otherlv_7, grammarAccess.getPerspectiveAccess().getUsertaskKeyword_4_2());
                       			
                     }
-                    // InternalPerspectiveDsl.g:315:4: ( (otherlv_8= RULE_ID ) )
-                    // InternalPerspectiveDsl.g:316:5: (otherlv_8= RULE_ID )
+                    // InternalPerspectiveDsl.g:317:4: ( (otherlv_8= RULE_ID ) )
+                    // InternalPerspectiveDsl.g:318:5: (otherlv_8= RULE_ID )
                     {
-                    // InternalPerspectiveDsl.g:316:5: (otherlv_8= RULE_ID )
-                    // InternalPerspectiveDsl.g:317:6: otherlv_8= RULE_ID
+                    // InternalPerspectiveDsl.g:318:5: (otherlv_8= RULE_ID )
+                    // InternalPerspectiveDsl.g:319:6: otherlv_8= RULE_ID
                     {
                     if ( state.backtracking==0 ) {
 
@@ -899,17 +899,17 @@
 
             }
 
-            // InternalPerspectiveDsl.g:329:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* ) ) )
-            // InternalPerspectiveDsl.g:330:4: ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* ) )
+            // InternalPerspectiveDsl.g:331:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* ) ) )
+            // InternalPerspectiveDsl.g:332:4: ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* ) )
             {
-            // InternalPerspectiveDsl.g:330:4: ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* ) )
-            // InternalPerspectiveDsl.g:331:5: ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* )
+            // InternalPerspectiveDsl.g:332:4: ( ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* ) )
+            // InternalPerspectiveDsl.g:333:5: ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* )
             {
             getUnorderedGroupHelper().enter(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5());
-            // InternalPerspectiveDsl.g:334:5: ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* )
-            // InternalPerspectiveDsl.g:335:6: ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )*
+            // InternalPerspectiveDsl.g:336:5: ( ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )* )
+            // InternalPerspectiveDsl.g:337:6: ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )*
             {
-            // InternalPerspectiveDsl.g:335:6: ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )*
+            // InternalPerspectiveDsl.g:337:6: ( ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) ) )*
             loop7:
             do {
                 int alt7=4;
@@ -928,28 +928,28 @@
 
                 switch (alt7) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:336:4: ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:338:4: ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:336:4: ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:337:5: {...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:338:4: ({...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:339:5: {...}? => ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 0) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspective", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 0)");
             	    }
-            	    // InternalPerspectiveDsl.g:337:108: ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:338:6: ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) )
+            	    // InternalPerspectiveDsl.g:339:108: ( ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:340:6: ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 0);
-            	    // InternalPerspectiveDsl.g:341:9: ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) )
-            	    // InternalPerspectiveDsl.g:341:10: {...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) )
+            	    // InternalPerspectiveDsl.g:343:9: ({...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) ) )
+            	    // InternalPerspectiveDsl.g:343:10: {...}? => (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspective", "true");
             	    }
-            	    // InternalPerspectiveDsl.g:341:19: (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) )
-            	    // InternalPerspectiveDsl.g:341:20: otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) )
+            	    // InternalPerspectiveDsl.g:343:19: (otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) ) )
+            	    // InternalPerspectiveDsl.g:343:20: otherlv_10= 'iconURI' ( (lv_iconURI_11_0= RULE_STRING ) )
             	    {
             	    otherlv_10=(Token)match(input,20,FOLLOW_8); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -957,11 +957,11 @@
             	      									newLeafNode(otherlv_10, grammarAccess.getPerspectiveAccess().getIconURIKeyword_5_0_0());
             	      								
             	    }
-            	    // InternalPerspectiveDsl.g:345:9: ( (lv_iconURI_11_0= RULE_STRING ) )
-            	    // InternalPerspectiveDsl.g:346:10: (lv_iconURI_11_0= RULE_STRING )
+            	    // InternalPerspectiveDsl.g:347:9: ( (lv_iconURI_11_0= RULE_STRING ) )
+            	    // InternalPerspectiveDsl.g:348:10: (lv_iconURI_11_0= RULE_STRING )
             	    {
-            	    // InternalPerspectiveDsl.g:346:10: (lv_iconURI_11_0= RULE_STRING )
-            	    // InternalPerspectiveDsl.g:347:11: lv_iconURI_11_0= RULE_STRING
+            	    // InternalPerspectiveDsl.g:348:10: (lv_iconURI_11_0= RULE_STRING )
+            	    // InternalPerspectiveDsl.g:349:11: lv_iconURI_11_0= RULE_STRING
             	    {
             	    lv_iconURI_11_0=(Token)match(input,RULE_STRING,FOLLOW_11); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -1004,28 +1004,28 @@
             	    }
             	    break;
             	case 2 :
-            	    // InternalPerspectiveDsl.g:369:4: ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:371:4: ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:369:4: ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:370:5: {...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:371:4: ({...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:372:5: {...}? => ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 1) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspective", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 1)");
             	    }
-            	    // InternalPerspectiveDsl.g:370:108: ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:371:6: ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) )
+            	    // InternalPerspectiveDsl.g:372:108: ( ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:373:6: ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 1);
-            	    // InternalPerspectiveDsl.g:374:9: ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) )
-            	    // InternalPerspectiveDsl.g:374:10: {...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) )
+            	    // InternalPerspectiveDsl.g:376:9: ({...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) ) )
+            	    // InternalPerspectiveDsl.g:376:10: {...}? => (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspective", "true");
             	    }
-            	    // InternalPerspectiveDsl.g:374:19: (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) )
-            	    // InternalPerspectiveDsl.g:374:20: otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) )
+            	    // InternalPerspectiveDsl.g:376:19: (otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) ) )
+            	    // InternalPerspectiveDsl.g:376:20: otherlv_12= 'accessibility' ( (lv_accessibilityPhrase_13_0= RULE_STRING ) )
             	    {
             	    otherlv_12=(Token)match(input,21,FOLLOW_8); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -1033,11 +1033,11 @@
             	      									newLeafNode(otherlv_12, grammarAccess.getPerspectiveAccess().getAccessibilityKeyword_5_1_0());
             	      								
             	    }
-            	    // InternalPerspectiveDsl.g:378:9: ( (lv_accessibilityPhrase_13_0= RULE_STRING ) )
-            	    // InternalPerspectiveDsl.g:379:10: (lv_accessibilityPhrase_13_0= RULE_STRING )
+            	    // InternalPerspectiveDsl.g:380:9: ( (lv_accessibilityPhrase_13_0= RULE_STRING ) )
+            	    // InternalPerspectiveDsl.g:381:10: (lv_accessibilityPhrase_13_0= RULE_STRING )
             	    {
-            	    // InternalPerspectiveDsl.g:379:10: (lv_accessibilityPhrase_13_0= RULE_STRING )
-            	    // InternalPerspectiveDsl.g:380:11: lv_accessibilityPhrase_13_0= RULE_STRING
+            	    // InternalPerspectiveDsl.g:381:10: (lv_accessibilityPhrase_13_0= RULE_STRING )
+            	    // InternalPerspectiveDsl.g:382:11: lv_accessibilityPhrase_13_0= RULE_STRING
             	    {
             	    lv_accessibilityPhrase_13_0=(Token)match(input,RULE_STRING,FOLLOW_11); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -1080,28 +1080,28 @@
             	    }
             	    break;
             	case 3 :
-            	    // InternalPerspectiveDsl.g:402:4: ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:404:4: ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:402:4: ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:403:5: {...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:404:4: ({...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:405:5: {...}? => ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 2) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspective", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 2)");
             	    }
-            	    // InternalPerspectiveDsl.g:403:108: ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:404:6: ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) )
+            	    // InternalPerspectiveDsl.g:405:108: ( ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:406:6: ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getPerspectiveAccess().getUnorderedGroup_5(), 2);
-            	    // InternalPerspectiveDsl.g:407:9: ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) )
-            	    // InternalPerspectiveDsl.g:407:10: {...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) )
+            	    // InternalPerspectiveDsl.g:409:9: ({...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) ) )
+            	    // InternalPerspectiveDsl.g:409:10: {...}? => (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspective", "true");
             	    }
-            	    // InternalPerspectiveDsl.g:407:19: (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) )
-            	    // InternalPerspectiveDsl.g:407:20: otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) )
+            	    // InternalPerspectiveDsl.g:409:19: (otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) ) )
+            	    // InternalPerspectiveDsl.g:409:20: otherlv_14= 'toolbar' ( (otherlv_15= RULE_ID ) )
             	    {
             	    otherlv_14=(Token)match(input,22,FOLLOW_4); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -1109,11 +1109,11 @@
             	      									newLeafNode(otherlv_14, grammarAccess.getPerspectiveAccess().getToolbarKeyword_5_2_0());
             	      								
             	    }
-            	    // InternalPerspectiveDsl.g:411:9: ( (otherlv_15= RULE_ID ) )
-            	    // InternalPerspectiveDsl.g:412:10: (otherlv_15= RULE_ID )
+            	    // InternalPerspectiveDsl.g:413:9: ( (otherlv_15= RULE_ID ) )
+            	    // InternalPerspectiveDsl.g:414:10: (otherlv_15= RULE_ID )
             	    {
-            	    // InternalPerspectiveDsl.g:412:10: (otherlv_15= RULE_ID )
-            	    // InternalPerspectiveDsl.g:413:11: otherlv_15= RULE_ID
+            	    // InternalPerspectiveDsl.g:414:10: (otherlv_15= RULE_ID )
+            	    // InternalPerspectiveDsl.g:415:11: otherlv_15= RULE_ID
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -1172,7 +1172,7 @@
               			newLeafNode(otherlv_16, grammarAccess.getPerspectiveAccess().getLeftCurlyBracketKeyword_6());
               		
             }
-            // InternalPerspectiveDsl.g:441:3: ( (lv_elements_17_0= rulePerspectiveElement ) )*
+            // InternalPerspectiveDsl.g:443:3: ( (lv_elements_17_0= rulePerspectiveElement ) )*
             loop8:
             do {
                 int alt8=2;
@@ -1185,10 +1185,10 @@
 
                 switch (alt8) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:442:4: (lv_elements_17_0= rulePerspectiveElement )
+            	    // InternalPerspectiveDsl.g:444:4: (lv_elements_17_0= rulePerspectiveElement )
             	    {
-            	    // InternalPerspectiveDsl.g:442:4: (lv_elements_17_0= rulePerspectiveElement )
-            	    // InternalPerspectiveDsl.g:443:5: lv_elements_17_0= rulePerspectiveElement
+            	    // InternalPerspectiveDsl.g:444:4: (lv_elements_17_0= rulePerspectiveElement )
+            	    // InternalPerspectiveDsl.g:445:5: lv_elements_17_0= rulePerspectiveElement
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -1256,7 +1256,7 @@
 
 
     // $ANTLR start "entryRulePerspectiveElement"
-    // InternalPerspectiveDsl.g:468:1: entryRulePerspectiveElement returns [EObject current=null] : iv_rulePerspectiveElement= rulePerspectiveElement EOF ;
+    // InternalPerspectiveDsl.g:470:1: entryRulePerspectiveElement returns [EObject current=null] : iv_rulePerspectiveElement= rulePerspectiveElement EOF ;
     public final EObject entryRulePerspectiveElement() throws RecognitionException {
         EObject current = null;
 
@@ -1264,8 +1264,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:468:59: (iv_rulePerspectiveElement= rulePerspectiveElement EOF )
-            // InternalPerspectiveDsl.g:469:2: iv_rulePerspectiveElement= rulePerspectiveElement EOF
+            // InternalPerspectiveDsl.g:470:59: (iv_rulePerspectiveElement= rulePerspectiveElement EOF )
+            // InternalPerspectiveDsl.g:471:2: iv_rulePerspectiveElement= rulePerspectiveElement EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveElementRule()); 
@@ -1296,7 +1296,7 @@
 
 
     // $ANTLR start "rulePerspectiveElement"
-    // InternalPerspectiveDsl.g:475:1: rulePerspectiveElement returns [EObject current=null] : (this_PerspectiveSashContainer_0= rulePerspectiveSashContainer | this_PerspectivePartStack_1= rulePerspectivePartStack | this_PerspectivePart_2= rulePerspectivePart ) ;
+    // InternalPerspectiveDsl.g:477:1: rulePerspectiveElement returns [EObject current=null] : (this_PerspectiveSashContainer_0= rulePerspectiveSashContainer | this_PerspectivePartStack_1= rulePerspectivePartStack | this_PerspectivePart_2= rulePerspectivePart ) ;
     public final EObject rulePerspectiveElement() throws RecognitionException {
         EObject current = null;
 
@@ -1311,10 +1311,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:481:2: ( (this_PerspectiveSashContainer_0= rulePerspectiveSashContainer | this_PerspectivePartStack_1= rulePerspectivePartStack | this_PerspectivePart_2= rulePerspectivePart ) )
-            // InternalPerspectiveDsl.g:482:2: (this_PerspectiveSashContainer_0= rulePerspectiveSashContainer | this_PerspectivePartStack_1= rulePerspectivePartStack | this_PerspectivePart_2= rulePerspectivePart )
+            // InternalPerspectiveDsl.g:483:2: ( (this_PerspectiveSashContainer_0= rulePerspectiveSashContainer | this_PerspectivePartStack_1= rulePerspectivePartStack | this_PerspectivePart_2= rulePerspectivePart ) )
+            // InternalPerspectiveDsl.g:484:2: (this_PerspectiveSashContainer_0= rulePerspectiveSashContainer | this_PerspectivePartStack_1= rulePerspectivePartStack | this_PerspectivePart_2= rulePerspectivePart )
             {
-            // InternalPerspectiveDsl.g:482:2: (this_PerspectiveSashContainer_0= rulePerspectiveSashContainer | this_PerspectivePartStack_1= rulePerspectivePartStack | this_PerspectivePart_2= rulePerspectivePart )
+            // InternalPerspectiveDsl.g:484:2: (this_PerspectiveSashContainer_0= rulePerspectiveSashContainer | this_PerspectivePartStack_1= rulePerspectivePartStack | this_PerspectivePart_2= rulePerspectivePart )
             int alt9=3;
             switch ( input.LA(1) ) {
             case 23:
@@ -1342,7 +1342,7 @@
 
             switch (alt9) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:483:3: this_PerspectiveSashContainer_0= rulePerspectiveSashContainer
+                    // InternalPerspectiveDsl.g:485:3: this_PerspectiveSashContainer_0= rulePerspectiveSashContainer
                     {
                     if ( state.backtracking==0 ) {
 
@@ -1364,7 +1364,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:492:3: this_PerspectivePartStack_1= rulePerspectivePartStack
+                    // InternalPerspectiveDsl.g:494:3: this_PerspectivePartStack_1= rulePerspectivePartStack
                     {
                     if ( state.backtracking==0 ) {
 
@@ -1386,7 +1386,7 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:501:3: this_PerspectivePart_2= rulePerspectivePart
+                    // InternalPerspectiveDsl.g:503:3: this_PerspectivePart_2= rulePerspectivePart
                     {
                     if ( state.backtracking==0 ) {
 
@@ -1432,7 +1432,7 @@
 
 
     // $ANTLR start "entryRulePerspectiveSashContainer"
-    // InternalPerspectiveDsl.g:513:1: entryRulePerspectiveSashContainer returns [EObject current=null] : iv_rulePerspectiveSashContainer= rulePerspectiveSashContainer EOF ;
+    // InternalPerspectiveDsl.g:515:1: entryRulePerspectiveSashContainer returns [EObject current=null] : iv_rulePerspectiveSashContainer= rulePerspectiveSashContainer EOF ;
     public final EObject entryRulePerspectiveSashContainer() throws RecognitionException {
         EObject current = null;
 
@@ -1440,8 +1440,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:513:65: (iv_rulePerspectiveSashContainer= rulePerspectiveSashContainer EOF )
-            // InternalPerspectiveDsl.g:514:2: iv_rulePerspectiveSashContainer= rulePerspectiveSashContainer EOF
+            // InternalPerspectiveDsl.g:515:65: (iv_rulePerspectiveSashContainer= rulePerspectiveSashContainer EOF )
+            // InternalPerspectiveDsl.g:516:2: iv_rulePerspectiveSashContainer= rulePerspectiveSashContainer EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveSashContainerRule()); 
@@ -1472,7 +1472,7 @@
 
 
     // $ANTLR start "rulePerspectiveSashContainer"
-    // InternalPerspectiveDsl.g:520:1: rulePerspectiveSashContainer returns [EObject current=null] : ( () otherlv_1= 'sashContainer' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_12= '{' ( (lv_elements_13_0= rulePerspectiveElement ) )* otherlv_14= '}' ) ;
+    // InternalPerspectiveDsl.g:522:1: rulePerspectiveSashContainer returns [EObject current=null] : ( () otherlv_1= 'sashContainer' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_12= '{' ( (lv_elements_13_0= rulePerspectiveElement ) )* otherlv_14= '}' ) ;
     public final EObject rulePerspectiveSashContainer() throws RecognitionException {
         EObject current = null;
 
@@ -1496,14 +1496,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:526:2: ( ( () otherlv_1= 'sashContainer' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_12= '{' ( (lv_elements_13_0= rulePerspectiveElement ) )* otherlv_14= '}' ) )
-            // InternalPerspectiveDsl.g:527:2: ( () otherlv_1= 'sashContainer' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_12= '{' ( (lv_elements_13_0= rulePerspectiveElement ) )* otherlv_14= '}' )
+            // InternalPerspectiveDsl.g:528:2: ( ( () otherlv_1= 'sashContainer' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_12= '{' ( (lv_elements_13_0= rulePerspectiveElement ) )* otherlv_14= '}' ) )
+            // InternalPerspectiveDsl.g:529:2: ( () otherlv_1= 'sashContainer' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_12= '{' ( (lv_elements_13_0= rulePerspectiveElement ) )* otherlv_14= '}' )
             {
-            // InternalPerspectiveDsl.g:527:2: ( () otherlv_1= 'sashContainer' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_12= '{' ( (lv_elements_13_0= rulePerspectiveElement ) )* otherlv_14= '}' )
-            // InternalPerspectiveDsl.g:528:3: () otherlv_1= 'sashContainer' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_12= '{' ( (lv_elements_13_0= rulePerspectiveElement ) )* otherlv_14= '}'
+            // InternalPerspectiveDsl.g:529:2: ( () otherlv_1= 'sashContainer' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_12= '{' ( (lv_elements_13_0= rulePerspectiveElement ) )* otherlv_14= '}' )
+            // InternalPerspectiveDsl.g:530:3: () otherlv_1= 'sashContainer' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_12= '{' ( (lv_elements_13_0= rulePerspectiveElement ) )* otherlv_14= '}'
             {
-            // InternalPerspectiveDsl.g:528:3: ()
-            // InternalPerspectiveDsl.g:529:4: 
+            // InternalPerspectiveDsl.g:530:3: ()
+            // InternalPerspectiveDsl.g:531:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -1521,11 +1521,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getPerspectiveSashContainerAccess().getSashContainerKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:539:3: ( (lv_elementId_2_0= RULE_ID ) )
-            // InternalPerspectiveDsl.g:540:4: (lv_elementId_2_0= RULE_ID )
+            // InternalPerspectiveDsl.g:541:3: ( (lv_elementId_2_0= RULE_ID ) )
+            // InternalPerspectiveDsl.g:542:4: (lv_elementId_2_0= RULE_ID )
             {
-            // InternalPerspectiveDsl.g:540:4: (lv_elementId_2_0= RULE_ID )
-            // InternalPerspectiveDsl.g:541:5: lv_elementId_2_0= RULE_ID
+            // InternalPerspectiveDsl.g:542:4: (lv_elementId_2_0= RULE_ID )
+            // InternalPerspectiveDsl.g:543:5: lv_elementId_2_0= RULE_ID
             {
             lv_elementId_2_0=(Token)match(input,RULE_ID,FOLLOW_13); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -1551,17 +1551,17 @@
 
             }
 
-            // InternalPerspectiveDsl.g:557:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
-            // InternalPerspectiveDsl.g:558:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* ) )
+            // InternalPerspectiveDsl.g:559:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+            // InternalPerspectiveDsl.g:560:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* ) )
             {
-            // InternalPerspectiveDsl.g:558:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* ) )
-            // InternalPerspectiveDsl.g:559:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* )
+            // InternalPerspectiveDsl.g:560:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* ) )
+            // InternalPerspectiveDsl.g:561:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* )
             {
             getUnorderedGroupHelper().enter(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3());
-            // InternalPerspectiveDsl.g:562:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* )
-            // InternalPerspectiveDsl.g:563:6: ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )*
+            // InternalPerspectiveDsl.g:564:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )* )
+            // InternalPerspectiveDsl.g:565:6: ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )*
             {
-            // InternalPerspectiveDsl.g:563:6: ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )*
+            // InternalPerspectiveDsl.g:565:6: ( ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) ) )*
             loop10:
             do {
                 int alt10=5;
@@ -1583,28 +1583,28 @@
 
                 switch (alt10) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:564:4: ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:566:4: ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:564:4: ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:565:5: {...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:566:4: ({...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:567:5: {...}? => ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 0) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectiveSashContainer", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 0)");
             	    }
-            	    // InternalPerspectiveDsl.g:565:121: ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:566:6: ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) )
+            	    // InternalPerspectiveDsl.g:567:121: ( ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:568:6: ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 0);
-            	    // InternalPerspectiveDsl.g:569:9: ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) )
-            	    // InternalPerspectiveDsl.g:569:10: {...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) )
+            	    // InternalPerspectiveDsl.g:571:9: ({...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) ) )
+            	    // InternalPerspectiveDsl.g:571:10: {...}? => (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectiveSashContainer", "true");
             	    }
-            	    // InternalPerspectiveDsl.g:569:19: (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) )
-            	    // InternalPerspectiveDsl.g:569:20: otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) )
+            	    // InternalPerspectiveDsl.g:571:19: (otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) ) )
+            	    // InternalPerspectiveDsl.g:571:20: otherlv_4= 'orientation' ( (lv_orientation_5_0= ruleSashOrientation ) )
             	    {
             	    otherlv_4=(Token)match(input,24,FOLLOW_14); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -1612,11 +1612,11 @@
             	      									newLeafNode(otherlv_4, grammarAccess.getPerspectiveSashContainerAccess().getOrientationKeyword_3_0_0());
             	      								
             	    }
-            	    // InternalPerspectiveDsl.g:573:9: ( (lv_orientation_5_0= ruleSashOrientation ) )
-            	    // InternalPerspectiveDsl.g:574:10: (lv_orientation_5_0= ruleSashOrientation )
+            	    // InternalPerspectiveDsl.g:575:9: ( (lv_orientation_5_0= ruleSashOrientation ) )
+            	    // InternalPerspectiveDsl.g:576:10: (lv_orientation_5_0= ruleSashOrientation )
             	    {
-            	    // InternalPerspectiveDsl.g:574:10: (lv_orientation_5_0= ruleSashOrientation )
-            	    // InternalPerspectiveDsl.g:575:11: lv_orientation_5_0= ruleSashOrientation
+            	    // InternalPerspectiveDsl.g:576:10: (lv_orientation_5_0= ruleSashOrientation )
+            	    // InternalPerspectiveDsl.g:577:11: lv_orientation_5_0= ruleSashOrientation
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -1664,28 +1664,28 @@
             	    }
             	    break;
             	case 2 :
-            	    // InternalPerspectiveDsl.g:598:4: ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:600:4: ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:598:4: ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:599:5: {...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:600:4: ({...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:601:5: {...}? => ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 1) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectiveSashContainer", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 1)");
             	    }
-            	    // InternalPerspectiveDsl.g:599:121: ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:600:6: ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) )
+            	    // InternalPerspectiveDsl.g:601:121: ( ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:602:6: ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 1);
-            	    // InternalPerspectiveDsl.g:603:9: ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) )
-            	    // InternalPerspectiveDsl.g:603:10: {...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) )
+            	    // InternalPerspectiveDsl.g:605:9: ({...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) ) )
+            	    // InternalPerspectiveDsl.g:605:10: {...}? => (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectiveSashContainer", "true");
             	    }
-            	    // InternalPerspectiveDsl.g:603:19: (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) )
-            	    // InternalPerspectiveDsl.g:603:20: otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) )
+            	    // InternalPerspectiveDsl.g:605:19: (otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) ) )
+            	    // InternalPerspectiveDsl.g:605:20: otherlv_6= 'selectedElement' ( (otherlv_7= RULE_ID ) )
             	    {
             	    otherlv_6=(Token)match(input,25,FOLLOW_4); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -1693,11 +1693,11 @@
             	      									newLeafNode(otherlv_6, grammarAccess.getPerspectiveSashContainerAccess().getSelectedElementKeyword_3_1_0());
             	      								
             	    }
-            	    // InternalPerspectiveDsl.g:607:9: ( (otherlv_7= RULE_ID ) )
-            	    // InternalPerspectiveDsl.g:608:10: (otherlv_7= RULE_ID )
+            	    // InternalPerspectiveDsl.g:609:9: ( (otherlv_7= RULE_ID ) )
+            	    // InternalPerspectiveDsl.g:610:10: (otherlv_7= RULE_ID )
             	    {
-            	    // InternalPerspectiveDsl.g:608:10: (otherlv_7= RULE_ID )
-            	    // InternalPerspectiveDsl.g:609:11: otherlv_7= RULE_ID
+            	    // InternalPerspectiveDsl.g:610:10: (otherlv_7= RULE_ID )
+            	    // InternalPerspectiveDsl.g:611:11: otherlv_7= RULE_ID
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -1735,28 +1735,28 @@
             	    }
             	    break;
             	case 3 :
-            	    // InternalPerspectiveDsl.g:626:4: ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:628:4: ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:626:4: ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:627:5: {...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:628:4: ({...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:629:5: {...}? => ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 2) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectiveSashContainer", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 2)");
             	    }
-            	    // InternalPerspectiveDsl.g:627:121: ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:628:6: ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) )
+            	    // InternalPerspectiveDsl.g:629:121: ( ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:630:6: ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 2);
-            	    // InternalPerspectiveDsl.g:631:9: ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) )
-            	    // InternalPerspectiveDsl.g:631:10: {...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) )
+            	    // InternalPerspectiveDsl.g:633:9: ({...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) ) )
+            	    // InternalPerspectiveDsl.g:633:10: {...}? => (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectiveSashContainer", "true");
             	    }
-            	    // InternalPerspectiveDsl.g:631:19: (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) )
-            	    // InternalPerspectiveDsl.g:631:20: otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) )
+            	    // InternalPerspectiveDsl.g:633:19: (otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) ) )
+            	    // InternalPerspectiveDsl.g:633:20: otherlv_8= 'spaceVolume' ( (lv_containerData_9_0= RULE_STRING ) )
             	    {
             	    otherlv_8=(Token)match(input,26,FOLLOW_8); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -1764,11 +1764,11 @@
             	      									newLeafNode(otherlv_8, grammarAccess.getPerspectiveSashContainerAccess().getSpaceVolumeKeyword_3_2_0());
             	      								
             	    }
-            	    // InternalPerspectiveDsl.g:635:9: ( (lv_containerData_9_0= RULE_STRING ) )
-            	    // InternalPerspectiveDsl.g:636:10: (lv_containerData_9_0= RULE_STRING )
+            	    // InternalPerspectiveDsl.g:637:9: ( (lv_containerData_9_0= RULE_STRING ) )
+            	    // InternalPerspectiveDsl.g:638:10: (lv_containerData_9_0= RULE_STRING )
             	    {
-            	    // InternalPerspectiveDsl.g:636:10: (lv_containerData_9_0= RULE_STRING )
-            	    // InternalPerspectiveDsl.g:637:11: lv_containerData_9_0= RULE_STRING
+            	    // InternalPerspectiveDsl.g:638:10: (lv_containerData_9_0= RULE_STRING )
+            	    // InternalPerspectiveDsl.g:639:11: lv_containerData_9_0= RULE_STRING
             	    {
             	    lv_containerData_9_0=(Token)match(input,RULE_STRING,FOLLOW_13); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -1811,28 +1811,28 @@
             	    }
             	    break;
             	case 4 :
-            	    // InternalPerspectiveDsl.g:659:4: ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:661:4: ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:659:4: ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:660:5: {...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:661:4: ({...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:662:5: {...}? => ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 3) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectiveSashContainer", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 3)");
             	    }
-            	    // InternalPerspectiveDsl.g:660:121: ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:661:6: ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) )
+            	    // InternalPerspectiveDsl.g:662:121: ( ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:663:6: ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getPerspectiveSashContainerAccess().getUnorderedGroup_3(), 3);
-            	    // InternalPerspectiveDsl.g:664:9: ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) )
-            	    // InternalPerspectiveDsl.g:664:10: {...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) )
+            	    // InternalPerspectiveDsl.g:666:9: ({...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) ) )
+            	    // InternalPerspectiveDsl.g:666:10: {...}? => (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectiveSashContainer", "true");
             	    }
-            	    // InternalPerspectiveDsl.g:664:19: (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) )
-            	    // InternalPerspectiveDsl.g:664:20: otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) )
+            	    // InternalPerspectiveDsl.g:666:19: (otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) ) )
+            	    // InternalPerspectiveDsl.g:666:20: otherlv_10= 'accessibility' ( (lv_accessibilityPhrase_11_0= RULE_STRING ) )
             	    {
             	    otherlv_10=(Token)match(input,21,FOLLOW_8); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -1840,11 +1840,11 @@
             	      									newLeafNode(otherlv_10, grammarAccess.getPerspectiveSashContainerAccess().getAccessibilityKeyword_3_3_0());
             	      								
             	    }
-            	    // InternalPerspectiveDsl.g:668:9: ( (lv_accessibilityPhrase_11_0= RULE_STRING ) )
-            	    // InternalPerspectiveDsl.g:669:10: (lv_accessibilityPhrase_11_0= RULE_STRING )
+            	    // InternalPerspectiveDsl.g:670:9: ( (lv_accessibilityPhrase_11_0= RULE_STRING ) )
+            	    // InternalPerspectiveDsl.g:671:10: (lv_accessibilityPhrase_11_0= RULE_STRING )
             	    {
-            	    // InternalPerspectiveDsl.g:669:10: (lv_accessibilityPhrase_11_0= RULE_STRING )
-            	    // InternalPerspectiveDsl.g:670:11: lv_accessibilityPhrase_11_0= RULE_STRING
+            	    // InternalPerspectiveDsl.g:671:10: (lv_accessibilityPhrase_11_0= RULE_STRING )
+            	    // InternalPerspectiveDsl.g:672:11: lv_accessibilityPhrase_11_0= RULE_STRING
             	    {
             	    lv_accessibilityPhrase_11_0=(Token)match(input,RULE_STRING,FOLLOW_13); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -1908,7 +1908,7 @@
               			newLeafNode(otherlv_12, grammarAccess.getPerspectiveSashContainerAccess().getLeftCurlyBracketKeyword_4());
               		
             }
-            // InternalPerspectiveDsl.g:703:3: ( (lv_elements_13_0= rulePerspectiveElement ) )*
+            // InternalPerspectiveDsl.g:705:3: ( (lv_elements_13_0= rulePerspectiveElement ) )*
             loop11:
             do {
                 int alt11=2;
@@ -1921,10 +1921,10 @@
 
                 switch (alt11) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:704:4: (lv_elements_13_0= rulePerspectiveElement )
+            	    // InternalPerspectiveDsl.g:706:4: (lv_elements_13_0= rulePerspectiveElement )
             	    {
-            	    // InternalPerspectiveDsl.g:704:4: (lv_elements_13_0= rulePerspectiveElement )
-            	    // InternalPerspectiveDsl.g:705:5: lv_elements_13_0= rulePerspectiveElement
+            	    // InternalPerspectiveDsl.g:706:4: (lv_elements_13_0= rulePerspectiveElement )
+            	    // InternalPerspectiveDsl.g:707:5: lv_elements_13_0= rulePerspectiveElement
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -1992,7 +1992,7 @@
 
 
     // $ANTLR start "entryRulePerspectivePartStack"
-    // InternalPerspectiveDsl.g:730:1: entryRulePerspectivePartStack returns [EObject current=null] : iv_rulePerspectivePartStack= rulePerspectivePartStack EOF ;
+    // InternalPerspectiveDsl.g:732:1: entryRulePerspectivePartStack returns [EObject current=null] : iv_rulePerspectivePartStack= rulePerspectivePartStack EOF ;
     public final EObject entryRulePerspectivePartStack() throws RecognitionException {
         EObject current = null;
 
@@ -2000,8 +2000,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:730:61: (iv_rulePerspectivePartStack= rulePerspectivePartStack EOF )
-            // InternalPerspectiveDsl.g:731:2: iv_rulePerspectivePartStack= rulePerspectivePartStack EOF
+            // InternalPerspectiveDsl.g:732:61: (iv_rulePerspectivePartStack= rulePerspectivePartStack EOF )
+            // InternalPerspectiveDsl.g:733:2: iv_rulePerspectivePartStack= rulePerspectivePartStack EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectivePartStackRule()); 
@@ -2032,7 +2032,7 @@
 
 
     // $ANTLR start "rulePerspectivePartStack"
-    // InternalPerspectiveDsl.g:737:1: rulePerspectivePartStack returns [EObject current=null] : ( () otherlv_1= 'partStack' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_10= '{' ( (lv_elements_11_0= rulePerspectiveElement ) )* otherlv_12= '}' ) ;
+    // InternalPerspectiveDsl.g:739:1: rulePerspectivePartStack returns [EObject current=null] : ( () otherlv_1= 'partStack' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_10= '{' ( (lv_elements_11_0= rulePerspectiveElement ) )* otherlv_12= '}' ) ;
     public final EObject rulePerspectivePartStack() throws RecognitionException {
         EObject current = null;
 
@@ -2053,14 +2053,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:743:2: ( ( () otherlv_1= 'partStack' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_10= '{' ( (lv_elements_11_0= rulePerspectiveElement ) )* otherlv_12= '}' ) )
-            // InternalPerspectiveDsl.g:744:2: ( () otherlv_1= 'partStack' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_10= '{' ( (lv_elements_11_0= rulePerspectiveElement ) )* otherlv_12= '}' )
+            // InternalPerspectiveDsl.g:745:2: ( ( () otherlv_1= 'partStack' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_10= '{' ( (lv_elements_11_0= rulePerspectiveElement ) )* otherlv_12= '}' ) )
+            // InternalPerspectiveDsl.g:746:2: ( () otherlv_1= 'partStack' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_10= '{' ( (lv_elements_11_0= rulePerspectiveElement ) )* otherlv_12= '}' )
             {
-            // InternalPerspectiveDsl.g:744:2: ( () otherlv_1= 'partStack' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_10= '{' ( (lv_elements_11_0= rulePerspectiveElement ) )* otherlv_12= '}' )
-            // InternalPerspectiveDsl.g:745:3: () otherlv_1= 'partStack' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_10= '{' ( (lv_elements_11_0= rulePerspectiveElement ) )* otherlv_12= '}'
+            // InternalPerspectiveDsl.g:746:2: ( () otherlv_1= 'partStack' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_10= '{' ( (lv_elements_11_0= rulePerspectiveElement ) )* otherlv_12= '}' )
+            // InternalPerspectiveDsl.g:747:3: () otherlv_1= 'partStack' ( (lv_elementId_2_0= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_10= '{' ( (lv_elements_11_0= rulePerspectiveElement ) )* otherlv_12= '}'
             {
-            // InternalPerspectiveDsl.g:745:3: ()
-            // InternalPerspectiveDsl.g:746:4: 
+            // InternalPerspectiveDsl.g:747:3: ()
+            // InternalPerspectiveDsl.g:748:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -2078,11 +2078,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getPerspectivePartStackAccess().getPartStackKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:756:3: ( (lv_elementId_2_0= RULE_ID ) )
-            // InternalPerspectiveDsl.g:757:4: (lv_elementId_2_0= RULE_ID )
+            // InternalPerspectiveDsl.g:758:3: ( (lv_elementId_2_0= RULE_ID ) )
+            // InternalPerspectiveDsl.g:759:4: (lv_elementId_2_0= RULE_ID )
             {
-            // InternalPerspectiveDsl.g:757:4: (lv_elementId_2_0= RULE_ID )
-            // InternalPerspectiveDsl.g:758:5: lv_elementId_2_0= RULE_ID
+            // InternalPerspectiveDsl.g:759:4: (lv_elementId_2_0= RULE_ID )
+            // InternalPerspectiveDsl.g:760:5: lv_elementId_2_0= RULE_ID
             {
             lv_elementId_2_0=(Token)match(input,RULE_ID,FOLLOW_15); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -2108,17 +2108,17 @@
 
             }
 
-            // InternalPerspectiveDsl.g:774:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
-            // InternalPerspectiveDsl.g:775:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* ) )
+            // InternalPerspectiveDsl.g:776:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+            // InternalPerspectiveDsl.g:777:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* ) )
             {
-            // InternalPerspectiveDsl.g:775:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* ) )
-            // InternalPerspectiveDsl.g:776:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* )
+            // InternalPerspectiveDsl.g:777:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* ) )
+            // InternalPerspectiveDsl.g:778:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* )
             {
             getUnorderedGroupHelper().enter(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3());
-            // InternalPerspectiveDsl.g:779:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* )
-            // InternalPerspectiveDsl.g:780:6: ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )*
+            // InternalPerspectiveDsl.g:781:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )* )
+            // InternalPerspectiveDsl.g:782:6: ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )*
             {
-            // InternalPerspectiveDsl.g:780:6: ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )*
+            // InternalPerspectiveDsl.g:782:6: ( ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) ) )*
             loop12:
             do {
                 int alt12=4;
@@ -2137,28 +2137,28 @@
 
                 switch (alt12) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:781:4: ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:783:4: ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:781:4: ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:782:5: {...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:783:4: ({...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:784:5: {...}? => ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 0) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectivePartStack", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 0)");
             	    }
-            	    // InternalPerspectiveDsl.g:782:117: ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:783:6: ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) )
+            	    // InternalPerspectiveDsl.g:784:117: ( ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:785:6: ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 0);
-            	    // InternalPerspectiveDsl.g:786:9: ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) )
-            	    // InternalPerspectiveDsl.g:786:10: {...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) )
+            	    // InternalPerspectiveDsl.g:788:9: ({...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) ) )
+            	    // InternalPerspectiveDsl.g:788:10: {...}? => (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectivePartStack", "true");
             	    }
-            	    // InternalPerspectiveDsl.g:786:19: (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) )
-            	    // InternalPerspectiveDsl.g:786:20: otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) )
+            	    // InternalPerspectiveDsl.g:788:19: (otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) ) )
+            	    // InternalPerspectiveDsl.g:788:20: otherlv_4= 'selectedElement' ( (otherlv_5= RULE_ID ) )
             	    {
             	    otherlv_4=(Token)match(input,25,FOLLOW_4); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2166,11 +2166,11 @@
             	      									newLeafNode(otherlv_4, grammarAccess.getPerspectivePartStackAccess().getSelectedElementKeyword_3_0_0());
             	      								
             	    }
-            	    // InternalPerspectiveDsl.g:790:9: ( (otherlv_5= RULE_ID ) )
-            	    // InternalPerspectiveDsl.g:791:10: (otherlv_5= RULE_ID )
+            	    // InternalPerspectiveDsl.g:792:9: ( (otherlv_5= RULE_ID ) )
+            	    // InternalPerspectiveDsl.g:793:10: (otherlv_5= RULE_ID )
             	    {
-            	    // InternalPerspectiveDsl.g:791:10: (otherlv_5= RULE_ID )
-            	    // InternalPerspectiveDsl.g:792:11: otherlv_5= RULE_ID
+            	    // InternalPerspectiveDsl.g:793:10: (otherlv_5= RULE_ID )
+            	    // InternalPerspectiveDsl.g:794:11: otherlv_5= RULE_ID
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -2208,28 +2208,28 @@
             	    }
             	    break;
             	case 2 :
-            	    // InternalPerspectiveDsl.g:809:4: ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:811:4: ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:809:4: ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:810:5: {...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:811:4: ({...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:812:5: {...}? => ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 1) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectivePartStack", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 1)");
             	    }
-            	    // InternalPerspectiveDsl.g:810:117: ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:811:6: ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) )
+            	    // InternalPerspectiveDsl.g:812:117: ( ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:813:6: ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 1);
-            	    // InternalPerspectiveDsl.g:814:9: ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) )
-            	    // InternalPerspectiveDsl.g:814:10: {...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) )
+            	    // InternalPerspectiveDsl.g:816:9: ({...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) ) )
+            	    // InternalPerspectiveDsl.g:816:10: {...}? => (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectivePartStack", "true");
             	    }
-            	    // InternalPerspectiveDsl.g:814:19: (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) )
-            	    // InternalPerspectiveDsl.g:814:20: otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) )
+            	    // InternalPerspectiveDsl.g:816:19: (otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) ) )
+            	    // InternalPerspectiveDsl.g:816:20: otherlv_6= 'spaceVolume' ( (lv_containerData_7_0= RULE_STRING ) )
             	    {
             	    otherlv_6=(Token)match(input,26,FOLLOW_8); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2237,11 +2237,11 @@
             	      									newLeafNode(otherlv_6, grammarAccess.getPerspectivePartStackAccess().getSpaceVolumeKeyword_3_1_0());
             	      								
             	    }
-            	    // InternalPerspectiveDsl.g:818:9: ( (lv_containerData_7_0= RULE_STRING ) )
-            	    // InternalPerspectiveDsl.g:819:10: (lv_containerData_7_0= RULE_STRING )
+            	    // InternalPerspectiveDsl.g:820:9: ( (lv_containerData_7_0= RULE_STRING ) )
+            	    // InternalPerspectiveDsl.g:821:10: (lv_containerData_7_0= RULE_STRING )
             	    {
-            	    // InternalPerspectiveDsl.g:819:10: (lv_containerData_7_0= RULE_STRING )
-            	    // InternalPerspectiveDsl.g:820:11: lv_containerData_7_0= RULE_STRING
+            	    // InternalPerspectiveDsl.g:821:10: (lv_containerData_7_0= RULE_STRING )
+            	    // InternalPerspectiveDsl.g:822:11: lv_containerData_7_0= RULE_STRING
             	    {
             	    lv_containerData_7_0=(Token)match(input,RULE_STRING,FOLLOW_15); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2284,28 +2284,28 @@
             	    }
             	    break;
             	case 3 :
-            	    // InternalPerspectiveDsl.g:842:4: ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:844:4: ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:842:4: ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:843:5: {...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:844:4: ({...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:845:5: {...}? => ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 2) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectivePartStack", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 2)");
             	    }
-            	    // InternalPerspectiveDsl.g:843:117: ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:844:6: ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) )
+            	    // InternalPerspectiveDsl.g:845:117: ( ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:846:6: ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartStackAccess().getUnorderedGroup_3(), 2);
-            	    // InternalPerspectiveDsl.g:847:9: ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) )
-            	    // InternalPerspectiveDsl.g:847:10: {...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) )
+            	    // InternalPerspectiveDsl.g:849:9: ({...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) ) )
+            	    // InternalPerspectiveDsl.g:849:10: {...}? => (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectivePartStack", "true");
             	    }
-            	    // InternalPerspectiveDsl.g:847:19: (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) )
-            	    // InternalPerspectiveDsl.g:847:20: otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) )
+            	    // InternalPerspectiveDsl.g:849:19: (otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) ) )
+            	    // InternalPerspectiveDsl.g:849:20: otherlv_8= 'accessibility' ( (lv_accessibilityPhrase_9_0= RULE_STRING ) )
             	    {
             	    otherlv_8=(Token)match(input,21,FOLLOW_8); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2313,11 +2313,11 @@
             	      									newLeafNode(otherlv_8, grammarAccess.getPerspectivePartStackAccess().getAccessibilityKeyword_3_2_0());
             	      								
             	    }
-            	    // InternalPerspectiveDsl.g:851:9: ( (lv_accessibilityPhrase_9_0= RULE_STRING ) )
-            	    // InternalPerspectiveDsl.g:852:10: (lv_accessibilityPhrase_9_0= RULE_STRING )
+            	    // InternalPerspectiveDsl.g:853:9: ( (lv_accessibilityPhrase_9_0= RULE_STRING ) )
+            	    // InternalPerspectiveDsl.g:854:10: (lv_accessibilityPhrase_9_0= RULE_STRING )
             	    {
-            	    // InternalPerspectiveDsl.g:852:10: (lv_accessibilityPhrase_9_0= RULE_STRING )
-            	    // InternalPerspectiveDsl.g:853:11: lv_accessibilityPhrase_9_0= RULE_STRING
+            	    // InternalPerspectiveDsl.g:854:10: (lv_accessibilityPhrase_9_0= RULE_STRING )
+            	    // InternalPerspectiveDsl.g:855:11: lv_accessibilityPhrase_9_0= RULE_STRING
             	    {
             	    lv_accessibilityPhrase_9_0=(Token)match(input,RULE_STRING,FOLLOW_15); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2381,7 +2381,7 @@
               			newLeafNode(otherlv_10, grammarAccess.getPerspectivePartStackAccess().getLeftCurlyBracketKeyword_4());
               		
             }
-            // InternalPerspectiveDsl.g:886:3: ( (lv_elements_11_0= rulePerspectiveElement ) )*
+            // InternalPerspectiveDsl.g:888:3: ( (lv_elements_11_0= rulePerspectiveElement ) )*
             loop13:
             do {
                 int alt13=2;
@@ -2394,10 +2394,10 @@
 
                 switch (alt13) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:887:4: (lv_elements_11_0= rulePerspectiveElement )
+            	    // InternalPerspectiveDsl.g:889:4: (lv_elements_11_0= rulePerspectiveElement )
             	    {
-            	    // InternalPerspectiveDsl.g:887:4: (lv_elements_11_0= rulePerspectiveElement )
-            	    // InternalPerspectiveDsl.g:888:5: lv_elements_11_0= rulePerspectiveElement
+            	    // InternalPerspectiveDsl.g:889:4: (lv_elements_11_0= rulePerspectiveElement )
+            	    // InternalPerspectiveDsl.g:890:5: lv_elements_11_0= rulePerspectiveElement
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -2465,7 +2465,7 @@
 
 
     // $ANTLR start "entryRulePerspectivePart"
-    // InternalPerspectiveDsl.g:913:1: entryRulePerspectivePart returns [EObject current=null] : iv_rulePerspectivePart= rulePerspectivePart EOF ;
+    // InternalPerspectiveDsl.g:915:1: entryRulePerspectivePart returns [EObject current=null] : iv_rulePerspectivePart= rulePerspectivePart EOF ;
     public final EObject entryRulePerspectivePart() throws RecognitionException {
         EObject current = null;
 
@@ -2473,8 +2473,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:913:56: (iv_rulePerspectivePart= rulePerspectivePart EOF )
-            // InternalPerspectiveDsl.g:914:2: iv_rulePerspectivePart= rulePerspectivePart EOF
+            // InternalPerspectiveDsl.g:915:56: (iv_rulePerspectivePart= rulePerspectivePart EOF )
+            // InternalPerspectiveDsl.g:916:2: iv_rulePerspectivePart= rulePerspectivePart EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectivePartRule()); 
@@ -2505,7 +2505,7 @@
 
 
     // $ANTLR start "rulePerspectivePart"
-    // InternalPerspectiveDsl.g:920:1: rulePerspectivePart returns [EObject current=null] : ( () otherlv_1= 'part' ( (lv_elementId_2_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* ) ) ) ) ;
+    // InternalPerspectiveDsl.g:922:1: rulePerspectivePart returns [EObject current=null] : ( () otherlv_1= 'part' ( (lv_elementId_2_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* ) ) ) ) ;
     public final EObject rulePerspectivePart() throws RecognitionException {
         EObject current = null;
 
@@ -2527,14 +2527,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:926:2: ( ( () otherlv_1= 'part' ( (lv_elementId_2_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* ) ) ) ) )
-            // InternalPerspectiveDsl.g:927:2: ( () otherlv_1= 'part' ( (lv_elementId_2_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* ) ) ) )
+            // InternalPerspectiveDsl.g:928:2: ( ( () otherlv_1= 'part' ( (lv_elementId_2_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* ) ) ) ) )
+            // InternalPerspectiveDsl.g:929:2: ( () otherlv_1= 'part' ( (lv_elementId_2_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* ) ) ) )
             {
-            // InternalPerspectiveDsl.g:927:2: ( () otherlv_1= 'part' ( (lv_elementId_2_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* ) ) ) )
-            // InternalPerspectiveDsl.g:928:3: () otherlv_1= 'part' ( (lv_elementId_2_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* ) ) )
+            // InternalPerspectiveDsl.g:929:2: ( () otherlv_1= 'part' ( (lv_elementId_2_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* ) ) ) )
+            // InternalPerspectiveDsl.g:930:3: () otherlv_1= 'part' ( (lv_elementId_2_0= ruleTRANSLATABLEID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* ) ) )
             {
-            // InternalPerspectiveDsl.g:928:3: ()
-            // InternalPerspectiveDsl.g:929:4: 
+            // InternalPerspectiveDsl.g:930:3: ()
+            // InternalPerspectiveDsl.g:931:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -2552,11 +2552,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getPerspectivePartAccess().getPartKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:939:3: ( (lv_elementId_2_0= ruleTRANSLATABLEID ) )
-            // InternalPerspectiveDsl.g:940:4: (lv_elementId_2_0= ruleTRANSLATABLEID )
+            // InternalPerspectiveDsl.g:941:3: ( (lv_elementId_2_0= ruleTRANSLATABLEID ) )
+            // InternalPerspectiveDsl.g:942:4: (lv_elementId_2_0= ruleTRANSLATABLEID )
             {
-            // InternalPerspectiveDsl.g:940:4: (lv_elementId_2_0= ruleTRANSLATABLEID )
-            // InternalPerspectiveDsl.g:941:5: lv_elementId_2_0= ruleTRANSLATABLEID
+            // InternalPerspectiveDsl.g:942:4: (lv_elementId_2_0= ruleTRANSLATABLEID )
+            // InternalPerspectiveDsl.g:943:5: lv_elementId_2_0= ruleTRANSLATABLEID
             {
             if ( state.backtracking==0 ) {
 
@@ -2587,17 +2587,17 @@
 
             }
 
-            // InternalPerspectiveDsl.g:958:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* ) ) )
-            // InternalPerspectiveDsl.g:959:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* ) )
+            // InternalPerspectiveDsl.g:960:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* ) ) )
+            // InternalPerspectiveDsl.g:961:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* ) )
             {
-            // InternalPerspectiveDsl.g:959:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* ) )
-            // InternalPerspectiveDsl.g:960:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* )
+            // InternalPerspectiveDsl.g:961:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* ) )
+            // InternalPerspectiveDsl.g:962:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* )
             {
             getUnorderedGroupHelper().enter(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3());
-            // InternalPerspectiveDsl.g:963:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* )
-            // InternalPerspectiveDsl.g:964:6: ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )*
+            // InternalPerspectiveDsl.g:965:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )* )
+            // InternalPerspectiveDsl.g:966:6: ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )*
             {
-            // InternalPerspectiveDsl.g:964:6: ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )*
+            // InternalPerspectiveDsl.g:966:6: ( ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) ) )*
             loop14:
             do {
                 int alt14=6;
@@ -2622,28 +2622,28 @@
 
                 switch (alt14) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:965:4: ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:967:4: ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:965:4: ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:966:5: {...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:967:4: ({...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:968:5: {...}? => ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 0) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectivePart", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 0)");
             	    }
-            	    // InternalPerspectiveDsl.g:966:112: ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:967:6: ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) )
+            	    // InternalPerspectiveDsl.g:968:112: ( ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:969:6: ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 0);
-            	    // InternalPerspectiveDsl.g:970:9: ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) )
-            	    // InternalPerspectiveDsl.g:970:10: {...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) )
+            	    // InternalPerspectiveDsl.g:972:9: ({...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) ) )
+            	    // InternalPerspectiveDsl.g:972:10: {...}? => (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectivePart", "true");
             	    }
-            	    // InternalPerspectiveDsl.g:970:19: (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) )
-            	    // InternalPerspectiveDsl.g:970:20: otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) )
+            	    // InternalPerspectiveDsl.g:972:19: (otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) ) )
+            	    // InternalPerspectiveDsl.g:972:20: otherlv_4= 'spaceVolume' ( (lv_containerData_5_0= RULE_STRING ) )
             	    {
             	    otherlv_4=(Token)match(input,26,FOLLOW_8); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2651,11 +2651,11 @@
             	      									newLeafNode(otherlv_4, grammarAccess.getPerspectivePartAccess().getSpaceVolumeKeyword_3_0_0());
             	      								
             	    }
-            	    // InternalPerspectiveDsl.g:974:9: ( (lv_containerData_5_0= RULE_STRING ) )
-            	    // InternalPerspectiveDsl.g:975:10: (lv_containerData_5_0= RULE_STRING )
+            	    // InternalPerspectiveDsl.g:976:9: ( (lv_containerData_5_0= RULE_STRING ) )
+            	    // InternalPerspectiveDsl.g:977:10: (lv_containerData_5_0= RULE_STRING )
             	    {
-            	    // InternalPerspectiveDsl.g:975:10: (lv_containerData_5_0= RULE_STRING )
-            	    // InternalPerspectiveDsl.g:976:11: lv_containerData_5_0= RULE_STRING
+            	    // InternalPerspectiveDsl.g:977:10: (lv_containerData_5_0= RULE_STRING )
+            	    // InternalPerspectiveDsl.g:978:11: lv_containerData_5_0= RULE_STRING
             	    {
             	    lv_containerData_5_0=(Token)match(input,RULE_STRING,FOLLOW_16); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2698,28 +2698,28 @@
             	    }
             	    break;
             	case 2 :
-            	    // InternalPerspectiveDsl.g:998:4: ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1000:4: ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:998:4: ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:999:5: {...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1000:4: ({...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1001:5: {...}? => ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 1) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectivePart", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 1)");
             	    }
-            	    // InternalPerspectiveDsl.g:999:112: ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:1000:6: ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) )
+            	    // InternalPerspectiveDsl.g:1001:112: ( ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1002:6: ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 1);
-            	    // InternalPerspectiveDsl.g:1003:9: ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) )
-            	    // InternalPerspectiveDsl.g:1003:10: {...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) )
+            	    // InternalPerspectiveDsl.g:1005:9: ({...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) ) )
+            	    // InternalPerspectiveDsl.g:1005:10: {...}? => (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectivePart", "true");
             	    }
-            	    // InternalPerspectiveDsl.g:1003:19: (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) )
-            	    // InternalPerspectiveDsl.g:1003:20: otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) )
+            	    // InternalPerspectiveDsl.g:1005:19: (otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) ) )
+            	    // InternalPerspectiveDsl.g:1005:20: otherlv_6= 'accessibility' ( (lv_accessibilityPhrase_7_0= RULE_STRING ) )
             	    {
             	    otherlv_6=(Token)match(input,21,FOLLOW_8); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2727,11 +2727,11 @@
             	      									newLeafNode(otherlv_6, grammarAccess.getPerspectivePartAccess().getAccessibilityKeyword_3_1_0());
             	      								
             	    }
-            	    // InternalPerspectiveDsl.g:1007:9: ( (lv_accessibilityPhrase_7_0= RULE_STRING ) )
-            	    // InternalPerspectiveDsl.g:1008:10: (lv_accessibilityPhrase_7_0= RULE_STRING )
+            	    // InternalPerspectiveDsl.g:1009:9: ( (lv_accessibilityPhrase_7_0= RULE_STRING ) )
+            	    // InternalPerspectiveDsl.g:1010:10: (lv_accessibilityPhrase_7_0= RULE_STRING )
             	    {
-            	    // InternalPerspectiveDsl.g:1008:10: (lv_accessibilityPhrase_7_0= RULE_STRING )
-            	    // InternalPerspectiveDsl.g:1009:11: lv_accessibilityPhrase_7_0= RULE_STRING
+            	    // InternalPerspectiveDsl.g:1010:10: (lv_accessibilityPhrase_7_0= RULE_STRING )
+            	    // InternalPerspectiveDsl.g:1011:11: lv_accessibilityPhrase_7_0= RULE_STRING
             	    {
             	    lv_accessibilityPhrase_7_0=(Token)match(input,RULE_STRING,FOLLOW_16); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2774,28 +2774,28 @@
             	    }
             	    break;
             	case 3 :
-            	    // InternalPerspectiveDsl.g:1031:4: ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1033:4: ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:1031:4: ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:1032:5: {...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1033:4: ({...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1034:5: {...}? => ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 2) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectivePart", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 2)");
             	    }
-            	    // InternalPerspectiveDsl.g:1032:112: ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:1033:6: ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) )
+            	    // InternalPerspectiveDsl.g:1034:112: ( ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1035:6: ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 2);
-            	    // InternalPerspectiveDsl.g:1036:9: ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) )
-            	    // InternalPerspectiveDsl.g:1036:10: {...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) )
+            	    // InternalPerspectiveDsl.g:1038:9: ({...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) ) )
+            	    // InternalPerspectiveDsl.g:1038:10: {...}? => (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectivePart", "true");
             	    }
-            	    // InternalPerspectiveDsl.g:1036:19: (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) )
-            	    // InternalPerspectiveDsl.g:1036:20: otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) )
+            	    // InternalPerspectiveDsl.g:1038:19: (otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) ) )
+            	    // InternalPerspectiveDsl.g:1038:20: otherlv_8= 'iconURI' ( (lv_iconURI_9_0= RULE_STRING ) )
             	    {
             	    otherlv_8=(Token)match(input,20,FOLLOW_8); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2803,11 +2803,11 @@
             	      									newLeafNode(otherlv_8, grammarAccess.getPerspectivePartAccess().getIconURIKeyword_3_2_0());
             	      								
             	    }
-            	    // InternalPerspectiveDsl.g:1040:9: ( (lv_iconURI_9_0= RULE_STRING ) )
-            	    // InternalPerspectiveDsl.g:1041:10: (lv_iconURI_9_0= RULE_STRING )
+            	    // InternalPerspectiveDsl.g:1042:9: ( (lv_iconURI_9_0= RULE_STRING ) )
+            	    // InternalPerspectiveDsl.g:1043:10: (lv_iconURI_9_0= RULE_STRING )
             	    {
-            	    // InternalPerspectiveDsl.g:1041:10: (lv_iconURI_9_0= RULE_STRING )
-            	    // InternalPerspectiveDsl.g:1042:11: lv_iconURI_9_0= RULE_STRING
+            	    // InternalPerspectiveDsl.g:1043:10: (lv_iconURI_9_0= RULE_STRING )
+            	    // InternalPerspectiveDsl.g:1044:11: lv_iconURI_9_0= RULE_STRING
             	    {
             	    lv_iconURI_9_0=(Token)match(input,RULE_STRING,FOLLOW_16); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2850,28 +2850,28 @@
             	    }
             	    break;
             	case 4 :
-            	    // InternalPerspectiveDsl.g:1064:4: ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1066:4: ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:1064:4: ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:1065:5: {...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1066:4: ({...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1067:5: {...}? => ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 3) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectivePart", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 3)");
             	    }
-            	    // InternalPerspectiveDsl.g:1065:112: ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:1066:6: ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) )
+            	    // InternalPerspectiveDsl.g:1067:112: ( ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1068:6: ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 3);
-            	    // InternalPerspectiveDsl.g:1069:9: ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) )
-            	    // InternalPerspectiveDsl.g:1069:10: {...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) )
+            	    // InternalPerspectiveDsl.g:1071:9: ({...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) ) )
+            	    // InternalPerspectiveDsl.g:1071:10: {...}? => (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectivePart", "true");
             	    }
-            	    // InternalPerspectiveDsl.g:1069:19: (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) )
-            	    // InternalPerspectiveDsl.g:1069:20: otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) )
+            	    // InternalPerspectiveDsl.g:1071:19: (otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) ) )
+            	    // InternalPerspectiveDsl.g:1071:20: otherlv_10= 'view' ( (lv_view_11_0= rulePerspectiveView ) )
             	    {
             	    otherlv_10=(Token)match(input,29,FOLLOW_17); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2879,11 +2879,11 @@
             	      									newLeafNode(otherlv_10, grammarAccess.getPerspectivePartAccess().getViewKeyword_3_3_0());
             	      								
             	    }
-            	    // InternalPerspectiveDsl.g:1073:9: ( (lv_view_11_0= rulePerspectiveView ) )
-            	    // InternalPerspectiveDsl.g:1074:10: (lv_view_11_0= rulePerspectiveView )
+            	    // InternalPerspectiveDsl.g:1075:9: ( (lv_view_11_0= rulePerspectiveView ) )
+            	    // InternalPerspectiveDsl.g:1076:10: (lv_view_11_0= rulePerspectiveView )
             	    {
-            	    // InternalPerspectiveDsl.g:1074:10: (lv_view_11_0= rulePerspectiveView )
-            	    // InternalPerspectiveDsl.g:1075:11: lv_view_11_0= rulePerspectiveView
+            	    // InternalPerspectiveDsl.g:1076:10: (lv_view_11_0= rulePerspectiveView )
+            	    // InternalPerspectiveDsl.g:1077:11: lv_view_11_0= rulePerspectiveView
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -2931,31 +2931,31 @@
             	    }
             	    break;
             	case 5 :
-            	    // InternalPerspectiveDsl.g:1098:4: ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1100:4: ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:1098:4: ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:1099:5: {...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) )
+            	    // InternalPerspectiveDsl.g:1100:4: ({...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1101:5: {...}? => ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 4) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectivePart", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 4)");
             	    }
-            	    // InternalPerspectiveDsl.g:1099:112: ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) )
-            	    // InternalPerspectiveDsl.g:1100:6: ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) )
+            	    // InternalPerspectiveDsl.g:1101:112: ( ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) ) )
+            	    // InternalPerspectiveDsl.g:1102:6: ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getPerspectivePartAccess().getUnorderedGroup_3(), 4);
-            	    // InternalPerspectiveDsl.g:1103:9: ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) )
-            	    // InternalPerspectiveDsl.g:1103:10: {...}? => ( (lv_isClosable_12_0= 'isClosable' ) )
+            	    // InternalPerspectiveDsl.g:1105:9: ({...}? => ( (lv_isClosable_12_0= 'isClosable' ) ) )
+            	    // InternalPerspectiveDsl.g:1105:10: {...}? => ( (lv_isClosable_12_0= 'isClosable' ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectivePart", "true");
             	    }
-            	    // InternalPerspectiveDsl.g:1103:19: ( (lv_isClosable_12_0= 'isClosable' ) )
-            	    // InternalPerspectiveDsl.g:1103:20: (lv_isClosable_12_0= 'isClosable' )
+            	    // InternalPerspectiveDsl.g:1105:19: ( (lv_isClosable_12_0= 'isClosable' ) )
+            	    // InternalPerspectiveDsl.g:1105:20: (lv_isClosable_12_0= 'isClosable' )
             	    {
-            	    // InternalPerspectiveDsl.g:1103:20: (lv_isClosable_12_0= 'isClosable' )
-            	    // InternalPerspectiveDsl.g:1104:10: lv_isClosable_12_0= 'isClosable'
+            	    // InternalPerspectiveDsl.g:1105:20: (lv_isClosable_12_0= 'isClosable' )
+            	    // InternalPerspectiveDsl.g:1106:10: lv_isClosable_12_0= 'isClosable'
             	    {
             	    lv_isClosable_12_0=(Token)match(input,30,FOLLOW_16); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -3031,7 +3031,7 @@
 
 
     // $ANTLR start "entryRulePerspectiveView"
-    // InternalPerspectiveDsl.g:1132:1: entryRulePerspectiveView returns [EObject current=null] : iv_rulePerspectiveView= rulePerspectiveView EOF ;
+    // InternalPerspectiveDsl.g:1134:1: entryRulePerspectiveView returns [EObject current=null] : iv_rulePerspectiveView= rulePerspectiveView EOF ;
     public final EObject entryRulePerspectiveView() throws RecognitionException {
         EObject current = null;
 
@@ -3039,8 +3039,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:1132:56: (iv_rulePerspectiveView= rulePerspectiveView EOF )
-            // InternalPerspectiveDsl.g:1133:2: iv_rulePerspectiveView= rulePerspectiveView EOF
+            // InternalPerspectiveDsl.g:1134:56: (iv_rulePerspectiveView= rulePerspectiveView EOF )
+            // InternalPerspectiveDsl.g:1135:2: iv_rulePerspectiveView= rulePerspectiveView EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveViewRule()); 
@@ -3071,7 +3071,7 @@
 
 
     // $ANTLR start "rulePerspectiveView"
-    // InternalPerspectiveDsl.g:1139:1: rulePerspectiveView returns [EObject current=null] : (this_PerspectiveSelection_0= rulePerspectiveSelection | this_PerspectiveTable_1= rulePerspectiveTable | this_PerspectiveChart_2= rulePerspectiveChart | this_PerspectiveReport_3= rulePerspectiveReport | this_PerspectiveOrganization_4= rulePerspectiveOrganization | this_PerspectiveTopology_5= rulePerspectiveTopology | this_PerspectiveDialog_6= rulePerspectiveDialog | this_PerspectiveGrid_7= rulePerspectiveGrid | this_PerspectiveWelcome_8= rulePerspectiveWelcome | this_PerspectiveSearch_9= rulePerspectiveSearch | this_PerspectiveDataInterchange_10= rulePerspectiveDataInterchange | this_PerspectiveBPMN_11= rulePerspectiveBPMN | this_PerspectiveKanban_12= rulePerspectiveKanban | this_PerspectiveTitle_13= rulePerspectiveTitle | this_PerspectiveDashboard_14= rulePerspectiveDashboard ) ;
+    // InternalPerspectiveDsl.g:1141:1: rulePerspectiveView returns [EObject current=null] : (this_PerspectiveSelection_0= rulePerspectiveSelection | this_PerspectiveTable_1= rulePerspectiveTable | this_PerspectiveChart_2= rulePerspectiveChart | this_PerspectiveReport_3= rulePerspectiveReport | this_PerspectiveOrganization_4= rulePerspectiveOrganization | this_PerspectiveTopology_5= rulePerspectiveTopology | this_PerspectiveDialog_6= rulePerspectiveDialog | this_PerspectiveGrid_7= rulePerspectiveGrid | this_PerspectiveWelcome_8= rulePerspectiveWelcome | this_PerspectiveSearch_9= rulePerspectiveSearch | this_PerspectiveDataInterchange_10= rulePerspectiveDataInterchange | this_PerspectiveBPMN_11= rulePerspectiveBPMN | this_PerspectiveKanban_12= rulePerspectiveKanban | this_PerspectiveTitle_13= rulePerspectiveTitle | this_PerspectiveDashboard_14= rulePerspectiveDashboard ) ;
     public final EObject rulePerspectiveView() throws RecognitionException {
         EObject current = null;
 
@@ -3110,10 +3110,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:1145:2: ( (this_PerspectiveSelection_0= rulePerspectiveSelection | this_PerspectiveTable_1= rulePerspectiveTable | this_PerspectiveChart_2= rulePerspectiveChart | this_PerspectiveReport_3= rulePerspectiveReport | this_PerspectiveOrganization_4= rulePerspectiveOrganization | this_PerspectiveTopology_5= rulePerspectiveTopology | this_PerspectiveDialog_6= rulePerspectiveDialog | this_PerspectiveGrid_7= rulePerspectiveGrid | this_PerspectiveWelcome_8= rulePerspectiveWelcome | this_PerspectiveSearch_9= rulePerspectiveSearch | this_PerspectiveDataInterchange_10= rulePerspectiveDataInterchange | this_PerspectiveBPMN_11= rulePerspectiveBPMN | this_PerspectiveKanban_12= rulePerspectiveKanban | this_PerspectiveTitle_13= rulePerspectiveTitle | this_PerspectiveDashboard_14= rulePerspectiveDashboard ) )
-            // InternalPerspectiveDsl.g:1146:2: (this_PerspectiveSelection_0= rulePerspectiveSelection | this_PerspectiveTable_1= rulePerspectiveTable | this_PerspectiveChart_2= rulePerspectiveChart | this_PerspectiveReport_3= rulePerspectiveReport | this_PerspectiveOrganization_4= rulePerspectiveOrganization | this_PerspectiveTopology_5= rulePerspectiveTopology | this_PerspectiveDialog_6= rulePerspectiveDialog | this_PerspectiveGrid_7= rulePerspectiveGrid | this_PerspectiveWelcome_8= rulePerspectiveWelcome | this_PerspectiveSearch_9= rulePerspectiveSearch | this_PerspectiveDataInterchange_10= rulePerspectiveDataInterchange | this_PerspectiveBPMN_11= rulePerspectiveBPMN | this_PerspectiveKanban_12= rulePerspectiveKanban | this_PerspectiveTitle_13= rulePerspectiveTitle | this_PerspectiveDashboard_14= rulePerspectiveDashboard )
+            // InternalPerspectiveDsl.g:1147:2: ( (this_PerspectiveSelection_0= rulePerspectiveSelection | this_PerspectiveTable_1= rulePerspectiveTable | this_PerspectiveChart_2= rulePerspectiveChart | this_PerspectiveReport_3= rulePerspectiveReport | this_PerspectiveOrganization_4= rulePerspectiveOrganization | this_PerspectiveTopology_5= rulePerspectiveTopology | this_PerspectiveDialog_6= rulePerspectiveDialog | this_PerspectiveGrid_7= rulePerspectiveGrid | this_PerspectiveWelcome_8= rulePerspectiveWelcome | this_PerspectiveSearch_9= rulePerspectiveSearch | this_PerspectiveDataInterchange_10= rulePerspectiveDataInterchange | this_PerspectiveBPMN_11= rulePerspectiveBPMN | this_PerspectiveKanban_12= rulePerspectiveKanban | this_PerspectiveTitle_13= rulePerspectiveTitle | this_PerspectiveDashboard_14= rulePerspectiveDashboard ) )
+            // InternalPerspectiveDsl.g:1148:2: (this_PerspectiveSelection_0= rulePerspectiveSelection | this_PerspectiveTable_1= rulePerspectiveTable | this_PerspectiveChart_2= rulePerspectiveChart | this_PerspectiveReport_3= rulePerspectiveReport | this_PerspectiveOrganization_4= rulePerspectiveOrganization | this_PerspectiveTopology_5= rulePerspectiveTopology | this_PerspectiveDialog_6= rulePerspectiveDialog | this_PerspectiveGrid_7= rulePerspectiveGrid | this_PerspectiveWelcome_8= rulePerspectiveWelcome | this_PerspectiveSearch_9= rulePerspectiveSearch | this_PerspectiveDataInterchange_10= rulePerspectiveDataInterchange | this_PerspectiveBPMN_11= rulePerspectiveBPMN | this_PerspectiveKanban_12= rulePerspectiveKanban | this_PerspectiveTitle_13= rulePerspectiveTitle | this_PerspectiveDashboard_14= rulePerspectiveDashboard )
             {
-            // InternalPerspectiveDsl.g:1146:2: (this_PerspectiveSelection_0= rulePerspectiveSelection | this_PerspectiveTable_1= rulePerspectiveTable | this_PerspectiveChart_2= rulePerspectiveChart | this_PerspectiveReport_3= rulePerspectiveReport | this_PerspectiveOrganization_4= rulePerspectiveOrganization | this_PerspectiveTopology_5= rulePerspectiveTopology | this_PerspectiveDialog_6= rulePerspectiveDialog | this_PerspectiveGrid_7= rulePerspectiveGrid | this_PerspectiveWelcome_8= rulePerspectiveWelcome | this_PerspectiveSearch_9= rulePerspectiveSearch | this_PerspectiveDataInterchange_10= rulePerspectiveDataInterchange | this_PerspectiveBPMN_11= rulePerspectiveBPMN | this_PerspectiveKanban_12= rulePerspectiveKanban | this_PerspectiveTitle_13= rulePerspectiveTitle | this_PerspectiveDashboard_14= rulePerspectiveDashboard )
+            // InternalPerspectiveDsl.g:1148:2: (this_PerspectiveSelection_0= rulePerspectiveSelection | this_PerspectiveTable_1= rulePerspectiveTable | this_PerspectiveChart_2= rulePerspectiveChart | this_PerspectiveReport_3= rulePerspectiveReport | this_PerspectiveOrganization_4= rulePerspectiveOrganization | this_PerspectiveTopology_5= rulePerspectiveTopology | this_PerspectiveDialog_6= rulePerspectiveDialog | this_PerspectiveGrid_7= rulePerspectiveGrid | this_PerspectiveWelcome_8= rulePerspectiveWelcome | this_PerspectiveSearch_9= rulePerspectiveSearch | this_PerspectiveDataInterchange_10= rulePerspectiveDataInterchange | this_PerspectiveBPMN_11= rulePerspectiveBPMN | this_PerspectiveKanban_12= rulePerspectiveKanban | this_PerspectiveTitle_13= rulePerspectiveTitle | this_PerspectiveDashboard_14= rulePerspectiveDashboard )
             int alt15=15;
             switch ( input.LA(1) ) {
             case 31:
@@ -3201,7 +3201,7 @@
 
             switch (alt15) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:1147:3: this_PerspectiveSelection_0= rulePerspectiveSelection
+                    // InternalPerspectiveDsl.g:1149:3: this_PerspectiveSelection_0= rulePerspectiveSelection
                     {
                     if ( state.backtracking==0 ) {
 
@@ -3223,7 +3223,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:1156:3: this_PerspectiveTable_1= rulePerspectiveTable
+                    // InternalPerspectiveDsl.g:1158:3: this_PerspectiveTable_1= rulePerspectiveTable
                     {
                     if ( state.backtracking==0 ) {
 
@@ -3245,7 +3245,7 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:1165:3: this_PerspectiveChart_2= rulePerspectiveChart
+                    // InternalPerspectiveDsl.g:1167:3: this_PerspectiveChart_2= rulePerspectiveChart
                     {
                     if ( state.backtracking==0 ) {
 
@@ -3267,7 +3267,7 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:1174:3: this_PerspectiveReport_3= rulePerspectiveReport
+                    // InternalPerspectiveDsl.g:1176:3: this_PerspectiveReport_3= rulePerspectiveReport
                     {
                     if ( state.backtracking==0 ) {
 
@@ -3289,7 +3289,7 @@
                     }
                     break;
                 case 5 :
-                    // InternalPerspectiveDsl.g:1183:3: this_PerspectiveOrganization_4= rulePerspectiveOrganization
+                    // InternalPerspectiveDsl.g:1185:3: this_PerspectiveOrganization_4= rulePerspectiveOrganization
                     {
                     if ( state.backtracking==0 ) {
 
@@ -3311,7 +3311,7 @@
                     }
                     break;
                 case 6 :
-                    // InternalPerspectiveDsl.g:1192:3: this_PerspectiveTopology_5= rulePerspectiveTopology
+                    // InternalPerspectiveDsl.g:1194:3: this_PerspectiveTopology_5= rulePerspectiveTopology
                     {
                     if ( state.backtracking==0 ) {
 
@@ -3333,7 +3333,7 @@
                     }
                     break;
                 case 7 :
-                    // InternalPerspectiveDsl.g:1201:3: this_PerspectiveDialog_6= rulePerspectiveDialog
+                    // InternalPerspectiveDsl.g:1203:3: this_PerspectiveDialog_6= rulePerspectiveDialog
                     {
                     if ( state.backtracking==0 ) {
 
@@ -3355,7 +3355,7 @@
                     }
                     break;
                 case 8 :
-                    // InternalPerspectiveDsl.g:1210:3: this_PerspectiveGrid_7= rulePerspectiveGrid
+                    // InternalPerspectiveDsl.g:1212:3: this_PerspectiveGrid_7= rulePerspectiveGrid
                     {
                     if ( state.backtracking==0 ) {
 
@@ -3377,7 +3377,7 @@
                     }
                     break;
                 case 9 :
-                    // InternalPerspectiveDsl.g:1219:3: this_PerspectiveWelcome_8= rulePerspectiveWelcome
+                    // InternalPerspectiveDsl.g:1221:3: this_PerspectiveWelcome_8= rulePerspectiveWelcome
                     {
                     if ( state.backtracking==0 ) {
 
@@ -3399,7 +3399,7 @@
                     }
                     break;
                 case 10 :
-                    // InternalPerspectiveDsl.g:1228:3: this_PerspectiveSearch_9= rulePerspectiveSearch
+                    // InternalPerspectiveDsl.g:1230:3: this_PerspectiveSearch_9= rulePerspectiveSearch
                     {
                     if ( state.backtracking==0 ) {
 
@@ -3421,7 +3421,7 @@
                     }
                     break;
                 case 11 :
-                    // InternalPerspectiveDsl.g:1237:3: this_PerspectiveDataInterchange_10= rulePerspectiveDataInterchange
+                    // InternalPerspectiveDsl.g:1239:3: this_PerspectiveDataInterchange_10= rulePerspectiveDataInterchange
                     {
                     if ( state.backtracking==0 ) {
 
@@ -3443,7 +3443,7 @@
                     }
                     break;
                 case 12 :
-                    // InternalPerspectiveDsl.g:1246:3: this_PerspectiveBPMN_11= rulePerspectiveBPMN
+                    // InternalPerspectiveDsl.g:1248:3: this_PerspectiveBPMN_11= rulePerspectiveBPMN
                     {
                     if ( state.backtracking==0 ) {
 
@@ -3465,7 +3465,7 @@
                     }
                     break;
                 case 13 :
-                    // InternalPerspectiveDsl.g:1255:3: this_PerspectiveKanban_12= rulePerspectiveKanban
+                    // InternalPerspectiveDsl.g:1257:3: this_PerspectiveKanban_12= rulePerspectiveKanban
                     {
                     if ( state.backtracking==0 ) {
 
@@ -3487,7 +3487,7 @@
                     }
                     break;
                 case 14 :
-                    // InternalPerspectiveDsl.g:1264:3: this_PerspectiveTitle_13= rulePerspectiveTitle
+                    // InternalPerspectiveDsl.g:1266:3: this_PerspectiveTitle_13= rulePerspectiveTitle
                     {
                     if ( state.backtracking==0 ) {
 
@@ -3509,7 +3509,7 @@
                     }
                     break;
                 case 15 :
-                    // InternalPerspectiveDsl.g:1273:3: this_PerspectiveDashboard_14= rulePerspectiveDashboard
+                    // InternalPerspectiveDsl.g:1275:3: this_PerspectiveDashboard_14= rulePerspectiveDashboard
                     {
                     if ( state.backtracking==0 ) {
 
@@ -3555,7 +3555,7 @@
 
 
     // $ANTLR start "entryRulePerspectiveSelection"
-    // InternalPerspectiveDsl.g:1285:1: entryRulePerspectiveSelection returns [EObject current=null] : iv_rulePerspectiveSelection= rulePerspectiveSelection EOF ;
+    // InternalPerspectiveDsl.g:1287:1: entryRulePerspectiveSelection returns [EObject current=null] : iv_rulePerspectiveSelection= rulePerspectiveSelection EOF ;
     public final EObject entryRulePerspectiveSelection() throws RecognitionException {
         EObject current = null;
 
@@ -3563,8 +3563,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:1285:61: (iv_rulePerspectiveSelection= rulePerspectiveSelection EOF )
-            // InternalPerspectiveDsl.g:1286:2: iv_rulePerspectiveSelection= rulePerspectiveSelection EOF
+            // InternalPerspectiveDsl.g:1287:61: (iv_rulePerspectiveSelection= rulePerspectiveSelection EOF )
+            // InternalPerspectiveDsl.g:1288:2: iv_rulePerspectiveSelection= rulePerspectiveSelection EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveSelectionRule()); 
@@ -3595,7 +3595,7 @@
 
 
     // $ANTLR start "rulePerspectiveSelection"
-    // InternalPerspectiveDsl.g:1292:1: rulePerspectiveSelection returns [EObject current=null] : ( () otherlv_1= 'select' ( (otherlv_2= RULE_ID ) ) ) ;
+    // InternalPerspectiveDsl.g:1294:1: rulePerspectiveSelection returns [EObject current=null] : ( () otherlv_1= 'select' ( (otherlv_2= RULE_ID ) ) ) ;
     public final EObject rulePerspectiveSelection() throws RecognitionException {
         EObject current = null;
 
@@ -3606,14 +3606,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:1298:2: ( ( () otherlv_1= 'select' ( (otherlv_2= RULE_ID ) ) ) )
-            // InternalPerspectiveDsl.g:1299:2: ( () otherlv_1= 'select' ( (otherlv_2= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1300:2: ( ( () otherlv_1= 'select' ( (otherlv_2= RULE_ID ) ) ) )
+            // InternalPerspectiveDsl.g:1301:2: ( () otherlv_1= 'select' ( (otherlv_2= RULE_ID ) ) )
             {
-            // InternalPerspectiveDsl.g:1299:2: ( () otherlv_1= 'select' ( (otherlv_2= RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:1300:3: () otherlv_1= 'select' ( (otherlv_2= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1301:2: ( () otherlv_1= 'select' ( (otherlv_2= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1302:3: () otherlv_1= 'select' ( (otherlv_2= RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:1300:3: ()
-            // InternalPerspectiveDsl.g:1301:4: 
+            // InternalPerspectiveDsl.g:1302:3: ()
+            // InternalPerspectiveDsl.g:1303:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -3631,11 +3631,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getPerspectiveSelectionAccess().getSelectKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:1311:3: ( (otherlv_2= RULE_ID ) )
-            // InternalPerspectiveDsl.g:1312:4: (otherlv_2= RULE_ID )
+            // InternalPerspectiveDsl.g:1313:3: ( (otherlv_2= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1314:4: (otherlv_2= RULE_ID )
             {
-            // InternalPerspectiveDsl.g:1312:4: (otherlv_2= RULE_ID )
-            // InternalPerspectiveDsl.g:1313:5: otherlv_2= RULE_ID
+            // InternalPerspectiveDsl.g:1314:4: (otherlv_2= RULE_ID )
+            // InternalPerspectiveDsl.g:1315:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -3681,7 +3681,7 @@
 
 
     // $ANTLR start "entryRulePerspectiveTable"
-    // InternalPerspectiveDsl.g:1328:1: entryRulePerspectiveTable returns [EObject current=null] : iv_rulePerspectiveTable= rulePerspectiveTable EOF ;
+    // InternalPerspectiveDsl.g:1330:1: entryRulePerspectiveTable returns [EObject current=null] : iv_rulePerspectiveTable= rulePerspectiveTable EOF ;
     public final EObject entryRulePerspectiveTable() throws RecognitionException {
         EObject current = null;
 
@@ -3689,8 +3689,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:1328:57: (iv_rulePerspectiveTable= rulePerspectiveTable EOF )
-            // InternalPerspectiveDsl.g:1329:2: iv_rulePerspectiveTable= rulePerspectiveTable EOF
+            // InternalPerspectiveDsl.g:1330:57: (iv_rulePerspectiveTable= rulePerspectiveTable EOF )
+            // InternalPerspectiveDsl.g:1331:2: iv_rulePerspectiveTable= rulePerspectiveTable EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveTableRule()); 
@@ -3721,7 +3721,7 @@
 
 
     // $ANTLR start "rulePerspectiveTable"
-    // InternalPerspectiveDsl.g:1335:1: rulePerspectiveTable returns [EObject current=null] : ( () otherlv_1= 'readOnlyTable' ( (otherlv_2= RULE_ID ) ) ) ;
+    // InternalPerspectiveDsl.g:1337:1: rulePerspectiveTable returns [EObject current=null] : ( () otherlv_1= 'readOnlyTable' ( (otherlv_2= RULE_ID ) ) ) ;
     public final EObject rulePerspectiveTable() throws RecognitionException {
         EObject current = null;
 
@@ -3732,14 +3732,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:1341:2: ( ( () otherlv_1= 'readOnlyTable' ( (otherlv_2= RULE_ID ) ) ) )
-            // InternalPerspectiveDsl.g:1342:2: ( () otherlv_1= 'readOnlyTable' ( (otherlv_2= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1343:2: ( ( () otherlv_1= 'readOnlyTable' ( (otherlv_2= RULE_ID ) ) ) )
+            // InternalPerspectiveDsl.g:1344:2: ( () otherlv_1= 'readOnlyTable' ( (otherlv_2= RULE_ID ) ) )
             {
-            // InternalPerspectiveDsl.g:1342:2: ( () otherlv_1= 'readOnlyTable' ( (otherlv_2= RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:1343:3: () otherlv_1= 'readOnlyTable' ( (otherlv_2= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1344:2: ( () otherlv_1= 'readOnlyTable' ( (otherlv_2= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1345:3: () otherlv_1= 'readOnlyTable' ( (otherlv_2= RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:1343:3: ()
-            // InternalPerspectiveDsl.g:1344:4: 
+            // InternalPerspectiveDsl.g:1345:3: ()
+            // InternalPerspectiveDsl.g:1346:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -3757,11 +3757,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getPerspectiveTableAccess().getReadOnlyTableKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:1354:3: ( (otherlv_2= RULE_ID ) )
-            // InternalPerspectiveDsl.g:1355:4: (otherlv_2= RULE_ID )
+            // InternalPerspectiveDsl.g:1356:3: ( (otherlv_2= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1357:4: (otherlv_2= RULE_ID )
             {
-            // InternalPerspectiveDsl.g:1355:4: (otherlv_2= RULE_ID )
-            // InternalPerspectiveDsl.g:1356:5: otherlv_2= RULE_ID
+            // InternalPerspectiveDsl.g:1357:4: (otherlv_2= RULE_ID )
+            // InternalPerspectiveDsl.g:1358:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -3807,7 +3807,7 @@
 
 
     // $ANTLR start "entryRulePerspectiveGrid"
-    // InternalPerspectiveDsl.g:1371:1: entryRulePerspectiveGrid returns [EObject current=null] : iv_rulePerspectiveGrid= rulePerspectiveGrid EOF ;
+    // InternalPerspectiveDsl.g:1373:1: entryRulePerspectiveGrid returns [EObject current=null] : iv_rulePerspectiveGrid= rulePerspectiveGrid EOF ;
     public final EObject entryRulePerspectiveGrid() throws RecognitionException {
         EObject current = null;
 
@@ -3815,8 +3815,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:1371:56: (iv_rulePerspectiveGrid= rulePerspectiveGrid EOF )
-            // InternalPerspectiveDsl.g:1372:2: iv_rulePerspectiveGrid= rulePerspectiveGrid EOF
+            // InternalPerspectiveDsl.g:1373:56: (iv_rulePerspectiveGrid= rulePerspectiveGrid EOF )
+            // InternalPerspectiveDsl.g:1374:2: iv_rulePerspectiveGrid= rulePerspectiveGrid EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveGridRule()); 
@@ -3847,7 +3847,7 @@
 
 
     // $ANTLR start "rulePerspectiveGrid"
-    // InternalPerspectiveDsl.g:1378:1: rulePerspectiveGrid returns [EObject current=null] : ( () otherlv_1= 'editableTable' ( (otherlv_2= RULE_ID ) ) ) ;
+    // InternalPerspectiveDsl.g:1380:1: rulePerspectiveGrid returns [EObject current=null] : ( () otherlv_1= 'editableTable' ( (otherlv_2= RULE_ID ) ) ) ;
     public final EObject rulePerspectiveGrid() throws RecognitionException {
         EObject current = null;
 
@@ -3858,14 +3858,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:1384:2: ( ( () otherlv_1= 'editableTable' ( (otherlv_2= RULE_ID ) ) ) )
-            // InternalPerspectiveDsl.g:1385:2: ( () otherlv_1= 'editableTable' ( (otherlv_2= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1386:2: ( ( () otherlv_1= 'editableTable' ( (otherlv_2= RULE_ID ) ) ) )
+            // InternalPerspectiveDsl.g:1387:2: ( () otherlv_1= 'editableTable' ( (otherlv_2= RULE_ID ) ) )
             {
-            // InternalPerspectiveDsl.g:1385:2: ( () otherlv_1= 'editableTable' ( (otherlv_2= RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:1386:3: () otherlv_1= 'editableTable' ( (otherlv_2= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1387:2: ( () otherlv_1= 'editableTable' ( (otherlv_2= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1388:3: () otherlv_1= 'editableTable' ( (otherlv_2= RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:1386:3: ()
-            // InternalPerspectiveDsl.g:1387:4: 
+            // InternalPerspectiveDsl.g:1388:3: ()
+            // InternalPerspectiveDsl.g:1389:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -3883,11 +3883,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getPerspectiveGridAccess().getEditableTableKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:1397:3: ( (otherlv_2= RULE_ID ) )
-            // InternalPerspectiveDsl.g:1398:4: (otherlv_2= RULE_ID )
+            // InternalPerspectiveDsl.g:1399:3: ( (otherlv_2= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1400:4: (otherlv_2= RULE_ID )
             {
-            // InternalPerspectiveDsl.g:1398:4: (otherlv_2= RULE_ID )
-            // InternalPerspectiveDsl.g:1399:5: otherlv_2= RULE_ID
+            // InternalPerspectiveDsl.g:1400:4: (otherlv_2= RULE_ID )
+            // InternalPerspectiveDsl.g:1401:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -3933,7 +3933,7 @@
 
 
     // $ANTLR start "entryRulePerspectiveChart"
-    // InternalPerspectiveDsl.g:1414:1: entryRulePerspectiveChart returns [EObject current=null] : iv_rulePerspectiveChart= rulePerspectiveChart EOF ;
+    // InternalPerspectiveDsl.g:1416:1: entryRulePerspectiveChart returns [EObject current=null] : iv_rulePerspectiveChart= rulePerspectiveChart EOF ;
     public final EObject entryRulePerspectiveChart() throws RecognitionException {
         EObject current = null;
 
@@ -3941,8 +3941,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:1414:57: (iv_rulePerspectiveChart= rulePerspectiveChart EOF )
-            // InternalPerspectiveDsl.g:1415:2: iv_rulePerspectiveChart= rulePerspectiveChart EOF
+            // InternalPerspectiveDsl.g:1416:57: (iv_rulePerspectiveChart= rulePerspectiveChart EOF )
+            // InternalPerspectiveDsl.g:1417:2: iv_rulePerspectiveChart= rulePerspectiveChart EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveChartRule()); 
@@ -3973,7 +3973,7 @@
 
 
     // $ANTLR start "rulePerspectiveChart"
-    // InternalPerspectiveDsl.g:1421:1: rulePerspectiveChart returns [EObject current=null] : ( () otherlv_1= 'chart' ( (otherlv_2= RULE_ID ) ) ) ;
+    // InternalPerspectiveDsl.g:1423:1: rulePerspectiveChart returns [EObject current=null] : ( () otherlv_1= 'chart' ( (otherlv_2= RULE_ID ) ) ) ;
     public final EObject rulePerspectiveChart() throws RecognitionException {
         EObject current = null;
 
@@ -3984,14 +3984,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:1427:2: ( ( () otherlv_1= 'chart' ( (otherlv_2= RULE_ID ) ) ) )
-            // InternalPerspectiveDsl.g:1428:2: ( () otherlv_1= 'chart' ( (otherlv_2= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1429:2: ( ( () otherlv_1= 'chart' ( (otherlv_2= RULE_ID ) ) ) )
+            // InternalPerspectiveDsl.g:1430:2: ( () otherlv_1= 'chart' ( (otherlv_2= RULE_ID ) ) )
             {
-            // InternalPerspectiveDsl.g:1428:2: ( () otherlv_1= 'chart' ( (otherlv_2= RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:1429:3: () otherlv_1= 'chart' ( (otherlv_2= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1430:2: ( () otherlv_1= 'chart' ( (otherlv_2= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1431:3: () otherlv_1= 'chart' ( (otherlv_2= RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:1429:3: ()
-            // InternalPerspectiveDsl.g:1430:4: 
+            // InternalPerspectiveDsl.g:1431:3: ()
+            // InternalPerspectiveDsl.g:1432:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -4009,11 +4009,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getPerspectiveChartAccess().getChartKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:1440:3: ( (otherlv_2= RULE_ID ) )
-            // InternalPerspectiveDsl.g:1441:4: (otherlv_2= RULE_ID )
+            // InternalPerspectiveDsl.g:1442:3: ( (otherlv_2= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1443:4: (otherlv_2= RULE_ID )
             {
-            // InternalPerspectiveDsl.g:1441:4: (otherlv_2= RULE_ID )
-            // InternalPerspectiveDsl.g:1442:5: otherlv_2= RULE_ID
+            // InternalPerspectiveDsl.g:1443:4: (otherlv_2= RULE_ID )
+            // InternalPerspectiveDsl.g:1444:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -4059,7 +4059,7 @@
 
 
     // $ANTLR start "entryRulePerspectiveReport"
-    // InternalPerspectiveDsl.g:1457:1: entryRulePerspectiveReport returns [EObject current=null] : iv_rulePerspectiveReport= rulePerspectiveReport EOF ;
+    // InternalPerspectiveDsl.g:1459:1: entryRulePerspectiveReport returns [EObject current=null] : iv_rulePerspectiveReport= rulePerspectiveReport EOF ;
     public final EObject entryRulePerspectiveReport() throws RecognitionException {
         EObject current = null;
 
@@ -4067,8 +4067,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:1457:58: (iv_rulePerspectiveReport= rulePerspectiveReport EOF )
-            // InternalPerspectiveDsl.g:1458:2: iv_rulePerspectiveReport= rulePerspectiveReport EOF
+            // InternalPerspectiveDsl.g:1459:58: (iv_rulePerspectiveReport= rulePerspectiveReport EOF )
+            // InternalPerspectiveDsl.g:1460:2: iv_rulePerspectiveReport= rulePerspectiveReport EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveReportRule()); 
@@ -4099,7 +4099,7 @@
 
 
     // $ANTLR start "rulePerspectiveReport"
-    // InternalPerspectiveDsl.g:1464:1: rulePerspectiveReport returns [EObject current=null] : ( () otherlv_1= 'report' ( (otherlv_2= RULE_ID ) ) ) ;
+    // InternalPerspectiveDsl.g:1466:1: rulePerspectiveReport returns [EObject current=null] : ( () otherlv_1= 'report' ( (otherlv_2= RULE_ID ) ) ) ;
     public final EObject rulePerspectiveReport() throws RecognitionException {
         EObject current = null;
 
@@ -4110,14 +4110,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:1470:2: ( ( () otherlv_1= 'report' ( (otherlv_2= RULE_ID ) ) ) )
-            // InternalPerspectiveDsl.g:1471:2: ( () otherlv_1= 'report' ( (otherlv_2= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1472:2: ( ( () otherlv_1= 'report' ( (otherlv_2= RULE_ID ) ) ) )
+            // InternalPerspectiveDsl.g:1473:2: ( () otherlv_1= 'report' ( (otherlv_2= RULE_ID ) ) )
             {
-            // InternalPerspectiveDsl.g:1471:2: ( () otherlv_1= 'report' ( (otherlv_2= RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:1472:3: () otherlv_1= 'report' ( (otherlv_2= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1473:2: ( () otherlv_1= 'report' ( (otherlv_2= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1474:3: () otherlv_1= 'report' ( (otherlv_2= RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:1472:3: ()
-            // InternalPerspectiveDsl.g:1473:4: 
+            // InternalPerspectiveDsl.g:1474:3: ()
+            // InternalPerspectiveDsl.g:1475:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -4135,11 +4135,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getPerspectiveReportAccess().getReportKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:1483:3: ( (otherlv_2= RULE_ID ) )
-            // InternalPerspectiveDsl.g:1484:4: (otherlv_2= RULE_ID )
+            // InternalPerspectiveDsl.g:1485:3: ( (otherlv_2= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1486:4: (otherlv_2= RULE_ID )
             {
-            // InternalPerspectiveDsl.g:1484:4: (otherlv_2= RULE_ID )
-            // InternalPerspectiveDsl.g:1485:5: otherlv_2= RULE_ID
+            // InternalPerspectiveDsl.g:1486:4: (otherlv_2= RULE_ID )
+            // InternalPerspectiveDsl.g:1487:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -4185,7 +4185,7 @@
 
 
     // $ANTLR start "entryRulePerspectiveOrganization"
-    // InternalPerspectiveDsl.g:1500:1: entryRulePerspectiveOrganization returns [EObject current=null] : iv_rulePerspectiveOrganization= rulePerspectiveOrganization EOF ;
+    // InternalPerspectiveDsl.g:1502:1: entryRulePerspectiveOrganization returns [EObject current=null] : iv_rulePerspectiveOrganization= rulePerspectiveOrganization EOF ;
     public final EObject entryRulePerspectiveOrganization() throws RecognitionException {
         EObject current = null;
 
@@ -4193,8 +4193,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:1500:64: (iv_rulePerspectiveOrganization= rulePerspectiveOrganization EOF )
-            // InternalPerspectiveDsl.g:1501:2: iv_rulePerspectiveOrganization= rulePerspectiveOrganization EOF
+            // InternalPerspectiveDsl.g:1502:64: (iv_rulePerspectiveOrganization= rulePerspectiveOrganization EOF )
+            // InternalPerspectiveDsl.g:1503:2: iv_rulePerspectiveOrganization= rulePerspectiveOrganization EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveOrganizationRule()); 
@@ -4225,7 +4225,7 @@
 
 
     // $ANTLR start "rulePerspectiveOrganization"
-    // InternalPerspectiveDsl.g:1507:1: rulePerspectiveOrganization returns [EObject current=null] : ( () otherlv_1= 'organigram' ( (otherlv_2= RULE_ID ) ) ) ;
+    // InternalPerspectiveDsl.g:1509:1: rulePerspectiveOrganization returns [EObject current=null] : ( () otherlv_1= 'organigram' ( (otherlv_2= RULE_ID ) ) ) ;
     public final EObject rulePerspectiveOrganization() throws RecognitionException {
         EObject current = null;
 
@@ -4236,14 +4236,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:1513:2: ( ( () otherlv_1= 'organigram' ( (otherlv_2= RULE_ID ) ) ) )
-            // InternalPerspectiveDsl.g:1514:2: ( () otherlv_1= 'organigram' ( (otherlv_2= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1515:2: ( ( () otherlv_1= 'organigram' ( (otherlv_2= RULE_ID ) ) ) )
+            // InternalPerspectiveDsl.g:1516:2: ( () otherlv_1= 'organigram' ( (otherlv_2= RULE_ID ) ) )
             {
-            // InternalPerspectiveDsl.g:1514:2: ( () otherlv_1= 'organigram' ( (otherlv_2= RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:1515:3: () otherlv_1= 'organigram' ( (otherlv_2= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1516:2: ( () otherlv_1= 'organigram' ( (otherlv_2= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1517:3: () otherlv_1= 'organigram' ( (otherlv_2= RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:1515:3: ()
-            // InternalPerspectiveDsl.g:1516:4: 
+            // InternalPerspectiveDsl.g:1517:3: ()
+            // InternalPerspectiveDsl.g:1518:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -4261,11 +4261,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getPerspectiveOrganizationAccess().getOrganigramKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:1526:3: ( (otherlv_2= RULE_ID ) )
-            // InternalPerspectiveDsl.g:1527:4: (otherlv_2= RULE_ID )
+            // InternalPerspectiveDsl.g:1528:3: ( (otherlv_2= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1529:4: (otherlv_2= RULE_ID )
             {
-            // InternalPerspectiveDsl.g:1527:4: (otherlv_2= RULE_ID )
-            // InternalPerspectiveDsl.g:1528:5: otherlv_2= RULE_ID
+            // InternalPerspectiveDsl.g:1529:4: (otherlv_2= RULE_ID )
+            // InternalPerspectiveDsl.g:1530:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -4311,7 +4311,7 @@
 
 
     // $ANTLR start "entryRulePerspectiveTopology"
-    // InternalPerspectiveDsl.g:1543:1: entryRulePerspectiveTopology returns [EObject current=null] : iv_rulePerspectiveTopology= rulePerspectiveTopology EOF ;
+    // InternalPerspectiveDsl.g:1545:1: entryRulePerspectiveTopology returns [EObject current=null] : iv_rulePerspectiveTopology= rulePerspectiveTopology EOF ;
     public final EObject entryRulePerspectiveTopology() throws RecognitionException {
         EObject current = null;
 
@@ -4319,8 +4319,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:1543:60: (iv_rulePerspectiveTopology= rulePerspectiveTopology EOF )
-            // InternalPerspectiveDsl.g:1544:2: iv_rulePerspectiveTopology= rulePerspectiveTopology EOF
+            // InternalPerspectiveDsl.g:1545:60: (iv_rulePerspectiveTopology= rulePerspectiveTopology EOF )
+            // InternalPerspectiveDsl.g:1546:2: iv_rulePerspectiveTopology= rulePerspectiveTopology EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveTopologyRule()); 
@@ -4351,7 +4351,7 @@
 
 
     // $ANTLR start "rulePerspectiveTopology"
-    // InternalPerspectiveDsl.g:1550:1: rulePerspectiveTopology returns [EObject current=null] : ( () otherlv_1= 'topology' ( (otherlv_2= RULE_ID ) ) ) ;
+    // InternalPerspectiveDsl.g:1552:1: rulePerspectiveTopology returns [EObject current=null] : ( () otherlv_1= 'topology' ( (otherlv_2= RULE_ID ) ) ) ;
     public final EObject rulePerspectiveTopology() throws RecognitionException {
         EObject current = null;
 
@@ -4362,14 +4362,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:1556:2: ( ( () otherlv_1= 'topology' ( (otherlv_2= RULE_ID ) ) ) )
-            // InternalPerspectiveDsl.g:1557:2: ( () otherlv_1= 'topology' ( (otherlv_2= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1558:2: ( ( () otherlv_1= 'topology' ( (otherlv_2= RULE_ID ) ) ) )
+            // InternalPerspectiveDsl.g:1559:2: ( () otherlv_1= 'topology' ( (otherlv_2= RULE_ID ) ) )
             {
-            // InternalPerspectiveDsl.g:1557:2: ( () otherlv_1= 'topology' ( (otherlv_2= RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:1558:3: () otherlv_1= 'topology' ( (otherlv_2= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1559:2: ( () otherlv_1= 'topology' ( (otherlv_2= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1560:3: () otherlv_1= 'topology' ( (otherlv_2= RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:1558:3: ()
-            // InternalPerspectiveDsl.g:1559:4: 
+            // InternalPerspectiveDsl.g:1560:3: ()
+            // InternalPerspectiveDsl.g:1561:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -4387,11 +4387,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getPerspectiveTopologyAccess().getTopologyKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:1569:3: ( (otherlv_2= RULE_ID ) )
-            // InternalPerspectiveDsl.g:1570:4: (otherlv_2= RULE_ID )
+            // InternalPerspectiveDsl.g:1571:3: ( (otherlv_2= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1572:4: (otherlv_2= RULE_ID )
             {
-            // InternalPerspectiveDsl.g:1570:4: (otherlv_2= RULE_ID )
-            // InternalPerspectiveDsl.g:1571:5: otherlv_2= RULE_ID
+            // InternalPerspectiveDsl.g:1572:4: (otherlv_2= RULE_ID )
+            // InternalPerspectiveDsl.g:1573:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -4437,7 +4437,7 @@
 
 
     // $ANTLR start "entryRulePerspectiveDialog"
-    // InternalPerspectiveDsl.g:1586:1: entryRulePerspectiveDialog returns [EObject current=null] : iv_rulePerspectiveDialog= rulePerspectiveDialog EOF ;
+    // InternalPerspectiveDsl.g:1588:1: entryRulePerspectiveDialog returns [EObject current=null] : iv_rulePerspectiveDialog= rulePerspectiveDialog EOF ;
     public final EObject entryRulePerspectiveDialog() throws RecognitionException {
         EObject current = null;
 
@@ -4445,8 +4445,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:1586:58: (iv_rulePerspectiveDialog= rulePerspectiveDialog EOF )
-            // InternalPerspectiveDsl.g:1587:2: iv_rulePerspectiveDialog= rulePerspectiveDialog EOF
+            // InternalPerspectiveDsl.g:1588:58: (iv_rulePerspectiveDialog= rulePerspectiveDialog EOF )
+            // InternalPerspectiveDsl.g:1589:2: iv_rulePerspectiveDialog= rulePerspectiveDialog EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveDialogRule()); 
@@ -4477,7 +4477,7 @@
 
 
     // $ANTLR start "rulePerspectiveDialog"
-    // InternalPerspectiveDsl.g:1593:1: rulePerspectiveDialog returns [EObject current=null] : ( () otherlv_1= 'dialog' ( (otherlv_2= RULE_ID ) ) ) ;
+    // InternalPerspectiveDsl.g:1595:1: rulePerspectiveDialog returns [EObject current=null] : ( () otherlv_1= 'dialog' ( (otherlv_2= RULE_ID ) ) ) ;
     public final EObject rulePerspectiveDialog() throws RecognitionException {
         EObject current = null;
 
@@ -4488,14 +4488,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:1599:2: ( ( () otherlv_1= 'dialog' ( (otherlv_2= RULE_ID ) ) ) )
-            // InternalPerspectiveDsl.g:1600:2: ( () otherlv_1= 'dialog' ( (otherlv_2= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1601:2: ( ( () otherlv_1= 'dialog' ( (otherlv_2= RULE_ID ) ) ) )
+            // InternalPerspectiveDsl.g:1602:2: ( () otherlv_1= 'dialog' ( (otherlv_2= RULE_ID ) ) )
             {
-            // InternalPerspectiveDsl.g:1600:2: ( () otherlv_1= 'dialog' ( (otherlv_2= RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:1601:3: () otherlv_1= 'dialog' ( (otherlv_2= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1602:2: ( () otherlv_1= 'dialog' ( (otherlv_2= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1603:3: () otherlv_1= 'dialog' ( (otherlv_2= RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:1601:3: ()
-            // InternalPerspectiveDsl.g:1602:4: 
+            // InternalPerspectiveDsl.g:1603:3: ()
+            // InternalPerspectiveDsl.g:1604:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -4513,11 +4513,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getPerspectiveDialogAccess().getDialogKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:1612:3: ( (otherlv_2= RULE_ID ) )
-            // InternalPerspectiveDsl.g:1613:4: (otherlv_2= RULE_ID )
+            // InternalPerspectiveDsl.g:1614:3: ( (otherlv_2= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1615:4: (otherlv_2= RULE_ID )
             {
-            // InternalPerspectiveDsl.g:1613:4: (otherlv_2= RULE_ID )
-            // InternalPerspectiveDsl.g:1614:5: otherlv_2= RULE_ID
+            // InternalPerspectiveDsl.g:1615:4: (otherlv_2= RULE_ID )
+            // InternalPerspectiveDsl.g:1616:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -4563,7 +4563,7 @@
 
 
     // $ANTLR start "entryRulePerspectiveBPMN"
-    // InternalPerspectiveDsl.g:1629:1: entryRulePerspectiveBPMN returns [EObject current=null] : iv_rulePerspectiveBPMN= rulePerspectiveBPMN EOF ;
+    // InternalPerspectiveDsl.g:1631:1: entryRulePerspectiveBPMN returns [EObject current=null] : iv_rulePerspectiveBPMN= rulePerspectiveBPMN EOF ;
     public final EObject entryRulePerspectiveBPMN() throws RecognitionException {
         EObject current = null;
 
@@ -4571,8 +4571,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:1629:56: (iv_rulePerspectiveBPMN= rulePerspectiveBPMN EOF )
-            // InternalPerspectiveDsl.g:1630:2: iv_rulePerspectiveBPMN= rulePerspectiveBPMN EOF
+            // InternalPerspectiveDsl.g:1631:56: (iv_rulePerspectiveBPMN= rulePerspectiveBPMN EOF )
+            // InternalPerspectiveDsl.g:1632:2: iv_rulePerspectiveBPMN= rulePerspectiveBPMN EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveBPMNRule()); 
@@ -4603,7 +4603,7 @@
 
 
     // $ANTLR start "rulePerspectiveBPMN"
-    // InternalPerspectiveDsl.g:1636:1: rulePerspectiveBPMN returns [EObject current=null] : ( () otherlv_1= 'bpmn' ) ;
+    // InternalPerspectiveDsl.g:1638:1: rulePerspectiveBPMN returns [EObject current=null] : ( () otherlv_1= 'bpmn' ) ;
     public final EObject rulePerspectiveBPMN() throws RecognitionException {
         EObject current = null;
 
@@ -4613,14 +4613,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:1642:2: ( ( () otherlv_1= 'bpmn' ) )
-            // InternalPerspectiveDsl.g:1643:2: ( () otherlv_1= 'bpmn' )
+            // InternalPerspectiveDsl.g:1644:2: ( ( () otherlv_1= 'bpmn' ) )
+            // InternalPerspectiveDsl.g:1645:2: ( () otherlv_1= 'bpmn' )
             {
-            // InternalPerspectiveDsl.g:1643:2: ( () otherlv_1= 'bpmn' )
-            // InternalPerspectiveDsl.g:1644:3: () otherlv_1= 'bpmn'
+            // InternalPerspectiveDsl.g:1645:2: ( () otherlv_1= 'bpmn' )
+            // InternalPerspectiveDsl.g:1646:3: () otherlv_1= 'bpmn'
             {
-            // InternalPerspectiveDsl.g:1644:3: ()
-            // InternalPerspectiveDsl.g:1645:4: 
+            // InternalPerspectiveDsl.g:1646:3: ()
+            // InternalPerspectiveDsl.g:1647:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -4663,7 +4663,7 @@
 
 
     // $ANTLR start "entryRulePerspectiveKanban"
-    // InternalPerspectiveDsl.g:1659:1: entryRulePerspectiveKanban returns [EObject current=null] : iv_rulePerspectiveKanban= rulePerspectiveKanban EOF ;
+    // InternalPerspectiveDsl.g:1661:1: entryRulePerspectiveKanban returns [EObject current=null] : iv_rulePerspectiveKanban= rulePerspectiveKanban EOF ;
     public final EObject entryRulePerspectiveKanban() throws RecognitionException {
         EObject current = null;
 
@@ -4671,8 +4671,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:1659:58: (iv_rulePerspectiveKanban= rulePerspectiveKanban EOF )
-            // InternalPerspectiveDsl.g:1660:2: iv_rulePerspectiveKanban= rulePerspectiveKanban EOF
+            // InternalPerspectiveDsl.g:1661:58: (iv_rulePerspectiveKanban= rulePerspectiveKanban EOF )
+            // InternalPerspectiveDsl.g:1662:2: iv_rulePerspectiveKanban= rulePerspectiveKanban EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveKanbanRule()); 
@@ -4703,7 +4703,7 @@
 
 
     // $ANTLR start "rulePerspectiveKanban"
-    // InternalPerspectiveDsl.g:1666:1: rulePerspectiveKanban returns [EObject current=null] : ( () otherlv_1= 'kanban' otherlv_2= 'of' ( (otherlv_3= RULE_ID ) ) otherlv_4= 'card' ( (otherlv_5= RULE_ID ) ) otherlv_6= 'dialog' ( (otherlv_7= RULE_ID ) ) ) ;
+    // InternalPerspectiveDsl.g:1668:1: rulePerspectiveKanban returns [EObject current=null] : ( () otherlv_1= 'kanban' otherlv_2= 'of' ( (otherlv_3= RULE_ID ) ) otherlv_4= 'card' ( (otherlv_5= RULE_ID ) ) otherlv_6= 'dialog' ( (otherlv_7= RULE_ID ) ) ) ;
     public final EObject rulePerspectiveKanban() throws RecognitionException {
         EObject current = null;
 
@@ -4719,14 +4719,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:1672:2: ( ( () otherlv_1= 'kanban' otherlv_2= 'of' ( (otherlv_3= RULE_ID ) ) otherlv_4= 'card' ( (otherlv_5= RULE_ID ) ) otherlv_6= 'dialog' ( (otherlv_7= RULE_ID ) ) ) )
-            // InternalPerspectiveDsl.g:1673:2: ( () otherlv_1= 'kanban' otherlv_2= 'of' ( (otherlv_3= RULE_ID ) ) otherlv_4= 'card' ( (otherlv_5= RULE_ID ) ) otherlv_6= 'dialog' ( (otherlv_7= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1674:2: ( ( () otherlv_1= 'kanban' otherlv_2= 'of' ( (otherlv_3= RULE_ID ) ) otherlv_4= 'card' ( (otherlv_5= RULE_ID ) ) otherlv_6= 'dialog' ( (otherlv_7= RULE_ID ) ) ) )
+            // InternalPerspectiveDsl.g:1675:2: ( () otherlv_1= 'kanban' otherlv_2= 'of' ( (otherlv_3= RULE_ID ) ) otherlv_4= 'card' ( (otherlv_5= RULE_ID ) ) otherlv_6= 'dialog' ( (otherlv_7= RULE_ID ) ) )
             {
-            // InternalPerspectiveDsl.g:1673:2: ( () otherlv_1= 'kanban' otherlv_2= 'of' ( (otherlv_3= RULE_ID ) ) otherlv_4= 'card' ( (otherlv_5= RULE_ID ) ) otherlv_6= 'dialog' ( (otherlv_7= RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:1674:3: () otherlv_1= 'kanban' otherlv_2= 'of' ( (otherlv_3= RULE_ID ) ) otherlv_4= 'card' ( (otherlv_5= RULE_ID ) ) otherlv_6= 'dialog' ( (otherlv_7= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1675:2: ( () otherlv_1= 'kanban' otherlv_2= 'of' ( (otherlv_3= RULE_ID ) ) otherlv_4= 'card' ( (otherlv_5= RULE_ID ) ) otherlv_6= 'dialog' ( (otherlv_7= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1676:3: () otherlv_1= 'kanban' otherlv_2= 'of' ( (otherlv_3= RULE_ID ) ) otherlv_4= 'card' ( (otherlv_5= RULE_ID ) ) otherlv_6= 'dialog' ( (otherlv_7= RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:1674:3: ()
-            // InternalPerspectiveDsl.g:1675:4: 
+            // InternalPerspectiveDsl.g:1676:3: ()
+            // InternalPerspectiveDsl.g:1677:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -4750,11 +4750,11 @@
               			newLeafNode(otherlv_2, grammarAccess.getPerspectiveKanbanAccess().getOfKeyword_2());
               		
             }
-            // InternalPerspectiveDsl.g:1689:3: ( (otherlv_3= RULE_ID ) )
-            // InternalPerspectiveDsl.g:1690:4: (otherlv_3= RULE_ID )
+            // InternalPerspectiveDsl.g:1691:3: ( (otherlv_3= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1692:4: (otherlv_3= RULE_ID )
             {
-            // InternalPerspectiveDsl.g:1690:4: (otherlv_3= RULE_ID )
-            // InternalPerspectiveDsl.g:1691:5: otherlv_3= RULE_ID
+            // InternalPerspectiveDsl.g:1692:4: (otherlv_3= RULE_ID )
+            // InternalPerspectiveDsl.g:1693:5: otherlv_3= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -4781,11 +4781,11 @@
               			newLeafNode(otherlv_4, grammarAccess.getPerspectiveKanbanAccess().getCardKeyword_4());
               		
             }
-            // InternalPerspectiveDsl.g:1706:3: ( (otherlv_5= RULE_ID ) )
-            // InternalPerspectiveDsl.g:1707:4: (otherlv_5= RULE_ID )
+            // InternalPerspectiveDsl.g:1708:3: ( (otherlv_5= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1709:4: (otherlv_5= RULE_ID )
             {
-            // InternalPerspectiveDsl.g:1707:4: (otherlv_5= RULE_ID )
-            // InternalPerspectiveDsl.g:1708:5: otherlv_5= RULE_ID
+            // InternalPerspectiveDsl.g:1709:4: (otherlv_5= RULE_ID )
+            // InternalPerspectiveDsl.g:1710:5: otherlv_5= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -4812,11 +4812,11 @@
               			newLeafNode(otherlv_6, grammarAccess.getPerspectiveKanbanAccess().getDialogKeyword_6());
               		
             }
-            // InternalPerspectiveDsl.g:1723:3: ( (otherlv_7= RULE_ID ) )
-            // InternalPerspectiveDsl.g:1724:4: (otherlv_7= RULE_ID )
+            // InternalPerspectiveDsl.g:1725:3: ( (otherlv_7= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1726:4: (otherlv_7= RULE_ID )
             {
-            // InternalPerspectiveDsl.g:1724:4: (otherlv_7= RULE_ID )
-            // InternalPerspectiveDsl.g:1725:5: otherlv_7= RULE_ID
+            // InternalPerspectiveDsl.g:1726:4: (otherlv_7= RULE_ID )
+            // InternalPerspectiveDsl.g:1727:5: otherlv_7= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -4862,7 +4862,7 @@
 
 
     // $ANTLR start "entryRulePerspectiveWelcome"
-    // InternalPerspectiveDsl.g:1740:1: entryRulePerspectiveWelcome returns [EObject current=null] : iv_rulePerspectiveWelcome= rulePerspectiveWelcome EOF ;
+    // InternalPerspectiveDsl.g:1742:1: entryRulePerspectiveWelcome returns [EObject current=null] : iv_rulePerspectiveWelcome= rulePerspectiveWelcome EOF ;
     public final EObject entryRulePerspectiveWelcome() throws RecognitionException {
         EObject current = null;
 
@@ -4870,8 +4870,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:1740:59: (iv_rulePerspectiveWelcome= rulePerspectiveWelcome EOF )
-            // InternalPerspectiveDsl.g:1741:2: iv_rulePerspectiveWelcome= rulePerspectiveWelcome EOF
+            // InternalPerspectiveDsl.g:1742:59: (iv_rulePerspectiveWelcome= rulePerspectiveWelcome EOF )
+            // InternalPerspectiveDsl.g:1743:2: iv_rulePerspectiveWelcome= rulePerspectiveWelcome EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveWelcomeRule()); 
@@ -4902,7 +4902,7 @@
 
 
     // $ANTLR start "rulePerspectiveWelcome"
-    // InternalPerspectiveDsl.g:1747:1: rulePerspectiveWelcome returns [EObject current=null] : ( () otherlv_1= 'welcome' ) ;
+    // InternalPerspectiveDsl.g:1749:1: rulePerspectiveWelcome returns [EObject current=null] : ( () otherlv_1= 'welcome' ) ;
     public final EObject rulePerspectiveWelcome() throws RecognitionException {
         EObject current = null;
 
@@ -4912,14 +4912,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:1753:2: ( ( () otherlv_1= 'welcome' ) )
-            // InternalPerspectiveDsl.g:1754:2: ( () otherlv_1= 'welcome' )
+            // InternalPerspectiveDsl.g:1755:2: ( ( () otherlv_1= 'welcome' ) )
+            // InternalPerspectiveDsl.g:1756:2: ( () otherlv_1= 'welcome' )
             {
-            // InternalPerspectiveDsl.g:1754:2: ( () otherlv_1= 'welcome' )
-            // InternalPerspectiveDsl.g:1755:3: () otherlv_1= 'welcome'
+            // InternalPerspectiveDsl.g:1756:2: ( () otherlv_1= 'welcome' )
+            // InternalPerspectiveDsl.g:1757:3: () otherlv_1= 'welcome'
             {
-            // InternalPerspectiveDsl.g:1755:3: ()
-            // InternalPerspectiveDsl.g:1756:4: 
+            // InternalPerspectiveDsl.g:1757:3: ()
+            // InternalPerspectiveDsl.g:1758:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -4962,7 +4962,7 @@
 
 
     // $ANTLR start "entryRulePerspectiveSearch"
-    // InternalPerspectiveDsl.g:1770:1: entryRulePerspectiveSearch returns [EObject current=null] : iv_rulePerspectiveSearch= rulePerspectiveSearch EOF ;
+    // InternalPerspectiveDsl.g:1772:1: entryRulePerspectiveSearch returns [EObject current=null] : iv_rulePerspectiveSearch= rulePerspectiveSearch EOF ;
     public final EObject entryRulePerspectiveSearch() throws RecognitionException {
         EObject current = null;
 
@@ -4970,8 +4970,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:1770:58: (iv_rulePerspectiveSearch= rulePerspectiveSearch EOF )
-            // InternalPerspectiveDsl.g:1771:2: iv_rulePerspectiveSearch= rulePerspectiveSearch EOF
+            // InternalPerspectiveDsl.g:1772:58: (iv_rulePerspectiveSearch= rulePerspectiveSearch EOF )
+            // InternalPerspectiveDsl.g:1773:2: iv_rulePerspectiveSearch= rulePerspectiveSearch EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveSearchRule()); 
@@ -5002,7 +5002,7 @@
 
 
     // $ANTLR start "rulePerspectiveSearch"
-    // InternalPerspectiveDsl.g:1777:1: rulePerspectiveSearch returns [EObject current=null] : ( () otherlv_1= 'search' otherlv_2= 'in' ( (otherlv_3= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* ) ) ) ) ;
+    // InternalPerspectiveDsl.g:1779:1: rulePerspectiveSearch returns [EObject current=null] : ( () otherlv_1= 'search' otherlv_2= 'in' ( (otherlv_3= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* ) ) ) ) ;
     public final EObject rulePerspectiveSearch() throws RecognitionException {
         EObject current = null;
 
@@ -5018,14 +5018,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:1783:2: ( ( () otherlv_1= 'search' otherlv_2= 'in' ( (otherlv_3= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* ) ) ) ) )
-            // InternalPerspectiveDsl.g:1784:2: ( () otherlv_1= 'search' otherlv_2= 'in' ( (otherlv_3= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* ) ) ) )
+            // InternalPerspectiveDsl.g:1785:2: ( ( () otherlv_1= 'search' otherlv_2= 'in' ( (otherlv_3= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* ) ) ) ) )
+            // InternalPerspectiveDsl.g:1786:2: ( () otherlv_1= 'search' otherlv_2= 'in' ( (otherlv_3= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* ) ) ) )
             {
-            // InternalPerspectiveDsl.g:1784:2: ( () otherlv_1= 'search' otherlv_2= 'in' ( (otherlv_3= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* ) ) ) )
-            // InternalPerspectiveDsl.g:1785:3: () otherlv_1= 'search' otherlv_2= 'in' ( (otherlv_3= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* ) ) )
+            // InternalPerspectiveDsl.g:1786:2: ( () otherlv_1= 'search' otherlv_2= 'in' ( (otherlv_3= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* ) ) ) )
+            // InternalPerspectiveDsl.g:1787:3: () otherlv_1= 'search' otherlv_2= 'in' ( (otherlv_3= RULE_ID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* ) ) )
             {
-            // InternalPerspectiveDsl.g:1785:3: ()
-            // InternalPerspectiveDsl.g:1786:4: 
+            // InternalPerspectiveDsl.g:1787:3: ()
+            // InternalPerspectiveDsl.g:1788:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -5049,11 +5049,11 @@
               			newLeafNode(otherlv_2, grammarAccess.getPerspectiveSearchAccess().getInKeyword_2());
               		
             }
-            // InternalPerspectiveDsl.g:1800:3: ( (otherlv_3= RULE_ID ) )
-            // InternalPerspectiveDsl.g:1801:4: (otherlv_3= RULE_ID )
+            // InternalPerspectiveDsl.g:1802:3: ( (otherlv_3= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1803:4: (otherlv_3= RULE_ID )
             {
-            // InternalPerspectiveDsl.g:1801:4: (otherlv_3= RULE_ID )
-            // InternalPerspectiveDsl.g:1802:5: otherlv_3= RULE_ID
+            // InternalPerspectiveDsl.g:1803:4: (otherlv_3= RULE_ID )
+            // InternalPerspectiveDsl.g:1804:5: otherlv_3= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -5074,17 +5074,17 @@
 
             }
 
-            // InternalPerspectiveDsl.g:1813:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* ) ) )
-            // InternalPerspectiveDsl.g:1814:4: ( ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* ) )
+            // InternalPerspectiveDsl.g:1815:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* ) ) )
+            // InternalPerspectiveDsl.g:1816:4: ( ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* ) )
             {
-            // InternalPerspectiveDsl.g:1814:4: ( ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* ) )
-            // InternalPerspectiveDsl.g:1815:5: ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* )
+            // InternalPerspectiveDsl.g:1816:4: ( ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* ) )
+            // InternalPerspectiveDsl.g:1817:5: ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* )
             {
             getUnorderedGroupHelper().enter(grammarAccess.getPerspectiveSearchAccess().getUnorderedGroup_4());
-            // InternalPerspectiveDsl.g:1818:5: ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* )
-            // InternalPerspectiveDsl.g:1819:6: ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )*
+            // InternalPerspectiveDsl.g:1820:5: ( ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )* )
+            // InternalPerspectiveDsl.g:1821:6: ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )*
             {
-            // InternalPerspectiveDsl.g:1819:6: ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )*
+            // InternalPerspectiveDsl.g:1821:6: ( ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) ) )*
             loop16:
             do {
                 int alt16=3;
@@ -5100,28 +5100,28 @@
 
                 switch (alt16) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:1820:4: ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1822:4: ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:1820:4: ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:1821:5: {...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1822:4: ({...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1823:5: {...}? => ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSearchAccess().getUnorderedGroup_4(), 0) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectiveSearch", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSearchAccess().getUnorderedGroup_4(), 0)");
             	    }
-            	    // InternalPerspectiveDsl.g:1821:114: ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:1822:6: ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) )
+            	    // InternalPerspectiveDsl.g:1823:114: ( ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1824:6: ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getPerspectiveSearchAccess().getUnorderedGroup_4(), 0);
-            	    // InternalPerspectiveDsl.g:1825:9: ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) )
-            	    // InternalPerspectiveDsl.g:1825:10: {...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) )
+            	    // InternalPerspectiveDsl.g:1827:9: ({...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) ) )
+            	    // InternalPerspectiveDsl.g:1827:10: {...}? => (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectiveSearch", "true");
             	    }
-            	    // InternalPerspectiveDsl.g:1825:19: (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) )
-            	    // InternalPerspectiveDsl.g:1825:20: otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) )
+            	    // InternalPerspectiveDsl.g:1827:19: (otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) ) )
+            	    // InternalPerspectiveDsl.g:1827:20: otherlv_5= 'depth' ( (lv_depth_6_0= RULE_INT ) )
             	    {
             	    otherlv_5=(Token)match(input,46,FOLLOW_23); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -5129,11 +5129,11 @@
             	      									newLeafNode(otherlv_5, grammarAccess.getPerspectiveSearchAccess().getDepthKeyword_4_0_0());
             	      								
             	    }
-            	    // InternalPerspectiveDsl.g:1829:9: ( (lv_depth_6_0= RULE_INT ) )
-            	    // InternalPerspectiveDsl.g:1830:10: (lv_depth_6_0= RULE_INT )
+            	    // InternalPerspectiveDsl.g:1831:9: ( (lv_depth_6_0= RULE_INT ) )
+            	    // InternalPerspectiveDsl.g:1832:10: (lv_depth_6_0= RULE_INT )
             	    {
-            	    // InternalPerspectiveDsl.g:1830:10: (lv_depth_6_0= RULE_INT )
-            	    // InternalPerspectiveDsl.g:1831:11: lv_depth_6_0= RULE_INT
+            	    // InternalPerspectiveDsl.g:1832:10: (lv_depth_6_0= RULE_INT )
+            	    // InternalPerspectiveDsl.g:1833:11: lv_depth_6_0= RULE_INT
             	    {
             	    lv_depth_6_0=(Token)match(input,RULE_INT,FOLLOW_22); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -5176,28 +5176,28 @@
             	    }
             	    break;
             	case 2 :
-            	    // InternalPerspectiveDsl.g:1853:4: ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1855:4: ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:1853:4: ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:1854:5: {...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1855:4: ({...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1856:5: {...}? => ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSearchAccess().getUnorderedGroup_4(), 1) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectiveSearch", "getUnorderedGroupHelper().canSelect(grammarAccess.getPerspectiveSearchAccess().getUnorderedGroup_4(), 1)");
             	    }
-            	    // InternalPerspectiveDsl.g:1854:114: ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:1855:6: ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) )
+            	    // InternalPerspectiveDsl.g:1856:114: ( ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:1857:6: ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getPerspectiveSearchAccess().getUnorderedGroup_4(), 1);
-            	    // InternalPerspectiveDsl.g:1858:9: ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) )
-            	    // InternalPerspectiveDsl.g:1858:10: {...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) )
+            	    // InternalPerspectiveDsl.g:1860:9: ({...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) ) )
+            	    // InternalPerspectiveDsl.g:1860:10: {...}? => (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "rulePerspectiveSearch", "true");
             	    }
-            	    // InternalPerspectiveDsl.g:1858:19: (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) )
-            	    // InternalPerspectiveDsl.g:1858:20: otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) )
+            	    // InternalPerspectiveDsl.g:1860:19: (otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) ) )
+            	    // InternalPerspectiveDsl.g:1860:20: otherlv_7= 'filterColumns' ( (lv_filterCols_8_0= RULE_INT ) )
             	    {
             	    otherlv_7=(Token)match(input,47,FOLLOW_23); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -5205,11 +5205,11 @@
             	      									newLeafNode(otherlv_7, grammarAccess.getPerspectiveSearchAccess().getFilterColumnsKeyword_4_1_0());
             	      								
             	    }
-            	    // InternalPerspectiveDsl.g:1862:9: ( (lv_filterCols_8_0= RULE_INT ) )
-            	    // InternalPerspectiveDsl.g:1863:10: (lv_filterCols_8_0= RULE_INT )
+            	    // InternalPerspectiveDsl.g:1864:9: ( (lv_filterCols_8_0= RULE_INT ) )
+            	    // InternalPerspectiveDsl.g:1865:10: (lv_filterCols_8_0= RULE_INT )
             	    {
-            	    // InternalPerspectiveDsl.g:1863:10: (lv_filterCols_8_0= RULE_INT )
-            	    // InternalPerspectiveDsl.g:1864:11: lv_filterCols_8_0= RULE_INT
+            	    // InternalPerspectiveDsl.g:1865:10: (lv_filterCols_8_0= RULE_INT )
+            	    // InternalPerspectiveDsl.g:1866:11: lv_filterCols_8_0= RULE_INT
             	    {
             	    lv_filterCols_8_0=(Token)match(input,RULE_INT,FOLLOW_22); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -5292,7 +5292,7 @@
 
 
     // $ANTLR start "entryRulePerspectiveDataInterchange"
-    // InternalPerspectiveDsl.g:1897:1: entryRulePerspectiveDataInterchange returns [EObject current=null] : iv_rulePerspectiveDataInterchange= rulePerspectiveDataInterchange EOF ;
+    // InternalPerspectiveDsl.g:1899:1: entryRulePerspectiveDataInterchange returns [EObject current=null] : iv_rulePerspectiveDataInterchange= rulePerspectiveDataInterchange EOF ;
     public final EObject entryRulePerspectiveDataInterchange() throws RecognitionException {
         EObject current = null;
 
@@ -5300,8 +5300,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:1897:67: (iv_rulePerspectiveDataInterchange= rulePerspectiveDataInterchange EOF )
-            // InternalPerspectiveDsl.g:1898:2: iv_rulePerspectiveDataInterchange= rulePerspectiveDataInterchange EOF
+            // InternalPerspectiveDsl.g:1899:67: (iv_rulePerspectiveDataInterchange= rulePerspectiveDataInterchange EOF )
+            // InternalPerspectiveDsl.g:1900:2: iv_rulePerspectiveDataInterchange= rulePerspectiveDataInterchange EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveDataInterchangeRule()); 
@@ -5332,7 +5332,7 @@
 
 
     // $ANTLR start "rulePerspectiveDataInterchange"
-    // InternalPerspectiveDsl.g:1904:1: rulePerspectiveDataInterchange returns [EObject current=null] : ( () otherlv_1= 'dataInterchange' ( (otherlv_2= RULE_ID ) ) ) ;
+    // InternalPerspectiveDsl.g:1906:1: rulePerspectiveDataInterchange returns [EObject current=null] : ( () otherlv_1= 'dataInterchange' ( (otherlv_2= RULE_ID ) ) ) ;
     public final EObject rulePerspectiveDataInterchange() throws RecognitionException {
         EObject current = null;
 
@@ -5343,14 +5343,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:1910:2: ( ( () otherlv_1= 'dataInterchange' ( (otherlv_2= RULE_ID ) ) ) )
-            // InternalPerspectiveDsl.g:1911:2: ( () otherlv_1= 'dataInterchange' ( (otherlv_2= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1912:2: ( ( () otherlv_1= 'dataInterchange' ( (otherlv_2= RULE_ID ) ) ) )
+            // InternalPerspectiveDsl.g:1913:2: ( () otherlv_1= 'dataInterchange' ( (otherlv_2= RULE_ID ) ) )
             {
-            // InternalPerspectiveDsl.g:1911:2: ( () otherlv_1= 'dataInterchange' ( (otherlv_2= RULE_ID ) ) )
-            // InternalPerspectiveDsl.g:1912:3: () otherlv_1= 'dataInterchange' ( (otherlv_2= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1913:2: ( () otherlv_1= 'dataInterchange' ( (otherlv_2= RULE_ID ) ) )
+            // InternalPerspectiveDsl.g:1914:3: () otherlv_1= 'dataInterchange' ( (otherlv_2= RULE_ID ) )
             {
-            // InternalPerspectiveDsl.g:1912:3: ()
-            // InternalPerspectiveDsl.g:1913:4: 
+            // InternalPerspectiveDsl.g:1914:3: ()
+            // InternalPerspectiveDsl.g:1915:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -5368,11 +5368,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getPerspectiveDataInterchangeAccess().getDataInterchangeKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:1923:3: ( (otherlv_2= RULE_ID ) )
-            // InternalPerspectiveDsl.g:1924:4: (otherlv_2= RULE_ID )
+            // InternalPerspectiveDsl.g:1925:3: ( (otherlv_2= RULE_ID ) )
+            // InternalPerspectiveDsl.g:1926:4: (otherlv_2= RULE_ID )
             {
-            // InternalPerspectiveDsl.g:1924:4: (otherlv_2= RULE_ID )
-            // InternalPerspectiveDsl.g:1925:5: otherlv_2= RULE_ID
+            // InternalPerspectiveDsl.g:1926:4: (otherlv_2= RULE_ID )
+            // InternalPerspectiveDsl.g:1927:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -5384,7 +5384,7 @@
             otherlv_2=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              					newLeafNode(otherlv_2, grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangePackageCrossReference_2_0());
+              					newLeafNode(otherlv_2, grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangeGroupCrossReference_2_0());
               				
             }
 
@@ -5418,7 +5418,7 @@
 
 
     // $ANTLR start "entryRulePerspectiveTitle"
-    // InternalPerspectiveDsl.g:1940:1: entryRulePerspectiveTitle returns [EObject current=null] : iv_rulePerspectiveTitle= rulePerspectiveTitle EOF ;
+    // InternalPerspectiveDsl.g:1942:1: entryRulePerspectiveTitle returns [EObject current=null] : iv_rulePerspectiveTitle= rulePerspectiveTitle EOF ;
     public final EObject entryRulePerspectiveTitle() throws RecognitionException {
         EObject current = null;
 
@@ -5426,8 +5426,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:1940:57: (iv_rulePerspectiveTitle= rulePerspectiveTitle EOF )
-            // InternalPerspectiveDsl.g:1941:2: iv_rulePerspectiveTitle= rulePerspectiveTitle EOF
+            // InternalPerspectiveDsl.g:1942:57: (iv_rulePerspectiveTitle= rulePerspectiveTitle EOF )
+            // InternalPerspectiveDsl.g:1943:2: iv_rulePerspectiveTitle= rulePerspectiveTitle EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveTitleRule()); 
@@ -5458,7 +5458,7 @@
 
 
     // $ANTLR start "rulePerspectiveTitle"
-    // InternalPerspectiveDsl.g:1947:1: rulePerspectiveTitle returns [EObject current=null] : ( () otherlv_1= 'title' ( (lv_htmlName_2_0= RULE_STRING ) ) ) ;
+    // InternalPerspectiveDsl.g:1949:1: rulePerspectiveTitle returns [EObject current=null] : ( () otherlv_1= 'title' ( (lv_htmlName_2_0= RULE_STRING ) ) ) ;
     public final EObject rulePerspectiveTitle() throws RecognitionException {
         EObject current = null;
 
@@ -5469,14 +5469,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:1953:2: ( ( () otherlv_1= 'title' ( (lv_htmlName_2_0= RULE_STRING ) ) ) )
-            // InternalPerspectiveDsl.g:1954:2: ( () otherlv_1= 'title' ( (lv_htmlName_2_0= RULE_STRING ) ) )
+            // InternalPerspectiveDsl.g:1955:2: ( ( () otherlv_1= 'title' ( (lv_htmlName_2_0= RULE_STRING ) ) ) )
+            // InternalPerspectiveDsl.g:1956:2: ( () otherlv_1= 'title' ( (lv_htmlName_2_0= RULE_STRING ) ) )
             {
-            // InternalPerspectiveDsl.g:1954:2: ( () otherlv_1= 'title' ( (lv_htmlName_2_0= RULE_STRING ) ) )
-            // InternalPerspectiveDsl.g:1955:3: () otherlv_1= 'title' ( (lv_htmlName_2_0= RULE_STRING ) )
+            // InternalPerspectiveDsl.g:1956:2: ( () otherlv_1= 'title' ( (lv_htmlName_2_0= RULE_STRING ) ) )
+            // InternalPerspectiveDsl.g:1957:3: () otherlv_1= 'title' ( (lv_htmlName_2_0= RULE_STRING ) )
             {
-            // InternalPerspectiveDsl.g:1955:3: ()
-            // InternalPerspectiveDsl.g:1956:4: 
+            // InternalPerspectiveDsl.g:1957:3: ()
+            // InternalPerspectiveDsl.g:1958:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -5494,11 +5494,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getPerspectiveTitleAccess().getTitleKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:1966:3: ( (lv_htmlName_2_0= RULE_STRING ) )
-            // InternalPerspectiveDsl.g:1967:4: (lv_htmlName_2_0= RULE_STRING )
+            // InternalPerspectiveDsl.g:1968:3: ( (lv_htmlName_2_0= RULE_STRING ) )
+            // InternalPerspectiveDsl.g:1969:4: (lv_htmlName_2_0= RULE_STRING )
             {
-            // InternalPerspectiveDsl.g:1967:4: (lv_htmlName_2_0= RULE_STRING )
-            // InternalPerspectiveDsl.g:1968:5: lv_htmlName_2_0= RULE_STRING
+            // InternalPerspectiveDsl.g:1969:4: (lv_htmlName_2_0= RULE_STRING )
+            // InternalPerspectiveDsl.g:1970:5: lv_htmlName_2_0= RULE_STRING
             {
             lv_htmlName_2_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -5549,7 +5549,7 @@
 
 
     // $ANTLR start "entryRulePerspectiveDashboard"
-    // InternalPerspectiveDsl.g:1988:1: entryRulePerspectiveDashboard returns [EObject current=null] : iv_rulePerspectiveDashboard= rulePerspectiveDashboard EOF ;
+    // InternalPerspectiveDsl.g:1990:1: entryRulePerspectiveDashboard returns [EObject current=null] : iv_rulePerspectiveDashboard= rulePerspectiveDashboard EOF ;
     public final EObject entryRulePerspectiveDashboard() throws RecognitionException {
         EObject current = null;
 
@@ -5557,8 +5557,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:1988:61: (iv_rulePerspectiveDashboard= rulePerspectiveDashboard EOF )
-            // InternalPerspectiveDsl.g:1989:2: iv_rulePerspectiveDashboard= rulePerspectiveDashboard EOF
+            // InternalPerspectiveDsl.g:1990:61: (iv_rulePerspectiveDashboard= rulePerspectiveDashboard EOF )
+            // InternalPerspectiveDsl.g:1991:2: iv_rulePerspectiveDashboard= rulePerspectiveDashboard EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getPerspectiveDashboardRule()); 
@@ -5589,7 +5589,7 @@
 
 
     // $ANTLR start "rulePerspectiveDashboard"
-    // InternalPerspectiveDsl.g:1995:1: rulePerspectiveDashboard returns [EObject current=null] : ( () otherlv_1= 'name' ( (lv_name_2_0= RULE_STRING ) ) ) ;
+    // InternalPerspectiveDsl.g:1997:1: rulePerspectiveDashboard returns [EObject current=null] : ( () otherlv_1= 'name' ( (lv_name_2_0= RULE_STRING ) ) ) ;
     public final EObject rulePerspectiveDashboard() throws RecognitionException {
         EObject current = null;
 
@@ -5600,14 +5600,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:2001:2: ( ( () otherlv_1= 'name' ( (lv_name_2_0= RULE_STRING ) ) ) )
-            // InternalPerspectiveDsl.g:2002:2: ( () otherlv_1= 'name' ( (lv_name_2_0= RULE_STRING ) ) )
+            // InternalPerspectiveDsl.g:2003:2: ( ( () otherlv_1= 'name' ( (lv_name_2_0= RULE_STRING ) ) ) )
+            // InternalPerspectiveDsl.g:2004:2: ( () otherlv_1= 'name' ( (lv_name_2_0= RULE_STRING ) ) )
             {
-            // InternalPerspectiveDsl.g:2002:2: ( () otherlv_1= 'name' ( (lv_name_2_0= RULE_STRING ) ) )
-            // InternalPerspectiveDsl.g:2003:3: () otherlv_1= 'name' ( (lv_name_2_0= RULE_STRING ) )
+            // InternalPerspectiveDsl.g:2004:2: ( () otherlv_1= 'name' ( (lv_name_2_0= RULE_STRING ) ) )
+            // InternalPerspectiveDsl.g:2005:3: () otherlv_1= 'name' ( (lv_name_2_0= RULE_STRING ) )
             {
-            // InternalPerspectiveDsl.g:2003:3: ()
-            // InternalPerspectiveDsl.g:2004:4: 
+            // InternalPerspectiveDsl.g:2005:3: ()
+            // InternalPerspectiveDsl.g:2006:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -5625,11 +5625,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getPerspectiveDashboardAccess().getNameKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:2014:3: ( (lv_name_2_0= RULE_STRING ) )
-            // InternalPerspectiveDsl.g:2015:4: (lv_name_2_0= RULE_STRING )
+            // InternalPerspectiveDsl.g:2016:3: ( (lv_name_2_0= RULE_STRING ) )
+            // InternalPerspectiveDsl.g:2017:4: (lv_name_2_0= RULE_STRING )
             {
-            // InternalPerspectiveDsl.g:2015:4: (lv_name_2_0= RULE_STRING )
-            // InternalPerspectiveDsl.g:2016:5: lv_name_2_0= RULE_STRING
+            // InternalPerspectiveDsl.g:2017:4: (lv_name_2_0= RULE_STRING )
+            // InternalPerspectiveDsl.g:2018:5: lv_name_2_0= RULE_STRING
             {
             lv_name_2_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -5680,7 +5680,7 @@
 
 
     // $ANTLR start "entryRuleTRANSLATABLEID"
-    // InternalPerspectiveDsl.g:2036:1: entryRuleTRANSLATABLEID returns [String current=null] : iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF ;
+    // InternalPerspectiveDsl.g:2038:1: entryRuleTRANSLATABLEID returns [String current=null] : iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF ;
     public final String entryRuleTRANSLATABLEID() throws RecognitionException {
         String current = null;
 
@@ -5688,8 +5688,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:2036:54: (iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF )
-            // InternalPerspectiveDsl.g:2037:2: iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF
+            // InternalPerspectiveDsl.g:2038:54: (iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF )
+            // InternalPerspectiveDsl.g:2039:2: iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTRANSLATABLEIDRule()); 
@@ -5720,7 +5720,7 @@
 
 
     // $ANTLR start "ruleTRANSLATABLEID"
-    // InternalPerspectiveDsl.g:2043:1: ruleTRANSLATABLEID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= RULE_ID ;
+    // InternalPerspectiveDsl.g:2045:1: ruleTRANSLATABLEID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= RULE_ID ;
     public final AntlrDatatypeRuleToken ruleTRANSLATABLEID() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -5730,8 +5730,8 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:2049:2: (this_ID_0= RULE_ID )
-            // InternalPerspectiveDsl.g:2050:2: this_ID_0= RULE_ID
+            // InternalPerspectiveDsl.g:2051:2: (this_ID_0= RULE_ID )
+            // InternalPerspectiveDsl.g:2052:2: this_ID_0= RULE_ID
             {
             this_ID_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -5766,7 +5766,7 @@
 
 
     // $ANTLR start "entryRuleTRANSLATABLESTRING"
-    // InternalPerspectiveDsl.g:2060:1: entryRuleTRANSLATABLESTRING returns [String current=null] : iv_ruleTRANSLATABLESTRING= ruleTRANSLATABLESTRING EOF ;
+    // InternalPerspectiveDsl.g:2062:1: entryRuleTRANSLATABLESTRING returns [String current=null] : iv_ruleTRANSLATABLESTRING= ruleTRANSLATABLESTRING EOF ;
     public final String entryRuleTRANSLATABLESTRING() throws RecognitionException {
         String current = null;
 
@@ -5774,8 +5774,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:2060:58: (iv_ruleTRANSLATABLESTRING= ruleTRANSLATABLESTRING EOF )
-            // InternalPerspectiveDsl.g:2061:2: iv_ruleTRANSLATABLESTRING= ruleTRANSLATABLESTRING EOF
+            // InternalPerspectiveDsl.g:2062:58: (iv_ruleTRANSLATABLESTRING= ruleTRANSLATABLESTRING EOF )
+            // InternalPerspectiveDsl.g:2063:2: iv_ruleTRANSLATABLESTRING= ruleTRANSLATABLESTRING EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTRANSLATABLESTRINGRule()); 
@@ -5806,7 +5806,7 @@
 
 
     // $ANTLR start "ruleTRANSLATABLESTRING"
-    // InternalPerspectiveDsl.g:2067:1: ruleTRANSLATABLESTRING returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_STRING_0= RULE_STRING ;
+    // InternalPerspectiveDsl.g:2069:1: ruleTRANSLATABLESTRING returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_STRING_0= RULE_STRING ;
     public final AntlrDatatypeRuleToken ruleTRANSLATABLESTRING() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -5816,8 +5816,8 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:2073:2: (this_STRING_0= RULE_STRING )
-            // InternalPerspectiveDsl.g:2074:2: this_STRING_0= RULE_STRING
+            // InternalPerspectiveDsl.g:2075:2: (this_STRING_0= RULE_STRING )
+            // InternalPerspectiveDsl.g:2076:2: this_STRING_0= RULE_STRING
             {
             this_STRING_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -5852,7 +5852,7 @@
 
 
     // $ANTLR start "entryRuleXImportDeclaration"
-    // InternalPerspectiveDsl.g:2084:1: entryRuleXImportDeclaration returns [EObject current=null] : iv_ruleXImportDeclaration= ruleXImportDeclaration EOF ;
+    // InternalPerspectiveDsl.g:2086:1: entryRuleXImportDeclaration returns [EObject current=null] : iv_ruleXImportDeclaration= ruleXImportDeclaration EOF ;
     public final EObject entryRuleXImportDeclaration() throws RecognitionException {
         EObject current = null;
 
@@ -5860,8 +5860,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:2084:59: (iv_ruleXImportDeclaration= ruleXImportDeclaration EOF )
-            // InternalPerspectiveDsl.g:2085:2: iv_ruleXImportDeclaration= ruleXImportDeclaration EOF
+            // InternalPerspectiveDsl.g:2086:59: (iv_ruleXImportDeclaration= ruleXImportDeclaration EOF )
+            // InternalPerspectiveDsl.g:2087:2: iv_ruleXImportDeclaration= ruleXImportDeclaration EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXImportDeclarationRule()); 
@@ -5892,7 +5892,7 @@
 
 
     // $ANTLR start "ruleXImportDeclaration"
-    // InternalPerspectiveDsl.g:2091:1: ruleXImportDeclaration returns [EObject current=null] : ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? ) ;
+    // InternalPerspectiveDsl.g:2093:1: ruleXImportDeclaration returns [EObject current=null] : ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? ) ;
     public final EObject ruleXImportDeclaration() throws RecognitionException {
         EObject current = null;
 
@@ -5913,14 +5913,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:2097:2: ( ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? ) )
-            // InternalPerspectiveDsl.g:2098:2: ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? )
+            // InternalPerspectiveDsl.g:2099:2: ( ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? ) )
+            // InternalPerspectiveDsl.g:2100:2: ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? )
             {
-            // InternalPerspectiveDsl.g:2098:2: ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? )
-            // InternalPerspectiveDsl.g:2099:3: () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )?
+            // InternalPerspectiveDsl.g:2100:2: ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? )
+            // InternalPerspectiveDsl.g:2101:3: () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )?
             {
-            // InternalPerspectiveDsl.g:2099:3: ()
-            // InternalPerspectiveDsl.g:2100:4: 
+            // InternalPerspectiveDsl.g:2101:3: ()
+            // InternalPerspectiveDsl.g:2102:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -5938,21 +5938,21 @@
               			newLeafNode(otherlv_1, grammarAccess.getXImportDeclarationAccess().getImportKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:2110:3: ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) )
+            // InternalPerspectiveDsl.g:2112:3: ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) )
             int alt19=4;
             alt19 = dfa19.predict(input);
             switch (alt19) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:2111:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
+                    // InternalPerspectiveDsl.g:2113:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
                     {
-                    // InternalPerspectiveDsl.g:2111:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
-                    // InternalPerspectiveDsl.g:2112:5: ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
+                    // InternalPerspectiveDsl.g:2113:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
+                    // InternalPerspectiveDsl.g:2114:5: ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
                     {
-                    // InternalPerspectiveDsl.g:2112:5: ( (lv_static_2_0= 'static' ) )
-                    // InternalPerspectiveDsl.g:2113:6: (lv_static_2_0= 'static' )
+                    // InternalPerspectiveDsl.g:2114:5: ( (lv_static_2_0= 'static' ) )
+                    // InternalPerspectiveDsl.g:2115:6: (lv_static_2_0= 'static' )
                     {
-                    // InternalPerspectiveDsl.g:2113:6: (lv_static_2_0= 'static' )
-                    // InternalPerspectiveDsl.g:2114:7: lv_static_2_0= 'static'
+                    // InternalPerspectiveDsl.g:2115:6: (lv_static_2_0= 'static' )
+                    // InternalPerspectiveDsl.g:2116:7: lv_static_2_0= 'static'
                     {
                     lv_static_2_0=(Token)match(input,52,FOLLOW_25); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -5974,7 +5974,7 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:2126:5: ( (lv_extension_3_0= 'extension' ) )?
+                    // InternalPerspectiveDsl.g:2128:5: ( (lv_extension_3_0= 'extension' ) )?
                     int alt17=2;
                     int LA17_0 = input.LA(1);
 
@@ -5983,10 +5983,10 @@
                     }
                     switch (alt17) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:2127:6: (lv_extension_3_0= 'extension' )
+                            // InternalPerspectiveDsl.g:2129:6: (lv_extension_3_0= 'extension' )
                             {
-                            // InternalPerspectiveDsl.g:2127:6: (lv_extension_3_0= 'extension' )
-                            // InternalPerspectiveDsl.g:2128:7: lv_extension_3_0= 'extension'
+                            // InternalPerspectiveDsl.g:2129:6: (lv_extension_3_0= 'extension' )
+                            // InternalPerspectiveDsl.g:2130:7: lv_extension_3_0= 'extension'
                             {
                             lv_extension_3_0=(Token)match(input,53,FOLLOW_25); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
@@ -6011,11 +6011,11 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:2140:5: ( ( ruleQualifiedNameInStaticImport ) )
-                    // InternalPerspectiveDsl.g:2141:6: ( ruleQualifiedNameInStaticImport )
+                    // InternalPerspectiveDsl.g:2142:5: ( ( ruleQualifiedNameInStaticImport ) )
+                    // InternalPerspectiveDsl.g:2143:6: ( ruleQualifiedNameInStaticImport )
                     {
-                    // InternalPerspectiveDsl.g:2141:6: ( ruleQualifiedNameInStaticImport )
-                    // InternalPerspectiveDsl.g:2142:7: ruleQualifiedNameInStaticImport
+                    // InternalPerspectiveDsl.g:2143:6: ( ruleQualifiedNameInStaticImport )
+                    // InternalPerspectiveDsl.g:2144:7: ruleQualifiedNameInStaticImport
                     {
                     if ( state.backtracking==0 ) {
 
@@ -6045,7 +6045,7 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:2156:5: ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
+                    // InternalPerspectiveDsl.g:2158:5: ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
                     int alt18=2;
                     int LA18_0 = input.LA(1);
 
@@ -6064,13 +6064,13 @@
                     }
                     switch (alt18) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:2157:6: ( (lv_wildcard_5_0= '*' ) )
+                            // InternalPerspectiveDsl.g:2159:6: ( (lv_wildcard_5_0= '*' ) )
                             {
-                            // InternalPerspectiveDsl.g:2157:6: ( (lv_wildcard_5_0= '*' ) )
-                            // InternalPerspectiveDsl.g:2158:7: (lv_wildcard_5_0= '*' )
+                            // InternalPerspectiveDsl.g:2159:6: ( (lv_wildcard_5_0= '*' ) )
+                            // InternalPerspectiveDsl.g:2160:7: (lv_wildcard_5_0= '*' )
                             {
-                            // InternalPerspectiveDsl.g:2158:7: (lv_wildcard_5_0= '*' )
-                            // InternalPerspectiveDsl.g:2159:8: lv_wildcard_5_0= '*'
+                            // InternalPerspectiveDsl.g:2160:7: (lv_wildcard_5_0= '*' )
+                            // InternalPerspectiveDsl.g:2161:8: lv_wildcard_5_0= '*'
                             {
                             lv_wildcard_5_0=(Token)match(input,54,FOLLOW_27); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
@@ -6096,13 +6096,13 @@
                             }
                             break;
                         case 2 :
-                            // InternalPerspectiveDsl.g:2172:6: ( (lv_memberName_6_0= ruleValidID ) )
+                            // InternalPerspectiveDsl.g:2174:6: ( (lv_memberName_6_0= ruleValidID ) )
                             {
-                            // InternalPerspectiveDsl.g:2172:6: ( (lv_memberName_6_0= ruleValidID ) )
-                            // InternalPerspectiveDsl.g:2173:7: (lv_memberName_6_0= ruleValidID )
+                            // InternalPerspectiveDsl.g:2174:6: ( (lv_memberName_6_0= ruleValidID ) )
+                            // InternalPerspectiveDsl.g:2175:7: (lv_memberName_6_0= ruleValidID )
                             {
-                            // InternalPerspectiveDsl.g:2173:7: (lv_memberName_6_0= ruleValidID )
-                            // InternalPerspectiveDsl.g:2174:8: lv_memberName_6_0= ruleValidID
+                            // InternalPerspectiveDsl.g:2175:7: (lv_memberName_6_0= ruleValidID )
+                            // InternalPerspectiveDsl.g:2176:8: lv_memberName_6_0= ruleValidID
                             {
                             if ( state.backtracking==0 ) {
 
@@ -6146,13 +6146,13 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:2194:4: ( ( ruleQualifiedName ) )
+                    // InternalPerspectiveDsl.g:2196:4: ( ( ruleQualifiedName ) )
                     {
-                    // InternalPerspectiveDsl.g:2194:4: ( ( ruleQualifiedName ) )
-                    // InternalPerspectiveDsl.g:2195:5: ( ruleQualifiedName )
+                    // InternalPerspectiveDsl.g:2196:4: ( ( ruleQualifiedName ) )
+                    // InternalPerspectiveDsl.g:2197:5: ( ruleQualifiedName )
                     {
-                    // InternalPerspectiveDsl.g:2195:5: ( ruleQualifiedName )
-                    // InternalPerspectiveDsl.g:2196:6: ruleQualifiedName
+                    // InternalPerspectiveDsl.g:2197:5: ( ruleQualifiedName )
+                    // InternalPerspectiveDsl.g:2198:6: ruleQualifiedName
                     {
                     if ( state.backtracking==0 ) {
 
@@ -6186,13 +6186,13 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:2211:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
+                    // InternalPerspectiveDsl.g:2213:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
                     {
-                    // InternalPerspectiveDsl.g:2211:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
-                    // InternalPerspectiveDsl.g:2212:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
+                    // InternalPerspectiveDsl.g:2213:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
+                    // InternalPerspectiveDsl.g:2214:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
                     {
-                    // InternalPerspectiveDsl.g:2212:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
-                    // InternalPerspectiveDsl.g:2213:6: lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard
+                    // InternalPerspectiveDsl.g:2214:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
+                    // InternalPerspectiveDsl.g:2215:6: lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard
                     {
                     if ( state.backtracking==0 ) {
 
@@ -6227,16 +6227,16 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:2231:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
+                    // InternalPerspectiveDsl.g:2233:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
                     {
-                    // InternalPerspectiveDsl.g:2231:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
-                    // InternalPerspectiveDsl.g:2232:5: ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
+                    // InternalPerspectiveDsl.g:2233:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
+                    // InternalPerspectiveDsl.g:2234:5: ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
                     {
-                    // InternalPerspectiveDsl.g:2232:5: ( (lv_fqnImport_9_0= 'ns' ) )
-                    // InternalPerspectiveDsl.g:2233:6: (lv_fqnImport_9_0= 'ns' )
+                    // InternalPerspectiveDsl.g:2234:5: ( (lv_fqnImport_9_0= 'ns' ) )
+                    // InternalPerspectiveDsl.g:2235:6: (lv_fqnImport_9_0= 'ns' )
                     {
-                    // InternalPerspectiveDsl.g:2233:6: (lv_fqnImport_9_0= 'ns' )
-                    // InternalPerspectiveDsl.g:2234:7: lv_fqnImport_9_0= 'ns'
+                    // InternalPerspectiveDsl.g:2235:6: (lv_fqnImport_9_0= 'ns' )
+                    // InternalPerspectiveDsl.g:2236:7: lv_fqnImport_9_0= 'ns'
                     {
                     lv_fqnImport_9_0=(Token)match(input,55,FOLLOW_4); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -6258,11 +6258,11 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:2246:5: ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
-                    // InternalPerspectiveDsl.g:2247:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
+                    // InternalPerspectiveDsl.g:2248:5: ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
+                    // InternalPerspectiveDsl.g:2249:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
                     {
-                    // InternalPerspectiveDsl.g:2247:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
-                    // InternalPerspectiveDsl.g:2248:7: lv_importedFullyQualifiedName_10_0= ruleQualifiedName
+                    // InternalPerspectiveDsl.g:2249:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
+                    // InternalPerspectiveDsl.g:2250:7: lv_importedFullyQualifiedName_10_0= ruleQualifiedName
                     {
                     if ( state.backtracking==0 ) {
 
@@ -6302,7 +6302,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:2267:3: (otherlv_11= ';' )?
+            // InternalPerspectiveDsl.g:2269:3: (otherlv_11= ';' )?
             int alt20=2;
             int LA20_0 = input.LA(1);
 
@@ -6311,7 +6311,7 @@
             }
             switch (alt20) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:2268:4: otherlv_11= ';'
+                    // InternalPerspectiveDsl.g:2270:4: otherlv_11= ';'
                     {
                     otherlv_11=(Token)match(input,56,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -6350,7 +6350,7 @@
 
 
     // $ANTLR start "entryRuleXAnnotation"
-    // InternalPerspectiveDsl.g:2277:1: entryRuleXAnnotation returns [EObject current=null] : iv_ruleXAnnotation= ruleXAnnotation EOF ;
+    // InternalPerspectiveDsl.g:2279:1: entryRuleXAnnotation returns [EObject current=null] : iv_ruleXAnnotation= ruleXAnnotation EOF ;
     public final EObject entryRuleXAnnotation() throws RecognitionException {
         EObject current = null;
 
@@ -6358,8 +6358,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:2277:52: (iv_ruleXAnnotation= ruleXAnnotation EOF )
-            // InternalPerspectiveDsl.g:2278:2: iv_ruleXAnnotation= ruleXAnnotation EOF
+            // InternalPerspectiveDsl.g:2279:52: (iv_ruleXAnnotation= ruleXAnnotation EOF )
+            // InternalPerspectiveDsl.g:2280:2: iv_ruleXAnnotation= ruleXAnnotation EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXAnnotationRule()); 
@@ -6390,7 +6390,7 @@
 
 
     // $ANTLR start "ruleXAnnotation"
-    // InternalPerspectiveDsl.g:2284:1: ruleXAnnotation returns [EObject current=null] : ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? ) ;
+    // InternalPerspectiveDsl.g:2286:1: ruleXAnnotation returns [EObject current=null] : ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? ) ;
     public final EObject ruleXAnnotation() throws RecognitionException {
         EObject current = null;
 
@@ -6409,14 +6409,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:2290:2: ( ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? ) )
-            // InternalPerspectiveDsl.g:2291:2: ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? )
+            // InternalPerspectiveDsl.g:2292:2: ( ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? ) )
+            // InternalPerspectiveDsl.g:2293:2: ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? )
             {
-            // InternalPerspectiveDsl.g:2291:2: ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? )
-            // InternalPerspectiveDsl.g:2292:3: () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )?
+            // InternalPerspectiveDsl.g:2293:2: ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? )
+            // InternalPerspectiveDsl.g:2294:3: () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )?
             {
-            // InternalPerspectiveDsl.g:2292:3: ()
-            // InternalPerspectiveDsl.g:2293:4: 
+            // InternalPerspectiveDsl.g:2294:3: ()
+            // InternalPerspectiveDsl.g:2295:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -6434,11 +6434,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:2303:3: ( ( ruleQualifiedName ) )
-            // InternalPerspectiveDsl.g:2304:4: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:2305:3: ( ( ruleQualifiedName ) )
+            // InternalPerspectiveDsl.g:2306:4: ( ruleQualifiedName )
             {
-            // InternalPerspectiveDsl.g:2304:4: ( ruleQualifiedName )
-            // InternalPerspectiveDsl.g:2305:5: ruleQualifiedName
+            // InternalPerspectiveDsl.g:2306:4: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:2307:5: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
 
@@ -6468,7 +6468,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:2319:3: ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )?
+            // InternalPerspectiveDsl.g:2321:3: ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )?
             int alt23=2;
             int LA23_0 = input.LA(1);
 
@@ -6477,10 +6477,10 @@
             }
             switch (alt23) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:2320:4: ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')'
+                    // InternalPerspectiveDsl.g:2322:4: ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')'
                     {
-                    // InternalPerspectiveDsl.g:2320:4: ( ( '(' )=>otherlv_3= '(' )
-                    // InternalPerspectiveDsl.g:2321:5: ( '(' )=>otherlv_3= '('
+                    // InternalPerspectiveDsl.g:2322:4: ( ( '(' )=>otherlv_3= '(' )
+                    // InternalPerspectiveDsl.g:2323:5: ( '(' )=>otherlv_3= '('
                     {
                     otherlv_3=(Token)match(input,58,FOLLOW_29); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -6491,21 +6491,21 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:2327:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?
+                    // InternalPerspectiveDsl.g:2329:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?
                     int alt22=3;
                     alt22 = dfa22.predict(input);
                     switch (alt22) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:2328:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
+                            // InternalPerspectiveDsl.g:2330:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
                             {
-                            // InternalPerspectiveDsl.g:2328:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
-                            // InternalPerspectiveDsl.g:2329:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
+                            // InternalPerspectiveDsl.g:2330:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
+                            // InternalPerspectiveDsl.g:2331:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
                             {
-                            // InternalPerspectiveDsl.g:2329:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) )
-                            // InternalPerspectiveDsl.g:2330:7: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
+                            // InternalPerspectiveDsl.g:2331:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) )
+                            // InternalPerspectiveDsl.g:2332:7: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
                             {
-                            // InternalPerspectiveDsl.g:2339:7: (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
-                            // InternalPerspectiveDsl.g:2340:8: lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair
+                            // InternalPerspectiveDsl.g:2341:7: (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
+                            // InternalPerspectiveDsl.g:2342:8: lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair
                             {
                             if ( state.backtracking==0 ) {
 
@@ -6536,7 +6536,7 @@
 
                             }
 
-                            // InternalPerspectiveDsl.g:2357:6: (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
+                            // InternalPerspectiveDsl.g:2359:6: (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
                             loop21:
                             do {
                                 int alt21=2;
@@ -6549,7 +6549,7 @@
 
                                 switch (alt21) {
                             	case 1 :
-                            	    // InternalPerspectiveDsl.g:2358:7: otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
+                            	    // InternalPerspectiveDsl.g:2360:7: otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
                             	    {
                             	    otherlv_5=(Token)match(input,59,FOLLOW_4); if (state.failed) return current;
                             	    if ( state.backtracking==0 ) {
@@ -6557,11 +6557,11 @@
                             	      							newLeafNode(otherlv_5, grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0());
                             	      						
                             	    }
-                            	    // InternalPerspectiveDsl.g:2362:7: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
-                            	    // InternalPerspectiveDsl.g:2363:8: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
+                            	    // InternalPerspectiveDsl.g:2364:7: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
+                            	    // InternalPerspectiveDsl.g:2365:8: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
                             	    {
-                            	    // InternalPerspectiveDsl.g:2372:8: (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
-                            	    // InternalPerspectiveDsl.g:2373:9: lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair
+                            	    // InternalPerspectiveDsl.g:2374:8: (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
+                            	    // InternalPerspectiveDsl.g:2375:9: lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair
                             	    {
                             	    if ( state.backtracking==0 ) {
 
@@ -6608,13 +6608,13 @@
                             }
                             break;
                         case 2 :
-                            // InternalPerspectiveDsl.g:2393:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
+                            // InternalPerspectiveDsl.g:2395:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
                             {
-                            // InternalPerspectiveDsl.g:2393:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
-                            // InternalPerspectiveDsl.g:2394:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
+                            // InternalPerspectiveDsl.g:2395:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
+                            // InternalPerspectiveDsl.g:2396:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
                             {
-                            // InternalPerspectiveDsl.g:2394:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
-                            // InternalPerspectiveDsl.g:2395:7: lv_value_7_0= ruleXAnnotationElementValueOrCommaList
+                            // InternalPerspectiveDsl.g:2396:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
+                            // InternalPerspectiveDsl.g:2397:7: lv_value_7_0= ruleXAnnotationElementValueOrCommaList
                             {
                             if ( state.backtracking==0 ) {
 
@@ -6688,7 +6688,7 @@
 
 
     // $ANTLR start "entryRuleXAnnotationElementValuePair"
-    // InternalPerspectiveDsl.g:2422:1: entryRuleXAnnotationElementValuePair returns [EObject current=null] : iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF ;
+    // InternalPerspectiveDsl.g:2424:1: entryRuleXAnnotationElementValuePair returns [EObject current=null] : iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF ;
     public final EObject entryRuleXAnnotationElementValuePair() throws RecognitionException {
         EObject current = null;
 
@@ -6696,8 +6696,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:2422:68: (iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF )
-            // InternalPerspectiveDsl.g:2423:2: iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF
+            // InternalPerspectiveDsl.g:2424:68: (iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF )
+            // InternalPerspectiveDsl.g:2425:2: iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXAnnotationElementValuePairRule()); 
@@ -6728,7 +6728,7 @@
 
 
     // $ANTLR start "ruleXAnnotationElementValuePair"
-    // InternalPerspectiveDsl.g:2429:1: ruleXAnnotationElementValuePair returns [EObject current=null] : ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) ) ;
+    // InternalPerspectiveDsl.g:2431:1: ruleXAnnotationElementValuePair returns [EObject current=null] : ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) ) ;
     public final EObject ruleXAnnotationElementValuePair() throws RecognitionException {
         EObject current = null;
 
@@ -6740,23 +6740,23 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:2435:2: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) ) )
-            // InternalPerspectiveDsl.g:2436:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
+            // InternalPerspectiveDsl.g:2437:2: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) ) )
+            // InternalPerspectiveDsl.g:2438:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
             {
-            // InternalPerspectiveDsl.g:2436:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
-            // InternalPerspectiveDsl.g:2437:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) )
+            // InternalPerspectiveDsl.g:2438:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
+            // InternalPerspectiveDsl.g:2439:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) )
             {
-            // InternalPerspectiveDsl.g:2437:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) )
-            // InternalPerspectiveDsl.g:2438:4: ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' )
+            // InternalPerspectiveDsl.g:2439:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) )
+            // InternalPerspectiveDsl.g:2440:4: ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' )
             {
-            // InternalPerspectiveDsl.g:2447:4: ( ( ( ruleValidID ) ) otherlv_1= '=' )
-            // InternalPerspectiveDsl.g:2448:5: ( ( ruleValidID ) ) otherlv_1= '='
+            // InternalPerspectiveDsl.g:2449:4: ( ( ( ruleValidID ) ) otherlv_1= '=' )
+            // InternalPerspectiveDsl.g:2450:5: ( ( ruleValidID ) ) otherlv_1= '='
             {
-            // InternalPerspectiveDsl.g:2448:5: ( ( ruleValidID ) )
-            // InternalPerspectiveDsl.g:2449:6: ( ruleValidID )
+            // InternalPerspectiveDsl.g:2450:5: ( ( ruleValidID ) )
+            // InternalPerspectiveDsl.g:2451:6: ( ruleValidID )
             {
-            // InternalPerspectiveDsl.g:2449:6: ( ruleValidID )
-            // InternalPerspectiveDsl.g:2450:7: ruleValidID
+            // InternalPerspectiveDsl.g:2451:6: ( ruleValidID )
+            // InternalPerspectiveDsl.g:2452:7: ruleValidID
             {
             if ( state.backtracking==0 ) {
 
@@ -6798,11 +6798,11 @@
 
             }
 
-            // InternalPerspectiveDsl.g:2470:3: ( (lv_value_2_0= ruleXAnnotationElementValue ) )
-            // InternalPerspectiveDsl.g:2471:4: (lv_value_2_0= ruleXAnnotationElementValue )
+            // InternalPerspectiveDsl.g:2472:3: ( (lv_value_2_0= ruleXAnnotationElementValue ) )
+            // InternalPerspectiveDsl.g:2473:4: (lv_value_2_0= ruleXAnnotationElementValue )
             {
-            // InternalPerspectiveDsl.g:2471:4: (lv_value_2_0= ruleXAnnotationElementValue )
-            // InternalPerspectiveDsl.g:2472:5: lv_value_2_0= ruleXAnnotationElementValue
+            // InternalPerspectiveDsl.g:2473:4: (lv_value_2_0= ruleXAnnotationElementValue )
+            // InternalPerspectiveDsl.g:2474:5: lv_value_2_0= ruleXAnnotationElementValue
             {
             if ( state.backtracking==0 ) {
 
@@ -6858,7 +6858,7 @@
 
 
     // $ANTLR start "entryRuleXAnnotationElementValueOrCommaList"
-    // InternalPerspectiveDsl.g:2493:1: entryRuleXAnnotationElementValueOrCommaList returns [EObject current=null] : iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF ;
+    // InternalPerspectiveDsl.g:2495:1: entryRuleXAnnotationElementValueOrCommaList returns [EObject current=null] : iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF ;
     public final EObject entryRuleXAnnotationElementValueOrCommaList() throws RecognitionException {
         EObject current = null;
 
@@ -6866,8 +6866,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:2493:75: (iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF )
-            // InternalPerspectiveDsl.g:2494:2: iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF
+            // InternalPerspectiveDsl.g:2495:75: (iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF )
+            // InternalPerspectiveDsl.g:2496:2: iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListRule()); 
@@ -6898,7 +6898,7 @@
 
 
     // $ANTLR start "ruleXAnnotationElementValueOrCommaList"
-    // InternalPerspectiveDsl.g:2500:1: ruleXAnnotationElementValueOrCommaList returns [EObject current=null] : ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) ) ;
+    // InternalPerspectiveDsl.g:2502:1: ruleXAnnotationElementValueOrCommaList returns [EObject current=null] : ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) ) ;
     public final EObject ruleXAnnotationElementValueOrCommaList() throws RecognitionException {
         EObject current = null;
 
@@ -6920,27 +6920,27 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:2506:2: ( ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) ) )
-            // InternalPerspectiveDsl.g:2507:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )
+            // InternalPerspectiveDsl.g:2508:2: ( ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) ) )
+            // InternalPerspectiveDsl.g:2509:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )
             {
-            // InternalPerspectiveDsl.g:2507:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )
+            // InternalPerspectiveDsl.g:2509:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )
             int alt28=2;
             alt28 = dfa28.predict(input);
             switch (alt28) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:2508:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
+                    // InternalPerspectiveDsl.g:2510:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                     {
-                    // InternalPerspectiveDsl.g:2508:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
-                    // InternalPerspectiveDsl.g:2509:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
+                    // InternalPerspectiveDsl.g:2510:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
+                    // InternalPerspectiveDsl.g:2511:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
                     {
-                    // InternalPerspectiveDsl.g:2509:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
-                    // InternalPerspectiveDsl.g:2510:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
+                    // InternalPerspectiveDsl.g:2511:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
+                    // InternalPerspectiveDsl.g:2512:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
                     {
-                    // InternalPerspectiveDsl.g:2517:5: ( () otherlv_1= '#' otherlv_2= '[' )
-                    // InternalPerspectiveDsl.g:2518:6: () otherlv_1= '#' otherlv_2= '['
+                    // InternalPerspectiveDsl.g:2519:5: ( () otherlv_1= '#' otherlv_2= '[' )
+                    // InternalPerspectiveDsl.g:2520:6: () otherlv_1= '#' otherlv_2= '['
                     {
-                    // InternalPerspectiveDsl.g:2518:6: ()
-                    // InternalPerspectiveDsl.g:2519:7: 
+                    // InternalPerspectiveDsl.g:2520:6: ()
+                    // InternalPerspectiveDsl.g:2521:7: 
                     {
                     if ( state.backtracking==0 ) {
 
@@ -6970,7 +6970,7 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:2535:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
+                    // InternalPerspectiveDsl.g:2537:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
                     int alt25=2;
                     int LA25_0 = input.LA(1);
 
@@ -6979,13 +6979,13 @@
                     }
                     switch (alt25) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:2536:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
+                            // InternalPerspectiveDsl.g:2538:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                             {
-                            // InternalPerspectiveDsl.g:2536:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
-                            // InternalPerspectiveDsl.g:2537:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
+                            // InternalPerspectiveDsl.g:2538:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
+                            // InternalPerspectiveDsl.g:2539:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                             {
-                            // InternalPerspectiveDsl.g:2537:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
-                            // InternalPerspectiveDsl.g:2538:7: lv_elements_3_0= ruleXAnnotationOrExpression
+                            // InternalPerspectiveDsl.g:2539:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
+                            // InternalPerspectiveDsl.g:2540:7: lv_elements_3_0= ruleXAnnotationOrExpression
                             {
                             if ( state.backtracking==0 ) {
 
@@ -7016,7 +7016,7 @@
 
                             }
 
-                            // InternalPerspectiveDsl.g:2555:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
+                            // InternalPerspectiveDsl.g:2557:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                             loop24:
                             do {
                                 int alt24=2;
@@ -7029,7 +7029,7 @@
 
                                 switch (alt24) {
                             	case 1 :
-                            	    // InternalPerspectiveDsl.g:2556:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
+                            	    // InternalPerspectiveDsl.g:2558:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                             	    {
                             	    otherlv_4=(Token)match(input,59,FOLLOW_33); if (state.failed) return current;
                             	    if ( state.backtracking==0 ) {
@@ -7037,11 +7037,11 @@
                             	      						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0());
                             	      					
                             	    }
-                            	    // InternalPerspectiveDsl.g:2560:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
-                            	    // InternalPerspectiveDsl.g:2561:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
+                            	    // InternalPerspectiveDsl.g:2562:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
+                            	    // InternalPerspectiveDsl.g:2563:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                             	    {
-                            	    // InternalPerspectiveDsl.g:2561:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
-                            	    // InternalPerspectiveDsl.g:2562:8: lv_elements_5_0= ruleXAnnotationOrExpression
+                            	    // InternalPerspectiveDsl.g:2563:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
+                            	    // InternalPerspectiveDsl.g:2564:8: lv_elements_5_0= ruleXAnnotationOrExpression
                             	    {
                             	    if ( state.backtracking==0 ) {
 
@@ -7100,10 +7100,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:2587:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
+                    // InternalPerspectiveDsl.g:2589:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
                     {
-                    // InternalPerspectiveDsl.g:2587:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
-                    // InternalPerspectiveDsl.g:2588:4: this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
+                    // InternalPerspectiveDsl.g:2589:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
+                    // InternalPerspectiveDsl.g:2590:4: this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
                     {
                     if ( state.backtracking==0 ) {
 
@@ -7121,7 +7121,7 @@
                       				afterParserOrEnumRuleCall();
                       			
                     }
-                    // InternalPerspectiveDsl.g:2596:4: ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
+                    // InternalPerspectiveDsl.g:2598:4: ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
                     int alt27=2;
                     int LA27_0 = input.LA(1);
 
@@ -7130,10 +7130,10 @@
                     }
                     switch (alt27) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:2597:5: () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
+                            // InternalPerspectiveDsl.g:2599:5: () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
                             {
-                            // InternalPerspectiveDsl.g:2597:5: ()
-                            // InternalPerspectiveDsl.g:2598:6: 
+                            // InternalPerspectiveDsl.g:2599:5: ()
+                            // InternalPerspectiveDsl.g:2600:6: 
                             {
                             if ( state.backtracking==0 ) {
 
@@ -7145,7 +7145,7 @@
 
                             }
 
-                            // InternalPerspectiveDsl.g:2604:5: (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
+                            // InternalPerspectiveDsl.g:2606:5: (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
                             int cnt26=0;
                             loop26:
                             do {
@@ -7159,7 +7159,7 @@
 
                                 switch (alt26) {
                             	case 1 :
-                            	    // InternalPerspectiveDsl.g:2605:6: otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
+                            	    // InternalPerspectiveDsl.g:2607:6: otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
                             	    {
                             	    otherlv_9=(Token)match(input,59,FOLLOW_33); if (state.failed) return current;
                             	    if ( state.backtracking==0 ) {
@@ -7167,11 +7167,11 @@
                             	      						newLeafNode(otherlv_9, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0());
                             	      					
                             	    }
-                            	    // InternalPerspectiveDsl.g:2609:6: ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
-                            	    // InternalPerspectiveDsl.g:2610:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
+                            	    // InternalPerspectiveDsl.g:2611:6: ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
+                            	    // InternalPerspectiveDsl.g:2612:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
                             	    {
-                            	    // InternalPerspectiveDsl.g:2610:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
-                            	    // InternalPerspectiveDsl.g:2611:8: lv_elements_10_0= ruleXAnnotationOrExpression
+                            	    // InternalPerspectiveDsl.g:2612:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
+                            	    // InternalPerspectiveDsl.g:2613:8: lv_elements_10_0= ruleXAnnotationOrExpression
                             	    {
                             	    if ( state.backtracking==0 ) {
 
@@ -7253,7 +7253,7 @@
 
 
     // $ANTLR start "entryRuleXAnnotationElementValue"
-    // InternalPerspectiveDsl.g:2635:1: entryRuleXAnnotationElementValue returns [EObject current=null] : iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF ;
+    // InternalPerspectiveDsl.g:2637:1: entryRuleXAnnotationElementValue returns [EObject current=null] : iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF ;
     public final EObject entryRuleXAnnotationElementValue() throws RecognitionException {
         EObject current = null;
 
@@ -7261,8 +7261,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:2635:64: (iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF )
-            // InternalPerspectiveDsl.g:2636:2: iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF
+            // InternalPerspectiveDsl.g:2637:64: (iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF )
+            // InternalPerspectiveDsl.g:2638:2: iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXAnnotationElementValueRule()); 
@@ -7293,7 +7293,7 @@
 
 
     // $ANTLR start "ruleXAnnotationElementValue"
-    // InternalPerspectiveDsl.g:2642:1: ruleXAnnotationElementValue returns [EObject current=null] : ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ) ;
+    // InternalPerspectiveDsl.g:2644:1: ruleXAnnotationElementValue returns [EObject current=null] : ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ) ;
     public final EObject ruleXAnnotationElementValue() throws RecognitionException {
         EObject current = null;
 
@@ -7312,27 +7312,27 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:2648:2: ( ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ) )
-            // InternalPerspectiveDsl.g:2649:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
+            // InternalPerspectiveDsl.g:2650:2: ( ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ) )
+            // InternalPerspectiveDsl.g:2651:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
             {
-            // InternalPerspectiveDsl.g:2649:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
+            // InternalPerspectiveDsl.g:2651:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
             int alt31=2;
             alt31 = dfa31.predict(input);
             switch (alt31) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:2650:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
+                    // InternalPerspectiveDsl.g:2652:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                     {
-                    // InternalPerspectiveDsl.g:2650:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
-                    // InternalPerspectiveDsl.g:2651:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
+                    // InternalPerspectiveDsl.g:2652:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
+                    // InternalPerspectiveDsl.g:2653:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
                     {
-                    // InternalPerspectiveDsl.g:2651:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
-                    // InternalPerspectiveDsl.g:2652:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
+                    // InternalPerspectiveDsl.g:2653:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
+                    // InternalPerspectiveDsl.g:2654:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
                     {
-                    // InternalPerspectiveDsl.g:2659:5: ( () otherlv_1= '#' otherlv_2= '[' )
-                    // InternalPerspectiveDsl.g:2660:6: () otherlv_1= '#' otherlv_2= '['
+                    // InternalPerspectiveDsl.g:2661:5: ( () otherlv_1= '#' otherlv_2= '[' )
+                    // InternalPerspectiveDsl.g:2662:6: () otherlv_1= '#' otherlv_2= '['
                     {
-                    // InternalPerspectiveDsl.g:2660:6: ()
-                    // InternalPerspectiveDsl.g:2661:7: 
+                    // InternalPerspectiveDsl.g:2662:6: ()
+                    // InternalPerspectiveDsl.g:2663:7: 
                     {
                     if ( state.backtracking==0 ) {
 
@@ -7362,7 +7362,7 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:2677:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
+                    // InternalPerspectiveDsl.g:2679:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
                     int alt30=2;
                     int LA30_0 = input.LA(1);
 
@@ -7371,13 +7371,13 @@
                     }
                     switch (alt30) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:2678:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
+                            // InternalPerspectiveDsl.g:2680:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                             {
-                            // InternalPerspectiveDsl.g:2678:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
-                            // InternalPerspectiveDsl.g:2679:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
+                            // InternalPerspectiveDsl.g:2680:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
+                            // InternalPerspectiveDsl.g:2681:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                             {
-                            // InternalPerspectiveDsl.g:2679:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
-                            // InternalPerspectiveDsl.g:2680:7: lv_elements_3_0= ruleXAnnotationOrExpression
+                            // InternalPerspectiveDsl.g:2681:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
+                            // InternalPerspectiveDsl.g:2682:7: lv_elements_3_0= ruleXAnnotationOrExpression
                             {
                             if ( state.backtracking==0 ) {
 
@@ -7408,7 +7408,7 @@
 
                             }
 
-                            // InternalPerspectiveDsl.g:2697:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
+                            // InternalPerspectiveDsl.g:2699:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                             loop29:
                             do {
                                 int alt29=2;
@@ -7421,7 +7421,7 @@
 
                                 switch (alt29) {
                             	case 1 :
-                            	    // InternalPerspectiveDsl.g:2698:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
+                            	    // InternalPerspectiveDsl.g:2700:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                             	    {
                             	    otherlv_4=(Token)match(input,59,FOLLOW_33); if (state.failed) return current;
                             	    if ( state.backtracking==0 ) {
@@ -7429,11 +7429,11 @@
                             	      						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0());
                             	      					
                             	    }
-                            	    // InternalPerspectiveDsl.g:2702:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
-                            	    // InternalPerspectiveDsl.g:2703:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
+                            	    // InternalPerspectiveDsl.g:2704:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
+                            	    // InternalPerspectiveDsl.g:2705:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                             	    {
-                            	    // InternalPerspectiveDsl.g:2703:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
-                            	    // InternalPerspectiveDsl.g:2704:8: lv_elements_5_0= ruleXAnnotationOrExpression
+                            	    // InternalPerspectiveDsl.g:2705:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
+                            	    // InternalPerspectiveDsl.g:2706:8: lv_elements_5_0= ruleXAnnotationOrExpression
                             	    {
                             	    if ( state.backtracking==0 ) {
 
@@ -7492,7 +7492,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:2729:3: this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression
+                    // InternalPerspectiveDsl.g:2731:3: this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -7538,7 +7538,7 @@
 
 
     // $ANTLR start "entryRuleXAnnotationOrExpression"
-    // InternalPerspectiveDsl.g:2741:1: entryRuleXAnnotationOrExpression returns [EObject current=null] : iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF ;
+    // InternalPerspectiveDsl.g:2743:1: entryRuleXAnnotationOrExpression returns [EObject current=null] : iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF ;
     public final EObject entryRuleXAnnotationOrExpression() throws RecognitionException {
         EObject current = null;
 
@@ -7546,8 +7546,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:2741:64: (iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF )
-            // InternalPerspectiveDsl.g:2742:2: iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF
+            // InternalPerspectiveDsl.g:2743:64: (iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF )
+            // InternalPerspectiveDsl.g:2744:2: iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXAnnotationOrExpressionRule()); 
@@ -7578,7 +7578,7 @@
 
 
     // $ANTLR start "ruleXAnnotationOrExpression"
-    // InternalPerspectiveDsl.g:2748:1: ruleXAnnotationOrExpression returns [EObject current=null] : (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:2750:1: ruleXAnnotationOrExpression returns [EObject current=null] : (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression ) ;
     public final EObject ruleXAnnotationOrExpression() throws RecognitionException {
         EObject current = null;
 
@@ -7591,10 +7591,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:2754:2: ( (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression ) )
-            // InternalPerspectiveDsl.g:2755:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
+            // InternalPerspectiveDsl.g:2756:2: ( (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:2757:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:2755:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
+            // InternalPerspectiveDsl.g:2757:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
             int alt32=2;
             int LA32_0 = input.LA(1);
 
@@ -7613,7 +7613,7 @@
             }
             switch (alt32) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:2756:3: this_XAnnotation_0= ruleXAnnotation
+                    // InternalPerspectiveDsl.g:2758:3: this_XAnnotation_0= ruleXAnnotation
                     {
                     if ( state.backtracking==0 ) {
 
@@ -7635,7 +7635,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:2765:3: this_XExpression_1= ruleXExpression
+                    // InternalPerspectiveDsl.g:2767:3: this_XExpression_1= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -7681,7 +7681,7 @@
 
 
     // $ANTLR start "entryRuleXExpression"
-    // InternalPerspectiveDsl.g:2777:1: entryRuleXExpression returns [EObject current=null] : iv_ruleXExpression= ruleXExpression EOF ;
+    // InternalPerspectiveDsl.g:2779:1: entryRuleXExpression returns [EObject current=null] : iv_ruleXExpression= ruleXExpression EOF ;
     public final EObject entryRuleXExpression() throws RecognitionException {
         EObject current = null;
 
@@ -7689,8 +7689,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:2777:52: (iv_ruleXExpression= ruleXExpression EOF )
-            // InternalPerspectiveDsl.g:2778:2: iv_ruleXExpression= ruleXExpression EOF
+            // InternalPerspectiveDsl.g:2779:52: (iv_ruleXExpression= ruleXExpression EOF )
+            // InternalPerspectiveDsl.g:2780:2: iv_ruleXExpression= ruleXExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXExpressionRule()); 
@@ -7721,7 +7721,7 @@
 
 
     // $ANTLR start "ruleXExpression"
-    // InternalPerspectiveDsl.g:2784:1: ruleXExpression returns [EObject current=null] : this_XAssignment_0= ruleXAssignment ;
+    // InternalPerspectiveDsl.g:2786:1: ruleXExpression returns [EObject current=null] : this_XAssignment_0= ruleXAssignment ;
     public final EObject ruleXExpression() throws RecognitionException {
         EObject current = null;
 
@@ -7732,8 +7732,8 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:2790:2: (this_XAssignment_0= ruleXAssignment )
-            // InternalPerspectiveDsl.g:2791:2: this_XAssignment_0= ruleXAssignment
+            // InternalPerspectiveDsl.g:2792:2: (this_XAssignment_0= ruleXAssignment )
+            // InternalPerspectiveDsl.g:2793:2: this_XAssignment_0= ruleXAssignment
             {
             if ( state.backtracking==0 ) {
 
@@ -7773,7 +7773,7 @@
 
 
     // $ANTLR start "entryRuleXAssignment"
-    // InternalPerspectiveDsl.g:2802:1: entryRuleXAssignment returns [EObject current=null] : iv_ruleXAssignment= ruleXAssignment EOF ;
+    // InternalPerspectiveDsl.g:2804:1: entryRuleXAssignment returns [EObject current=null] : iv_ruleXAssignment= ruleXAssignment EOF ;
     public final EObject entryRuleXAssignment() throws RecognitionException {
         EObject current = null;
 
@@ -7781,8 +7781,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:2802:52: (iv_ruleXAssignment= ruleXAssignment EOF )
-            // InternalPerspectiveDsl.g:2803:2: iv_ruleXAssignment= ruleXAssignment EOF
+            // InternalPerspectiveDsl.g:2804:52: (iv_ruleXAssignment= ruleXAssignment EOF )
+            // InternalPerspectiveDsl.g:2805:2: iv_ruleXAssignment= ruleXAssignment EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXAssignmentRule()); 
@@ -7813,7 +7813,7 @@
 
 
     // $ANTLR start "ruleXAssignment"
-    // InternalPerspectiveDsl.g:2809:1: ruleXAssignment returns [EObject current=null] : ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) ;
+    // InternalPerspectiveDsl.g:2811:1: ruleXAssignment returns [EObject current=null] : ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) ;
     public final EObject ruleXAssignment() throws RecognitionException {
         EObject current = null;
 
@@ -7828,10 +7828,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:2815:2: ( ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) )
-            // InternalPerspectiveDsl.g:2816:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
+            // InternalPerspectiveDsl.g:2817:2: ( ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) )
+            // InternalPerspectiveDsl.g:2818:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
             {
-            // InternalPerspectiveDsl.g:2816:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
+            // InternalPerspectiveDsl.g:2818:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
             int alt34=2;
             switch ( input.LA(1) ) {
             case RULE_ID:
@@ -7970,13 +7970,13 @@
 
             switch (alt34) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:2817:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
+                    // InternalPerspectiveDsl.g:2819:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
                     {
-                    // InternalPerspectiveDsl.g:2817:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
-                    // InternalPerspectiveDsl.g:2818:4: () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) )
+                    // InternalPerspectiveDsl.g:2819:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
+                    // InternalPerspectiveDsl.g:2820:4: () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) )
                     {
-                    // InternalPerspectiveDsl.g:2818:4: ()
-                    // InternalPerspectiveDsl.g:2819:5: 
+                    // InternalPerspectiveDsl.g:2820:4: ()
+                    // InternalPerspectiveDsl.g:2821:5: 
                     {
                     if ( state.backtracking==0 ) {
 
@@ -7988,11 +7988,11 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:2825:4: ( ( ruleFeatureCallID ) )
-                    // InternalPerspectiveDsl.g:2826:5: ( ruleFeatureCallID )
+                    // InternalPerspectiveDsl.g:2827:4: ( ( ruleFeatureCallID ) )
+                    // InternalPerspectiveDsl.g:2828:5: ( ruleFeatureCallID )
                     {
-                    // InternalPerspectiveDsl.g:2826:5: ( ruleFeatureCallID )
-                    // InternalPerspectiveDsl.g:2827:6: ruleFeatureCallID
+                    // InternalPerspectiveDsl.g:2828:5: ( ruleFeatureCallID )
+                    // InternalPerspectiveDsl.g:2829:6: ruleFeatureCallID
                     {
                     if ( state.backtracking==0 ) {
 
@@ -8037,11 +8037,11 @@
                       				afterParserOrEnumRuleCall();
                       			
                     }
-                    // InternalPerspectiveDsl.g:2848:4: ( (lv_value_3_0= ruleXAssignment ) )
-                    // InternalPerspectiveDsl.g:2849:5: (lv_value_3_0= ruleXAssignment )
+                    // InternalPerspectiveDsl.g:2850:4: ( (lv_value_3_0= ruleXAssignment ) )
+                    // InternalPerspectiveDsl.g:2851:5: (lv_value_3_0= ruleXAssignment )
                     {
-                    // InternalPerspectiveDsl.g:2849:5: (lv_value_3_0= ruleXAssignment )
-                    // InternalPerspectiveDsl.g:2850:6: lv_value_3_0= ruleXAssignment
+                    // InternalPerspectiveDsl.g:2851:5: (lv_value_3_0= ruleXAssignment )
+                    // InternalPerspectiveDsl.g:2852:6: lv_value_3_0= ruleXAssignment
                     {
                     if ( state.backtracking==0 ) {
 
@@ -8079,10 +8079,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:2869:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
+                    // InternalPerspectiveDsl.g:2871:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
                     {
-                    // InternalPerspectiveDsl.g:2869:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
-                    // InternalPerspectiveDsl.g:2870:4: this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
+                    // InternalPerspectiveDsl.g:2871:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
+                    // InternalPerspectiveDsl.g:2872:4: this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
                     {
                     if ( state.backtracking==0 ) {
 
@@ -8100,21 +8100,21 @@
                       				afterParserOrEnumRuleCall();
                       			
                     }
-                    // InternalPerspectiveDsl.g:2878:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
+                    // InternalPerspectiveDsl.g:2880:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
                     int alt33=2;
                     alt33 = dfa33.predict(input);
                     switch (alt33) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:2879:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) )
+                            // InternalPerspectiveDsl.g:2881:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) )
                             {
-                            // InternalPerspectiveDsl.g:2879:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) )
-                            // InternalPerspectiveDsl.g:2880:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) )
+                            // InternalPerspectiveDsl.g:2881:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) )
+                            // InternalPerspectiveDsl.g:2882:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) )
                             {
-                            // InternalPerspectiveDsl.g:2890:6: ( () ( ( ruleOpMultiAssign ) ) )
-                            // InternalPerspectiveDsl.g:2891:7: () ( ( ruleOpMultiAssign ) )
+                            // InternalPerspectiveDsl.g:2892:6: ( () ( ( ruleOpMultiAssign ) ) )
+                            // InternalPerspectiveDsl.g:2893:7: () ( ( ruleOpMultiAssign ) )
                             {
-                            // InternalPerspectiveDsl.g:2891:7: ()
-                            // InternalPerspectiveDsl.g:2892:8: 
+                            // InternalPerspectiveDsl.g:2893:7: ()
+                            // InternalPerspectiveDsl.g:2894:8: 
                             {
                             if ( state.backtracking==0 ) {
 
@@ -8126,11 +8126,11 @@
 
                             }
 
-                            // InternalPerspectiveDsl.g:2898:7: ( ( ruleOpMultiAssign ) )
-                            // InternalPerspectiveDsl.g:2899:8: ( ruleOpMultiAssign )
+                            // InternalPerspectiveDsl.g:2900:7: ( ( ruleOpMultiAssign ) )
+                            // InternalPerspectiveDsl.g:2901:8: ( ruleOpMultiAssign )
                             {
-                            // InternalPerspectiveDsl.g:2899:8: ( ruleOpMultiAssign )
-                            // InternalPerspectiveDsl.g:2900:9: ruleOpMultiAssign
+                            // InternalPerspectiveDsl.g:2901:8: ( ruleOpMultiAssign )
+                            // InternalPerspectiveDsl.g:2902:9: ruleOpMultiAssign
                             {
                             if ( state.backtracking==0 ) {
 
@@ -8166,11 +8166,11 @@
 
                             }
 
-                            // InternalPerspectiveDsl.g:2916:5: ( (lv_rightOperand_7_0= ruleXAssignment ) )
-                            // InternalPerspectiveDsl.g:2917:6: (lv_rightOperand_7_0= ruleXAssignment )
+                            // InternalPerspectiveDsl.g:2918:5: ( (lv_rightOperand_7_0= ruleXAssignment ) )
+                            // InternalPerspectiveDsl.g:2919:6: (lv_rightOperand_7_0= ruleXAssignment )
                             {
-                            // InternalPerspectiveDsl.g:2917:6: (lv_rightOperand_7_0= ruleXAssignment )
-                            // InternalPerspectiveDsl.g:2918:7: lv_rightOperand_7_0= ruleXAssignment
+                            // InternalPerspectiveDsl.g:2919:6: (lv_rightOperand_7_0= ruleXAssignment )
+                            // InternalPerspectiveDsl.g:2920:7: lv_rightOperand_7_0= ruleXAssignment
                             {
                             if ( state.backtracking==0 ) {
 
@@ -8238,7 +8238,7 @@
 
 
     // $ANTLR start "entryRuleOpSingleAssign"
-    // InternalPerspectiveDsl.g:2941:1: entryRuleOpSingleAssign returns [String current=null] : iv_ruleOpSingleAssign= ruleOpSingleAssign EOF ;
+    // InternalPerspectiveDsl.g:2943:1: entryRuleOpSingleAssign returns [String current=null] : iv_ruleOpSingleAssign= ruleOpSingleAssign EOF ;
     public final String entryRuleOpSingleAssign() throws RecognitionException {
         String current = null;
 
@@ -8246,8 +8246,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:2941:54: (iv_ruleOpSingleAssign= ruleOpSingleAssign EOF )
-            // InternalPerspectiveDsl.g:2942:2: iv_ruleOpSingleAssign= ruleOpSingleAssign EOF
+            // InternalPerspectiveDsl.g:2943:54: (iv_ruleOpSingleAssign= ruleOpSingleAssign EOF )
+            // InternalPerspectiveDsl.g:2944:2: iv_ruleOpSingleAssign= ruleOpSingleAssign EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpSingleAssignRule()); 
@@ -8278,7 +8278,7 @@
 
 
     // $ANTLR start "ruleOpSingleAssign"
-    // InternalPerspectiveDsl.g:2948:1: ruleOpSingleAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '=' ;
+    // InternalPerspectiveDsl.g:2950:1: ruleOpSingleAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '=' ;
     public final AntlrDatatypeRuleToken ruleOpSingleAssign() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -8288,8 +8288,8 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:2954:2: (kw= '=' )
-            // InternalPerspectiveDsl.g:2955:2: kw= '='
+            // InternalPerspectiveDsl.g:2956:2: (kw= '=' )
+            // InternalPerspectiveDsl.g:2957:2: kw= '='
             {
             kw=(Token)match(input,61,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -8320,7 +8320,7 @@
 
 
     // $ANTLR start "entryRuleOpMultiAssign"
-    // InternalPerspectiveDsl.g:2963:1: entryRuleOpMultiAssign returns [String current=null] : iv_ruleOpMultiAssign= ruleOpMultiAssign EOF ;
+    // InternalPerspectiveDsl.g:2965:1: entryRuleOpMultiAssign returns [String current=null] : iv_ruleOpMultiAssign= ruleOpMultiAssign EOF ;
     public final String entryRuleOpMultiAssign() throws RecognitionException {
         String current = null;
 
@@ -8328,8 +8328,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:2963:53: (iv_ruleOpMultiAssign= ruleOpMultiAssign EOF )
-            // InternalPerspectiveDsl.g:2964:2: iv_ruleOpMultiAssign= ruleOpMultiAssign EOF
+            // InternalPerspectiveDsl.g:2965:53: (iv_ruleOpMultiAssign= ruleOpMultiAssign EOF )
+            // InternalPerspectiveDsl.g:2966:2: iv_ruleOpMultiAssign= ruleOpMultiAssign EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpMultiAssignRule()); 
@@ -8360,7 +8360,7 @@
 
 
     // $ANTLR start "ruleOpMultiAssign"
-    // InternalPerspectiveDsl.g:2970:1: ruleOpMultiAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) ;
+    // InternalPerspectiveDsl.g:2972:1: ruleOpMultiAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) ;
     public final AntlrDatatypeRuleToken ruleOpMultiAssign() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -8370,10 +8370,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:2976:2: ( (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) )
-            // InternalPerspectiveDsl.g:2977:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
+            // InternalPerspectiveDsl.g:2978:2: ( (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) )
+            // InternalPerspectiveDsl.g:2979:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
             {
-            // InternalPerspectiveDsl.g:2977:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
+            // InternalPerspectiveDsl.g:2979:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
             int alt36=7;
             switch ( input.LA(1) ) {
             case 65:
@@ -8421,7 +8421,7 @@
 
             switch (alt36) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:2978:3: kw= '+='
+                    // InternalPerspectiveDsl.g:2980:3: kw= '+='
                     {
                     kw=(Token)match(input,65,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -8434,7 +8434,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:2984:3: kw= '-='
+                    // InternalPerspectiveDsl.g:2986:3: kw= '-='
                     {
                     kw=(Token)match(input,66,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -8447,7 +8447,7 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:2990:3: kw= '*='
+                    // InternalPerspectiveDsl.g:2992:3: kw= '*='
                     {
                     kw=(Token)match(input,67,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -8460,7 +8460,7 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:2996:3: kw= '/='
+                    // InternalPerspectiveDsl.g:2998:3: kw= '/='
                     {
                     kw=(Token)match(input,68,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -8473,7 +8473,7 @@
                     }
                     break;
                 case 5 :
-                    // InternalPerspectiveDsl.g:3002:3: kw= '%='
+                    // InternalPerspectiveDsl.g:3004:3: kw= '%='
                     {
                     kw=(Token)match(input,69,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -8486,10 +8486,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalPerspectiveDsl.g:3008:3: (kw= '<' kw= '<' kw= '=' )
+                    // InternalPerspectiveDsl.g:3010:3: (kw= '<' kw= '<' kw= '=' )
                     {
-                    // InternalPerspectiveDsl.g:3008:3: (kw= '<' kw= '<' kw= '=' )
-                    // InternalPerspectiveDsl.g:3009:4: kw= '<' kw= '<' kw= '='
+                    // InternalPerspectiveDsl.g:3010:3: (kw= '<' kw= '<' kw= '=' )
+                    // InternalPerspectiveDsl.g:3011:4: kw= '<' kw= '<' kw= '='
                     {
                     kw=(Token)match(input,70,FOLLOW_39); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -8519,10 +8519,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalPerspectiveDsl.g:3026:3: (kw= '>' (kw= '>' )? kw= '>=' )
+                    // InternalPerspectiveDsl.g:3028:3: (kw= '>' (kw= '>' )? kw= '>=' )
                     {
-                    // InternalPerspectiveDsl.g:3026:3: (kw= '>' (kw= '>' )? kw= '>=' )
-                    // InternalPerspectiveDsl.g:3027:4: kw= '>' (kw= '>' )? kw= '>='
+                    // InternalPerspectiveDsl.g:3028:3: (kw= '>' (kw= '>' )? kw= '>=' )
+                    // InternalPerspectiveDsl.g:3029:4: kw= '>' (kw= '>' )? kw= '>='
                     {
                     kw=(Token)match(input,71,FOLLOW_40); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -8531,7 +8531,7 @@
                       				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0());
                       			
                     }
-                    // InternalPerspectiveDsl.g:3032:4: (kw= '>' )?
+                    // InternalPerspectiveDsl.g:3034:4: (kw= '>' )?
                     int alt35=2;
                     int LA35_0 = input.LA(1);
 
@@ -8540,7 +8540,7 @@
                     }
                     switch (alt35) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:3033:5: kw= '>'
+                            // InternalPerspectiveDsl.g:3035:5: kw= '>'
                             {
                             kw=(Token)match(input,71,FOLLOW_41); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
@@ -8593,7 +8593,7 @@
 
 
     // $ANTLR start "entryRuleXOrExpression"
-    // InternalPerspectiveDsl.g:3049:1: entryRuleXOrExpression returns [EObject current=null] : iv_ruleXOrExpression= ruleXOrExpression EOF ;
+    // InternalPerspectiveDsl.g:3051:1: entryRuleXOrExpression returns [EObject current=null] : iv_ruleXOrExpression= ruleXOrExpression EOF ;
     public final EObject entryRuleXOrExpression() throws RecognitionException {
         EObject current = null;
 
@@ -8601,8 +8601,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:3049:54: (iv_ruleXOrExpression= ruleXOrExpression EOF )
-            // InternalPerspectiveDsl.g:3050:2: iv_ruleXOrExpression= ruleXOrExpression EOF
+            // InternalPerspectiveDsl.g:3051:54: (iv_ruleXOrExpression= ruleXOrExpression EOF )
+            // InternalPerspectiveDsl.g:3052:2: iv_ruleXOrExpression= ruleXOrExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXOrExpressionRule()); 
@@ -8633,7 +8633,7 @@
 
 
     // $ANTLR start "ruleXOrExpression"
-    // InternalPerspectiveDsl.g:3056:1: ruleXOrExpression returns [EObject current=null] : (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) ;
+    // InternalPerspectiveDsl.g:3058:1: ruleXOrExpression returns [EObject current=null] : (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) ;
     public final EObject ruleXOrExpression() throws RecognitionException {
         EObject current = null;
 
@@ -8646,11 +8646,11 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:3062:2: ( (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) )
-            // InternalPerspectiveDsl.g:3063:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
+            // InternalPerspectiveDsl.g:3064:2: ( (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) )
+            // InternalPerspectiveDsl.g:3065:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
             {
-            // InternalPerspectiveDsl.g:3063:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
-            // InternalPerspectiveDsl.g:3064:3: this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
+            // InternalPerspectiveDsl.g:3065:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
+            // InternalPerspectiveDsl.g:3066:3: this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
             {
             if ( state.backtracking==0 ) {
 
@@ -8668,7 +8668,7 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalPerspectiveDsl.g:3072:3: ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
+            // InternalPerspectiveDsl.g:3074:3: ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
             loop37:
             do {
                 int alt37=2;
@@ -8687,16 +8687,16 @@
 
                 switch (alt37) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:3073:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) )
+            	    // InternalPerspectiveDsl.g:3075:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3073:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) )
-            	    // InternalPerspectiveDsl.g:3074:5: ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) )
+            	    // InternalPerspectiveDsl.g:3075:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) )
+            	    // InternalPerspectiveDsl.g:3076:5: ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3084:5: ( () ( ( ruleOpOr ) ) )
-            	    // InternalPerspectiveDsl.g:3085:6: () ( ( ruleOpOr ) )
+            	    // InternalPerspectiveDsl.g:3086:5: ( () ( ( ruleOpOr ) ) )
+            	    // InternalPerspectiveDsl.g:3087:6: () ( ( ruleOpOr ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3085:6: ()
-            	    // InternalPerspectiveDsl.g:3086:7: 
+            	    // InternalPerspectiveDsl.g:3087:6: ()
+            	    // InternalPerspectiveDsl.g:3088:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -8708,11 +8708,11 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:3092:6: ( ( ruleOpOr ) )
-            	    // InternalPerspectiveDsl.g:3093:7: ( ruleOpOr )
+            	    // InternalPerspectiveDsl.g:3094:6: ( ( ruleOpOr ) )
+            	    // InternalPerspectiveDsl.g:3095:7: ( ruleOpOr )
             	    {
-            	    // InternalPerspectiveDsl.g:3093:7: ( ruleOpOr )
-            	    // InternalPerspectiveDsl.g:3094:8: ruleOpOr
+            	    // InternalPerspectiveDsl.g:3095:7: ( ruleOpOr )
+            	    // InternalPerspectiveDsl.g:3096:8: ruleOpOr
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -8748,11 +8748,11 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:3110:4: ( (lv_rightOperand_3_0= ruleXAndExpression ) )
-            	    // InternalPerspectiveDsl.g:3111:5: (lv_rightOperand_3_0= ruleXAndExpression )
+            	    // InternalPerspectiveDsl.g:3112:4: ( (lv_rightOperand_3_0= ruleXAndExpression ) )
+            	    // InternalPerspectiveDsl.g:3113:5: (lv_rightOperand_3_0= ruleXAndExpression )
             	    {
-            	    // InternalPerspectiveDsl.g:3111:5: (lv_rightOperand_3_0= ruleXAndExpression )
-            	    // InternalPerspectiveDsl.g:3112:6: lv_rightOperand_3_0= ruleXAndExpression
+            	    // InternalPerspectiveDsl.g:3113:5: (lv_rightOperand_3_0= ruleXAndExpression )
+            	    // InternalPerspectiveDsl.g:3114:6: lv_rightOperand_3_0= ruleXAndExpression
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -8817,7 +8817,7 @@
 
 
     // $ANTLR start "entryRuleOpOr"
-    // InternalPerspectiveDsl.g:3134:1: entryRuleOpOr returns [String current=null] : iv_ruleOpOr= ruleOpOr EOF ;
+    // InternalPerspectiveDsl.g:3136:1: entryRuleOpOr returns [String current=null] : iv_ruleOpOr= ruleOpOr EOF ;
     public final String entryRuleOpOr() throws RecognitionException {
         String current = null;
 
@@ -8825,8 +8825,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:3134:44: (iv_ruleOpOr= ruleOpOr EOF )
-            // InternalPerspectiveDsl.g:3135:2: iv_ruleOpOr= ruleOpOr EOF
+            // InternalPerspectiveDsl.g:3136:44: (iv_ruleOpOr= ruleOpOr EOF )
+            // InternalPerspectiveDsl.g:3137:2: iv_ruleOpOr= ruleOpOr EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpOrRule()); 
@@ -8857,7 +8857,7 @@
 
 
     // $ANTLR start "ruleOpOr"
-    // InternalPerspectiveDsl.g:3141:1: ruleOpOr returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '||' ;
+    // InternalPerspectiveDsl.g:3143:1: ruleOpOr returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '||' ;
     public final AntlrDatatypeRuleToken ruleOpOr() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -8867,8 +8867,8 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:3147:2: (kw= '||' )
-            // InternalPerspectiveDsl.g:3148:2: kw= '||'
+            // InternalPerspectiveDsl.g:3149:2: (kw= '||' )
+            // InternalPerspectiveDsl.g:3150:2: kw= '||'
             {
             kw=(Token)match(input,73,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -8899,7 +8899,7 @@
 
 
     // $ANTLR start "entryRuleXAndExpression"
-    // InternalPerspectiveDsl.g:3156:1: entryRuleXAndExpression returns [EObject current=null] : iv_ruleXAndExpression= ruleXAndExpression EOF ;
+    // InternalPerspectiveDsl.g:3158:1: entryRuleXAndExpression returns [EObject current=null] : iv_ruleXAndExpression= ruleXAndExpression EOF ;
     public final EObject entryRuleXAndExpression() throws RecognitionException {
         EObject current = null;
 
@@ -8907,8 +8907,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:3156:55: (iv_ruleXAndExpression= ruleXAndExpression EOF )
-            // InternalPerspectiveDsl.g:3157:2: iv_ruleXAndExpression= ruleXAndExpression EOF
+            // InternalPerspectiveDsl.g:3158:55: (iv_ruleXAndExpression= ruleXAndExpression EOF )
+            // InternalPerspectiveDsl.g:3159:2: iv_ruleXAndExpression= ruleXAndExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXAndExpressionRule()); 
@@ -8939,7 +8939,7 @@
 
 
     // $ANTLR start "ruleXAndExpression"
-    // InternalPerspectiveDsl.g:3163:1: ruleXAndExpression returns [EObject current=null] : (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) ;
+    // InternalPerspectiveDsl.g:3165:1: ruleXAndExpression returns [EObject current=null] : (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) ;
     public final EObject ruleXAndExpression() throws RecognitionException {
         EObject current = null;
 
@@ -8952,11 +8952,11 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:3169:2: ( (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) )
-            // InternalPerspectiveDsl.g:3170:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
+            // InternalPerspectiveDsl.g:3171:2: ( (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) )
+            // InternalPerspectiveDsl.g:3172:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
             {
-            // InternalPerspectiveDsl.g:3170:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
-            // InternalPerspectiveDsl.g:3171:3: this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
+            // InternalPerspectiveDsl.g:3172:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
+            // InternalPerspectiveDsl.g:3173:3: this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
             {
             if ( state.backtracking==0 ) {
 
@@ -8974,7 +8974,7 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalPerspectiveDsl.g:3179:3: ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
+            // InternalPerspectiveDsl.g:3181:3: ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
             loop38:
             do {
                 int alt38=2;
@@ -8993,16 +8993,16 @@
 
                 switch (alt38) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:3180:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
+            	    // InternalPerspectiveDsl.g:3182:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3180:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) )
-            	    // InternalPerspectiveDsl.g:3181:5: ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) )
+            	    // InternalPerspectiveDsl.g:3182:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) )
+            	    // InternalPerspectiveDsl.g:3183:5: ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3191:5: ( () ( ( ruleOpAnd ) ) )
-            	    // InternalPerspectiveDsl.g:3192:6: () ( ( ruleOpAnd ) )
+            	    // InternalPerspectiveDsl.g:3193:5: ( () ( ( ruleOpAnd ) ) )
+            	    // InternalPerspectiveDsl.g:3194:6: () ( ( ruleOpAnd ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3192:6: ()
-            	    // InternalPerspectiveDsl.g:3193:7: 
+            	    // InternalPerspectiveDsl.g:3194:6: ()
+            	    // InternalPerspectiveDsl.g:3195:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -9014,11 +9014,11 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:3199:6: ( ( ruleOpAnd ) )
-            	    // InternalPerspectiveDsl.g:3200:7: ( ruleOpAnd )
+            	    // InternalPerspectiveDsl.g:3201:6: ( ( ruleOpAnd ) )
+            	    // InternalPerspectiveDsl.g:3202:7: ( ruleOpAnd )
             	    {
-            	    // InternalPerspectiveDsl.g:3200:7: ( ruleOpAnd )
-            	    // InternalPerspectiveDsl.g:3201:8: ruleOpAnd
+            	    // InternalPerspectiveDsl.g:3202:7: ( ruleOpAnd )
+            	    // InternalPerspectiveDsl.g:3203:8: ruleOpAnd
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -9054,11 +9054,11 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:3217:4: ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
-            	    // InternalPerspectiveDsl.g:3218:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
+            	    // InternalPerspectiveDsl.g:3219:4: ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
+            	    // InternalPerspectiveDsl.g:3220:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
             	    {
-            	    // InternalPerspectiveDsl.g:3218:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
-            	    // InternalPerspectiveDsl.g:3219:6: lv_rightOperand_3_0= ruleXEqualityExpression
+            	    // InternalPerspectiveDsl.g:3220:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
+            	    // InternalPerspectiveDsl.g:3221:6: lv_rightOperand_3_0= ruleXEqualityExpression
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -9123,7 +9123,7 @@
 
 
     // $ANTLR start "entryRuleOpAnd"
-    // InternalPerspectiveDsl.g:3241:1: entryRuleOpAnd returns [String current=null] : iv_ruleOpAnd= ruleOpAnd EOF ;
+    // InternalPerspectiveDsl.g:3243:1: entryRuleOpAnd returns [String current=null] : iv_ruleOpAnd= ruleOpAnd EOF ;
     public final String entryRuleOpAnd() throws RecognitionException {
         String current = null;
 
@@ -9131,8 +9131,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:3241:45: (iv_ruleOpAnd= ruleOpAnd EOF )
-            // InternalPerspectiveDsl.g:3242:2: iv_ruleOpAnd= ruleOpAnd EOF
+            // InternalPerspectiveDsl.g:3243:45: (iv_ruleOpAnd= ruleOpAnd EOF )
+            // InternalPerspectiveDsl.g:3244:2: iv_ruleOpAnd= ruleOpAnd EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpAndRule()); 
@@ -9163,7 +9163,7 @@
 
 
     // $ANTLR start "ruleOpAnd"
-    // InternalPerspectiveDsl.g:3248:1: ruleOpAnd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '&&' ;
+    // InternalPerspectiveDsl.g:3250:1: ruleOpAnd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '&&' ;
     public final AntlrDatatypeRuleToken ruleOpAnd() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -9173,8 +9173,8 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:3254:2: (kw= '&&' )
-            // InternalPerspectiveDsl.g:3255:2: kw= '&&'
+            // InternalPerspectiveDsl.g:3256:2: (kw= '&&' )
+            // InternalPerspectiveDsl.g:3257:2: kw= '&&'
             {
             kw=(Token)match(input,74,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -9205,7 +9205,7 @@
 
 
     // $ANTLR start "entryRuleXEqualityExpression"
-    // InternalPerspectiveDsl.g:3263:1: entryRuleXEqualityExpression returns [EObject current=null] : iv_ruleXEqualityExpression= ruleXEqualityExpression EOF ;
+    // InternalPerspectiveDsl.g:3265:1: entryRuleXEqualityExpression returns [EObject current=null] : iv_ruleXEqualityExpression= ruleXEqualityExpression EOF ;
     public final EObject entryRuleXEqualityExpression() throws RecognitionException {
         EObject current = null;
 
@@ -9213,8 +9213,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:3263:60: (iv_ruleXEqualityExpression= ruleXEqualityExpression EOF )
-            // InternalPerspectiveDsl.g:3264:2: iv_ruleXEqualityExpression= ruleXEqualityExpression EOF
+            // InternalPerspectiveDsl.g:3265:60: (iv_ruleXEqualityExpression= ruleXEqualityExpression EOF )
+            // InternalPerspectiveDsl.g:3266:2: iv_ruleXEqualityExpression= ruleXEqualityExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXEqualityExpressionRule()); 
@@ -9245,7 +9245,7 @@
 
 
     // $ANTLR start "ruleXEqualityExpression"
-    // InternalPerspectiveDsl.g:3270:1: ruleXEqualityExpression returns [EObject current=null] : (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) ;
+    // InternalPerspectiveDsl.g:3272:1: ruleXEqualityExpression returns [EObject current=null] : (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) ;
     public final EObject ruleXEqualityExpression() throws RecognitionException {
         EObject current = null;
 
@@ -9258,11 +9258,11 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:3276:2: ( (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) )
-            // InternalPerspectiveDsl.g:3277:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
+            // InternalPerspectiveDsl.g:3278:2: ( (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) )
+            // InternalPerspectiveDsl.g:3279:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
             {
-            // InternalPerspectiveDsl.g:3277:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
-            // InternalPerspectiveDsl.g:3278:3: this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
+            // InternalPerspectiveDsl.g:3279:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
+            // InternalPerspectiveDsl.g:3280:3: this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
             {
             if ( state.backtracking==0 ) {
 
@@ -9280,7 +9280,7 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalPerspectiveDsl.g:3286:3: ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
+            // InternalPerspectiveDsl.g:3288:3: ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
             loop39:
             do {
                 int alt39=2;
@@ -9334,16 +9334,16 @@
 
                 switch (alt39) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:3287:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
+            	    // InternalPerspectiveDsl.g:3289:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3287:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) )
-            	    // InternalPerspectiveDsl.g:3288:5: ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) )
+            	    // InternalPerspectiveDsl.g:3289:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) )
+            	    // InternalPerspectiveDsl.g:3290:5: ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3298:5: ( () ( ( ruleOpEquality ) ) )
-            	    // InternalPerspectiveDsl.g:3299:6: () ( ( ruleOpEquality ) )
+            	    // InternalPerspectiveDsl.g:3300:5: ( () ( ( ruleOpEquality ) ) )
+            	    // InternalPerspectiveDsl.g:3301:6: () ( ( ruleOpEquality ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3299:6: ()
-            	    // InternalPerspectiveDsl.g:3300:7: 
+            	    // InternalPerspectiveDsl.g:3301:6: ()
+            	    // InternalPerspectiveDsl.g:3302:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -9355,11 +9355,11 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:3306:6: ( ( ruleOpEquality ) )
-            	    // InternalPerspectiveDsl.g:3307:7: ( ruleOpEquality )
+            	    // InternalPerspectiveDsl.g:3308:6: ( ( ruleOpEquality ) )
+            	    // InternalPerspectiveDsl.g:3309:7: ( ruleOpEquality )
             	    {
-            	    // InternalPerspectiveDsl.g:3307:7: ( ruleOpEquality )
-            	    // InternalPerspectiveDsl.g:3308:8: ruleOpEquality
+            	    // InternalPerspectiveDsl.g:3309:7: ( ruleOpEquality )
+            	    // InternalPerspectiveDsl.g:3310:8: ruleOpEquality
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -9395,11 +9395,11 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:3324:4: ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
-            	    // InternalPerspectiveDsl.g:3325:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
+            	    // InternalPerspectiveDsl.g:3326:4: ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
+            	    // InternalPerspectiveDsl.g:3327:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
             	    {
-            	    // InternalPerspectiveDsl.g:3325:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
-            	    // InternalPerspectiveDsl.g:3326:6: lv_rightOperand_3_0= ruleXRelationalExpression
+            	    // InternalPerspectiveDsl.g:3327:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
+            	    // InternalPerspectiveDsl.g:3328:6: lv_rightOperand_3_0= ruleXRelationalExpression
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -9464,7 +9464,7 @@
 
 
     // $ANTLR start "entryRuleOpEquality"
-    // InternalPerspectiveDsl.g:3348:1: entryRuleOpEquality returns [String current=null] : iv_ruleOpEquality= ruleOpEquality EOF ;
+    // InternalPerspectiveDsl.g:3350:1: entryRuleOpEquality returns [String current=null] : iv_ruleOpEquality= ruleOpEquality EOF ;
     public final String entryRuleOpEquality() throws RecognitionException {
         String current = null;
 
@@ -9472,8 +9472,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:3348:50: (iv_ruleOpEquality= ruleOpEquality EOF )
-            // InternalPerspectiveDsl.g:3349:2: iv_ruleOpEquality= ruleOpEquality EOF
+            // InternalPerspectiveDsl.g:3350:50: (iv_ruleOpEquality= ruleOpEquality EOF )
+            // InternalPerspectiveDsl.g:3351:2: iv_ruleOpEquality= ruleOpEquality EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpEqualityRule()); 
@@ -9504,7 +9504,7 @@
 
 
     // $ANTLR start "ruleOpEquality"
-    // InternalPerspectiveDsl.g:3355:1: ruleOpEquality returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) ;
+    // InternalPerspectiveDsl.g:3357:1: ruleOpEquality returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) ;
     public final AntlrDatatypeRuleToken ruleOpEquality() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -9514,10 +9514,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:3361:2: ( (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) )
-            // InternalPerspectiveDsl.g:3362:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
+            // InternalPerspectiveDsl.g:3363:2: ( (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) )
+            // InternalPerspectiveDsl.g:3364:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
             {
-            // InternalPerspectiveDsl.g:3362:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
+            // InternalPerspectiveDsl.g:3364:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
             int alt40=4;
             switch ( input.LA(1) ) {
             case 75:
@@ -9550,7 +9550,7 @@
 
             switch (alt40) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3363:3: kw= '=='
+                    // InternalPerspectiveDsl.g:3365:3: kw= '=='
                     {
                     kw=(Token)match(input,75,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -9563,7 +9563,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3369:3: kw= '!='
+                    // InternalPerspectiveDsl.g:3371:3: kw= '!='
                     {
                     kw=(Token)match(input,76,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -9576,7 +9576,7 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:3375:3: kw= '==='
+                    // InternalPerspectiveDsl.g:3377:3: kw= '==='
                     {
                     kw=(Token)match(input,77,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -9589,7 +9589,7 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:3381:3: kw= '!=='
+                    // InternalPerspectiveDsl.g:3383:3: kw= '!=='
                     {
                     kw=(Token)match(input,78,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -9626,7 +9626,7 @@
 
 
     // $ANTLR start "entryRuleXRelationalExpression"
-    // InternalPerspectiveDsl.g:3390:1: entryRuleXRelationalExpression returns [EObject current=null] : iv_ruleXRelationalExpression= ruleXRelationalExpression EOF ;
+    // InternalPerspectiveDsl.g:3392:1: entryRuleXRelationalExpression returns [EObject current=null] : iv_ruleXRelationalExpression= ruleXRelationalExpression EOF ;
     public final EObject entryRuleXRelationalExpression() throws RecognitionException {
         EObject current = null;
 
@@ -9634,8 +9634,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:3390:62: (iv_ruleXRelationalExpression= ruleXRelationalExpression EOF )
-            // InternalPerspectiveDsl.g:3391:2: iv_ruleXRelationalExpression= ruleXRelationalExpression EOF
+            // InternalPerspectiveDsl.g:3392:62: (iv_ruleXRelationalExpression= ruleXRelationalExpression EOF )
+            // InternalPerspectiveDsl.g:3393:2: iv_ruleXRelationalExpression= ruleXRelationalExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXRelationalExpressionRule()); 
@@ -9666,7 +9666,7 @@
 
 
     // $ANTLR start "ruleXRelationalExpression"
-    // InternalPerspectiveDsl.g:3397:1: ruleXRelationalExpression returns [EObject current=null] : (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) ;
+    // InternalPerspectiveDsl.g:3399:1: ruleXRelationalExpression returns [EObject current=null] : (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) ;
     public final EObject ruleXRelationalExpression() throws RecognitionException {
         EObject current = null;
 
@@ -9682,11 +9682,11 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:3403:2: ( (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) )
-            // InternalPerspectiveDsl.g:3404:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
+            // InternalPerspectiveDsl.g:3405:2: ( (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) )
+            // InternalPerspectiveDsl.g:3406:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
             {
-            // InternalPerspectiveDsl.g:3404:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
-            // InternalPerspectiveDsl.g:3405:3: this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
+            // InternalPerspectiveDsl.g:3406:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
+            // InternalPerspectiveDsl.g:3407:3: this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
             {
             if ( state.backtracking==0 ) {
 
@@ -9704,7 +9704,7 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalPerspectiveDsl.g:3413:3: ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
+            // InternalPerspectiveDsl.g:3415:3: ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
             loop41:
             do {
                 int alt41=3;
@@ -9758,19 +9758,19 @@
 
                 switch (alt41) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:3414:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
+            	    // InternalPerspectiveDsl.g:3416:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3414:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
-            	    // InternalPerspectiveDsl.g:3415:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    // InternalPerspectiveDsl.g:3416:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
+            	    // InternalPerspectiveDsl.g:3417:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3415:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) )
-            	    // InternalPerspectiveDsl.g:3416:6: ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' )
+            	    // InternalPerspectiveDsl.g:3417:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) )
+            	    // InternalPerspectiveDsl.g:3418:6: ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' )
             	    {
-            	    // InternalPerspectiveDsl.g:3422:6: ( () otherlv_2= 'instanceof' )
-            	    // InternalPerspectiveDsl.g:3423:7: () otherlv_2= 'instanceof'
+            	    // InternalPerspectiveDsl.g:3424:6: ( () otherlv_2= 'instanceof' )
+            	    // InternalPerspectiveDsl.g:3425:7: () otherlv_2= 'instanceof'
             	    {
-            	    // InternalPerspectiveDsl.g:3423:7: ()
-            	    // InternalPerspectiveDsl.g:3424:8: 
+            	    // InternalPerspectiveDsl.g:3425:7: ()
+            	    // InternalPerspectiveDsl.g:3426:8: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -9794,11 +9794,11 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:3436:5: ( (lv_type_3_0= ruleJvmTypeReference ) )
-            	    // InternalPerspectiveDsl.g:3437:6: (lv_type_3_0= ruleJvmTypeReference )
+            	    // InternalPerspectiveDsl.g:3438:5: ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    // InternalPerspectiveDsl.g:3439:6: (lv_type_3_0= ruleJvmTypeReference )
             	    {
-            	    // InternalPerspectiveDsl.g:3437:6: (lv_type_3_0= ruleJvmTypeReference )
-            	    // InternalPerspectiveDsl.g:3438:7: lv_type_3_0= ruleJvmTypeReference
+            	    // InternalPerspectiveDsl.g:3439:6: (lv_type_3_0= ruleJvmTypeReference )
+            	    // InternalPerspectiveDsl.g:3440:7: lv_type_3_0= ruleJvmTypeReference
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -9836,19 +9836,19 @@
             	    }
             	    break;
             	case 2 :
-            	    // InternalPerspectiveDsl.g:3457:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
+            	    // InternalPerspectiveDsl.g:3459:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3457:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
-            	    // InternalPerspectiveDsl.g:3458:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
+            	    // InternalPerspectiveDsl.g:3459:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
+            	    // InternalPerspectiveDsl.g:3460:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3458:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) )
-            	    // InternalPerspectiveDsl.g:3459:6: ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) )
+            	    // InternalPerspectiveDsl.g:3460:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) )
+            	    // InternalPerspectiveDsl.g:3461:6: ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3469:6: ( () ( ( ruleOpCompare ) ) )
-            	    // InternalPerspectiveDsl.g:3470:7: () ( ( ruleOpCompare ) )
+            	    // InternalPerspectiveDsl.g:3471:6: ( () ( ( ruleOpCompare ) ) )
+            	    // InternalPerspectiveDsl.g:3472:7: () ( ( ruleOpCompare ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3470:7: ()
-            	    // InternalPerspectiveDsl.g:3471:8: 
+            	    // InternalPerspectiveDsl.g:3472:7: ()
+            	    // InternalPerspectiveDsl.g:3473:8: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -9860,11 +9860,11 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:3477:7: ( ( ruleOpCompare ) )
-            	    // InternalPerspectiveDsl.g:3478:8: ( ruleOpCompare )
+            	    // InternalPerspectiveDsl.g:3479:7: ( ( ruleOpCompare ) )
+            	    // InternalPerspectiveDsl.g:3480:8: ( ruleOpCompare )
             	    {
-            	    // InternalPerspectiveDsl.g:3478:8: ( ruleOpCompare )
-            	    // InternalPerspectiveDsl.g:3479:9: ruleOpCompare
+            	    // InternalPerspectiveDsl.g:3480:8: ( ruleOpCompare )
+            	    // InternalPerspectiveDsl.g:3481:9: ruleOpCompare
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -9900,11 +9900,11 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:3495:5: ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
-            	    // InternalPerspectiveDsl.g:3496:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
+            	    // InternalPerspectiveDsl.g:3497:5: ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
+            	    // InternalPerspectiveDsl.g:3498:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
             	    {
-            	    // InternalPerspectiveDsl.g:3496:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
-            	    // InternalPerspectiveDsl.g:3497:7: lv_rightOperand_6_0= ruleXOtherOperatorExpression
+            	    // InternalPerspectiveDsl.g:3498:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
+            	    // InternalPerspectiveDsl.g:3499:7: lv_rightOperand_6_0= ruleXOtherOperatorExpression
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -9972,7 +9972,7 @@
 
 
     // $ANTLR start "entryRuleOpCompare"
-    // InternalPerspectiveDsl.g:3520:1: entryRuleOpCompare returns [String current=null] : iv_ruleOpCompare= ruleOpCompare EOF ;
+    // InternalPerspectiveDsl.g:3522:1: entryRuleOpCompare returns [String current=null] : iv_ruleOpCompare= ruleOpCompare EOF ;
     public final String entryRuleOpCompare() throws RecognitionException {
         String current = null;
 
@@ -9980,8 +9980,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:3520:49: (iv_ruleOpCompare= ruleOpCompare EOF )
-            // InternalPerspectiveDsl.g:3521:2: iv_ruleOpCompare= ruleOpCompare EOF
+            // InternalPerspectiveDsl.g:3522:49: (iv_ruleOpCompare= ruleOpCompare EOF )
+            // InternalPerspectiveDsl.g:3523:2: iv_ruleOpCompare= ruleOpCompare EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpCompareRule()); 
@@ -10012,7 +10012,7 @@
 
 
     // $ANTLR start "ruleOpCompare"
-    // InternalPerspectiveDsl.g:3527:1: ruleOpCompare returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) ;
+    // InternalPerspectiveDsl.g:3529:1: ruleOpCompare returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) ;
     public final AntlrDatatypeRuleToken ruleOpCompare() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -10022,10 +10022,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:3533:2: ( (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) )
-            // InternalPerspectiveDsl.g:3534:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
+            // InternalPerspectiveDsl.g:3535:2: ( (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) )
+            // InternalPerspectiveDsl.g:3536:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
             {
-            // InternalPerspectiveDsl.g:3534:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
+            // InternalPerspectiveDsl.g:3536:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
             int alt42=4;
             switch ( input.LA(1) ) {
             case 72:
@@ -10067,7 +10067,7 @@
 
             switch (alt42) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3535:3: kw= '>='
+                    // InternalPerspectiveDsl.g:3537:3: kw= '>='
                     {
                     kw=(Token)match(input,72,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -10080,10 +10080,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3541:3: (kw= '<' kw= '=' )
+                    // InternalPerspectiveDsl.g:3543:3: (kw= '<' kw= '=' )
                     {
-                    // InternalPerspectiveDsl.g:3541:3: (kw= '<' kw= '=' )
-                    // InternalPerspectiveDsl.g:3542:4: kw= '<' kw= '='
+                    // InternalPerspectiveDsl.g:3543:3: (kw= '<' kw= '=' )
+                    // InternalPerspectiveDsl.g:3544:4: kw= '<' kw= '='
                     {
                     kw=(Token)match(input,70,FOLLOW_32); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -10106,7 +10106,7 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:3554:3: kw= '>'
+                    // InternalPerspectiveDsl.g:3556:3: kw= '>'
                     {
                     kw=(Token)match(input,71,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -10119,7 +10119,7 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:3560:3: kw= '<'
+                    // InternalPerspectiveDsl.g:3562:3: kw= '<'
                     {
                     kw=(Token)match(input,70,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -10156,7 +10156,7 @@
 
 
     // $ANTLR start "entryRuleXOtherOperatorExpression"
-    // InternalPerspectiveDsl.g:3569:1: entryRuleXOtherOperatorExpression returns [EObject current=null] : iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF ;
+    // InternalPerspectiveDsl.g:3571:1: entryRuleXOtherOperatorExpression returns [EObject current=null] : iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF ;
     public final EObject entryRuleXOtherOperatorExpression() throws RecognitionException {
         EObject current = null;
 
@@ -10164,8 +10164,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:3569:65: (iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF )
-            // InternalPerspectiveDsl.g:3570:2: iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF
+            // InternalPerspectiveDsl.g:3571:65: (iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF )
+            // InternalPerspectiveDsl.g:3572:2: iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXOtherOperatorExpressionRule()); 
@@ -10196,7 +10196,7 @@
 
 
     // $ANTLR start "ruleXOtherOperatorExpression"
-    // InternalPerspectiveDsl.g:3576:1: ruleXOtherOperatorExpression returns [EObject current=null] : (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) ;
+    // InternalPerspectiveDsl.g:3578:1: ruleXOtherOperatorExpression returns [EObject current=null] : (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) ;
     public final EObject ruleXOtherOperatorExpression() throws RecognitionException {
         EObject current = null;
 
@@ -10209,11 +10209,11 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:3582:2: ( (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) )
-            // InternalPerspectiveDsl.g:3583:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
+            // InternalPerspectiveDsl.g:3584:2: ( (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) )
+            // InternalPerspectiveDsl.g:3585:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
             {
-            // InternalPerspectiveDsl.g:3583:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
-            // InternalPerspectiveDsl.g:3584:3: this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
+            // InternalPerspectiveDsl.g:3585:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
+            // InternalPerspectiveDsl.g:3586:3: this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
             {
             if ( state.backtracking==0 ) {
 
@@ -10231,23 +10231,23 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalPerspectiveDsl.g:3592:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
+            // InternalPerspectiveDsl.g:3594:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
             loop43:
             do {
                 int alt43=2;
                 alt43 = dfa43.predict(input);
                 switch (alt43) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:3593:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
+            	    // InternalPerspectiveDsl.g:3595:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3593:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) )
-            	    // InternalPerspectiveDsl.g:3594:5: ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) )
+            	    // InternalPerspectiveDsl.g:3595:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) )
+            	    // InternalPerspectiveDsl.g:3596:5: ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3604:5: ( () ( ( ruleOpOther ) ) )
-            	    // InternalPerspectiveDsl.g:3605:6: () ( ( ruleOpOther ) )
+            	    // InternalPerspectiveDsl.g:3606:5: ( () ( ( ruleOpOther ) ) )
+            	    // InternalPerspectiveDsl.g:3607:6: () ( ( ruleOpOther ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3605:6: ()
-            	    // InternalPerspectiveDsl.g:3606:7: 
+            	    // InternalPerspectiveDsl.g:3607:6: ()
+            	    // InternalPerspectiveDsl.g:3608:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -10259,11 +10259,11 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:3612:6: ( ( ruleOpOther ) )
-            	    // InternalPerspectiveDsl.g:3613:7: ( ruleOpOther )
+            	    // InternalPerspectiveDsl.g:3614:6: ( ( ruleOpOther ) )
+            	    // InternalPerspectiveDsl.g:3615:7: ( ruleOpOther )
             	    {
-            	    // InternalPerspectiveDsl.g:3613:7: ( ruleOpOther )
-            	    // InternalPerspectiveDsl.g:3614:8: ruleOpOther
+            	    // InternalPerspectiveDsl.g:3615:7: ( ruleOpOther )
+            	    // InternalPerspectiveDsl.g:3616:8: ruleOpOther
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -10299,11 +10299,11 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:3630:4: ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
-            	    // InternalPerspectiveDsl.g:3631:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
+            	    // InternalPerspectiveDsl.g:3632:4: ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
+            	    // InternalPerspectiveDsl.g:3633:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
             	    {
-            	    // InternalPerspectiveDsl.g:3631:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
-            	    // InternalPerspectiveDsl.g:3632:6: lv_rightOperand_3_0= ruleXAdditiveExpression
+            	    // InternalPerspectiveDsl.g:3633:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
+            	    // InternalPerspectiveDsl.g:3634:6: lv_rightOperand_3_0= ruleXAdditiveExpression
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -10368,7 +10368,7 @@
 
 
     // $ANTLR start "entryRuleOpOther"
-    // InternalPerspectiveDsl.g:3654:1: entryRuleOpOther returns [String current=null] : iv_ruleOpOther= ruleOpOther EOF ;
+    // InternalPerspectiveDsl.g:3656:1: entryRuleOpOther returns [String current=null] : iv_ruleOpOther= ruleOpOther EOF ;
     public final String entryRuleOpOther() throws RecognitionException {
         String current = null;
 
@@ -10376,8 +10376,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:3654:47: (iv_ruleOpOther= ruleOpOther EOF )
-            // InternalPerspectiveDsl.g:3655:2: iv_ruleOpOther= ruleOpOther EOF
+            // InternalPerspectiveDsl.g:3656:47: (iv_ruleOpOther= ruleOpOther EOF )
+            // InternalPerspectiveDsl.g:3657:2: iv_ruleOpOther= ruleOpOther EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpOtherRule()); 
@@ -10408,7 +10408,7 @@
 
 
     // $ANTLR start "ruleOpOther"
-    // InternalPerspectiveDsl.g:3661:1: ruleOpOther returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) ;
+    // InternalPerspectiveDsl.g:3663:1: ruleOpOther returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) ;
     public final AntlrDatatypeRuleToken ruleOpOther() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -10418,15 +10418,15 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:3667:2: ( (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) )
-            // InternalPerspectiveDsl.g:3668:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
+            // InternalPerspectiveDsl.g:3669:2: ( (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) )
+            // InternalPerspectiveDsl.g:3670:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
             {
-            // InternalPerspectiveDsl.g:3668:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
+            // InternalPerspectiveDsl.g:3670:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
             int alt46=9;
             alt46 = dfa46.predict(input);
             switch (alt46) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3669:3: kw= '->'
+                    // InternalPerspectiveDsl.g:3671:3: kw= '->'
                     {
                     kw=(Token)match(input,80,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -10439,7 +10439,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3675:3: kw= '..<'
+                    // InternalPerspectiveDsl.g:3677:3: kw= '..<'
                     {
                     kw=(Token)match(input,81,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -10452,10 +10452,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:3681:3: (kw= '>' kw= '..' )
+                    // InternalPerspectiveDsl.g:3683:3: (kw= '>' kw= '..' )
                     {
-                    // InternalPerspectiveDsl.g:3681:3: (kw= '>' kw= '..' )
-                    // InternalPerspectiveDsl.g:3682:4: kw= '>' kw= '..'
+                    // InternalPerspectiveDsl.g:3683:3: (kw= '>' kw= '..' )
+                    // InternalPerspectiveDsl.g:3684:4: kw= '>' kw= '..'
                     {
                     kw=(Token)match(input,71,FOLLOW_48); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -10478,7 +10478,7 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:3694:3: kw= '..'
+                    // InternalPerspectiveDsl.g:3696:3: kw= '..'
                     {
                     kw=(Token)match(input,82,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -10491,7 +10491,7 @@
                     }
                     break;
                 case 5 :
-                    // InternalPerspectiveDsl.g:3700:3: kw= '=>'
+                    // InternalPerspectiveDsl.g:3702:3: kw= '=>'
                     {
                     kw=(Token)match(input,83,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -10504,10 +10504,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalPerspectiveDsl.g:3706:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
+                    // InternalPerspectiveDsl.g:3708:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
                     {
-                    // InternalPerspectiveDsl.g:3706:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
-                    // InternalPerspectiveDsl.g:3707:4: kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
+                    // InternalPerspectiveDsl.g:3708:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
+                    // InternalPerspectiveDsl.g:3709:4: kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
                     {
                     kw=(Token)match(input,71,FOLLOW_49); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -10516,7 +10516,7 @@
                       				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0());
                       			
                     }
-                    // InternalPerspectiveDsl.g:3712:4: ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
+                    // InternalPerspectiveDsl.g:3714:4: ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
                     int alt44=2;
                     int LA44_0 = input.LA(1);
 
@@ -10546,13 +10546,13 @@
                     }
                     switch (alt44) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:3713:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
+                            // InternalPerspectiveDsl.g:3715:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
                             {
-                            // InternalPerspectiveDsl.g:3713:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
-                            // InternalPerspectiveDsl.g:3714:6: ( ( '>' '>' ) )=> (kw= '>' kw= '>' )
+                            // InternalPerspectiveDsl.g:3715:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
+                            // InternalPerspectiveDsl.g:3716:6: ( ( '>' '>' ) )=> (kw= '>' kw= '>' )
                             {
-                            // InternalPerspectiveDsl.g:3719:6: (kw= '>' kw= '>' )
-                            // InternalPerspectiveDsl.g:3720:7: kw= '>' kw= '>'
+                            // InternalPerspectiveDsl.g:3721:6: (kw= '>' kw= '>' )
+                            // InternalPerspectiveDsl.g:3722:7: kw= '>' kw= '>'
                             {
                             kw=(Token)match(input,71,FOLLOW_49); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
@@ -10578,7 +10578,7 @@
                             }
                             break;
                         case 2 :
-                            // InternalPerspectiveDsl.g:3733:5: kw= '>'
+                            // InternalPerspectiveDsl.g:3735:5: kw= '>'
                             {
                             kw=(Token)match(input,71,FOLLOW_2); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
@@ -10600,10 +10600,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalPerspectiveDsl.g:3741:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
+                    // InternalPerspectiveDsl.g:3743:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
                     {
-                    // InternalPerspectiveDsl.g:3741:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
-                    // InternalPerspectiveDsl.g:3742:4: kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
+                    // InternalPerspectiveDsl.g:3743:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
+                    // InternalPerspectiveDsl.g:3744:4: kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
                     {
                     kw=(Token)match(input,70,FOLLOW_50); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -10612,7 +10612,7 @@
                       				newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0());
                       			
                     }
-                    // InternalPerspectiveDsl.g:3747:4: ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
+                    // InternalPerspectiveDsl.g:3749:4: ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
                     int alt45=3;
                     int LA45_0 = input.LA(1);
 
@@ -10645,13 +10645,13 @@
                     }
                     switch (alt45) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:3748:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
+                            // InternalPerspectiveDsl.g:3750:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
                             {
-                            // InternalPerspectiveDsl.g:3748:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
-                            // InternalPerspectiveDsl.g:3749:6: ( ( '<' '<' ) )=> (kw= '<' kw= '<' )
+                            // InternalPerspectiveDsl.g:3750:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
+                            // InternalPerspectiveDsl.g:3751:6: ( ( '<' '<' ) )=> (kw= '<' kw= '<' )
                             {
-                            // InternalPerspectiveDsl.g:3754:6: (kw= '<' kw= '<' )
-                            // InternalPerspectiveDsl.g:3755:7: kw= '<' kw= '<'
+                            // InternalPerspectiveDsl.g:3756:6: (kw= '<' kw= '<' )
+                            // InternalPerspectiveDsl.g:3757:7: kw= '<' kw= '<'
                             {
                             kw=(Token)match(input,70,FOLLOW_39); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
@@ -10677,7 +10677,7 @@
                             }
                             break;
                         case 2 :
-                            // InternalPerspectiveDsl.g:3768:5: kw= '<'
+                            // InternalPerspectiveDsl.g:3770:5: kw= '<'
                             {
                             kw=(Token)match(input,70,FOLLOW_2); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
@@ -10690,7 +10690,7 @@
                             }
                             break;
                         case 3 :
-                            // InternalPerspectiveDsl.g:3774:5: kw= '=>'
+                            // InternalPerspectiveDsl.g:3776:5: kw= '=>'
                             {
                             kw=(Token)match(input,83,FOLLOW_2); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
@@ -10712,7 +10712,7 @@
                     }
                     break;
                 case 8 :
-                    // InternalPerspectiveDsl.g:3782:3: kw= '<>'
+                    // InternalPerspectiveDsl.g:3784:3: kw= '<>'
                     {
                     kw=(Token)match(input,84,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -10725,7 +10725,7 @@
                     }
                     break;
                 case 9 :
-                    // InternalPerspectiveDsl.g:3788:3: kw= '?:'
+                    // InternalPerspectiveDsl.g:3790:3: kw= '?:'
                     {
                     kw=(Token)match(input,85,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -10762,7 +10762,7 @@
 
 
     // $ANTLR start "entryRuleXAdditiveExpression"
-    // InternalPerspectiveDsl.g:3797:1: entryRuleXAdditiveExpression returns [EObject current=null] : iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF ;
+    // InternalPerspectiveDsl.g:3799:1: entryRuleXAdditiveExpression returns [EObject current=null] : iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF ;
     public final EObject entryRuleXAdditiveExpression() throws RecognitionException {
         EObject current = null;
 
@@ -10770,8 +10770,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:3797:60: (iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF )
-            // InternalPerspectiveDsl.g:3798:2: iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF
+            // InternalPerspectiveDsl.g:3799:60: (iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF )
+            // InternalPerspectiveDsl.g:3800:2: iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXAdditiveExpressionRule()); 
@@ -10802,7 +10802,7 @@
 
 
     // $ANTLR start "ruleXAdditiveExpression"
-    // InternalPerspectiveDsl.g:3804:1: ruleXAdditiveExpression returns [EObject current=null] : (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) ;
+    // InternalPerspectiveDsl.g:3806:1: ruleXAdditiveExpression returns [EObject current=null] : (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) ;
     public final EObject ruleXAdditiveExpression() throws RecognitionException {
         EObject current = null;
 
@@ -10815,11 +10815,11 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:3810:2: ( (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) )
-            // InternalPerspectiveDsl.g:3811:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
+            // InternalPerspectiveDsl.g:3812:2: ( (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) )
+            // InternalPerspectiveDsl.g:3813:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
             {
-            // InternalPerspectiveDsl.g:3811:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
-            // InternalPerspectiveDsl.g:3812:3: this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
+            // InternalPerspectiveDsl.g:3813:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
+            // InternalPerspectiveDsl.g:3814:3: this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
             {
             if ( state.backtracking==0 ) {
 
@@ -10837,7 +10837,7 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalPerspectiveDsl.g:3820:3: ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
+            // InternalPerspectiveDsl.g:3822:3: ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
             loop47:
             do {
                 int alt47=2;
@@ -10865,16 +10865,16 @@
 
                 switch (alt47) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:3821:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
+            	    // InternalPerspectiveDsl.g:3823:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3821:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) )
-            	    // InternalPerspectiveDsl.g:3822:5: ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) )
+            	    // InternalPerspectiveDsl.g:3823:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) )
+            	    // InternalPerspectiveDsl.g:3824:5: ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3832:5: ( () ( ( ruleOpAdd ) ) )
-            	    // InternalPerspectiveDsl.g:3833:6: () ( ( ruleOpAdd ) )
+            	    // InternalPerspectiveDsl.g:3834:5: ( () ( ( ruleOpAdd ) ) )
+            	    // InternalPerspectiveDsl.g:3835:6: () ( ( ruleOpAdd ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3833:6: ()
-            	    // InternalPerspectiveDsl.g:3834:7: 
+            	    // InternalPerspectiveDsl.g:3835:6: ()
+            	    // InternalPerspectiveDsl.g:3836:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -10886,11 +10886,11 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:3840:6: ( ( ruleOpAdd ) )
-            	    // InternalPerspectiveDsl.g:3841:7: ( ruleOpAdd )
+            	    // InternalPerspectiveDsl.g:3842:6: ( ( ruleOpAdd ) )
+            	    // InternalPerspectiveDsl.g:3843:7: ( ruleOpAdd )
             	    {
-            	    // InternalPerspectiveDsl.g:3841:7: ( ruleOpAdd )
-            	    // InternalPerspectiveDsl.g:3842:8: ruleOpAdd
+            	    // InternalPerspectiveDsl.g:3843:7: ( ruleOpAdd )
+            	    // InternalPerspectiveDsl.g:3844:8: ruleOpAdd
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -10926,11 +10926,11 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:3858:4: ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
-            	    // InternalPerspectiveDsl.g:3859:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
+            	    // InternalPerspectiveDsl.g:3860:4: ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
+            	    // InternalPerspectiveDsl.g:3861:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
             	    {
-            	    // InternalPerspectiveDsl.g:3859:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
-            	    // InternalPerspectiveDsl.g:3860:6: lv_rightOperand_3_0= ruleXMultiplicativeExpression
+            	    // InternalPerspectiveDsl.g:3861:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
+            	    // InternalPerspectiveDsl.g:3862:6: lv_rightOperand_3_0= ruleXMultiplicativeExpression
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -10995,7 +10995,7 @@
 
 
     // $ANTLR start "entryRuleOpAdd"
-    // InternalPerspectiveDsl.g:3882:1: entryRuleOpAdd returns [String current=null] : iv_ruleOpAdd= ruleOpAdd EOF ;
+    // InternalPerspectiveDsl.g:3884:1: entryRuleOpAdd returns [String current=null] : iv_ruleOpAdd= ruleOpAdd EOF ;
     public final String entryRuleOpAdd() throws RecognitionException {
         String current = null;
 
@@ -11003,8 +11003,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:3882:45: (iv_ruleOpAdd= ruleOpAdd EOF )
-            // InternalPerspectiveDsl.g:3883:2: iv_ruleOpAdd= ruleOpAdd EOF
+            // InternalPerspectiveDsl.g:3884:45: (iv_ruleOpAdd= ruleOpAdd EOF )
+            // InternalPerspectiveDsl.g:3885:2: iv_ruleOpAdd= ruleOpAdd EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpAddRule()); 
@@ -11035,7 +11035,7 @@
 
 
     // $ANTLR start "ruleOpAdd"
-    // InternalPerspectiveDsl.g:3889:1: ruleOpAdd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+' | kw= '-' ) ;
+    // InternalPerspectiveDsl.g:3891:1: ruleOpAdd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+' | kw= '-' ) ;
     public final AntlrDatatypeRuleToken ruleOpAdd() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -11045,10 +11045,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:3895:2: ( (kw= '+' | kw= '-' ) )
-            // InternalPerspectiveDsl.g:3896:2: (kw= '+' | kw= '-' )
+            // InternalPerspectiveDsl.g:3897:2: ( (kw= '+' | kw= '-' ) )
+            // InternalPerspectiveDsl.g:3898:2: (kw= '+' | kw= '-' )
             {
-            // InternalPerspectiveDsl.g:3896:2: (kw= '+' | kw= '-' )
+            // InternalPerspectiveDsl.g:3898:2: (kw= '+' | kw= '-' )
             int alt48=2;
             int LA48_0 = input.LA(1);
 
@@ -11067,7 +11067,7 @@
             }
             switch (alt48) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:3897:3: kw= '+'
+                    // InternalPerspectiveDsl.g:3899:3: kw= '+'
                     {
                     kw=(Token)match(input,86,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -11080,7 +11080,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:3903:3: kw= '-'
+                    // InternalPerspectiveDsl.g:3905:3: kw= '-'
                     {
                     kw=(Token)match(input,87,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -11117,7 +11117,7 @@
 
 
     // $ANTLR start "entryRuleXMultiplicativeExpression"
-    // InternalPerspectiveDsl.g:3912:1: entryRuleXMultiplicativeExpression returns [EObject current=null] : iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF ;
+    // InternalPerspectiveDsl.g:3914:1: entryRuleXMultiplicativeExpression returns [EObject current=null] : iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF ;
     public final EObject entryRuleXMultiplicativeExpression() throws RecognitionException {
         EObject current = null;
 
@@ -11125,8 +11125,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:3912:66: (iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF )
-            // InternalPerspectiveDsl.g:3913:2: iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF
+            // InternalPerspectiveDsl.g:3914:66: (iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF )
+            // InternalPerspectiveDsl.g:3915:2: iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXMultiplicativeExpressionRule()); 
@@ -11157,7 +11157,7 @@
 
 
     // $ANTLR start "ruleXMultiplicativeExpression"
-    // InternalPerspectiveDsl.g:3919:1: ruleXMultiplicativeExpression returns [EObject current=null] : (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) ;
+    // InternalPerspectiveDsl.g:3921:1: ruleXMultiplicativeExpression returns [EObject current=null] : (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) ;
     public final EObject ruleXMultiplicativeExpression() throws RecognitionException {
         EObject current = null;
 
@@ -11170,11 +11170,11 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:3925:2: ( (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) )
-            // InternalPerspectiveDsl.g:3926:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
+            // InternalPerspectiveDsl.g:3927:2: ( (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) )
+            // InternalPerspectiveDsl.g:3928:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
             {
-            // InternalPerspectiveDsl.g:3926:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
-            // InternalPerspectiveDsl.g:3927:3: this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
+            // InternalPerspectiveDsl.g:3928:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
+            // InternalPerspectiveDsl.g:3929:3: this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
             {
             if ( state.backtracking==0 ) {
 
@@ -11192,7 +11192,7 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalPerspectiveDsl.g:3935:3: ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
+            // InternalPerspectiveDsl.g:3937:3: ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
             loop49:
             do {
                 int alt49=2;
@@ -11246,16 +11246,16 @@
 
                 switch (alt49) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:3936:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
+            	    // InternalPerspectiveDsl.g:3938:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3936:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) )
-            	    // InternalPerspectiveDsl.g:3937:5: ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) )
+            	    // InternalPerspectiveDsl.g:3938:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) )
+            	    // InternalPerspectiveDsl.g:3939:5: ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3947:5: ( () ( ( ruleOpMulti ) ) )
-            	    // InternalPerspectiveDsl.g:3948:6: () ( ( ruleOpMulti ) )
+            	    // InternalPerspectiveDsl.g:3949:5: ( () ( ( ruleOpMulti ) ) )
+            	    // InternalPerspectiveDsl.g:3950:6: () ( ( ruleOpMulti ) )
             	    {
-            	    // InternalPerspectiveDsl.g:3948:6: ()
-            	    // InternalPerspectiveDsl.g:3949:7: 
+            	    // InternalPerspectiveDsl.g:3950:6: ()
+            	    // InternalPerspectiveDsl.g:3951:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -11267,11 +11267,11 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:3955:6: ( ( ruleOpMulti ) )
-            	    // InternalPerspectiveDsl.g:3956:7: ( ruleOpMulti )
+            	    // InternalPerspectiveDsl.g:3957:6: ( ( ruleOpMulti ) )
+            	    // InternalPerspectiveDsl.g:3958:7: ( ruleOpMulti )
             	    {
-            	    // InternalPerspectiveDsl.g:3956:7: ( ruleOpMulti )
-            	    // InternalPerspectiveDsl.g:3957:8: ruleOpMulti
+            	    // InternalPerspectiveDsl.g:3958:7: ( ruleOpMulti )
+            	    // InternalPerspectiveDsl.g:3959:8: ruleOpMulti
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -11307,11 +11307,11 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:3973:4: ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
-            	    // InternalPerspectiveDsl.g:3974:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
+            	    // InternalPerspectiveDsl.g:3975:4: ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
+            	    // InternalPerspectiveDsl.g:3976:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
             	    {
-            	    // InternalPerspectiveDsl.g:3974:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
-            	    // InternalPerspectiveDsl.g:3975:6: lv_rightOperand_3_0= ruleXUnaryOperation
+            	    // InternalPerspectiveDsl.g:3976:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
+            	    // InternalPerspectiveDsl.g:3977:6: lv_rightOperand_3_0= ruleXUnaryOperation
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -11376,7 +11376,7 @@
 
 
     // $ANTLR start "entryRuleOpMulti"
-    // InternalPerspectiveDsl.g:3997:1: entryRuleOpMulti returns [String current=null] : iv_ruleOpMulti= ruleOpMulti EOF ;
+    // InternalPerspectiveDsl.g:3999:1: entryRuleOpMulti returns [String current=null] : iv_ruleOpMulti= ruleOpMulti EOF ;
     public final String entryRuleOpMulti() throws RecognitionException {
         String current = null;
 
@@ -11384,8 +11384,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:3997:47: (iv_ruleOpMulti= ruleOpMulti EOF )
-            // InternalPerspectiveDsl.g:3998:2: iv_ruleOpMulti= ruleOpMulti EOF
+            // InternalPerspectiveDsl.g:3999:47: (iv_ruleOpMulti= ruleOpMulti EOF )
+            // InternalPerspectiveDsl.g:4000:2: iv_ruleOpMulti= ruleOpMulti EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpMultiRule()); 
@@ -11416,7 +11416,7 @@
 
 
     // $ANTLR start "ruleOpMulti"
-    // InternalPerspectiveDsl.g:4004:1: ruleOpMulti returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) ;
+    // InternalPerspectiveDsl.g:4006:1: ruleOpMulti returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) ;
     public final AntlrDatatypeRuleToken ruleOpMulti() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -11426,10 +11426,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:4010:2: ( (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) )
-            // InternalPerspectiveDsl.g:4011:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
+            // InternalPerspectiveDsl.g:4012:2: ( (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) )
+            // InternalPerspectiveDsl.g:4013:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
             {
-            // InternalPerspectiveDsl.g:4011:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
+            // InternalPerspectiveDsl.g:4013:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
             int alt50=4;
             switch ( input.LA(1) ) {
             case 54:
@@ -11462,7 +11462,7 @@
 
             switch (alt50) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:4012:3: kw= '*'
+                    // InternalPerspectiveDsl.g:4014:3: kw= '*'
                     {
                     kw=(Token)match(input,54,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -11475,7 +11475,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:4018:3: kw= '**'
+                    // InternalPerspectiveDsl.g:4020:3: kw= '**'
                     {
                     kw=(Token)match(input,88,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -11488,7 +11488,7 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:4024:3: kw= '/'
+                    // InternalPerspectiveDsl.g:4026:3: kw= '/'
                     {
                     kw=(Token)match(input,89,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -11501,7 +11501,7 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:4030:3: kw= '%'
+                    // InternalPerspectiveDsl.g:4032:3: kw= '%'
                     {
                     kw=(Token)match(input,90,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -11538,7 +11538,7 @@
 
 
     // $ANTLR start "entryRuleXUnaryOperation"
-    // InternalPerspectiveDsl.g:4039:1: entryRuleXUnaryOperation returns [EObject current=null] : iv_ruleXUnaryOperation= ruleXUnaryOperation EOF ;
+    // InternalPerspectiveDsl.g:4041:1: entryRuleXUnaryOperation returns [EObject current=null] : iv_ruleXUnaryOperation= ruleXUnaryOperation EOF ;
     public final EObject entryRuleXUnaryOperation() throws RecognitionException {
         EObject current = null;
 
@@ -11546,8 +11546,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:4039:56: (iv_ruleXUnaryOperation= ruleXUnaryOperation EOF )
-            // InternalPerspectiveDsl.g:4040:2: iv_ruleXUnaryOperation= ruleXUnaryOperation EOF
+            // InternalPerspectiveDsl.g:4041:56: (iv_ruleXUnaryOperation= ruleXUnaryOperation EOF )
+            // InternalPerspectiveDsl.g:4042:2: iv_ruleXUnaryOperation= ruleXUnaryOperation EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXUnaryOperationRule()); 
@@ -11578,7 +11578,7 @@
 
 
     // $ANTLR start "ruleXUnaryOperation"
-    // InternalPerspectiveDsl.g:4046:1: ruleXUnaryOperation returns [EObject current=null] : ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) ;
+    // InternalPerspectiveDsl.g:4048:1: ruleXUnaryOperation returns [EObject current=null] : ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) ;
     public final EObject ruleXUnaryOperation() throws RecognitionException {
         EObject current = null;
 
@@ -11591,10 +11591,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:4052:2: ( ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) )
-            // InternalPerspectiveDsl.g:4053:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
+            // InternalPerspectiveDsl.g:4054:2: ( ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) )
+            // InternalPerspectiveDsl.g:4055:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
             {
-            // InternalPerspectiveDsl.g:4053:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
+            // InternalPerspectiveDsl.g:4055:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
             int alt51=2;
             int LA51_0 = input.LA(1);
 
@@ -11613,13 +11613,13 @@
             }
             switch (alt51) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:4054:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
+                    // InternalPerspectiveDsl.g:4056:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
                     {
-                    // InternalPerspectiveDsl.g:4054:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
-                    // InternalPerspectiveDsl.g:4055:4: () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) )
+                    // InternalPerspectiveDsl.g:4056:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
+                    // InternalPerspectiveDsl.g:4057:4: () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) )
                     {
-                    // InternalPerspectiveDsl.g:4055:4: ()
-                    // InternalPerspectiveDsl.g:4056:5: 
+                    // InternalPerspectiveDsl.g:4057:4: ()
+                    // InternalPerspectiveDsl.g:4058:5: 
                     {
                     if ( state.backtracking==0 ) {
 
@@ -11631,11 +11631,11 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:4062:4: ( ( ruleOpUnary ) )
-                    // InternalPerspectiveDsl.g:4063:5: ( ruleOpUnary )
+                    // InternalPerspectiveDsl.g:4064:4: ( ( ruleOpUnary ) )
+                    // InternalPerspectiveDsl.g:4065:5: ( ruleOpUnary )
                     {
-                    // InternalPerspectiveDsl.g:4063:5: ( ruleOpUnary )
-                    // InternalPerspectiveDsl.g:4064:6: ruleOpUnary
+                    // InternalPerspectiveDsl.g:4065:5: ( ruleOpUnary )
+                    // InternalPerspectiveDsl.g:4066:6: ruleOpUnary
                     {
                     if ( state.backtracking==0 ) {
 
@@ -11665,11 +11665,11 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:4078:4: ( (lv_operand_2_0= ruleXUnaryOperation ) )
-                    // InternalPerspectiveDsl.g:4079:5: (lv_operand_2_0= ruleXUnaryOperation )
+                    // InternalPerspectiveDsl.g:4080:4: ( (lv_operand_2_0= ruleXUnaryOperation ) )
+                    // InternalPerspectiveDsl.g:4081:5: (lv_operand_2_0= ruleXUnaryOperation )
                     {
-                    // InternalPerspectiveDsl.g:4079:5: (lv_operand_2_0= ruleXUnaryOperation )
-                    // InternalPerspectiveDsl.g:4080:6: lv_operand_2_0= ruleXUnaryOperation
+                    // InternalPerspectiveDsl.g:4081:5: (lv_operand_2_0= ruleXUnaryOperation )
+                    // InternalPerspectiveDsl.g:4082:6: lv_operand_2_0= ruleXUnaryOperation
                     {
                     if ( state.backtracking==0 ) {
 
@@ -11707,7 +11707,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:4099:3: this_XCastedExpression_3= ruleXCastedExpression
+                    // InternalPerspectiveDsl.g:4101:3: this_XCastedExpression_3= ruleXCastedExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -11753,7 +11753,7 @@
 
 
     // $ANTLR start "entryRuleOpUnary"
-    // InternalPerspectiveDsl.g:4111:1: entryRuleOpUnary returns [String current=null] : iv_ruleOpUnary= ruleOpUnary EOF ;
+    // InternalPerspectiveDsl.g:4113:1: entryRuleOpUnary returns [String current=null] : iv_ruleOpUnary= ruleOpUnary EOF ;
     public final String entryRuleOpUnary() throws RecognitionException {
         String current = null;
 
@@ -11761,8 +11761,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:4111:47: (iv_ruleOpUnary= ruleOpUnary EOF )
-            // InternalPerspectiveDsl.g:4112:2: iv_ruleOpUnary= ruleOpUnary EOF
+            // InternalPerspectiveDsl.g:4113:47: (iv_ruleOpUnary= ruleOpUnary EOF )
+            // InternalPerspectiveDsl.g:4114:2: iv_ruleOpUnary= ruleOpUnary EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpUnaryRule()); 
@@ -11793,7 +11793,7 @@
 
 
     // $ANTLR start "ruleOpUnary"
-    // InternalPerspectiveDsl.g:4118:1: ruleOpUnary returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '!' | kw= '-' | kw= '+' ) ;
+    // InternalPerspectiveDsl.g:4120:1: ruleOpUnary returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '!' | kw= '-' | kw= '+' ) ;
     public final AntlrDatatypeRuleToken ruleOpUnary() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -11803,10 +11803,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:4124:2: ( (kw= '!' | kw= '-' | kw= '+' ) )
-            // InternalPerspectiveDsl.g:4125:2: (kw= '!' | kw= '-' | kw= '+' )
+            // InternalPerspectiveDsl.g:4126:2: ( (kw= '!' | kw= '-' | kw= '+' ) )
+            // InternalPerspectiveDsl.g:4127:2: (kw= '!' | kw= '-' | kw= '+' )
             {
-            // InternalPerspectiveDsl.g:4125:2: (kw= '!' | kw= '-' | kw= '+' )
+            // InternalPerspectiveDsl.g:4127:2: (kw= '!' | kw= '-' | kw= '+' )
             int alt52=3;
             switch ( input.LA(1) ) {
             case 91:
@@ -11834,7 +11834,7 @@
 
             switch (alt52) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:4126:3: kw= '!'
+                    // InternalPerspectiveDsl.g:4128:3: kw= '!'
                     {
                     kw=(Token)match(input,91,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -11847,7 +11847,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:4132:3: kw= '-'
+                    // InternalPerspectiveDsl.g:4134:3: kw= '-'
                     {
                     kw=(Token)match(input,87,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -11860,7 +11860,7 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:4138:3: kw= '+'
+                    // InternalPerspectiveDsl.g:4140:3: kw= '+'
                     {
                     kw=(Token)match(input,86,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -11897,7 +11897,7 @@
 
 
     // $ANTLR start "entryRuleXCastedExpression"
-    // InternalPerspectiveDsl.g:4147:1: entryRuleXCastedExpression returns [EObject current=null] : iv_ruleXCastedExpression= ruleXCastedExpression EOF ;
+    // InternalPerspectiveDsl.g:4149:1: entryRuleXCastedExpression returns [EObject current=null] : iv_ruleXCastedExpression= ruleXCastedExpression EOF ;
     public final EObject entryRuleXCastedExpression() throws RecognitionException {
         EObject current = null;
 
@@ -11905,8 +11905,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:4147:58: (iv_ruleXCastedExpression= ruleXCastedExpression EOF )
-            // InternalPerspectiveDsl.g:4148:2: iv_ruleXCastedExpression= ruleXCastedExpression EOF
+            // InternalPerspectiveDsl.g:4149:58: (iv_ruleXCastedExpression= ruleXCastedExpression EOF )
+            // InternalPerspectiveDsl.g:4150:2: iv_ruleXCastedExpression= ruleXCastedExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXCastedExpressionRule()); 
@@ -11937,7 +11937,7 @@
 
 
     // $ANTLR start "ruleXCastedExpression"
-    // InternalPerspectiveDsl.g:4154:1: ruleXCastedExpression returns [EObject current=null] : (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) ;
+    // InternalPerspectiveDsl.g:4156:1: ruleXCastedExpression returns [EObject current=null] : (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) ;
     public final EObject ruleXCastedExpression() throws RecognitionException {
         EObject current = null;
 
@@ -11951,11 +11951,11 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:4160:2: ( (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) )
-            // InternalPerspectiveDsl.g:4161:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
+            // InternalPerspectiveDsl.g:4162:2: ( (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) )
+            // InternalPerspectiveDsl.g:4163:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
             {
-            // InternalPerspectiveDsl.g:4161:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
-            // InternalPerspectiveDsl.g:4162:3: this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
+            // InternalPerspectiveDsl.g:4163:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
+            // InternalPerspectiveDsl.g:4164:3: this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
             {
             if ( state.backtracking==0 ) {
 
@@ -11973,7 +11973,7 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalPerspectiveDsl.g:4170:3: ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
+            // InternalPerspectiveDsl.g:4172:3: ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
             loop53:
             do {
                 int alt53=2;
@@ -11992,16 +11992,16 @@
 
                 switch (alt53) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:4171:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    // InternalPerspectiveDsl.g:4173:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
             	    {
-            	    // InternalPerspectiveDsl.g:4171:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) )
-            	    // InternalPerspectiveDsl.g:4172:5: ( ( () 'as' ) )=> ( () otherlv_2= 'as' )
+            	    // InternalPerspectiveDsl.g:4173:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) )
+            	    // InternalPerspectiveDsl.g:4174:5: ( ( () 'as' ) )=> ( () otherlv_2= 'as' )
             	    {
-            	    // InternalPerspectiveDsl.g:4178:5: ( () otherlv_2= 'as' )
-            	    // InternalPerspectiveDsl.g:4179:6: () otherlv_2= 'as'
+            	    // InternalPerspectiveDsl.g:4180:5: ( () otherlv_2= 'as' )
+            	    // InternalPerspectiveDsl.g:4181:6: () otherlv_2= 'as'
             	    {
-            	    // InternalPerspectiveDsl.g:4179:6: ()
-            	    // InternalPerspectiveDsl.g:4180:7: 
+            	    // InternalPerspectiveDsl.g:4181:6: ()
+            	    // InternalPerspectiveDsl.g:4182:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -12025,11 +12025,11 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:4192:4: ( (lv_type_3_0= ruleJvmTypeReference ) )
-            	    // InternalPerspectiveDsl.g:4193:5: (lv_type_3_0= ruleJvmTypeReference )
+            	    // InternalPerspectiveDsl.g:4194:4: ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    // InternalPerspectiveDsl.g:4195:5: (lv_type_3_0= ruleJvmTypeReference )
             	    {
-            	    // InternalPerspectiveDsl.g:4193:5: (lv_type_3_0= ruleJvmTypeReference )
-            	    // InternalPerspectiveDsl.g:4194:6: lv_type_3_0= ruleJvmTypeReference
+            	    // InternalPerspectiveDsl.g:4195:5: (lv_type_3_0= ruleJvmTypeReference )
+            	    // InternalPerspectiveDsl.g:4196:6: lv_type_3_0= ruleJvmTypeReference
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -12094,7 +12094,7 @@
 
 
     // $ANTLR start "entryRuleXPostfixOperation"
-    // InternalPerspectiveDsl.g:4216:1: entryRuleXPostfixOperation returns [EObject current=null] : iv_ruleXPostfixOperation= ruleXPostfixOperation EOF ;
+    // InternalPerspectiveDsl.g:4218:1: entryRuleXPostfixOperation returns [EObject current=null] : iv_ruleXPostfixOperation= ruleXPostfixOperation EOF ;
     public final EObject entryRuleXPostfixOperation() throws RecognitionException {
         EObject current = null;
 
@@ -12102,8 +12102,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:4216:58: (iv_ruleXPostfixOperation= ruleXPostfixOperation EOF )
-            // InternalPerspectiveDsl.g:4217:2: iv_ruleXPostfixOperation= ruleXPostfixOperation EOF
+            // InternalPerspectiveDsl.g:4218:58: (iv_ruleXPostfixOperation= ruleXPostfixOperation EOF )
+            // InternalPerspectiveDsl.g:4219:2: iv_ruleXPostfixOperation= ruleXPostfixOperation EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXPostfixOperationRule()); 
@@ -12134,7 +12134,7 @@
 
 
     // $ANTLR start "ruleXPostfixOperation"
-    // InternalPerspectiveDsl.g:4223:1: ruleXPostfixOperation returns [EObject current=null] : (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) ;
+    // InternalPerspectiveDsl.g:4225:1: ruleXPostfixOperation returns [EObject current=null] : (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) ;
     public final EObject ruleXPostfixOperation() throws RecognitionException {
         EObject current = null;
 
@@ -12145,11 +12145,11 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:4229:2: ( (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) )
-            // InternalPerspectiveDsl.g:4230:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
+            // InternalPerspectiveDsl.g:4231:2: ( (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) )
+            // InternalPerspectiveDsl.g:4232:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
             {
-            // InternalPerspectiveDsl.g:4230:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
-            // InternalPerspectiveDsl.g:4231:3: this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
+            // InternalPerspectiveDsl.g:4232:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
+            // InternalPerspectiveDsl.g:4233:3: this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
             {
             if ( state.backtracking==0 ) {
 
@@ -12167,7 +12167,7 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalPerspectiveDsl.g:4239:3: ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
+            // InternalPerspectiveDsl.g:4241:3: ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
             int alt54=2;
             int LA54_0 = input.LA(1);
 
@@ -12187,13 +12187,13 @@
             }
             switch (alt54) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:4240:4: ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) )
+                    // InternalPerspectiveDsl.g:4242:4: ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) )
                     {
-                    // InternalPerspectiveDsl.g:4250:4: ( () ( ( ruleOpPostfix ) ) )
-                    // InternalPerspectiveDsl.g:4251:5: () ( ( ruleOpPostfix ) )
+                    // InternalPerspectiveDsl.g:4252:4: ( () ( ( ruleOpPostfix ) ) )
+                    // InternalPerspectiveDsl.g:4253:5: () ( ( ruleOpPostfix ) )
                     {
-                    // InternalPerspectiveDsl.g:4251:5: ()
-                    // InternalPerspectiveDsl.g:4252:6: 
+                    // InternalPerspectiveDsl.g:4253:5: ()
+                    // InternalPerspectiveDsl.g:4254:6: 
                     {
                     if ( state.backtracking==0 ) {
 
@@ -12205,11 +12205,11 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:4258:5: ( ( ruleOpPostfix ) )
-                    // InternalPerspectiveDsl.g:4259:6: ( ruleOpPostfix )
+                    // InternalPerspectiveDsl.g:4260:5: ( ( ruleOpPostfix ) )
+                    // InternalPerspectiveDsl.g:4261:6: ( ruleOpPostfix )
                     {
-                    // InternalPerspectiveDsl.g:4259:6: ( ruleOpPostfix )
-                    // InternalPerspectiveDsl.g:4260:7: ruleOpPostfix
+                    // InternalPerspectiveDsl.g:4261:6: ( ruleOpPostfix )
+                    // InternalPerspectiveDsl.g:4262:7: ruleOpPostfix
                     {
                     if ( state.backtracking==0 ) {
 
@@ -12273,7 +12273,7 @@
 
 
     // $ANTLR start "entryRuleOpPostfix"
-    // InternalPerspectiveDsl.g:4280:1: entryRuleOpPostfix returns [String current=null] : iv_ruleOpPostfix= ruleOpPostfix EOF ;
+    // InternalPerspectiveDsl.g:4282:1: entryRuleOpPostfix returns [String current=null] : iv_ruleOpPostfix= ruleOpPostfix EOF ;
     public final String entryRuleOpPostfix() throws RecognitionException {
         String current = null;
 
@@ -12281,8 +12281,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:4280:49: (iv_ruleOpPostfix= ruleOpPostfix EOF )
-            // InternalPerspectiveDsl.g:4281:2: iv_ruleOpPostfix= ruleOpPostfix EOF
+            // InternalPerspectiveDsl.g:4282:49: (iv_ruleOpPostfix= ruleOpPostfix EOF )
+            // InternalPerspectiveDsl.g:4283:2: iv_ruleOpPostfix= ruleOpPostfix EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpPostfixRule()); 
@@ -12313,7 +12313,7 @@
 
 
     // $ANTLR start "ruleOpPostfix"
-    // InternalPerspectiveDsl.g:4287:1: ruleOpPostfix returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '++' | kw= '--' ) ;
+    // InternalPerspectiveDsl.g:4289:1: ruleOpPostfix returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '++' | kw= '--' ) ;
     public final AntlrDatatypeRuleToken ruleOpPostfix() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -12323,10 +12323,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:4293:2: ( (kw= '++' | kw= '--' ) )
-            // InternalPerspectiveDsl.g:4294:2: (kw= '++' | kw= '--' )
+            // InternalPerspectiveDsl.g:4295:2: ( (kw= '++' | kw= '--' ) )
+            // InternalPerspectiveDsl.g:4296:2: (kw= '++' | kw= '--' )
             {
-            // InternalPerspectiveDsl.g:4294:2: (kw= '++' | kw= '--' )
+            // InternalPerspectiveDsl.g:4296:2: (kw= '++' | kw= '--' )
             int alt55=2;
             int LA55_0 = input.LA(1);
 
@@ -12345,7 +12345,7 @@
             }
             switch (alt55) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:4295:3: kw= '++'
+                    // InternalPerspectiveDsl.g:4297:3: kw= '++'
                     {
                     kw=(Token)match(input,93,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -12358,7 +12358,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:4301:3: kw= '--'
+                    // InternalPerspectiveDsl.g:4303:3: kw= '--'
                     {
                     kw=(Token)match(input,94,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -12395,7 +12395,7 @@
 
 
     // $ANTLR start "entryRuleXMemberFeatureCall"
-    // InternalPerspectiveDsl.g:4310:1: entryRuleXMemberFeatureCall returns [EObject current=null] : iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF ;
+    // InternalPerspectiveDsl.g:4312:1: entryRuleXMemberFeatureCall returns [EObject current=null] : iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF ;
     public final EObject entryRuleXMemberFeatureCall() throws RecognitionException {
         EObject current = null;
 
@@ -12403,8 +12403,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:4310:59: (iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF )
-            // InternalPerspectiveDsl.g:4311:2: iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF
+            // InternalPerspectiveDsl.g:4312:59: (iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF )
+            // InternalPerspectiveDsl.g:4313:2: iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXMemberFeatureCallRule()); 
@@ -12435,7 +12435,7 @@
 
 
     // $ANTLR start "ruleXMemberFeatureCall"
-    // InternalPerspectiveDsl.g:4317:1: ruleXMemberFeatureCall returns [EObject current=null] : (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* ) ;
+    // InternalPerspectiveDsl.g:4319:1: ruleXMemberFeatureCall returns [EObject current=null] : (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* ) ;
     public final EObject ruleXMemberFeatureCall() throws RecognitionException {
         EObject current = null;
 
@@ -12471,11 +12471,11 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:4323:2: ( (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* ) )
-            // InternalPerspectiveDsl.g:4324:2: (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* )
+            // InternalPerspectiveDsl.g:4325:2: ( (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* ) )
+            // InternalPerspectiveDsl.g:4326:2: (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* )
             {
-            // InternalPerspectiveDsl.g:4324:2: (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* )
-            // InternalPerspectiveDsl.g:4325:3: this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )*
+            // InternalPerspectiveDsl.g:4326:2: (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* )
+            // InternalPerspectiveDsl.g:4327:3: this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )*
             {
             if ( state.backtracking==0 ) {
 
@@ -12493,7 +12493,7 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalPerspectiveDsl.g:4333:3: ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )*
+            // InternalPerspectiveDsl.g:4335:3: ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )*
             loop64:
             do {
                 int alt64=3;
@@ -12542,19 +12542,19 @@
 
                 switch (alt64) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:4334:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
+            	    // InternalPerspectiveDsl.g:4336:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:4334:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
-            	    // InternalPerspectiveDsl.g:4335:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) )
+            	    // InternalPerspectiveDsl.g:4336:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
+            	    // InternalPerspectiveDsl.g:4337:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) )
             	    {
-            	    // InternalPerspectiveDsl.g:4335:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
-            	    // InternalPerspectiveDsl.g:4336:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+            	    // InternalPerspectiveDsl.g:4337:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
+            	    // InternalPerspectiveDsl.g:4338:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
             	    {
-            	    // InternalPerspectiveDsl.g:4356:6: ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
-            	    // InternalPerspectiveDsl.g:4357:7: () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
+            	    // InternalPerspectiveDsl.g:4358:6: ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+            	    // InternalPerspectiveDsl.g:4359:7: () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
             	    {
-            	    // InternalPerspectiveDsl.g:4357:7: ()
-            	    // InternalPerspectiveDsl.g:4358:8: 
+            	    // InternalPerspectiveDsl.g:4359:7: ()
+            	    // InternalPerspectiveDsl.g:4360:8: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -12566,7 +12566,7 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:4364:7: (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) )
+            	    // InternalPerspectiveDsl.g:4366:7: (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) )
             	    int alt56=2;
             	    int LA56_0 = input.LA(1);
 
@@ -12585,7 +12585,7 @@
             	    }
             	    switch (alt56) {
             	        case 1 :
-            	            // InternalPerspectiveDsl.g:4365:8: otherlv_2= '.'
+            	            // InternalPerspectiveDsl.g:4367:8: otherlv_2= '.'
             	            {
             	            otherlv_2=(Token)match(input,95,FOLLOW_56); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
@@ -12597,13 +12597,13 @@
             	            }
             	            break;
             	        case 2 :
-            	            // InternalPerspectiveDsl.g:4370:8: ( (lv_explicitStatic_3_0= '::' ) )
+            	            // InternalPerspectiveDsl.g:4372:8: ( (lv_explicitStatic_3_0= '::' ) )
             	            {
-            	            // InternalPerspectiveDsl.g:4370:8: ( (lv_explicitStatic_3_0= '::' ) )
-            	            // InternalPerspectiveDsl.g:4371:9: (lv_explicitStatic_3_0= '::' )
+            	            // InternalPerspectiveDsl.g:4372:8: ( (lv_explicitStatic_3_0= '::' ) )
+            	            // InternalPerspectiveDsl.g:4373:9: (lv_explicitStatic_3_0= '::' )
             	            {
-            	            // InternalPerspectiveDsl.g:4371:9: (lv_explicitStatic_3_0= '::' )
-            	            // InternalPerspectiveDsl.g:4372:10: lv_explicitStatic_3_0= '::'
+            	            // InternalPerspectiveDsl.g:4373:9: (lv_explicitStatic_3_0= '::' )
+            	            // InternalPerspectiveDsl.g:4374:10: lv_explicitStatic_3_0= '::'
             	            {
             	            lv_explicitStatic_3_0=(Token)match(input,96,FOLLOW_56); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
@@ -12631,11 +12631,11 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:4385:7: ( ( ruleFeatureCallID ) )
-            	    // InternalPerspectiveDsl.g:4386:8: ( ruleFeatureCallID )
+            	    // InternalPerspectiveDsl.g:4387:7: ( ( ruleFeatureCallID ) )
+            	    // InternalPerspectiveDsl.g:4388:8: ( ruleFeatureCallID )
             	    {
-            	    // InternalPerspectiveDsl.g:4386:8: ( ruleFeatureCallID )
-            	    // InternalPerspectiveDsl.g:4387:9: ruleFeatureCallID
+            	    // InternalPerspectiveDsl.g:4388:8: ( ruleFeatureCallID )
+            	    // InternalPerspectiveDsl.g:4389:9: ruleFeatureCallID
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -12686,11 +12686,11 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:4410:5: ( (lv_value_6_0= ruleXAssignment ) )
-            	    // InternalPerspectiveDsl.g:4411:6: (lv_value_6_0= ruleXAssignment )
+            	    // InternalPerspectiveDsl.g:4412:5: ( (lv_value_6_0= ruleXAssignment ) )
+            	    // InternalPerspectiveDsl.g:4413:6: (lv_value_6_0= ruleXAssignment )
             	    {
-            	    // InternalPerspectiveDsl.g:4411:6: (lv_value_6_0= ruleXAssignment )
-            	    // InternalPerspectiveDsl.g:4412:7: lv_value_6_0= ruleXAssignment
+            	    // InternalPerspectiveDsl.g:4413:6: (lv_value_6_0= ruleXAssignment )
+            	    // InternalPerspectiveDsl.g:4414:7: lv_value_6_0= ruleXAssignment
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -12728,19 +12728,19 @@
             	    }
             	    break;
             	case 2 :
-            	    // InternalPerspectiveDsl.g:4431:4: ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? )
+            	    // InternalPerspectiveDsl.g:4433:4: ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? )
             	    {
-            	    // InternalPerspectiveDsl.g:4431:4: ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? )
-            	    // InternalPerspectiveDsl.g:4432:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
+            	    // InternalPerspectiveDsl.g:4433:4: ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? )
+            	    // InternalPerspectiveDsl.g:4434:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
             	    {
-            	    // InternalPerspectiveDsl.g:4432:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) )
-            	    // InternalPerspectiveDsl.g:4433:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
+            	    // InternalPerspectiveDsl.g:4434:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) )
+            	    // InternalPerspectiveDsl.g:4435:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:4453:6: ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
-            	    // InternalPerspectiveDsl.g:4454:7: () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
+            	    // InternalPerspectiveDsl.g:4455:6: ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
+            	    // InternalPerspectiveDsl.g:4456:7: () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
             	    {
-            	    // InternalPerspectiveDsl.g:4454:7: ()
-            	    // InternalPerspectiveDsl.g:4455:8: 
+            	    // InternalPerspectiveDsl.g:4456:7: ()
+            	    // InternalPerspectiveDsl.g:4457:8: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -12752,7 +12752,7 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:4461:7: (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
+            	    // InternalPerspectiveDsl.g:4463:7: (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
             	    int alt57=3;
             	    switch ( input.LA(1) ) {
             	    case 95:
@@ -12780,7 +12780,7 @@
 
             	    switch (alt57) {
             	        case 1 :
-            	            // InternalPerspectiveDsl.g:4462:8: otherlv_8= '.'
+            	            // InternalPerspectiveDsl.g:4464:8: otherlv_8= '.'
             	            {
             	            otherlv_8=(Token)match(input,95,FOLLOW_57); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
@@ -12792,13 +12792,13 @@
             	            }
             	            break;
             	        case 2 :
-            	            // InternalPerspectiveDsl.g:4467:8: ( (lv_nullSafe_9_0= '?.' ) )
+            	            // InternalPerspectiveDsl.g:4469:8: ( (lv_nullSafe_9_0= '?.' ) )
             	            {
-            	            // InternalPerspectiveDsl.g:4467:8: ( (lv_nullSafe_9_0= '?.' ) )
-            	            // InternalPerspectiveDsl.g:4468:9: (lv_nullSafe_9_0= '?.' )
+            	            // InternalPerspectiveDsl.g:4469:8: ( (lv_nullSafe_9_0= '?.' ) )
+            	            // InternalPerspectiveDsl.g:4470:9: (lv_nullSafe_9_0= '?.' )
             	            {
-            	            // InternalPerspectiveDsl.g:4468:9: (lv_nullSafe_9_0= '?.' )
-            	            // InternalPerspectiveDsl.g:4469:10: lv_nullSafe_9_0= '?.'
+            	            // InternalPerspectiveDsl.g:4470:9: (lv_nullSafe_9_0= '?.' )
+            	            // InternalPerspectiveDsl.g:4471:10: lv_nullSafe_9_0= '?.'
             	            {
             	            lv_nullSafe_9_0=(Token)match(input,97,FOLLOW_57); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
@@ -12824,13 +12824,13 @@
             	            }
             	            break;
             	        case 3 :
-            	            // InternalPerspectiveDsl.g:4482:8: ( (lv_explicitStatic_10_0= '::' ) )
+            	            // InternalPerspectiveDsl.g:4484:8: ( (lv_explicitStatic_10_0= '::' ) )
             	            {
-            	            // InternalPerspectiveDsl.g:4482:8: ( (lv_explicitStatic_10_0= '::' ) )
-            	            // InternalPerspectiveDsl.g:4483:9: (lv_explicitStatic_10_0= '::' )
+            	            // InternalPerspectiveDsl.g:4484:8: ( (lv_explicitStatic_10_0= '::' ) )
+            	            // InternalPerspectiveDsl.g:4485:9: (lv_explicitStatic_10_0= '::' )
             	            {
-            	            // InternalPerspectiveDsl.g:4483:9: (lv_explicitStatic_10_0= '::' )
-            	            // InternalPerspectiveDsl.g:4484:10: lv_explicitStatic_10_0= '::'
+            	            // InternalPerspectiveDsl.g:4485:9: (lv_explicitStatic_10_0= '::' )
+            	            // InternalPerspectiveDsl.g:4486:10: lv_explicitStatic_10_0= '::'
             	            {
             	            lv_explicitStatic_10_0=(Token)match(input,96,FOLLOW_57); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
@@ -12864,7 +12864,7 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:4499:5: (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )?
+            	    // InternalPerspectiveDsl.g:4501:5: (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )?
             	    int alt59=2;
             	    int LA59_0 = input.LA(1);
 
@@ -12873,7 +12873,7 @@
             	    }
             	    switch (alt59) {
             	        case 1 :
-            	            // InternalPerspectiveDsl.g:4500:6: otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>'
+            	            // InternalPerspectiveDsl.g:4502:6: otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>'
             	            {
             	            otherlv_11=(Token)match(input,70,FOLLOW_58); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
@@ -12881,11 +12881,11 @@
             	              						newLeafNode(otherlv_11, grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0());
             	              					
             	            }
-            	            // InternalPerspectiveDsl.g:4504:6: ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) )
-            	            // InternalPerspectiveDsl.g:4505:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
+            	            // InternalPerspectiveDsl.g:4506:6: ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) )
+            	            // InternalPerspectiveDsl.g:4507:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
             	            {
-            	            // InternalPerspectiveDsl.g:4505:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
-            	            // InternalPerspectiveDsl.g:4506:8: lv_typeArguments_12_0= ruleJvmArgumentTypeReference
+            	            // InternalPerspectiveDsl.g:4507:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
+            	            // InternalPerspectiveDsl.g:4508:8: lv_typeArguments_12_0= ruleJvmArgumentTypeReference
             	            {
             	            if ( state.backtracking==0 ) {
 
@@ -12916,7 +12916,7 @@
 
             	            }
 
-            	            // InternalPerspectiveDsl.g:4523:6: (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )*
+            	            // InternalPerspectiveDsl.g:4525:6: (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )*
             	            loop58:
             	            do {
             	                int alt58=2;
@@ -12929,7 +12929,7 @@
 
             	                switch (alt58) {
             	            	case 1 :
-            	            	    // InternalPerspectiveDsl.g:4524:7: otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
+            	            	    // InternalPerspectiveDsl.g:4526:7: otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
             	            	    {
             	            	    otherlv_13=(Token)match(input,59,FOLLOW_58); if (state.failed) return current;
             	            	    if ( state.backtracking==0 ) {
@@ -12937,11 +12937,11 @@
             	            	      							newLeafNode(otherlv_13, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0());
             	            	      						
             	            	    }
-            	            	    // InternalPerspectiveDsl.g:4528:7: ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
-            	            	    // InternalPerspectiveDsl.g:4529:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
+            	            	    // InternalPerspectiveDsl.g:4530:7: ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
+            	            	    // InternalPerspectiveDsl.g:4531:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
             	            	    {
-            	            	    // InternalPerspectiveDsl.g:4529:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
-            	            	    // InternalPerspectiveDsl.g:4530:9: lv_typeArguments_14_0= ruleJvmArgumentTypeReference
+            	            	    // InternalPerspectiveDsl.g:4531:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
+            	            	    // InternalPerspectiveDsl.g:4532:9: lv_typeArguments_14_0= ruleJvmArgumentTypeReference
             	            	    {
             	            	    if ( state.backtracking==0 ) {
 
@@ -12993,11 +12993,11 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:4553:5: ( ( ruleIdOrSuper ) )
-            	    // InternalPerspectiveDsl.g:4554:6: ( ruleIdOrSuper )
+            	    // InternalPerspectiveDsl.g:4555:5: ( ( ruleIdOrSuper ) )
+            	    // InternalPerspectiveDsl.g:4556:6: ( ruleIdOrSuper )
             	    {
-            	    // InternalPerspectiveDsl.g:4554:6: ( ruleIdOrSuper )
-            	    // InternalPerspectiveDsl.g:4555:7: ruleIdOrSuper
+            	    // InternalPerspectiveDsl.g:4556:6: ( ruleIdOrSuper )
+            	    // InternalPerspectiveDsl.g:4557:7: ruleIdOrSuper
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -13027,18 +13027,18 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:4569:5: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )?
+            	    // InternalPerspectiveDsl.g:4571:5: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )?
             	    int alt62=2;
             	    alt62 = dfa62.predict(input);
             	    switch (alt62) {
             	        case 1 :
-            	            // InternalPerspectiveDsl.g:4570:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')'
+            	            // InternalPerspectiveDsl.g:4572:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')'
             	            {
-            	            // InternalPerspectiveDsl.g:4570:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) )
-            	            // InternalPerspectiveDsl.g:4571:7: ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' )
+            	            // InternalPerspectiveDsl.g:4572:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) )
+            	            // InternalPerspectiveDsl.g:4573:7: ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' )
             	            {
-            	            // InternalPerspectiveDsl.g:4575:7: (lv_explicitOperationCall_17_0= '(' )
-            	            // InternalPerspectiveDsl.g:4576:8: lv_explicitOperationCall_17_0= '('
+            	            // InternalPerspectiveDsl.g:4577:7: (lv_explicitOperationCall_17_0= '(' )
+            	            // InternalPerspectiveDsl.g:4578:8: lv_explicitOperationCall_17_0= '('
             	            {
             	            lv_explicitOperationCall_17_0=(Token)match(input,58,FOLLOW_61); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
@@ -13060,18 +13060,18 @@
 
             	            }
 
-            	            // InternalPerspectiveDsl.g:4588:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?
+            	            // InternalPerspectiveDsl.g:4590:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?
             	            int alt61=3;
             	            alt61 = dfa61.predict(input);
             	            switch (alt61) {
             	                case 1 :
-            	                    // InternalPerspectiveDsl.g:4589:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
+            	                    // InternalPerspectiveDsl.g:4591:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
             	                    {
-            	                    // InternalPerspectiveDsl.g:4589:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
-            	                    // InternalPerspectiveDsl.g:4590:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure )
+            	                    // InternalPerspectiveDsl.g:4591:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
+            	                    // InternalPerspectiveDsl.g:4592:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure )
             	                    {
-            	                    // InternalPerspectiveDsl.g:4615:8: (lv_memberCallArguments_18_0= ruleXShortClosure )
-            	                    // InternalPerspectiveDsl.g:4616:9: lv_memberCallArguments_18_0= ruleXShortClosure
+            	                    // InternalPerspectiveDsl.g:4617:8: (lv_memberCallArguments_18_0= ruleXShortClosure )
+            	                    // InternalPerspectiveDsl.g:4618:9: lv_memberCallArguments_18_0= ruleXShortClosure
             	                    {
             	                    if ( state.backtracking==0 ) {
 
@@ -13106,16 +13106,16 @@
             	                    }
             	                    break;
             	                case 2 :
-            	                    // InternalPerspectiveDsl.g:4634:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
+            	                    // InternalPerspectiveDsl.g:4636:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
             	                    {
-            	                    // InternalPerspectiveDsl.g:4634:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
-            	                    // InternalPerspectiveDsl.g:4635:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
+            	                    // InternalPerspectiveDsl.g:4636:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
+            	                    // InternalPerspectiveDsl.g:4637:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
             	                    {
-            	                    // InternalPerspectiveDsl.g:4635:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) )
-            	                    // InternalPerspectiveDsl.g:4636:9: (lv_memberCallArguments_19_0= ruleXExpression )
+            	                    // InternalPerspectiveDsl.g:4637:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) )
+            	                    // InternalPerspectiveDsl.g:4638:9: (lv_memberCallArguments_19_0= ruleXExpression )
             	                    {
-            	                    // InternalPerspectiveDsl.g:4636:9: (lv_memberCallArguments_19_0= ruleXExpression )
-            	                    // InternalPerspectiveDsl.g:4637:10: lv_memberCallArguments_19_0= ruleXExpression
+            	                    // InternalPerspectiveDsl.g:4638:9: (lv_memberCallArguments_19_0= ruleXExpression )
+            	                    // InternalPerspectiveDsl.g:4639:10: lv_memberCallArguments_19_0= ruleXExpression
             	                    {
             	                    if ( state.backtracking==0 ) {
 
@@ -13146,7 +13146,7 @@
 
             	                    }
 
-            	                    // InternalPerspectiveDsl.g:4654:8: (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
+            	                    // InternalPerspectiveDsl.g:4656:8: (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
             	                    loop60:
             	                    do {
             	                        int alt60=2;
@@ -13159,7 +13159,7 @@
 
             	                        switch (alt60) {
             	                    	case 1 :
-            	                    	    // InternalPerspectiveDsl.g:4655:9: otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) )
+            	                    	    // InternalPerspectiveDsl.g:4657:9: otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) )
             	                    	    {
             	                    	    otherlv_20=(Token)match(input,59,FOLLOW_33); if (state.failed) return current;
             	                    	    if ( state.backtracking==0 ) {
@@ -13167,11 +13167,11 @@
             	                    	      									newLeafNode(otherlv_20, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0());
             	                    	      								
             	                    	    }
-            	                    	    // InternalPerspectiveDsl.g:4659:9: ( (lv_memberCallArguments_21_0= ruleXExpression ) )
-            	                    	    // InternalPerspectiveDsl.g:4660:10: (lv_memberCallArguments_21_0= ruleXExpression )
+            	                    	    // InternalPerspectiveDsl.g:4661:9: ( (lv_memberCallArguments_21_0= ruleXExpression ) )
+            	                    	    // InternalPerspectiveDsl.g:4662:10: (lv_memberCallArguments_21_0= ruleXExpression )
             	                    	    {
-            	                    	    // InternalPerspectiveDsl.g:4660:10: (lv_memberCallArguments_21_0= ruleXExpression )
-            	                    	    // InternalPerspectiveDsl.g:4661:11: lv_memberCallArguments_21_0= ruleXExpression
+            	                    	    // InternalPerspectiveDsl.g:4662:10: (lv_memberCallArguments_21_0= ruleXExpression )
+            	                    	    // InternalPerspectiveDsl.g:4663:11: lv_memberCallArguments_21_0= ruleXExpression
             	                    	    {
             	                    	    if ( state.backtracking==0 ) {
 
@@ -13232,15 +13232,15 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:4686:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
+            	    // InternalPerspectiveDsl.g:4688:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
             	    int alt63=2;
             	    alt63 = dfa63.predict(input);
             	    switch (alt63) {
             	        case 1 :
-            	            // InternalPerspectiveDsl.g:4687:6: ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure )
+            	            // InternalPerspectiveDsl.g:4689:6: ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure )
             	            {
-            	            // InternalPerspectiveDsl.g:4693:6: (lv_memberCallArguments_23_0= ruleXClosure )
-            	            // InternalPerspectiveDsl.g:4694:7: lv_memberCallArguments_23_0= ruleXClosure
+            	            // InternalPerspectiveDsl.g:4695:6: (lv_memberCallArguments_23_0= ruleXClosure )
+            	            // InternalPerspectiveDsl.g:4696:7: lv_memberCallArguments_23_0= ruleXClosure
             	            {
             	            if ( state.backtracking==0 ) {
 
@@ -13311,7 +13311,7 @@
 
 
     // $ANTLR start "entryRuleXPrimaryExpression"
-    // InternalPerspectiveDsl.g:4717:1: entryRuleXPrimaryExpression returns [EObject current=null] : iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF ;
+    // InternalPerspectiveDsl.g:4719:1: entryRuleXPrimaryExpression returns [EObject current=null] : iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF ;
     public final EObject entryRuleXPrimaryExpression() throws RecognitionException {
         EObject current = null;
 
@@ -13319,8 +13319,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:4717:59: (iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF )
-            // InternalPerspectiveDsl.g:4718:2: iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF
+            // InternalPerspectiveDsl.g:4719:59: (iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF )
+            // InternalPerspectiveDsl.g:4720:2: iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXPrimaryExpressionRule()); 
@@ -13351,7 +13351,7 @@
 
 
     // $ANTLR start "ruleXPrimaryExpression"
-    // InternalPerspectiveDsl.g:4724:1: ruleXPrimaryExpression returns [EObject current=null] : (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression ) ;
+    // InternalPerspectiveDsl.g:4726:1: ruleXPrimaryExpression returns [EObject current=null] : (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression ) ;
     public final EObject ruleXPrimaryExpression() throws RecognitionException {
         EObject current = null;
 
@@ -13390,15 +13390,15 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:4730:2: ( (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression ) )
-            // InternalPerspectiveDsl.g:4731:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )
+            // InternalPerspectiveDsl.g:4732:2: ( (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression ) )
+            // InternalPerspectiveDsl.g:4733:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )
             {
-            // InternalPerspectiveDsl.g:4731:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )
+            // InternalPerspectiveDsl.g:4733:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )
             int alt65=15;
             alt65 = dfa65.predict(input);
             switch (alt65) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:4732:3: this_XConstructorCall_0= ruleXConstructorCall
+                    // InternalPerspectiveDsl.g:4734:3: this_XConstructorCall_0= ruleXConstructorCall
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13420,7 +13420,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:4741:3: this_XBlockExpression_1= ruleXBlockExpression
+                    // InternalPerspectiveDsl.g:4743:3: this_XBlockExpression_1= ruleXBlockExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13442,7 +13442,7 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:4750:3: this_XSwitchExpression_2= ruleXSwitchExpression
+                    // InternalPerspectiveDsl.g:4752:3: this_XSwitchExpression_2= ruleXSwitchExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13464,10 +13464,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:4759:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
+                    // InternalPerspectiveDsl.g:4761:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
                     {
-                    // InternalPerspectiveDsl.g:4759:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
-                    // InternalPerspectiveDsl.g:4760:4: ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression
+                    // InternalPerspectiveDsl.g:4761:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
+                    // InternalPerspectiveDsl.g:4762:4: ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13492,7 +13492,7 @@
                     }
                     break;
                 case 5 :
-                    // InternalPerspectiveDsl.g:4777:3: this_XFeatureCall_4= ruleXFeatureCall
+                    // InternalPerspectiveDsl.g:4779:3: this_XFeatureCall_4= ruleXFeatureCall
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13514,7 +13514,7 @@
                     }
                     break;
                 case 6 :
-                    // InternalPerspectiveDsl.g:4786:3: this_XLiteral_5= ruleXLiteral
+                    // InternalPerspectiveDsl.g:4788:3: this_XLiteral_5= ruleXLiteral
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13536,7 +13536,7 @@
                     }
                     break;
                 case 7 :
-                    // InternalPerspectiveDsl.g:4795:3: this_XIfExpression_6= ruleXIfExpression
+                    // InternalPerspectiveDsl.g:4797:3: this_XIfExpression_6= ruleXIfExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13558,10 +13558,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalPerspectiveDsl.g:4804:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
+                    // InternalPerspectiveDsl.g:4806:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
                     {
-                    // InternalPerspectiveDsl.g:4804:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
-                    // InternalPerspectiveDsl.g:4805:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression
+                    // InternalPerspectiveDsl.g:4806:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
+                    // InternalPerspectiveDsl.g:4807:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13586,7 +13586,7 @@
                     }
                     break;
                 case 9 :
-                    // InternalPerspectiveDsl.g:4828:3: this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression
+                    // InternalPerspectiveDsl.g:4830:3: this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13608,7 +13608,7 @@
                     }
                     break;
                 case 10 :
-                    // InternalPerspectiveDsl.g:4837:3: this_XWhileExpression_9= ruleXWhileExpression
+                    // InternalPerspectiveDsl.g:4839:3: this_XWhileExpression_9= ruleXWhileExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13630,7 +13630,7 @@
                     }
                     break;
                 case 11 :
-                    // InternalPerspectiveDsl.g:4846:3: this_XDoWhileExpression_10= ruleXDoWhileExpression
+                    // InternalPerspectiveDsl.g:4848:3: this_XDoWhileExpression_10= ruleXDoWhileExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13652,7 +13652,7 @@
                     }
                     break;
                 case 12 :
-                    // InternalPerspectiveDsl.g:4855:3: this_XThrowExpression_11= ruleXThrowExpression
+                    // InternalPerspectiveDsl.g:4857:3: this_XThrowExpression_11= ruleXThrowExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13674,7 +13674,7 @@
                     }
                     break;
                 case 13 :
-                    // InternalPerspectiveDsl.g:4864:3: this_XReturnExpression_12= ruleXReturnExpression
+                    // InternalPerspectiveDsl.g:4866:3: this_XReturnExpression_12= ruleXReturnExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13696,7 +13696,7 @@
                     }
                     break;
                 case 14 :
-                    // InternalPerspectiveDsl.g:4873:3: this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression
+                    // InternalPerspectiveDsl.g:4875:3: this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13718,7 +13718,7 @@
                     }
                     break;
                 case 15 :
-                    // InternalPerspectiveDsl.g:4882:3: this_XParenthesizedExpression_14= ruleXParenthesizedExpression
+                    // InternalPerspectiveDsl.g:4884:3: this_XParenthesizedExpression_14= ruleXParenthesizedExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13764,7 +13764,7 @@
 
 
     // $ANTLR start "entryRuleXLiteral"
-    // InternalPerspectiveDsl.g:4894:1: entryRuleXLiteral returns [EObject current=null] : iv_ruleXLiteral= ruleXLiteral EOF ;
+    // InternalPerspectiveDsl.g:4896:1: entryRuleXLiteral returns [EObject current=null] : iv_ruleXLiteral= ruleXLiteral EOF ;
     public final EObject entryRuleXLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -13772,8 +13772,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:4894:49: (iv_ruleXLiteral= ruleXLiteral EOF )
-            // InternalPerspectiveDsl.g:4895:2: iv_ruleXLiteral= ruleXLiteral EOF
+            // InternalPerspectiveDsl.g:4896:49: (iv_ruleXLiteral= ruleXLiteral EOF )
+            // InternalPerspectiveDsl.g:4897:2: iv_ruleXLiteral= ruleXLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXLiteralRule()); 
@@ -13804,7 +13804,7 @@
 
 
     // $ANTLR start "ruleXLiteral"
-    // InternalPerspectiveDsl.g:4901:1: ruleXLiteral returns [EObject current=null] : (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral ) ;
+    // InternalPerspectiveDsl.g:4903:1: ruleXLiteral returns [EObject current=null] : (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral ) ;
     public final EObject ruleXLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -13827,10 +13827,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:4907:2: ( (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral ) )
-            // InternalPerspectiveDsl.g:4908:2: (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral )
+            // InternalPerspectiveDsl.g:4909:2: ( (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral ) )
+            // InternalPerspectiveDsl.g:4910:2: (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral )
             {
-            // InternalPerspectiveDsl.g:4908:2: (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral )
+            // InternalPerspectiveDsl.g:4910:2: (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral )
             int alt66=7;
             int LA66_0 = input.LA(1);
 
@@ -13864,7 +13864,7 @@
             }
             switch (alt66) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:4909:3: this_XCollectionLiteral_0= ruleXCollectionLiteral
+                    // InternalPerspectiveDsl.g:4911:3: this_XCollectionLiteral_0= ruleXCollectionLiteral
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13886,10 +13886,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:4918:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
+                    // InternalPerspectiveDsl.g:4920:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
                     {
-                    // InternalPerspectiveDsl.g:4918:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
-                    // InternalPerspectiveDsl.g:4919:4: ( ( () '[' ) )=>this_XClosure_1= ruleXClosure
+                    // InternalPerspectiveDsl.g:4920:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
+                    // InternalPerspectiveDsl.g:4921:4: ( ( () '[' ) )=>this_XClosure_1= ruleXClosure
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13914,7 +13914,7 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:4935:3: this_XBooleanLiteral_2= ruleXBooleanLiteral
+                    // InternalPerspectiveDsl.g:4937:3: this_XBooleanLiteral_2= ruleXBooleanLiteral
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13936,7 +13936,7 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:4944:3: this_XNumberLiteral_3= ruleXNumberLiteral
+                    // InternalPerspectiveDsl.g:4946:3: this_XNumberLiteral_3= ruleXNumberLiteral
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13958,7 +13958,7 @@
                     }
                     break;
                 case 5 :
-                    // InternalPerspectiveDsl.g:4953:3: this_XNullLiteral_4= ruleXNullLiteral
+                    // InternalPerspectiveDsl.g:4955:3: this_XNullLiteral_4= ruleXNullLiteral
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13980,7 +13980,7 @@
                     }
                     break;
                 case 6 :
-                    // InternalPerspectiveDsl.g:4962:3: this_XStringLiteral_5= ruleXStringLiteral
+                    // InternalPerspectiveDsl.g:4964:3: this_XStringLiteral_5= ruleXStringLiteral
                     {
                     if ( state.backtracking==0 ) {
 
@@ -14002,7 +14002,7 @@
                     }
                     break;
                 case 7 :
-                    // InternalPerspectiveDsl.g:4971:3: this_XTypeLiteral_6= ruleXTypeLiteral
+                    // InternalPerspectiveDsl.g:4973:3: this_XTypeLiteral_6= ruleXTypeLiteral
                     {
                     if ( state.backtracking==0 ) {
 
@@ -14048,7 +14048,7 @@
 
 
     // $ANTLR start "entryRuleXCollectionLiteral"
-    // InternalPerspectiveDsl.g:4983:1: entryRuleXCollectionLiteral returns [EObject current=null] : iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF ;
+    // InternalPerspectiveDsl.g:4985:1: entryRuleXCollectionLiteral returns [EObject current=null] : iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF ;
     public final EObject entryRuleXCollectionLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -14056,8 +14056,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:4983:59: (iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF )
-            // InternalPerspectiveDsl.g:4984:2: iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF
+            // InternalPerspectiveDsl.g:4985:59: (iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF )
+            // InternalPerspectiveDsl.g:4986:2: iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXCollectionLiteralRule()); 
@@ -14088,7 +14088,7 @@
 
 
     // $ANTLR start "ruleXCollectionLiteral"
-    // InternalPerspectiveDsl.g:4990:1: ruleXCollectionLiteral returns [EObject current=null] : (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) ;
+    // InternalPerspectiveDsl.g:4992:1: ruleXCollectionLiteral returns [EObject current=null] : (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) ;
     public final EObject ruleXCollectionLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -14101,10 +14101,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:4996:2: ( (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) )
-            // InternalPerspectiveDsl.g:4997:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
+            // InternalPerspectiveDsl.g:4998:2: ( (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) )
+            // InternalPerspectiveDsl.g:4999:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
             {
-            // InternalPerspectiveDsl.g:4997:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
+            // InternalPerspectiveDsl.g:4999:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
             int alt67=2;
             int LA67_0 = input.LA(1);
 
@@ -14134,7 +14134,7 @@
             }
             switch (alt67) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:4998:3: this_XSetLiteral_0= ruleXSetLiteral
+                    // InternalPerspectiveDsl.g:5000:3: this_XSetLiteral_0= ruleXSetLiteral
                     {
                     if ( state.backtracking==0 ) {
 
@@ -14156,7 +14156,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:5007:3: this_XListLiteral_1= ruleXListLiteral
+                    // InternalPerspectiveDsl.g:5009:3: this_XListLiteral_1= ruleXListLiteral
                     {
                     if ( state.backtracking==0 ) {
 
@@ -14202,7 +14202,7 @@
 
 
     // $ANTLR start "entryRuleXSetLiteral"
-    // InternalPerspectiveDsl.g:5019:1: entryRuleXSetLiteral returns [EObject current=null] : iv_ruleXSetLiteral= ruleXSetLiteral EOF ;
+    // InternalPerspectiveDsl.g:5021:1: entryRuleXSetLiteral returns [EObject current=null] : iv_ruleXSetLiteral= ruleXSetLiteral EOF ;
     public final EObject entryRuleXSetLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -14210,8 +14210,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:5019:52: (iv_ruleXSetLiteral= ruleXSetLiteral EOF )
-            // InternalPerspectiveDsl.g:5020:2: iv_ruleXSetLiteral= ruleXSetLiteral EOF
+            // InternalPerspectiveDsl.g:5021:52: (iv_ruleXSetLiteral= ruleXSetLiteral EOF )
+            // InternalPerspectiveDsl.g:5022:2: iv_ruleXSetLiteral= ruleXSetLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXSetLiteralRule()); 
@@ -14242,7 +14242,7 @@
 
 
     // $ANTLR start "ruleXSetLiteral"
-    // InternalPerspectiveDsl.g:5026:1: ruleXSetLiteral returns [EObject current=null] : ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) ;
+    // InternalPerspectiveDsl.g:5028:1: ruleXSetLiteral returns [EObject current=null] : ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) ;
     public final EObject ruleXSetLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -14259,14 +14259,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:5032:2: ( ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) )
-            // InternalPerspectiveDsl.g:5033:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
+            // InternalPerspectiveDsl.g:5034:2: ( ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) )
+            // InternalPerspectiveDsl.g:5035:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
             {
-            // InternalPerspectiveDsl.g:5033:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
-            // InternalPerspectiveDsl.g:5034:3: () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}'
+            // InternalPerspectiveDsl.g:5035:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
+            // InternalPerspectiveDsl.g:5036:3: () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}'
             {
-            // InternalPerspectiveDsl.g:5034:3: ()
-            // InternalPerspectiveDsl.g:5035:4: 
+            // InternalPerspectiveDsl.g:5036:3: ()
+            // InternalPerspectiveDsl.g:5037:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -14290,7 +14290,7 @@
               			newLeafNode(otherlv_2, grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2());
               		
             }
-            // InternalPerspectiveDsl.g:5049:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
+            // InternalPerspectiveDsl.g:5051:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
             int alt69=2;
             int LA69_0 = input.LA(1);
 
@@ -14299,13 +14299,13 @@
             }
             switch (alt69) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:5050:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    // InternalPerspectiveDsl.g:5052:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                     {
-                    // InternalPerspectiveDsl.g:5050:4: ( (lv_elements_3_0= ruleXExpression ) )
-                    // InternalPerspectiveDsl.g:5051:5: (lv_elements_3_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:5052:4: ( (lv_elements_3_0= ruleXExpression ) )
+                    // InternalPerspectiveDsl.g:5053:5: (lv_elements_3_0= ruleXExpression )
                     {
-                    // InternalPerspectiveDsl.g:5051:5: (lv_elements_3_0= ruleXExpression )
-                    // InternalPerspectiveDsl.g:5052:6: lv_elements_3_0= ruleXExpression
+                    // InternalPerspectiveDsl.g:5053:5: (lv_elements_3_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:5054:6: lv_elements_3_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -14336,7 +14336,7 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:5069:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    // InternalPerspectiveDsl.g:5071:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                     loop68:
                     do {
                         int alt68=2;
@@ -14349,7 +14349,7 @@
 
                         switch (alt68) {
                     	case 1 :
-                    	    // InternalPerspectiveDsl.g:5070:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
+                    	    // InternalPerspectiveDsl.g:5072:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
                     	    {
                     	    otherlv_4=(Token)match(input,59,FOLLOW_33); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
@@ -14357,11 +14357,11 @@
                     	      					newLeafNode(otherlv_4, grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0());
                     	      				
                     	    }
-                    	    // InternalPerspectiveDsl.g:5074:5: ( (lv_elements_5_0= ruleXExpression ) )
-                    	    // InternalPerspectiveDsl.g:5075:6: (lv_elements_5_0= ruleXExpression )
+                    	    // InternalPerspectiveDsl.g:5076:5: ( (lv_elements_5_0= ruleXExpression ) )
+                    	    // InternalPerspectiveDsl.g:5077:6: (lv_elements_5_0= ruleXExpression )
                     	    {
-                    	    // InternalPerspectiveDsl.g:5075:6: (lv_elements_5_0= ruleXExpression )
-                    	    // InternalPerspectiveDsl.g:5076:7: lv_elements_5_0= ruleXExpression
+                    	    // InternalPerspectiveDsl.g:5077:6: (lv_elements_5_0= ruleXExpression )
+                    	    // InternalPerspectiveDsl.g:5078:7: lv_elements_5_0= ruleXExpression
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -14438,7 +14438,7 @@
 
 
     // $ANTLR start "entryRuleXListLiteral"
-    // InternalPerspectiveDsl.g:5103:1: entryRuleXListLiteral returns [EObject current=null] : iv_ruleXListLiteral= ruleXListLiteral EOF ;
+    // InternalPerspectiveDsl.g:5105:1: entryRuleXListLiteral returns [EObject current=null] : iv_ruleXListLiteral= ruleXListLiteral EOF ;
     public final EObject entryRuleXListLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -14446,8 +14446,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:5103:53: (iv_ruleXListLiteral= ruleXListLiteral EOF )
-            // InternalPerspectiveDsl.g:5104:2: iv_ruleXListLiteral= ruleXListLiteral EOF
+            // InternalPerspectiveDsl.g:5105:53: (iv_ruleXListLiteral= ruleXListLiteral EOF )
+            // InternalPerspectiveDsl.g:5106:2: iv_ruleXListLiteral= ruleXListLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXListLiteralRule()); 
@@ -14478,7 +14478,7 @@
 
 
     // $ANTLR start "ruleXListLiteral"
-    // InternalPerspectiveDsl.g:5110:1: ruleXListLiteral returns [EObject current=null] : ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) ;
+    // InternalPerspectiveDsl.g:5112:1: ruleXListLiteral returns [EObject current=null] : ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) ;
     public final EObject ruleXListLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -14495,14 +14495,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:5116:2: ( ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) )
-            // InternalPerspectiveDsl.g:5117:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
+            // InternalPerspectiveDsl.g:5118:2: ( ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) )
+            // InternalPerspectiveDsl.g:5119:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
             {
-            // InternalPerspectiveDsl.g:5117:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
-            // InternalPerspectiveDsl.g:5118:3: () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']'
+            // InternalPerspectiveDsl.g:5119:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
+            // InternalPerspectiveDsl.g:5120:3: () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']'
             {
-            // InternalPerspectiveDsl.g:5118:3: ()
-            // InternalPerspectiveDsl.g:5119:4: 
+            // InternalPerspectiveDsl.g:5120:3: ()
+            // InternalPerspectiveDsl.g:5121:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -14526,7 +14526,7 @@
               			newLeafNode(otherlv_2, grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2());
               		
             }
-            // InternalPerspectiveDsl.g:5133:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
+            // InternalPerspectiveDsl.g:5135:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
             int alt71=2;
             int LA71_0 = input.LA(1);
 
@@ -14535,13 +14535,13 @@
             }
             switch (alt71) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:5134:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    // InternalPerspectiveDsl.g:5136:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                     {
-                    // InternalPerspectiveDsl.g:5134:4: ( (lv_elements_3_0= ruleXExpression ) )
-                    // InternalPerspectiveDsl.g:5135:5: (lv_elements_3_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:5136:4: ( (lv_elements_3_0= ruleXExpression ) )
+                    // InternalPerspectiveDsl.g:5137:5: (lv_elements_3_0= ruleXExpression )
                     {
-                    // InternalPerspectiveDsl.g:5135:5: (lv_elements_3_0= ruleXExpression )
-                    // InternalPerspectiveDsl.g:5136:6: lv_elements_3_0= ruleXExpression
+                    // InternalPerspectiveDsl.g:5137:5: (lv_elements_3_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:5138:6: lv_elements_3_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -14572,7 +14572,7 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:5153:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    // InternalPerspectiveDsl.g:5155:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                     loop70:
                     do {
                         int alt70=2;
@@ -14585,7 +14585,7 @@
 
                         switch (alt70) {
                     	case 1 :
-                    	    // InternalPerspectiveDsl.g:5154:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
+                    	    // InternalPerspectiveDsl.g:5156:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
                     	    {
                     	    otherlv_4=(Token)match(input,59,FOLLOW_33); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
@@ -14593,11 +14593,11 @@
                     	      					newLeafNode(otherlv_4, grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0());
                     	      				
                     	    }
-                    	    // InternalPerspectiveDsl.g:5158:5: ( (lv_elements_5_0= ruleXExpression ) )
-                    	    // InternalPerspectiveDsl.g:5159:6: (lv_elements_5_0= ruleXExpression )
+                    	    // InternalPerspectiveDsl.g:5160:5: ( (lv_elements_5_0= ruleXExpression ) )
+                    	    // InternalPerspectiveDsl.g:5161:6: (lv_elements_5_0= ruleXExpression )
                     	    {
-                    	    // InternalPerspectiveDsl.g:5159:6: (lv_elements_5_0= ruleXExpression )
-                    	    // InternalPerspectiveDsl.g:5160:7: lv_elements_5_0= ruleXExpression
+                    	    // InternalPerspectiveDsl.g:5161:6: (lv_elements_5_0= ruleXExpression )
+                    	    // InternalPerspectiveDsl.g:5162:7: lv_elements_5_0= ruleXExpression
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -14674,7 +14674,7 @@
 
 
     // $ANTLR start "entryRuleXClosure"
-    // InternalPerspectiveDsl.g:5187:1: entryRuleXClosure returns [EObject current=null] : iv_ruleXClosure= ruleXClosure EOF ;
+    // InternalPerspectiveDsl.g:5189:1: entryRuleXClosure returns [EObject current=null] : iv_ruleXClosure= ruleXClosure EOF ;
     public final EObject entryRuleXClosure() throws RecognitionException {
         EObject current = null;
 
@@ -14682,8 +14682,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:5187:49: (iv_ruleXClosure= ruleXClosure EOF )
-            // InternalPerspectiveDsl.g:5188:2: iv_ruleXClosure= ruleXClosure EOF
+            // InternalPerspectiveDsl.g:5189:49: (iv_ruleXClosure= ruleXClosure EOF )
+            // InternalPerspectiveDsl.g:5190:2: iv_ruleXClosure= ruleXClosure EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXClosureRule()); 
@@ -14714,7 +14714,7 @@
 
 
     // $ANTLR start "ruleXClosure"
-    // InternalPerspectiveDsl.g:5194:1: ruleXClosure returns [EObject current=null] : ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' ) ;
+    // InternalPerspectiveDsl.g:5196:1: ruleXClosure returns [EObject current=null] : ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' ) ;
     public final EObject ruleXClosure() throws RecognitionException {
         EObject current = null;
 
@@ -14733,20 +14733,20 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:5200:2: ( ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' ) )
-            // InternalPerspectiveDsl.g:5201:2: ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' )
+            // InternalPerspectiveDsl.g:5202:2: ( ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' ) )
+            // InternalPerspectiveDsl.g:5203:2: ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' )
             {
-            // InternalPerspectiveDsl.g:5201:2: ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' )
-            // InternalPerspectiveDsl.g:5202:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']'
+            // InternalPerspectiveDsl.g:5203:2: ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' )
+            // InternalPerspectiveDsl.g:5204:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']'
             {
-            // InternalPerspectiveDsl.g:5202:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) )
-            // InternalPerspectiveDsl.g:5203:4: ( ( () '[' ) )=> ( () otherlv_1= '[' )
+            // InternalPerspectiveDsl.g:5204:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) )
+            // InternalPerspectiveDsl.g:5205:4: ( ( () '[' ) )=> ( () otherlv_1= '[' )
             {
-            // InternalPerspectiveDsl.g:5209:4: ( () otherlv_1= '[' )
-            // InternalPerspectiveDsl.g:5210:5: () otherlv_1= '['
+            // InternalPerspectiveDsl.g:5211:4: ( () otherlv_1= '[' )
+            // InternalPerspectiveDsl.g:5212:5: () otherlv_1= '['
             {
-            // InternalPerspectiveDsl.g:5210:5: ()
-            // InternalPerspectiveDsl.g:5211:6: 
+            // InternalPerspectiveDsl.g:5212:5: ()
+            // InternalPerspectiveDsl.g:5213:6: 
             {
             if ( state.backtracking==0 ) {
 
@@ -14770,17 +14770,17 @@
 
             }
 
-            // InternalPerspectiveDsl.g:5223:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?
+            // InternalPerspectiveDsl.g:5225:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?
             int alt74=2;
             alt74 = dfa74.predict(input);
             switch (alt74) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:5224:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
+                    // InternalPerspectiveDsl.g:5226:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
                     {
-                    // InternalPerspectiveDsl.g:5247:4: ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
-                    // InternalPerspectiveDsl.g:5248:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) )
+                    // InternalPerspectiveDsl.g:5249:4: ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
+                    // InternalPerspectiveDsl.g:5250:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) )
                     {
-                    // InternalPerspectiveDsl.g:5248:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )?
+                    // InternalPerspectiveDsl.g:5250:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )?
                     int alt73=2;
                     int LA73_0 = input.LA(1);
 
@@ -14789,13 +14789,13 @@
                     }
                     switch (alt73) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:5249:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
+                            // InternalPerspectiveDsl.g:5251:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
                             {
-                            // InternalPerspectiveDsl.g:5249:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) )
-                            // InternalPerspectiveDsl.g:5250:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
+                            // InternalPerspectiveDsl.g:5251:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) )
+                            // InternalPerspectiveDsl.g:5252:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
                             {
-                            // InternalPerspectiveDsl.g:5250:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
-                            // InternalPerspectiveDsl.g:5251:8: lv_declaredFormalParameters_2_0= ruleJvmFormalParameter
+                            // InternalPerspectiveDsl.g:5252:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
+                            // InternalPerspectiveDsl.g:5253:8: lv_declaredFormalParameters_2_0= ruleJvmFormalParameter
                             {
                             if ( state.backtracking==0 ) {
 
@@ -14826,7 +14826,7 @@
 
                             }
 
-                            // InternalPerspectiveDsl.g:5268:6: (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
+                            // InternalPerspectiveDsl.g:5270:6: (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
                             loop72:
                             do {
                                 int alt72=2;
@@ -14839,7 +14839,7 @@
 
                                 switch (alt72) {
                             	case 1 :
-                            	    // InternalPerspectiveDsl.g:5269:7: otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
+                            	    // InternalPerspectiveDsl.g:5271:7: otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
                             	    {
                             	    otherlv_3=(Token)match(input,59,FOLLOW_46); if (state.failed) return current;
                             	    if ( state.backtracking==0 ) {
@@ -14847,11 +14847,11 @@
                             	      							newLeafNode(otherlv_3, grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0());
                             	      						
                             	    }
-                            	    // InternalPerspectiveDsl.g:5273:7: ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
-                            	    // InternalPerspectiveDsl.g:5274:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
+                            	    // InternalPerspectiveDsl.g:5275:7: ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
+                            	    // InternalPerspectiveDsl.g:5276:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
                             	    {
-                            	    // InternalPerspectiveDsl.g:5274:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
-                            	    // InternalPerspectiveDsl.g:5275:9: lv_declaredFormalParameters_4_0= ruleJvmFormalParameter
+                            	    // InternalPerspectiveDsl.g:5276:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
+                            	    // InternalPerspectiveDsl.g:5277:9: lv_declaredFormalParameters_4_0= ruleJvmFormalParameter
                             	    {
                             	    if ( state.backtracking==0 ) {
 
@@ -14897,11 +14897,11 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:5294:5: ( (lv_explicitSyntax_5_0= '|' ) )
-                    // InternalPerspectiveDsl.g:5295:6: (lv_explicitSyntax_5_0= '|' )
+                    // InternalPerspectiveDsl.g:5296:5: ( (lv_explicitSyntax_5_0= '|' ) )
+                    // InternalPerspectiveDsl.g:5297:6: (lv_explicitSyntax_5_0= '|' )
                     {
-                    // InternalPerspectiveDsl.g:5295:6: (lv_explicitSyntax_5_0= '|' )
-                    // InternalPerspectiveDsl.g:5296:7: lv_explicitSyntax_5_0= '|'
+                    // InternalPerspectiveDsl.g:5297:6: (lv_explicitSyntax_5_0= '|' )
+                    // InternalPerspectiveDsl.g:5298:7: lv_explicitSyntax_5_0= '|'
                     {
                     lv_explicitSyntax_5_0=(Token)match(input,98,FOLLOW_68); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -14932,11 +14932,11 @@
 
             }
 
-            // InternalPerspectiveDsl.g:5310:3: ( (lv_expression_6_0= ruleXExpressionInClosure ) )
-            // InternalPerspectiveDsl.g:5311:4: (lv_expression_6_0= ruleXExpressionInClosure )
+            // InternalPerspectiveDsl.g:5312:3: ( (lv_expression_6_0= ruleXExpressionInClosure ) )
+            // InternalPerspectiveDsl.g:5313:4: (lv_expression_6_0= ruleXExpressionInClosure )
             {
-            // InternalPerspectiveDsl.g:5311:4: (lv_expression_6_0= ruleXExpressionInClosure )
-            // InternalPerspectiveDsl.g:5312:5: lv_expression_6_0= ruleXExpressionInClosure
+            // InternalPerspectiveDsl.g:5313:4: (lv_expression_6_0= ruleXExpressionInClosure )
+            // InternalPerspectiveDsl.g:5314:5: lv_expression_6_0= ruleXExpressionInClosure
             {
             if ( state.backtracking==0 ) {
 
@@ -14998,7 +14998,7 @@
 
 
     // $ANTLR start "entryRuleXExpressionInClosure"
-    // InternalPerspectiveDsl.g:5337:1: entryRuleXExpressionInClosure returns [EObject current=null] : iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF ;
+    // InternalPerspectiveDsl.g:5339:1: entryRuleXExpressionInClosure returns [EObject current=null] : iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF ;
     public final EObject entryRuleXExpressionInClosure() throws RecognitionException {
         EObject current = null;
 
@@ -15006,8 +15006,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:5337:61: (iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF )
-            // InternalPerspectiveDsl.g:5338:2: iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF
+            // InternalPerspectiveDsl.g:5339:61: (iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF )
+            // InternalPerspectiveDsl.g:5340:2: iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXExpressionInClosureRule()); 
@@ -15038,7 +15038,7 @@
 
 
     // $ANTLR start "ruleXExpressionInClosure"
-    // InternalPerspectiveDsl.g:5344:1: ruleXExpressionInClosure returns [EObject current=null] : ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) ;
+    // InternalPerspectiveDsl.g:5346:1: ruleXExpressionInClosure returns [EObject current=null] : ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) ;
     public final EObject ruleXExpressionInClosure() throws RecognitionException {
         EObject current = null;
 
@@ -15050,14 +15050,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:5350:2: ( ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) )
-            // InternalPerspectiveDsl.g:5351:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
+            // InternalPerspectiveDsl.g:5352:2: ( ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) )
+            // InternalPerspectiveDsl.g:5353:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
             {
-            // InternalPerspectiveDsl.g:5351:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
-            // InternalPerspectiveDsl.g:5352:3: () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
+            // InternalPerspectiveDsl.g:5353:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
+            // InternalPerspectiveDsl.g:5354:3: () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
             {
-            // InternalPerspectiveDsl.g:5352:3: ()
-            // InternalPerspectiveDsl.g:5353:4: 
+            // InternalPerspectiveDsl.g:5354:3: ()
+            // InternalPerspectiveDsl.g:5355:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -15069,7 +15069,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:5359:3: ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
+            // InternalPerspectiveDsl.g:5361:3: ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
             loop76:
             do {
                 int alt76=2;
@@ -15082,13 +15082,13 @@
 
                 switch (alt76) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:5360:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )?
+            	    // InternalPerspectiveDsl.g:5362:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )?
             	    {
-            	    // InternalPerspectiveDsl.g:5360:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) )
-            	    // InternalPerspectiveDsl.g:5361:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
+            	    // InternalPerspectiveDsl.g:5362:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) )
+            	    // InternalPerspectiveDsl.g:5363:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
             	    {
-            	    // InternalPerspectiveDsl.g:5361:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
-            	    // InternalPerspectiveDsl.g:5362:6: lv_expressions_1_0= ruleXExpressionOrVarDeclaration
+            	    // InternalPerspectiveDsl.g:5363:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
+            	    // InternalPerspectiveDsl.g:5364:6: lv_expressions_1_0= ruleXExpressionOrVarDeclaration
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -15119,7 +15119,7 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:5379:4: (otherlv_2= ';' )?
+            	    // InternalPerspectiveDsl.g:5381:4: (otherlv_2= ';' )?
             	    int alt75=2;
             	    int LA75_0 = input.LA(1);
 
@@ -15128,7 +15128,7 @@
             	    }
             	    switch (alt75) {
             	        case 1 :
-            	            // InternalPerspectiveDsl.g:5380:5: otherlv_2= ';'
+            	            // InternalPerspectiveDsl.g:5382:5: otherlv_2= ';'
             	            {
             	            otherlv_2=(Token)match(input,56,FOLLOW_71); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
@@ -15176,7 +15176,7 @@
 
 
     // $ANTLR start "entryRuleXShortClosure"
-    // InternalPerspectiveDsl.g:5390:1: entryRuleXShortClosure returns [EObject current=null] : iv_ruleXShortClosure= ruleXShortClosure EOF ;
+    // InternalPerspectiveDsl.g:5392:1: entryRuleXShortClosure returns [EObject current=null] : iv_ruleXShortClosure= ruleXShortClosure EOF ;
     public final EObject entryRuleXShortClosure() throws RecognitionException {
         EObject current = null;
 
@@ -15184,8 +15184,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:5390:54: (iv_ruleXShortClosure= ruleXShortClosure EOF )
-            // InternalPerspectiveDsl.g:5391:2: iv_ruleXShortClosure= ruleXShortClosure EOF
+            // InternalPerspectiveDsl.g:5392:54: (iv_ruleXShortClosure= ruleXShortClosure EOF )
+            // InternalPerspectiveDsl.g:5393:2: iv_ruleXShortClosure= ruleXShortClosure EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXShortClosureRule()); 
@@ -15216,7 +15216,7 @@
 
 
     // $ANTLR start "ruleXShortClosure"
-    // InternalPerspectiveDsl.g:5397:1: ruleXShortClosure returns [EObject current=null] : ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) ;
+    // InternalPerspectiveDsl.g:5399:1: ruleXShortClosure returns [EObject current=null] : ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) ;
     public final EObject ruleXShortClosure() throws RecognitionException {
         EObject current = null;
 
@@ -15233,20 +15233,20 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:5403:2: ( ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) )
-            // InternalPerspectiveDsl.g:5404:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
+            // InternalPerspectiveDsl.g:5405:2: ( ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) )
+            // InternalPerspectiveDsl.g:5406:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
             {
-            // InternalPerspectiveDsl.g:5404:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
-            // InternalPerspectiveDsl.g:5405:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:5406:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
+            // InternalPerspectiveDsl.g:5407:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) )
             {
-            // InternalPerspectiveDsl.g:5405:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) )
-            // InternalPerspectiveDsl.g:5406:4: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
+            // InternalPerspectiveDsl.g:5407:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) )
+            // InternalPerspectiveDsl.g:5408:4: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
             {
-            // InternalPerspectiveDsl.g:5431:4: ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
-            // InternalPerspectiveDsl.g:5432:5: () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) )
+            // InternalPerspectiveDsl.g:5433:4: ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
+            // InternalPerspectiveDsl.g:5434:5: () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) )
             {
-            // InternalPerspectiveDsl.g:5432:5: ()
-            // InternalPerspectiveDsl.g:5433:6: 
+            // InternalPerspectiveDsl.g:5434:5: ()
+            // InternalPerspectiveDsl.g:5435:6: 
             {
             if ( state.backtracking==0 ) {
 
@@ -15258,7 +15258,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:5439:5: ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )?
+            // InternalPerspectiveDsl.g:5441:5: ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )?
             int alt78=2;
             int LA78_0 = input.LA(1);
 
@@ -15267,13 +15267,13 @@
             }
             switch (alt78) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:5440:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
+                    // InternalPerspectiveDsl.g:5442:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
                     {
-                    // InternalPerspectiveDsl.g:5440:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) )
-                    // InternalPerspectiveDsl.g:5441:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
+                    // InternalPerspectiveDsl.g:5442:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) )
+                    // InternalPerspectiveDsl.g:5443:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
                     {
-                    // InternalPerspectiveDsl.g:5441:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
-                    // InternalPerspectiveDsl.g:5442:8: lv_declaredFormalParameters_1_0= ruleJvmFormalParameter
+                    // InternalPerspectiveDsl.g:5443:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
+                    // InternalPerspectiveDsl.g:5444:8: lv_declaredFormalParameters_1_0= ruleJvmFormalParameter
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15304,7 +15304,7 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:5459:6: (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
+                    // InternalPerspectiveDsl.g:5461:6: (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
                     loop77:
                     do {
                         int alt77=2;
@@ -15317,7 +15317,7 @@
 
                         switch (alt77) {
                     	case 1 :
-                    	    // InternalPerspectiveDsl.g:5460:7: otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
+                    	    // InternalPerspectiveDsl.g:5462:7: otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
                     	    {
                     	    otherlv_2=(Token)match(input,59,FOLLOW_46); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
@@ -15325,11 +15325,11 @@
                     	      							newLeafNode(otherlv_2, grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0());
                     	      						
                     	    }
-                    	    // InternalPerspectiveDsl.g:5464:7: ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
-                    	    // InternalPerspectiveDsl.g:5465:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
+                    	    // InternalPerspectiveDsl.g:5466:7: ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
+                    	    // InternalPerspectiveDsl.g:5467:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
                     	    {
-                    	    // InternalPerspectiveDsl.g:5465:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
-                    	    // InternalPerspectiveDsl.g:5466:9: lv_declaredFormalParameters_3_0= ruleJvmFormalParameter
+                    	    // InternalPerspectiveDsl.g:5467:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
+                    	    // InternalPerspectiveDsl.g:5468:9: lv_declaredFormalParameters_3_0= ruleJvmFormalParameter
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -15375,11 +15375,11 @@
 
             }
 
-            // InternalPerspectiveDsl.g:5485:5: ( (lv_explicitSyntax_4_0= '|' ) )
-            // InternalPerspectiveDsl.g:5486:6: (lv_explicitSyntax_4_0= '|' )
+            // InternalPerspectiveDsl.g:5487:5: ( (lv_explicitSyntax_4_0= '|' ) )
+            // InternalPerspectiveDsl.g:5488:6: (lv_explicitSyntax_4_0= '|' )
             {
-            // InternalPerspectiveDsl.g:5486:6: (lv_explicitSyntax_4_0= '|' )
-            // InternalPerspectiveDsl.g:5487:7: lv_explicitSyntax_4_0= '|'
+            // InternalPerspectiveDsl.g:5488:6: (lv_explicitSyntax_4_0= '|' )
+            // InternalPerspectiveDsl.g:5489:7: lv_explicitSyntax_4_0= '|'
             {
             lv_explicitSyntax_4_0=(Token)match(input,98,FOLLOW_33); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -15407,11 +15407,11 @@
 
             }
 
-            // InternalPerspectiveDsl.g:5501:3: ( (lv_expression_5_0= ruleXExpression ) )
-            // InternalPerspectiveDsl.g:5502:4: (lv_expression_5_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:5503:3: ( (lv_expression_5_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:5504:4: (lv_expression_5_0= ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:5502:4: (lv_expression_5_0= ruleXExpression )
-            // InternalPerspectiveDsl.g:5503:5: lv_expression_5_0= ruleXExpression
+            // InternalPerspectiveDsl.g:5504:4: (lv_expression_5_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:5505:5: lv_expression_5_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -15467,7 +15467,7 @@
 
 
     // $ANTLR start "entryRuleXParenthesizedExpression"
-    // InternalPerspectiveDsl.g:5524:1: entryRuleXParenthesizedExpression returns [EObject current=null] : iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF ;
+    // InternalPerspectiveDsl.g:5526:1: entryRuleXParenthesizedExpression returns [EObject current=null] : iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF ;
     public final EObject entryRuleXParenthesizedExpression() throws RecognitionException {
         EObject current = null;
 
@@ -15475,8 +15475,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:5524:65: (iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF )
-            // InternalPerspectiveDsl.g:5525:2: iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF
+            // InternalPerspectiveDsl.g:5526:65: (iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF )
+            // InternalPerspectiveDsl.g:5527:2: iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXParenthesizedExpressionRule()); 
@@ -15507,7 +15507,7 @@
 
 
     // $ANTLR start "ruleXParenthesizedExpression"
-    // InternalPerspectiveDsl.g:5531:1: ruleXParenthesizedExpression returns [EObject current=null] : (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) ;
+    // InternalPerspectiveDsl.g:5533:1: ruleXParenthesizedExpression returns [EObject current=null] : (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) ;
     public final EObject ruleXParenthesizedExpression() throws RecognitionException {
         EObject current = null;
 
@@ -15520,11 +15520,11 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:5537:2: ( (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) )
-            // InternalPerspectiveDsl.g:5538:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
+            // InternalPerspectiveDsl.g:5539:2: ( (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) )
+            // InternalPerspectiveDsl.g:5540:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
             {
-            // InternalPerspectiveDsl.g:5538:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
-            // InternalPerspectiveDsl.g:5539:3: otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')'
+            // InternalPerspectiveDsl.g:5540:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
+            // InternalPerspectiveDsl.g:5541:3: otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')'
             {
             otherlv_0=(Token)match(input,58,FOLLOW_33); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -15579,7 +15579,7 @@
 
 
     // $ANTLR start "entryRuleXIfExpression"
-    // InternalPerspectiveDsl.g:5559:1: entryRuleXIfExpression returns [EObject current=null] : iv_ruleXIfExpression= ruleXIfExpression EOF ;
+    // InternalPerspectiveDsl.g:5561:1: entryRuleXIfExpression returns [EObject current=null] : iv_ruleXIfExpression= ruleXIfExpression EOF ;
     public final EObject entryRuleXIfExpression() throws RecognitionException {
         EObject current = null;
 
@@ -15587,8 +15587,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:5559:54: (iv_ruleXIfExpression= ruleXIfExpression EOF )
-            // InternalPerspectiveDsl.g:5560:2: iv_ruleXIfExpression= ruleXIfExpression EOF
+            // InternalPerspectiveDsl.g:5561:54: (iv_ruleXIfExpression= ruleXIfExpression EOF )
+            // InternalPerspectiveDsl.g:5562:2: iv_ruleXIfExpression= ruleXIfExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXIfExpressionRule()); 
@@ -15619,7 +15619,7 @@
 
 
     // $ANTLR start "ruleXIfExpression"
-    // InternalPerspectiveDsl.g:5566:1: ruleXIfExpression returns [EObject current=null] : ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? ) ;
+    // InternalPerspectiveDsl.g:5568:1: ruleXIfExpression returns [EObject current=null] : ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? ) ;
     public final EObject ruleXIfExpression() throws RecognitionException {
         EObject current = null;
 
@@ -15638,14 +15638,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:5572:2: ( ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? ) )
-            // InternalPerspectiveDsl.g:5573:2: ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? )
+            // InternalPerspectiveDsl.g:5574:2: ( ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? ) )
+            // InternalPerspectiveDsl.g:5575:2: ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? )
             {
-            // InternalPerspectiveDsl.g:5573:2: ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? )
-            // InternalPerspectiveDsl.g:5574:3: () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
+            // InternalPerspectiveDsl.g:5575:2: ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? )
+            // InternalPerspectiveDsl.g:5576:3: () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
             {
-            // InternalPerspectiveDsl.g:5574:3: ()
-            // InternalPerspectiveDsl.g:5575:4: 
+            // InternalPerspectiveDsl.g:5576:3: ()
+            // InternalPerspectiveDsl.g:5577:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -15669,11 +15669,11 @@
               			newLeafNode(otherlv_2, grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2());
               		
             }
-            // InternalPerspectiveDsl.g:5589:3: ( (lv_if_3_0= ruleXExpression ) )
-            // InternalPerspectiveDsl.g:5590:4: (lv_if_3_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:5591:3: ( (lv_if_3_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:5592:4: (lv_if_3_0= ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:5590:4: (lv_if_3_0= ruleXExpression )
-            // InternalPerspectiveDsl.g:5591:5: lv_if_3_0= ruleXExpression
+            // InternalPerspectiveDsl.g:5592:4: (lv_if_3_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:5593:5: lv_if_3_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -15710,11 +15710,11 @@
               			newLeafNode(otherlv_4, grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4());
               		
             }
-            // InternalPerspectiveDsl.g:5612:3: ( (lv_then_5_0= ruleXExpression ) )
-            // InternalPerspectiveDsl.g:5613:4: (lv_then_5_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:5614:3: ( (lv_then_5_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:5615:4: (lv_then_5_0= ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:5613:4: (lv_then_5_0= ruleXExpression )
-            // InternalPerspectiveDsl.g:5614:5: lv_then_5_0= ruleXExpression
+            // InternalPerspectiveDsl.g:5615:4: (lv_then_5_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:5616:5: lv_then_5_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -15745,7 +15745,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:5631:3: ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
+            // InternalPerspectiveDsl.g:5633:3: ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
             int alt79=2;
             int LA79_0 = input.LA(1);
 
@@ -15758,10 +15758,10 @@
             }
             switch (alt79) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:5632:4: ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) )
+                    // InternalPerspectiveDsl.g:5634:4: ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) )
                     {
-                    // InternalPerspectiveDsl.g:5632:4: ( ( 'else' )=>otherlv_6= 'else' )
-                    // InternalPerspectiveDsl.g:5633:5: ( 'else' )=>otherlv_6= 'else'
+                    // InternalPerspectiveDsl.g:5634:4: ( ( 'else' )=>otherlv_6= 'else' )
+                    // InternalPerspectiveDsl.g:5635:5: ( 'else' )=>otherlv_6= 'else'
                     {
                     otherlv_6=(Token)match(input,100,FOLLOW_33); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -15772,11 +15772,11 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:5639:4: ( (lv_else_7_0= ruleXExpression ) )
-                    // InternalPerspectiveDsl.g:5640:5: (lv_else_7_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:5641:4: ( (lv_else_7_0= ruleXExpression ) )
+                    // InternalPerspectiveDsl.g:5642:5: (lv_else_7_0= ruleXExpression )
                     {
-                    // InternalPerspectiveDsl.g:5640:5: (lv_else_7_0= ruleXExpression )
-                    // InternalPerspectiveDsl.g:5641:6: lv_else_7_0= ruleXExpression
+                    // InternalPerspectiveDsl.g:5642:5: (lv_else_7_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:5643:6: lv_else_7_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15838,7 +15838,7 @@
 
 
     // $ANTLR start "entryRuleXSwitchExpression"
-    // InternalPerspectiveDsl.g:5663:1: entryRuleXSwitchExpression returns [EObject current=null] : iv_ruleXSwitchExpression= ruleXSwitchExpression EOF ;
+    // InternalPerspectiveDsl.g:5665:1: entryRuleXSwitchExpression returns [EObject current=null] : iv_ruleXSwitchExpression= ruleXSwitchExpression EOF ;
     public final EObject entryRuleXSwitchExpression() throws RecognitionException {
         EObject current = null;
 
@@ -15846,8 +15846,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:5663:58: (iv_ruleXSwitchExpression= ruleXSwitchExpression EOF )
-            // InternalPerspectiveDsl.g:5664:2: iv_ruleXSwitchExpression= ruleXSwitchExpression EOF
+            // InternalPerspectiveDsl.g:5665:58: (iv_ruleXSwitchExpression= ruleXSwitchExpression EOF )
+            // InternalPerspectiveDsl.g:5666:2: iv_ruleXSwitchExpression= ruleXSwitchExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXSwitchExpressionRule()); 
@@ -15878,7 +15878,7 @@
 
 
     // $ANTLR start "ruleXSwitchExpression"
-    // InternalPerspectiveDsl.g:5670:1: ruleXSwitchExpression returns [EObject current=null] : ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' ) ;
+    // InternalPerspectiveDsl.g:5672:1: ruleXSwitchExpression returns [EObject current=null] : ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' ) ;
     public final EObject ruleXSwitchExpression() throws RecognitionException {
         EObject current = null;
 
@@ -15908,14 +15908,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:5676:2: ( ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' ) )
-            // InternalPerspectiveDsl.g:5677:2: ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' )
+            // InternalPerspectiveDsl.g:5678:2: ( ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' ) )
+            // InternalPerspectiveDsl.g:5679:2: ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' )
             {
-            // InternalPerspectiveDsl.g:5677:2: ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' )
-            // InternalPerspectiveDsl.g:5678:3: () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}'
+            // InternalPerspectiveDsl.g:5679:2: ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' )
+            // InternalPerspectiveDsl.g:5680:3: () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}'
             {
-            // InternalPerspectiveDsl.g:5678:3: ()
-            // InternalPerspectiveDsl.g:5679:4: 
+            // InternalPerspectiveDsl.g:5680:3: ()
+            // InternalPerspectiveDsl.g:5681:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -15933,21 +15933,21 @@
               			newLeafNode(otherlv_1, grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:5689:3: ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) )
+            // InternalPerspectiveDsl.g:5691:3: ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) )
             int alt81=2;
             alt81 = dfa81.predict(input);
             switch (alt81) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:5690:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
+                    // InternalPerspectiveDsl.g:5692:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
                     {
-                    // InternalPerspectiveDsl.g:5690:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
-                    // InternalPerspectiveDsl.g:5691:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')'
+                    // InternalPerspectiveDsl.g:5692:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
+                    // InternalPerspectiveDsl.g:5693:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')'
                     {
-                    // InternalPerspectiveDsl.g:5691:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
-                    // InternalPerspectiveDsl.g:5692:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+                    // InternalPerspectiveDsl.g:5693:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
+                    // InternalPerspectiveDsl.g:5694:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
                     {
-                    // InternalPerspectiveDsl.g:5702:6: (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
-                    // InternalPerspectiveDsl.g:5703:7: otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
+                    // InternalPerspectiveDsl.g:5704:6: (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+                    // InternalPerspectiveDsl.g:5705:7: otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
                     {
                     otherlv_2=(Token)match(input,58,FOLLOW_46); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -15955,11 +15955,11 @@
                       							newLeafNode(otherlv_2, grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0());
                       						
                     }
-                    // InternalPerspectiveDsl.g:5707:7: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
-                    // InternalPerspectiveDsl.g:5708:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+                    // InternalPerspectiveDsl.g:5709:7: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
+                    // InternalPerspectiveDsl.g:5710:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
                     {
-                    // InternalPerspectiveDsl.g:5708:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
-                    // InternalPerspectiveDsl.g:5709:9: lv_declaredParam_3_0= ruleJvmFormalParameter
+                    // InternalPerspectiveDsl.g:5710:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+                    // InternalPerspectiveDsl.g:5711:9: lv_declaredParam_3_0= ruleJvmFormalParameter
                     {
                     if ( state.backtracking==0 ) {
 
@@ -16002,11 +16002,11 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:5732:5: ( (lv_switch_5_0= ruleXExpression ) )
-                    // InternalPerspectiveDsl.g:5733:6: (lv_switch_5_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:5734:5: ( (lv_switch_5_0= ruleXExpression ) )
+                    // InternalPerspectiveDsl.g:5735:6: (lv_switch_5_0= ruleXExpression )
                     {
-                    // InternalPerspectiveDsl.g:5733:6: (lv_switch_5_0= ruleXExpression )
-                    // InternalPerspectiveDsl.g:5734:7: lv_switch_5_0= ruleXExpression
+                    // InternalPerspectiveDsl.g:5735:6: (lv_switch_5_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:5736:7: lv_switch_5_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -16050,26 +16050,26 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:5757:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
+                    // InternalPerspectiveDsl.g:5759:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
                     {
-                    // InternalPerspectiveDsl.g:5757:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
-                    // InternalPerspectiveDsl.g:5758:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) )
+                    // InternalPerspectiveDsl.g:5759:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
+                    // InternalPerspectiveDsl.g:5760:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) )
                     {
-                    // InternalPerspectiveDsl.g:5758:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?
+                    // InternalPerspectiveDsl.g:5760:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?
                     int alt80=2;
                     alt80 = dfa80.predict(input);
                     switch (alt80) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:5759:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
+                            // InternalPerspectiveDsl.g:5761:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
                             {
-                            // InternalPerspectiveDsl.g:5768:6: ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
-                            // InternalPerspectiveDsl.g:5769:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':'
+                            // InternalPerspectiveDsl.g:5770:6: ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
+                            // InternalPerspectiveDsl.g:5771:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':'
                             {
-                            // InternalPerspectiveDsl.g:5769:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) )
-                            // InternalPerspectiveDsl.g:5770:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
+                            // InternalPerspectiveDsl.g:5771:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) )
+                            // InternalPerspectiveDsl.g:5772:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
                             {
-                            // InternalPerspectiveDsl.g:5770:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
-                            // InternalPerspectiveDsl.g:5771:9: lv_declaredParam_7_0= ruleJvmFormalParameter
+                            // InternalPerspectiveDsl.g:5772:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
+                            // InternalPerspectiveDsl.g:5773:9: lv_declaredParam_7_0= ruleJvmFormalParameter
                             {
                             if ( state.backtracking==0 ) {
 
@@ -16115,11 +16115,11 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:5794:5: ( (lv_switch_9_0= ruleXExpression ) )
-                    // InternalPerspectiveDsl.g:5795:6: (lv_switch_9_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:5796:5: ( (lv_switch_9_0= ruleXExpression ) )
+                    // InternalPerspectiveDsl.g:5797:6: (lv_switch_9_0= ruleXExpression )
                     {
-                    // InternalPerspectiveDsl.g:5795:6: (lv_switch_9_0= ruleXExpression )
-                    // InternalPerspectiveDsl.g:5796:7: lv_switch_9_0= ruleXExpression
+                    // InternalPerspectiveDsl.g:5797:6: (lv_switch_9_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:5798:7: lv_switch_9_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -16165,7 +16165,7 @@
               			newLeafNode(otherlv_10, grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3());
               		
             }
-            // InternalPerspectiveDsl.g:5819:3: ( (lv_cases_11_0= ruleXCasePart ) )*
+            // InternalPerspectiveDsl.g:5821:3: ( (lv_cases_11_0= ruleXCasePart ) )*
             loop82:
             do {
                 int alt82=2;
@@ -16178,10 +16178,10 @@
 
                 switch (alt82) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:5820:4: (lv_cases_11_0= ruleXCasePart )
+            	    // InternalPerspectiveDsl.g:5822:4: (lv_cases_11_0= ruleXCasePart )
             	    {
-            	    // InternalPerspectiveDsl.g:5820:4: (lv_cases_11_0= ruleXCasePart )
-            	    // InternalPerspectiveDsl.g:5821:5: lv_cases_11_0= ruleXCasePart
+            	    // InternalPerspectiveDsl.g:5822:4: (lv_cases_11_0= ruleXCasePart )
+            	    // InternalPerspectiveDsl.g:5823:5: lv_cases_11_0= ruleXCasePart
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -16218,7 +16218,7 @@
                 }
             } while (true);
 
-            // InternalPerspectiveDsl.g:5838:3: (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )?
+            // InternalPerspectiveDsl.g:5840:3: (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )?
             int alt83=2;
             int LA83_0 = input.LA(1);
 
@@ -16227,7 +16227,7 @@
             }
             switch (alt83) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:5839:4: otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) )
+                    // InternalPerspectiveDsl.g:5841:4: otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) )
                     {
                     otherlv_12=(Token)match(input,103,FOLLOW_75); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -16241,11 +16241,11 @@
                       				newLeafNode(otherlv_13, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1());
                       			
                     }
-                    // InternalPerspectiveDsl.g:5847:4: ( (lv_default_14_0= ruleXExpression ) )
-                    // InternalPerspectiveDsl.g:5848:5: (lv_default_14_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:5849:4: ( (lv_default_14_0= ruleXExpression ) )
+                    // InternalPerspectiveDsl.g:5850:5: (lv_default_14_0= ruleXExpression )
                     {
-                    // InternalPerspectiveDsl.g:5848:5: (lv_default_14_0= ruleXExpression )
-                    // InternalPerspectiveDsl.g:5849:6: lv_default_14_0= ruleXExpression
+                    // InternalPerspectiveDsl.g:5850:5: (lv_default_14_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:5851:6: lv_default_14_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -16313,7 +16313,7 @@
 
 
     // $ANTLR start "entryRuleXCasePart"
-    // InternalPerspectiveDsl.g:5875:1: entryRuleXCasePart returns [EObject current=null] : iv_ruleXCasePart= ruleXCasePart EOF ;
+    // InternalPerspectiveDsl.g:5877:1: entryRuleXCasePart returns [EObject current=null] : iv_ruleXCasePart= ruleXCasePart EOF ;
     public final EObject entryRuleXCasePart() throws RecognitionException {
         EObject current = null;
 
@@ -16321,8 +16321,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:5875:50: (iv_ruleXCasePart= ruleXCasePart EOF )
-            // InternalPerspectiveDsl.g:5876:2: iv_ruleXCasePart= ruleXCasePart EOF
+            // InternalPerspectiveDsl.g:5877:50: (iv_ruleXCasePart= ruleXCasePart EOF )
+            // InternalPerspectiveDsl.g:5878:2: iv_ruleXCasePart= ruleXCasePart EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXCasePartRule()); 
@@ -16353,7 +16353,7 @@
 
 
     // $ANTLR start "ruleXCasePart"
-    // InternalPerspectiveDsl.g:5882:1: ruleXCasePart returns [EObject current=null] : ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) ) ;
+    // InternalPerspectiveDsl.g:5884:1: ruleXCasePart returns [EObject current=null] : ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) ) ;
     public final EObject ruleXCasePart() throws RecognitionException {
         EObject current = null;
 
@@ -16371,14 +16371,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:5888:2: ( ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) ) )
-            // InternalPerspectiveDsl.g:5889:2: ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) )
+            // InternalPerspectiveDsl.g:5890:2: ( ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) ) )
+            // InternalPerspectiveDsl.g:5891:2: ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) )
             {
-            // InternalPerspectiveDsl.g:5889:2: ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) )
-            // InternalPerspectiveDsl.g:5890:3: () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
+            // InternalPerspectiveDsl.g:5891:2: ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) )
+            // InternalPerspectiveDsl.g:5892:3: () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
             {
-            // InternalPerspectiveDsl.g:5890:3: ()
-            // InternalPerspectiveDsl.g:5891:4: 
+            // InternalPerspectiveDsl.g:5892:3: ()
+            // InternalPerspectiveDsl.g:5893:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -16390,7 +16390,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:5897:3: ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )?
+            // InternalPerspectiveDsl.g:5899:3: ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )?
             int alt84=2;
             int LA84_0 = input.LA(1);
 
@@ -16399,10 +16399,10 @@
             }
             switch (alt84) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:5898:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
+                    // InternalPerspectiveDsl.g:5900:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
                     {
-                    // InternalPerspectiveDsl.g:5898:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
-                    // InternalPerspectiveDsl.g:5899:5: lv_typeGuard_1_0= ruleJvmTypeReference
+                    // InternalPerspectiveDsl.g:5900:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
+                    // InternalPerspectiveDsl.g:5901:5: lv_typeGuard_1_0= ruleJvmTypeReference
                     {
                     if ( state.backtracking==0 ) {
 
@@ -16436,7 +16436,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:5916:3: (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )?
+            // InternalPerspectiveDsl.g:5918:3: (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )?
             int alt85=2;
             int LA85_0 = input.LA(1);
 
@@ -16445,7 +16445,7 @@
             }
             switch (alt85) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:5917:4: otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) )
+                    // InternalPerspectiveDsl.g:5919:4: otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) )
                     {
                     otherlv_2=(Token)match(input,104,FOLLOW_33); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -16453,11 +16453,11 @@
                       				newLeafNode(otherlv_2, grammarAccess.getXCasePartAccess().getCaseKeyword_2_0());
                       			
                     }
-                    // InternalPerspectiveDsl.g:5921:4: ( (lv_case_3_0= ruleXExpression ) )
-                    // InternalPerspectiveDsl.g:5922:5: (lv_case_3_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:5923:4: ( (lv_case_3_0= ruleXExpression ) )
+                    // InternalPerspectiveDsl.g:5924:5: (lv_case_3_0= ruleXExpression )
                     {
-                    // InternalPerspectiveDsl.g:5922:5: (lv_case_3_0= ruleXExpression )
-                    // InternalPerspectiveDsl.g:5923:6: lv_case_3_0= ruleXExpression
+                    // InternalPerspectiveDsl.g:5924:5: (lv_case_3_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:5925:6: lv_case_3_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -16494,7 +16494,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:5941:3: ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
+            // InternalPerspectiveDsl.g:5943:3: ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
             int alt86=2;
             int LA86_0 = input.LA(1);
 
@@ -16513,10 +16513,10 @@
             }
             switch (alt86) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:5942:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
+                    // InternalPerspectiveDsl.g:5944:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
                     {
-                    // InternalPerspectiveDsl.g:5942:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
-                    // InternalPerspectiveDsl.g:5943:5: otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) )
+                    // InternalPerspectiveDsl.g:5944:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
+                    // InternalPerspectiveDsl.g:5945:5: otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) )
                     {
                     otherlv_4=(Token)match(input,102,FOLLOW_33); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -16524,11 +16524,11 @@
                       					newLeafNode(otherlv_4, grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0());
                       				
                     }
-                    // InternalPerspectiveDsl.g:5947:5: ( (lv_then_5_0= ruleXExpression ) )
-                    // InternalPerspectiveDsl.g:5948:6: (lv_then_5_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:5949:5: ( (lv_then_5_0= ruleXExpression ) )
+                    // InternalPerspectiveDsl.g:5950:6: (lv_then_5_0= ruleXExpression )
                     {
-                    // InternalPerspectiveDsl.g:5948:6: (lv_then_5_0= ruleXExpression )
-                    // InternalPerspectiveDsl.g:5949:7: lv_then_5_0= ruleXExpression
+                    // InternalPerspectiveDsl.g:5950:6: (lv_then_5_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:5951:7: lv_then_5_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -16566,13 +16566,13 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:5968:4: ( (lv_fallThrough_6_0= ',' ) )
+                    // InternalPerspectiveDsl.g:5970:4: ( (lv_fallThrough_6_0= ',' ) )
                     {
-                    // InternalPerspectiveDsl.g:5968:4: ( (lv_fallThrough_6_0= ',' ) )
-                    // InternalPerspectiveDsl.g:5969:5: (lv_fallThrough_6_0= ',' )
+                    // InternalPerspectiveDsl.g:5970:4: ( (lv_fallThrough_6_0= ',' ) )
+                    // InternalPerspectiveDsl.g:5971:5: (lv_fallThrough_6_0= ',' )
                     {
-                    // InternalPerspectiveDsl.g:5969:5: (lv_fallThrough_6_0= ',' )
-                    // InternalPerspectiveDsl.g:5970:6: lv_fallThrough_6_0= ','
+                    // InternalPerspectiveDsl.g:5971:5: (lv_fallThrough_6_0= ',' )
+                    // InternalPerspectiveDsl.g:5972:6: lv_fallThrough_6_0= ','
                     {
                     lv_fallThrough_6_0=(Token)match(input,59,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -16625,7 +16625,7 @@
 
 
     // $ANTLR start "entryRuleXForLoopExpression"
-    // InternalPerspectiveDsl.g:5987:1: entryRuleXForLoopExpression returns [EObject current=null] : iv_ruleXForLoopExpression= ruleXForLoopExpression EOF ;
+    // InternalPerspectiveDsl.g:5989:1: entryRuleXForLoopExpression returns [EObject current=null] : iv_ruleXForLoopExpression= ruleXForLoopExpression EOF ;
     public final EObject entryRuleXForLoopExpression() throws RecognitionException {
         EObject current = null;
 
@@ -16633,8 +16633,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:5987:59: (iv_ruleXForLoopExpression= ruleXForLoopExpression EOF )
-            // InternalPerspectiveDsl.g:5988:2: iv_ruleXForLoopExpression= ruleXForLoopExpression EOF
+            // InternalPerspectiveDsl.g:5989:59: (iv_ruleXForLoopExpression= ruleXForLoopExpression EOF )
+            // InternalPerspectiveDsl.g:5990:2: iv_ruleXForLoopExpression= ruleXForLoopExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXForLoopExpressionRule()); 
@@ -16665,7 +16665,7 @@
 
 
     // $ANTLR start "ruleXForLoopExpression"
-    // InternalPerspectiveDsl.g:5994:1: ruleXForLoopExpression returns [EObject current=null] : ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) ) ;
+    // InternalPerspectiveDsl.g:5996:1: ruleXForLoopExpression returns [EObject current=null] : ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) ) ;
     public final EObject ruleXForLoopExpression() throws RecognitionException {
         EObject current = null;
 
@@ -16684,20 +16684,20 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:6000:2: ( ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) ) )
-            // InternalPerspectiveDsl.g:6001:2: ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) )
+            // InternalPerspectiveDsl.g:6002:2: ( ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) ) )
+            // InternalPerspectiveDsl.g:6003:2: ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) )
             {
-            // InternalPerspectiveDsl.g:6001:2: ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) )
-            // InternalPerspectiveDsl.g:6002:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:6003:2: ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) )
+            // InternalPerspectiveDsl.g:6004:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) )
             {
-            // InternalPerspectiveDsl.g:6002:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
-            // InternalPerspectiveDsl.g:6003:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+            // InternalPerspectiveDsl.g:6004:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
+            // InternalPerspectiveDsl.g:6005:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
             {
-            // InternalPerspectiveDsl.g:6016:4: ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
-            // InternalPerspectiveDsl.g:6017:5: () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
+            // InternalPerspectiveDsl.g:6018:4: ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+            // InternalPerspectiveDsl.g:6019:5: () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
             {
-            // InternalPerspectiveDsl.g:6017:5: ()
-            // InternalPerspectiveDsl.g:6018:6: 
+            // InternalPerspectiveDsl.g:6019:5: ()
+            // InternalPerspectiveDsl.g:6020:6: 
             {
             if ( state.backtracking==0 ) {
 
@@ -16721,11 +16721,11 @@
               					newLeafNode(otherlv_2, grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2());
               				
             }
-            // InternalPerspectiveDsl.g:6032:5: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
-            // InternalPerspectiveDsl.g:6033:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+            // InternalPerspectiveDsl.g:6034:5: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
+            // InternalPerspectiveDsl.g:6035:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
             {
-            // InternalPerspectiveDsl.g:6033:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
-            // InternalPerspectiveDsl.g:6034:7: lv_declaredParam_3_0= ruleJvmFormalParameter
+            // InternalPerspectiveDsl.g:6035:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+            // InternalPerspectiveDsl.g:6036:7: lv_declaredParam_3_0= ruleJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
 
@@ -16768,11 +16768,11 @@
 
             }
 
-            // InternalPerspectiveDsl.g:6057:3: ( (lv_forExpression_5_0= ruleXExpression ) )
-            // InternalPerspectiveDsl.g:6058:4: (lv_forExpression_5_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:6059:3: ( (lv_forExpression_5_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:6060:4: (lv_forExpression_5_0= ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:6058:4: (lv_forExpression_5_0= ruleXExpression )
-            // InternalPerspectiveDsl.g:6059:5: lv_forExpression_5_0= ruleXExpression
+            // InternalPerspectiveDsl.g:6060:4: (lv_forExpression_5_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:6061:5: lv_forExpression_5_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -16809,11 +16809,11 @@
               			newLeafNode(otherlv_6, grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2());
               		
             }
-            // InternalPerspectiveDsl.g:6080:3: ( (lv_eachExpression_7_0= ruleXExpression ) )
-            // InternalPerspectiveDsl.g:6081:4: (lv_eachExpression_7_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:6082:3: ( (lv_eachExpression_7_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:6083:4: (lv_eachExpression_7_0= ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:6081:4: (lv_eachExpression_7_0= ruleXExpression )
-            // InternalPerspectiveDsl.g:6082:5: lv_eachExpression_7_0= ruleXExpression
+            // InternalPerspectiveDsl.g:6083:4: (lv_eachExpression_7_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:6084:5: lv_eachExpression_7_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -16869,7 +16869,7 @@
 
 
     // $ANTLR start "entryRuleXBasicForLoopExpression"
-    // InternalPerspectiveDsl.g:6103:1: entryRuleXBasicForLoopExpression returns [EObject current=null] : iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF ;
+    // InternalPerspectiveDsl.g:6105:1: entryRuleXBasicForLoopExpression returns [EObject current=null] : iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF ;
     public final EObject entryRuleXBasicForLoopExpression() throws RecognitionException {
         EObject current = null;
 
@@ -16877,8 +16877,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:6103:64: (iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF )
-            // InternalPerspectiveDsl.g:6104:2: iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF
+            // InternalPerspectiveDsl.g:6105:64: (iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF )
+            // InternalPerspectiveDsl.g:6106:2: iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXBasicForLoopExpressionRule()); 
@@ -16909,7 +16909,7 @@
 
 
     // $ANTLR start "ruleXBasicForLoopExpression"
-    // InternalPerspectiveDsl.g:6110:1: ruleXBasicForLoopExpression returns [EObject current=null] : ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) ) ;
+    // InternalPerspectiveDsl.g:6112:1: ruleXBasicForLoopExpression returns [EObject current=null] : ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) ) ;
     public final EObject ruleXBasicForLoopExpression() throws RecognitionException {
         EObject current = null;
 
@@ -16937,14 +16937,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:6116:2: ( ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) ) )
-            // InternalPerspectiveDsl.g:6117:2: ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) )
+            // InternalPerspectiveDsl.g:6118:2: ( ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) ) )
+            // InternalPerspectiveDsl.g:6119:2: ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) )
             {
-            // InternalPerspectiveDsl.g:6117:2: ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) )
-            // InternalPerspectiveDsl.g:6118:3: () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:6119:2: ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) )
+            // InternalPerspectiveDsl.g:6120:3: () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) )
             {
-            // InternalPerspectiveDsl.g:6118:3: ()
-            // InternalPerspectiveDsl.g:6119:4: 
+            // InternalPerspectiveDsl.g:6120:3: ()
+            // InternalPerspectiveDsl.g:6121:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -16968,7 +16968,7 @@
               			newLeafNode(otherlv_2, grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2());
               		
             }
-            // InternalPerspectiveDsl.g:6133:3: ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )?
+            // InternalPerspectiveDsl.g:6135:3: ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )?
             int alt88=2;
             int LA88_0 = input.LA(1);
 
@@ -16977,13 +16977,13 @@
             }
             switch (alt88) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:6134:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
+                    // InternalPerspectiveDsl.g:6136:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
                     {
-                    // InternalPerspectiveDsl.g:6134:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) )
-                    // InternalPerspectiveDsl.g:6135:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
+                    // InternalPerspectiveDsl.g:6136:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) )
+                    // InternalPerspectiveDsl.g:6137:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
                     {
-                    // InternalPerspectiveDsl.g:6135:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
-                    // InternalPerspectiveDsl.g:6136:6: lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration
+                    // InternalPerspectiveDsl.g:6137:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
+                    // InternalPerspectiveDsl.g:6138:6: lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration
                     {
                     if ( state.backtracking==0 ) {
 
@@ -17014,7 +17014,7 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:6153:4: (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
+                    // InternalPerspectiveDsl.g:6155:4: (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
                     loop87:
                     do {
                         int alt87=2;
@@ -17027,7 +17027,7 @@
 
                         switch (alt87) {
                     	case 1 :
-                    	    // InternalPerspectiveDsl.g:6154:5: otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
+                    	    // InternalPerspectiveDsl.g:6156:5: otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
                     	    {
                     	    otherlv_4=(Token)match(input,59,FOLLOW_82); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
@@ -17035,11 +17035,11 @@
                     	      					newLeafNode(otherlv_4, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0());
                     	      				
                     	    }
-                    	    // InternalPerspectiveDsl.g:6158:5: ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
-                    	    // InternalPerspectiveDsl.g:6159:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
+                    	    // InternalPerspectiveDsl.g:6160:5: ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
+                    	    // InternalPerspectiveDsl.g:6161:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
                     	    {
-                    	    // InternalPerspectiveDsl.g:6159:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
-                    	    // InternalPerspectiveDsl.g:6160:7: lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration
+                    	    // InternalPerspectiveDsl.g:6161:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
+                    	    // InternalPerspectiveDsl.g:6162:7: lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -17091,7 +17091,7 @@
               			newLeafNode(otherlv_6, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4());
               		
             }
-            // InternalPerspectiveDsl.g:6183:3: ( (lv_expression_7_0= ruleXExpression ) )?
+            // InternalPerspectiveDsl.g:6185:3: ( (lv_expression_7_0= ruleXExpression ) )?
             int alt89=2;
             int LA89_0 = input.LA(1);
 
@@ -17100,10 +17100,10 @@
             }
             switch (alt89) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:6184:4: (lv_expression_7_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:6186:4: (lv_expression_7_0= ruleXExpression )
                     {
-                    // InternalPerspectiveDsl.g:6184:4: (lv_expression_7_0= ruleXExpression )
-                    // InternalPerspectiveDsl.g:6185:5: lv_expression_7_0= ruleXExpression
+                    // InternalPerspectiveDsl.g:6186:4: (lv_expression_7_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:6187:5: lv_expression_7_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -17143,7 +17143,7 @@
               			newLeafNode(otherlv_8, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6());
               		
             }
-            // InternalPerspectiveDsl.g:6206:3: ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )?
+            // InternalPerspectiveDsl.g:6208:3: ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )?
             int alt91=2;
             int LA91_0 = input.LA(1);
 
@@ -17152,13 +17152,13 @@
             }
             switch (alt91) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:6207:4: ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
+                    // InternalPerspectiveDsl.g:6209:4: ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
                     {
-                    // InternalPerspectiveDsl.g:6207:4: ( (lv_updateExpressions_9_0= ruleXExpression ) )
-                    // InternalPerspectiveDsl.g:6208:5: (lv_updateExpressions_9_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:6209:4: ( (lv_updateExpressions_9_0= ruleXExpression ) )
+                    // InternalPerspectiveDsl.g:6210:5: (lv_updateExpressions_9_0= ruleXExpression )
                     {
-                    // InternalPerspectiveDsl.g:6208:5: (lv_updateExpressions_9_0= ruleXExpression )
-                    // InternalPerspectiveDsl.g:6209:6: lv_updateExpressions_9_0= ruleXExpression
+                    // InternalPerspectiveDsl.g:6210:5: (lv_updateExpressions_9_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:6211:6: lv_updateExpressions_9_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -17189,7 +17189,7 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:6226:4: (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
+                    // InternalPerspectiveDsl.g:6228:4: (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
                     loop90:
                     do {
                         int alt90=2;
@@ -17202,7 +17202,7 @@
 
                         switch (alt90) {
                     	case 1 :
-                    	    // InternalPerspectiveDsl.g:6227:5: otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) )
+                    	    // InternalPerspectiveDsl.g:6229:5: otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) )
                     	    {
                     	    otherlv_10=(Token)match(input,59,FOLLOW_33); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
@@ -17210,11 +17210,11 @@
                     	      					newLeafNode(otherlv_10, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0());
                     	      				
                     	    }
-                    	    // InternalPerspectiveDsl.g:6231:5: ( (lv_updateExpressions_11_0= ruleXExpression ) )
-                    	    // InternalPerspectiveDsl.g:6232:6: (lv_updateExpressions_11_0= ruleXExpression )
+                    	    // InternalPerspectiveDsl.g:6233:5: ( (lv_updateExpressions_11_0= ruleXExpression ) )
+                    	    // InternalPerspectiveDsl.g:6234:6: (lv_updateExpressions_11_0= ruleXExpression )
                     	    {
-                    	    // InternalPerspectiveDsl.g:6232:6: (lv_updateExpressions_11_0= ruleXExpression )
-                    	    // InternalPerspectiveDsl.g:6233:7: lv_updateExpressions_11_0= ruleXExpression
+                    	    // InternalPerspectiveDsl.g:6234:6: (lv_updateExpressions_11_0= ruleXExpression )
+                    	    // InternalPerspectiveDsl.g:6235:7: lv_updateExpressions_11_0= ruleXExpression
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -17266,11 +17266,11 @@
               			newLeafNode(otherlv_12, grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8());
               		
             }
-            // InternalPerspectiveDsl.g:6256:3: ( (lv_eachExpression_13_0= ruleXExpression ) )
-            // InternalPerspectiveDsl.g:6257:4: (lv_eachExpression_13_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:6258:3: ( (lv_eachExpression_13_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:6259:4: (lv_eachExpression_13_0= ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:6257:4: (lv_eachExpression_13_0= ruleXExpression )
-            // InternalPerspectiveDsl.g:6258:5: lv_eachExpression_13_0= ruleXExpression
+            // InternalPerspectiveDsl.g:6259:4: (lv_eachExpression_13_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:6260:5: lv_eachExpression_13_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -17326,7 +17326,7 @@
 
 
     // $ANTLR start "entryRuleXWhileExpression"
-    // InternalPerspectiveDsl.g:6279:1: entryRuleXWhileExpression returns [EObject current=null] : iv_ruleXWhileExpression= ruleXWhileExpression EOF ;
+    // InternalPerspectiveDsl.g:6281:1: entryRuleXWhileExpression returns [EObject current=null] : iv_ruleXWhileExpression= ruleXWhileExpression EOF ;
     public final EObject entryRuleXWhileExpression() throws RecognitionException {
         EObject current = null;
 
@@ -17334,8 +17334,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:6279:57: (iv_ruleXWhileExpression= ruleXWhileExpression EOF )
-            // InternalPerspectiveDsl.g:6280:2: iv_ruleXWhileExpression= ruleXWhileExpression EOF
+            // InternalPerspectiveDsl.g:6281:57: (iv_ruleXWhileExpression= ruleXWhileExpression EOF )
+            // InternalPerspectiveDsl.g:6282:2: iv_ruleXWhileExpression= ruleXWhileExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXWhileExpressionRule()); 
@@ -17366,7 +17366,7 @@
 
 
     // $ANTLR start "ruleXWhileExpression"
-    // InternalPerspectiveDsl.g:6286:1: ruleXWhileExpression returns [EObject current=null] : ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) ;
+    // InternalPerspectiveDsl.g:6288:1: ruleXWhileExpression returns [EObject current=null] : ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) ;
     public final EObject ruleXWhileExpression() throws RecognitionException {
         EObject current = null;
 
@@ -17382,14 +17382,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:6292:2: ( ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) )
-            // InternalPerspectiveDsl.g:6293:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
+            // InternalPerspectiveDsl.g:6294:2: ( ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) )
+            // InternalPerspectiveDsl.g:6295:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
             {
-            // InternalPerspectiveDsl.g:6293:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
-            // InternalPerspectiveDsl.g:6294:3: () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:6295:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
+            // InternalPerspectiveDsl.g:6296:3: () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) )
             {
-            // InternalPerspectiveDsl.g:6294:3: ()
-            // InternalPerspectiveDsl.g:6295:4: 
+            // InternalPerspectiveDsl.g:6296:3: ()
+            // InternalPerspectiveDsl.g:6297:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -17413,11 +17413,11 @@
               			newLeafNode(otherlv_2, grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2());
               		
             }
-            // InternalPerspectiveDsl.g:6309:3: ( (lv_predicate_3_0= ruleXExpression ) )
-            // InternalPerspectiveDsl.g:6310:4: (lv_predicate_3_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:6311:3: ( (lv_predicate_3_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:6312:4: (lv_predicate_3_0= ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:6310:4: (lv_predicate_3_0= ruleXExpression )
-            // InternalPerspectiveDsl.g:6311:5: lv_predicate_3_0= ruleXExpression
+            // InternalPerspectiveDsl.g:6312:4: (lv_predicate_3_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:6313:5: lv_predicate_3_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -17454,11 +17454,11 @@
               			newLeafNode(otherlv_4, grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4());
               		
             }
-            // InternalPerspectiveDsl.g:6332:3: ( (lv_body_5_0= ruleXExpression ) )
-            // InternalPerspectiveDsl.g:6333:4: (lv_body_5_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:6334:3: ( (lv_body_5_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:6335:4: (lv_body_5_0= ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:6333:4: (lv_body_5_0= ruleXExpression )
-            // InternalPerspectiveDsl.g:6334:5: lv_body_5_0= ruleXExpression
+            // InternalPerspectiveDsl.g:6335:4: (lv_body_5_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:6336:5: lv_body_5_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -17514,7 +17514,7 @@
 
 
     // $ANTLR start "entryRuleXDoWhileExpression"
-    // InternalPerspectiveDsl.g:6355:1: entryRuleXDoWhileExpression returns [EObject current=null] : iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF ;
+    // InternalPerspectiveDsl.g:6357:1: entryRuleXDoWhileExpression returns [EObject current=null] : iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF ;
     public final EObject entryRuleXDoWhileExpression() throws RecognitionException {
         EObject current = null;
 
@@ -17522,8 +17522,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:6355:59: (iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF )
-            // InternalPerspectiveDsl.g:6356:2: iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF
+            // InternalPerspectiveDsl.g:6357:59: (iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF )
+            // InternalPerspectiveDsl.g:6358:2: iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXDoWhileExpressionRule()); 
@@ -17554,7 +17554,7 @@
 
 
     // $ANTLR start "ruleXDoWhileExpression"
-    // InternalPerspectiveDsl.g:6362:1: ruleXDoWhileExpression returns [EObject current=null] : ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) ;
+    // InternalPerspectiveDsl.g:6364:1: ruleXDoWhileExpression returns [EObject current=null] : ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) ;
     public final EObject ruleXDoWhileExpression() throws RecognitionException {
         EObject current = null;
 
@@ -17571,14 +17571,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:6368:2: ( ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) )
-            // InternalPerspectiveDsl.g:6369:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
+            // InternalPerspectiveDsl.g:6370:2: ( ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) )
+            // InternalPerspectiveDsl.g:6371:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
             {
-            // InternalPerspectiveDsl.g:6369:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
-            // InternalPerspectiveDsl.g:6370:3: () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')'
+            // InternalPerspectiveDsl.g:6371:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
+            // InternalPerspectiveDsl.g:6372:3: () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')'
             {
-            // InternalPerspectiveDsl.g:6370:3: ()
-            // InternalPerspectiveDsl.g:6371:4: 
+            // InternalPerspectiveDsl.g:6372:3: ()
+            // InternalPerspectiveDsl.g:6373:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -17596,11 +17596,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:6381:3: ( (lv_body_2_0= ruleXExpression ) )
-            // InternalPerspectiveDsl.g:6382:4: (lv_body_2_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:6383:3: ( (lv_body_2_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:6384:4: (lv_body_2_0= ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:6382:4: (lv_body_2_0= ruleXExpression )
-            // InternalPerspectiveDsl.g:6383:5: lv_body_2_0= ruleXExpression
+            // InternalPerspectiveDsl.g:6384:4: (lv_body_2_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:6385:5: lv_body_2_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -17643,11 +17643,11 @@
               			newLeafNode(otherlv_4, grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4());
               		
             }
-            // InternalPerspectiveDsl.g:6408:3: ( (lv_predicate_5_0= ruleXExpression ) )
-            // InternalPerspectiveDsl.g:6409:4: (lv_predicate_5_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:6410:3: ( (lv_predicate_5_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:6411:4: (lv_predicate_5_0= ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:6409:4: (lv_predicate_5_0= ruleXExpression )
-            // InternalPerspectiveDsl.g:6410:5: lv_predicate_5_0= ruleXExpression
+            // InternalPerspectiveDsl.g:6411:4: (lv_predicate_5_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:6412:5: lv_predicate_5_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -17709,7 +17709,7 @@
 
 
     // $ANTLR start "entryRuleXBlockExpression"
-    // InternalPerspectiveDsl.g:6435:1: entryRuleXBlockExpression returns [EObject current=null] : iv_ruleXBlockExpression= ruleXBlockExpression EOF ;
+    // InternalPerspectiveDsl.g:6437:1: entryRuleXBlockExpression returns [EObject current=null] : iv_ruleXBlockExpression= ruleXBlockExpression EOF ;
     public final EObject entryRuleXBlockExpression() throws RecognitionException {
         EObject current = null;
 
@@ -17717,8 +17717,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:6435:57: (iv_ruleXBlockExpression= ruleXBlockExpression EOF )
-            // InternalPerspectiveDsl.g:6436:2: iv_ruleXBlockExpression= ruleXBlockExpression EOF
+            // InternalPerspectiveDsl.g:6437:57: (iv_ruleXBlockExpression= ruleXBlockExpression EOF )
+            // InternalPerspectiveDsl.g:6438:2: iv_ruleXBlockExpression= ruleXBlockExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXBlockExpressionRule()); 
@@ -17749,7 +17749,7 @@
 
 
     // $ANTLR start "ruleXBlockExpression"
-    // InternalPerspectiveDsl.g:6442:1: ruleXBlockExpression returns [EObject current=null] : ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) ;
+    // InternalPerspectiveDsl.g:6444:1: ruleXBlockExpression returns [EObject current=null] : ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) ;
     public final EObject ruleXBlockExpression() throws RecognitionException {
         EObject current = null;
 
@@ -17763,14 +17763,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:6448:2: ( ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) )
-            // InternalPerspectiveDsl.g:6449:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
+            // InternalPerspectiveDsl.g:6450:2: ( ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) )
+            // InternalPerspectiveDsl.g:6451:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
             {
-            // InternalPerspectiveDsl.g:6449:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
-            // InternalPerspectiveDsl.g:6450:3: () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}'
+            // InternalPerspectiveDsl.g:6451:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
+            // InternalPerspectiveDsl.g:6452:3: () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}'
             {
-            // InternalPerspectiveDsl.g:6450:3: ()
-            // InternalPerspectiveDsl.g:6451:4: 
+            // InternalPerspectiveDsl.g:6452:3: ()
+            // InternalPerspectiveDsl.g:6453:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -17788,7 +17788,7 @@
               			newLeafNode(otherlv_1, grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:6461:3: ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )*
+            // InternalPerspectiveDsl.g:6463:3: ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )*
             loop93:
             do {
                 int alt93=2;
@@ -17801,13 +17801,13 @@
 
                 switch (alt93) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:6462:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )?
+            	    // InternalPerspectiveDsl.g:6464:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )?
             	    {
-            	    // InternalPerspectiveDsl.g:6462:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) )
-            	    // InternalPerspectiveDsl.g:6463:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
+            	    // InternalPerspectiveDsl.g:6464:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) )
+            	    // InternalPerspectiveDsl.g:6465:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
             	    {
-            	    // InternalPerspectiveDsl.g:6463:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
-            	    // InternalPerspectiveDsl.g:6464:6: lv_expressions_2_0= ruleXExpressionOrVarDeclaration
+            	    // InternalPerspectiveDsl.g:6465:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
+            	    // InternalPerspectiveDsl.g:6466:6: lv_expressions_2_0= ruleXExpressionOrVarDeclaration
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -17838,7 +17838,7 @@
 
             	    }
 
-            	    // InternalPerspectiveDsl.g:6481:4: (otherlv_3= ';' )?
+            	    // InternalPerspectiveDsl.g:6483:4: (otherlv_3= ';' )?
             	    int alt92=2;
             	    int LA92_0 = input.LA(1);
 
@@ -17847,7 +17847,7 @@
             	    }
             	    switch (alt92) {
             	        case 1 :
-            	            // InternalPerspectiveDsl.g:6482:5: otherlv_3= ';'
+            	            // InternalPerspectiveDsl.g:6484:5: otherlv_3= ';'
             	            {
             	            otherlv_3=(Token)match(input,56,FOLLOW_86); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
@@ -17901,7 +17901,7 @@
 
 
     // $ANTLR start "entryRuleXExpressionOrVarDeclaration"
-    // InternalPerspectiveDsl.g:6496:1: entryRuleXExpressionOrVarDeclaration returns [EObject current=null] : iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF ;
+    // InternalPerspectiveDsl.g:6498:1: entryRuleXExpressionOrVarDeclaration returns [EObject current=null] : iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF ;
     public final EObject entryRuleXExpressionOrVarDeclaration() throws RecognitionException {
         EObject current = null;
 
@@ -17909,8 +17909,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:6496:68: (iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF )
-            // InternalPerspectiveDsl.g:6497:2: iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF
+            // InternalPerspectiveDsl.g:6498:68: (iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF )
+            // InternalPerspectiveDsl.g:6499:2: iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationRule()); 
@@ -17941,7 +17941,7 @@
 
 
     // $ANTLR start "ruleXExpressionOrVarDeclaration"
-    // InternalPerspectiveDsl.g:6503:1: ruleXExpressionOrVarDeclaration returns [EObject current=null] : (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) ;
+    // InternalPerspectiveDsl.g:6505:1: ruleXExpressionOrVarDeclaration returns [EObject current=null] : (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) ;
     public final EObject ruleXExpressionOrVarDeclaration() throws RecognitionException {
         EObject current = null;
 
@@ -17954,10 +17954,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:6509:2: ( (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) )
-            // InternalPerspectiveDsl.g:6510:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
+            // InternalPerspectiveDsl.g:6511:2: ( (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:6512:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:6510:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
+            // InternalPerspectiveDsl.g:6512:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
             int alt94=2;
             int LA94_0 = input.LA(1);
 
@@ -17976,7 +17976,7 @@
             }
             switch (alt94) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:6511:3: this_XVariableDeclaration_0= ruleXVariableDeclaration
+                    // InternalPerspectiveDsl.g:6513:3: this_XVariableDeclaration_0= ruleXVariableDeclaration
                     {
                     if ( state.backtracking==0 ) {
 
@@ -17998,7 +17998,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:6520:3: this_XExpression_1= ruleXExpression
+                    // InternalPerspectiveDsl.g:6522:3: this_XExpression_1= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -18044,7 +18044,7 @@
 
 
     // $ANTLR start "entryRuleXVariableDeclaration"
-    // InternalPerspectiveDsl.g:6532:1: entryRuleXVariableDeclaration returns [EObject current=null] : iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF ;
+    // InternalPerspectiveDsl.g:6534:1: entryRuleXVariableDeclaration returns [EObject current=null] : iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF ;
     public final EObject entryRuleXVariableDeclaration() throws RecognitionException {
         EObject current = null;
 
@@ -18052,8 +18052,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:6532:61: (iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF )
-            // InternalPerspectiveDsl.g:6533:2: iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF
+            // InternalPerspectiveDsl.g:6534:61: (iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF )
+            // InternalPerspectiveDsl.g:6535:2: iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXVariableDeclarationRule()); 
@@ -18084,7 +18084,7 @@
 
 
     // $ANTLR start "ruleXVariableDeclaration"
-    // InternalPerspectiveDsl.g:6539:1: ruleXVariableDeclaration returns [EObject current=null] : ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? ) ;
+    // InternalPerspectiveDsl.g:6541:1: ruleXVariableDeclaration returns [EObject current=null] : ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? ) ;
     public final EObject ruleXVariableDeclaration() throws RecognitionException {
         EObject current = null;
 
@@ -18104,14 +18104,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:6545:2: ( ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? ) )
-            // InternalPerspectiveDsl.g:6546:2: ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? )
+            // InternalPerspectiveDsl.g:6547:2: ( ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? ) )
+            // InternalPerspectiveDsl.g:6548:2: ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? )
             {
-            // InternalPerspectiveDsl.g:6546:2: ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? )
-            // InternalPerspectiveDsl.g:6547:3: () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
+            // InternalPerspectiveDsl.g:6548:2: ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? )
+            // InternalPerspectiveDsl.g:6549:3: () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
             {
-            // InternalPerspectiveDsl.g:6547:3: ()
-            // InternalPerspectiveDsl.g:6548:4: 
+            // InternalPerspectiveDsl.g:6549:3: ()
+            // InternalPerspectiveDsl.g:6550:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -18123,7 +18123,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:6554:3: ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' )
+            // InternalPerspectiveDsl.g:6556:3: ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' )
             int alt95=2;
             int LA95_0 = input.LA(1);
 
@@ -18142,13 +18142,13 @@
             }
             switch (alt95) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:6555:4: ( (lv_writeable_1_0= 'var' ) )
+                    // InternalPerspectiveDsl.g:6557:4: ( (lv_writeable_1_0= 'var' ) )
                     {
-                    // InternalPerspectiveDsl.g:6555:4: ( (lv_writeable_1_0= 'var' ) )
-                    // InternalPerspectiveDsl.g:6556:5: (lv_writeable_1_0= 'var' )
+                    // InternalPerspectiveDsl.g:6557:4: ( (lv_writeable_1_0= 'var' ) )
+                    // InternalPerspectiveDsl.g:6558:5: (lv_writeable_1_0= 'var' )
                     {
-                    // InternalPerspectiveDsl.g:6556:5: (lv_writeable_1_0= 'var' )
-                    // InternalPerspectiveDsl.g:6557:6: lv_writeable_1_0= 'var'
+                    // InternalPerspectiveDsl.g:6558:5: (lv_writeable_1_0= 'var' )
+                    // InternalPerspectiveDsl.g:6559:6: lv_writeable_1_0= 'var'
                     {
                     lv_writeable_1_0=(Token)match(input,108,FOLLOW_46); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -18174,7 +18174,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:6570:4: otherlv_2= 'val'
+                    // InternalPerspectiveDsl.g:6572:4: otherlv_2= 'val'
                     {
                     otherlv_2=(Token)match(input,109,FOLLOW_46); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -18188,7 +18188,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:6575:3: ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) )
+            // InternalPerspectiveDsl.g:6577:3: ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) )
             int alt96=2;
             int LA96_0 = input.LA(1);
 
@@ -18224,19 +18224,19 @@
             }
             switch (alt96) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:6576:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
+                    // InternalPerspectiveDsl.g:6578:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
                     {
-                    // InternalPerspectiveDsl.g:6576:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
-                    // InternalPerspectiveDsl.g:6577:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
+                    // InternalPerspectiveDsl.g:6578:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
+                    // InternalPerspectiveDsl.g:6579:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
                     {
-                    // InternalPerspectiveDsl.g:6590:5: ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
-                    // InternalPerspectiveDsl.g:6591:6: ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) )
+                    // InternalPerspectiveDsl.g:6592:5: ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
+                    // InternalPerspectiveDsl.g:6593:6: ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) )
                     {
-                    // InternalPerspectiveDsl.g:6591:6: ( (lv_type_3_0= ruleJvmTypeReference ) )
-                    // InternalPerspectiveDsl.g:6592:7: (lv_type_3_0= ruleJvmTypeReference )
+                    // InternalPerspectiveDsl.g:6593:6: ( (lv_type_3_0= ruleJvmTypeReference ) )
+                    // InternalPerspectiveDsl.g:6594:7: (lv_type_3_0= ruleJvmTypeReference )
                     {
-                    // InternalPerspectiveDsl.g:6592:7: (lv_type_3_0= ruleJvmTypeReference )
-                    // InternalPerspectiveDsl.g:6593:8: lv_type_3_0= ruleJvmTypeReference
+                    // InternalPerspectiveDsl.g:6594:7: (lv_type_3_0= ruleJvmTypeReference )
+                    // InternalPerspectiveDsl.g:6595:8: lv_type_3_0= ruleJvmTypeReference
                     {
                     if ( state.backtracking==0 ) {
 
@@ -18267,11 +18267,11 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:6610:6: ( (lv_name_4_0= ruleValidID ) )
-                    // InternalPerspectiveDsl.g:6611:7: (lv_name_4_0= ruleValidID )
+                    // InternalPerspectiveDsl.g:6612:6: ( (lv_name_4_0= ruleValidID ) )
+                    // InternalPerspectiveDsl.g:6613:7: (lv_name_4_0= ruleValidID )
                     {
-                    // InternalPerspectiveDsl.g:6611:7: (lv_name_4_0= ruleValidID )
-                    // InternalPerspectiveDsl.g:6612:8: lv_name_4_0= ruleValidID
+                    // InternalPerspectiveDsl.g:6613:7: (lv_name_4_0= ruleValidID )
+                    // InternalPerspectiveDsl.g:6614:8: lv_name_4_0= ruleValidID
                     {
                     if ( state.backtracking==0 ) {
 
@@ -18312,13 +18312,13 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:6632:4: ( (lv_name_5_0= ruleValidID ) )
+                    // InternalPerspectiveDsl.g:6634:4: ( (lv_name_5_0= ruleValidID ) )
                     {
-                    // InternalPerspectiveDsl.g:6632:4: ( (lv_name_5_0= ruleValidID ) )
-                    // InternalPerspectiveDsl.g:6633:5: (lv_name_5_0= ruleValidID )
+                    // InternalPerspectiveDsl.g:6634:4: ( (lv_name_5_0= ruleValidID ) )
+                    // InternalPerspectiveDsl.g:6635:5: (lv_name_5_0= ruleValidID )
                     {
-                    // InternalPerspectiveDsl.g:6633:5: (lv_name_5_0= ruleValidID )
-                    // InternalPerspectiveDsl.g:6634:6: lv_name_5_0= ruleValidID
+                    // InternalPerspectiveDsl.g:6635:5: (lv_name_5_0= ruleValidID )
+                    // InternalPerspectiveDsl.g:6636:6: lv_name_5_0= ruleValidID
                     {
                     if ( state.backtracking==0 ) {
 
@@ -18355,7 +18355,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:6652:3: (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
+            // InternalPerspectiveDsl.g:6654:3: (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
             int alt97=2;
             int LA97_0 = input.LA(1);
 
@@ -18364,7 +18364,7 @@
             }
             switch (alt97) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:6653:4: otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) )
+                    // InternalPerspectiveDsl.g:6655:4: otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) )
                     {
                     otherlv_6=(Token)match(input,61,FOLLOW_33); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -18372,11 +18372,11 @@
                       				newLeafNode(otherlv_6, grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0());
                       			
                     }
-                    // InternalPerspectiveDsl.g:6657:4: ( (lv_right_7_0= ruleXExpression ) )
-                    // InternalPerspectiveDsl.g:6658:5: (lv_right_7_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:6659:4: ( (lv_right_7_0= ruleXExpression ) )
+                    // InternalPerspectiveDsl.g:6660:5: (lv_right_7_0= ruleXExpression )
                     {
-                    // InternalPerspectiveDsl.g:6658:5: (lv_right_7_0= ruleXExpression )
-                    // InternalPerspectiveDsl.g:6659:6: lv_right_7_0= ruleXExpression
+                    // InternalPerspectiveDsl.g:6660:5: (lv_right_7_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:6661:6: lv_right_7_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -18438,7 +18438,7 @@
 
 
     // $ANTLR start "entryRuleJvmFormalParameter"
-    // InternalPerspectiveDsl.g:6681:1: entryRuleJvmFormalParameter returns [EObject current=null] : iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF ;
+    // InternalPerspectiveDsl.g:6683:1: entryRuleJvmFormalParameter returns [EObject current=null] : iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF ;
     public final EObject entryRuleJvmFormalParameter() throws RecognitionException {
         EObject current = null;
 
@@ -18446,8 +18446,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:6681:59: (iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF )
-            // InternalPerspectiveDsl.g:6682:2: iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF
+            // InternalPerspectiveDsl.g:6683:59: (iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF )
+            // InternalPerspectiveDsl.g:6684:2: iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmFormalParameterRule()); 
@@ -18478,7 +18478,7 @@
 
 
     // $ANTLR start "ruleJvmFormalParameter"
-    // InternalPerspectiveDsl.g:6688:1: ruleJvmFormalParameter returns [EObject current=null] : ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) ;
+    // InternalPerspectiveDsl.g:6690:1: ruleJvmFormalParameter returns [EObject current=null] : ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) ;
     public final EObject ruleJvmFormalParameter() throws RecognitionException {
         EObject current = null;
 
@@ -18491,13 +18491,13 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:6694:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) )
-            // InternalPerspectiveDsl.g:6695:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
+            // InternalPerspectiveDsl.g:6696:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) )
+            // InternalPerspectiveDsl.g:6697:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
             {
-            // InternalPerspectiveDsl.g:6695:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
-            // InternalPerspectiveDsl.g:6696:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) )
+            // InternalPerspectiveDsl.g:6697:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
+            // InternalPerspectiveDsl.g:6698:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) )
             {
-            // InternalPerspectiveDsl.g:6696:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )?
+            // InternalPerspectiveDsl.g:6698:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )?
             int alt98=2;
             int LA98_0 = input.LA(1);
 
@@ -18513,10 +18513,10 @@
             }
             switch (alt98) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:6697:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+                    // InternalPerspectiveDsl.g:6699:4: (lv_parameterType_0_0= ruleJvmTypeReference )
                     {
-                    // InternalPerspectiveDsl.g:6697:4: (lv_parameterType_0_0= ruleJvmTypeReference )
-                    // InternalPerspectiveDsl.g:6698:5: lv_parameterType_0_0= ruleJvmTypeReference
+                    // InternalPerspectiveDsl.g:6699:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+                    // InternalPerspectiveDsl.g:6700:5: lv_parameterType_0_0= ruleJvmTypeReference
                     {
                     if ( state.backtracking==0 ) {
 
@@ -18550,11 +18550,11 @@
 
             }
 
-            // InternalPerspectiveDsl.g:6715:3: ( (lv_name_1_0= ruleValidID ) )
-            // InternalPerspectiveDsl.g:6716:4: (lv_name_1_0= ruleValidID )
+            // InternalPerspectiveDsl.g:6717:3: ( (lv_name_1_0= ruleValidID ) )
+            // InternalPerspectiveDsl.g:6718:4: (lv_name_1_0= ruleValidID )
             {
-            // InternalPerspectiveDsl.g:6716:4: (lv_name_1_0= ruleValidID )
-            // InternalPerspectiveDsl.g:6717:5: lv_name_1_0= ruleValidID
+            // InternalPerspectiveDsl.g:6718:4: (lv_name_1_0= ruleValidID )
+            // InternalPerspectiveDsl.g:6719:5: lv_name_1_0= ruleValidID
             {
             if ( state.backtracking==0 ) {
 
@@ -18610,7 +18610,7 @@
 
 
     // $ANTLR start "entryRuleFullJvmFormalParameter"
-    // InternalPerspectiveDsl.g:6738:1: entryRuleFullJvmFormalParameter returns [EObject current=null] : iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF ;
+    // InternalPerspectiveDsl.g:6740:1: entryRuleFullJvmFormalParameter returns [EObject current=null] : iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF ;
     public final EObject entryRuleFullJvmFormalParameter() throws RecognitionException {
         EObject current = null;
 
@@ -18618,8 +18618,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:6738:63: (iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF )
-            // InternalPerspectiveDsl.g:6739:2: iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF
+            // InternalPerspectiveDsl.g:6740:63: (iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF )
+            // InternalPerspectiveDsl.g:6741:2: iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getFullJvmFormalParameterRule()); 
@@ -18650,7 +18650,7 @@
 
 
     // $ANTLR start "ruleFullJvmFormalParameter"
-    // InternalPerspectiveDsl.g:6745:1: ruleFullJvmFormalParameter returns [EObject current=null] : ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) ;
+    // InternalPerspectiveDsl.g:6747:1: ruleFullJvmFormalParameter returns [EObject current=null] : ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) ;
     public final EObject ruleFullJvmFormalParameter() throws RecognitionException {
         EObject current = null;
 
@@ -18663,17 +18663,17 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:6751:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) )
-            // InternalPerspectiveDsl.g:6752:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
+            // InternalPerspectiveDsl.g:6753:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) )
+            // InternalPerspectiveDsl.g:6754:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
             {
-            // InternalPerspectiveDsl.g:6752:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
-            // InternalPerspectiveDsl.g:6753:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) )
+            // InternalPerspectiveDsl.g:6754:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
+            // InternalPerspectiveDsl.g:6755:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) )
             {
-            // InternalPerspectiveDsl.g:6753:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )
-            // InternalPerspectiveDsl.g:6754:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:6755:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:6756:4: (lv_parameterType_0_0= ruleJvmTypeReference )
             {
-            // InternalPerspectiveDsl.g:6754:4: (lv_parameterType_0_0= ruleJvmTypeReference )
-            // InternalPerspectiveDsl.g:6755:5: lv_parameterType_0_0= ruleJvmTypeReference
+            // InternalPerspectiveDsl.g:6756:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:6757:5: lv_parameterType_0_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
 
@@ -18704,11 +18704,11 @@
 
             }
 
-            // InternalPerspectiveDsl.g:6772:3: ( (lv_name_1_0= ruleValidID ) )
-            // InternalPerspectiveDsl.g:6773:4: (lv_name_1_0= ruleValidID )
+            // InternalPerspectiveDsl.g:6774:3: ( (lv_name_1_0= ruleValidID ) )
+            // InternalPerspectiveDsl.g:6775:4: (lv_name_1_0= ruleValidID )
             {
-            // InternalPerspectiveDsl.g:6773:4: (lv_name_1_0= ruleValidID )
-            // InternalPerspectiveDsl.g:6774:5: lv_name_1_0= ruleValidID
+            // InternalPerspectiveDsl.g:6775:4: (lv_name_1_0= ruleValidID )
+            // InternalPerspectiveDsl.g:6776:5: lv_name_1_0= ruleValidID
             {
             if ( state.backtracking==0 ) {
 
@@ -18764,7 +18764,7 @@
 
 
     // $ANTLR start "entryRuleXFeatureCall"
-    // InternalPerspectiveDsl.g:6795:1: entryRuleXFeatureCall returns [EObject current=null] : iv_ruleXFeatureCall= ruleXFeatureCall EOF ;
+    // InternalPerspectiveDsl.g:6797:1: entryRuleXFeatureCall returns [EObject current=null] : iv_ruleXFeatureCall= ruleXFeatureCall EOF ;
     public final EObject entryRuleXFeatureCall() throws RecognitionException {
         EObject current = null;
 
@@ -18772,8 +18772,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:6795:53: (iv_ruleXFeatureCall= ruleXFeatureCall EOF )
-            // InternalPerspectiveDsl.g:6796:2: iv_ruleXFeatureCall= ruleXFeatureCall EOF
+            // InternalPerspectiveDsl.g:6797:53: (iv_ruleXFeatureCall= ruleXFeatureCall EOF )
+            // InternalPerspectiveDsl.g:6798:2: iv_ruleXFeatureCall= ruleXFeatureCall EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXFeatureCallRule()); 
@@ -18804,7 +18804,7 @@
 
 
     // $ANTLR start "ruleXFeatureCall"
-    // InternalPerspectiveDsl.g:6802:1: ruleXFeatureCall returns [EObject current=null] : ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? ) ;
+    // InternalPerspectiveDsl.g:6804:1: ruleXFeatureCall returns [EObject current=null] : ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? ) ;
     public final EObject ruleXFeatureCall() throws RecognitionException {
         EObject current = null;
 
@@ -18831,14 +18831,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:6808:2: ( ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? ) )
-            // InternalPerspectiveDsl.g:6809:2: ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? )
+            // InternalPerspectiveDsl.g:6810:2: ( ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? ) )
+            // InternalPerspectiveDsl.g:6811:2: ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? )
             {
-            // InternalPerspectiveDsl.g:6809:2: ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? )
-            // InternalPerspectiveDsl.g:6810:3: () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
+            // InternalPerspectiveDsl.g:6811:2: ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? )
+            // InternalPerspectiveDsl.g:6812:3: () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
             {
-            // InternalPerspectiveDsl.g:6810:3: ()
-            // InternalPerspectiveDsl.g:6811:4: 
+            // InternalPerspectiveDsl.g:6812:3: ()
+            // InternalPerspectiveDsl.g:6813:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -18850,7 +18850,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:6817:3: (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )?
+            // InternalPerspectiveDsl.g:6819:3: (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )?
             int alt100=2;
             int LA100_0 = input.LA(1);
 
@@ -18859,7 +18859,7 @@
             }
             switch (alt100) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:6818:4: otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>'
+                    // InternalPerspectiveDsl.g:6820:4: otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>'
                     {
                     otherlv_1=(Token)match(input,70,FOLLOW_58); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -18867,11 +18867,11 @@
                       				newLeafNode(otherlv_1, grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0());
                       			
                     }
-                    // InternalPerspectiveDsl.g:6822:4: ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) )
-                    // InternalPerspectiveDsl.g:6823:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
+                    // InternalPerspectiveDsl.g:6824:4: ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) )
+                    // InternalPerspectiveDsl.g:6825:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
                     {
-                    // InternalPerspectiveDsl.g:6823:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
-                    // InternalPerspectiveDsl.g:6824:6: lv_typeArguments_2_0= ruleJvmArgumentTypeReference
+                    // InternalPerspectiveDsl.g:6825:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
+                    // InternalPerspectiveDsl.g:6826:6: lv_typeArguments_2_0= ruleJvmArgumentTypeReference
                     {
                     if ( state.backtracking==0 ) {
 
@@ -18902,7 +18902,7 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:6841:4: (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )*
+                    // InternalPerspectiveDsl.g:6843:4: (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )*
                     loop99:
                     do {
                         int alt99=2;
@@ -18915,7 +18915,7 @@
 
                         switch (alt99) {
                     	case 1 :
-                    	    // InternalPerspectiveDsl.g:6842:5: otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalPerspectiveDsl.g:6844:5: otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
                     	    {
                     	    otherlv_3=(Token)match(input,59,FOLLOW_58); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
@@ -18923,11 +18923,11 @@
                     	      					newLeafNode(otherlv_3, grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0());
                     	      				
                     	    }
-                    	    // InternalPerspectiveDsl.g:6846:5: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
-                    	    // InternalPerspectiveDsl.g:6847:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    	    // InternalPerspectiveDsl.g:6848:5: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalPerspectiveDsl.g:6849:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                     	    {
-                    	    // InternalPerspectiveDsl.g:6847:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
-                    	    // InternalPerspectiveDsl.g:6848:7: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
+                    	    // InternalPerspectiveDsl.g:6849:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    	    // InternalPerspectiveDsl.g:6850:7: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -18979,11 +18979,11 @@
 
             }
 
-            // InternalPerspectiveDsl.g:6871:3: ( ( ruleIdOrSuper ) )
-            // InternalPerspectiveDsl.g:6872:4: ( ruleIdOrSuper )
+            // InternalPerspectiveDsl.g:6873:3: ( ( ruleIdOrSuper ) )
+            // InternalPerspectiveDsl.g:6874:4: ( ruleIdOrSuper )
             {
-            // InternalPerspectiveDsl.g:6872:4: ( ruleIdOrSuper )
-            // InternalPerspectiveDsl.g:6873:5: ruleIdOrSuper
+            // InternalPerspectiveDsl.g:6874:4: ( ruleIdOrSuper )
+            // InternalPerspectiveDsl.g:6875:5: ruleIdOrSuper
             {
             if ( state.backtracking==0 ) {
 
@@ -19013,18 +19013,18 @@
 
             }
 
-            // InternalPerspectiveDsl.g:6887:3: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )?
+            // InternalPerspectiveDsl.g:6889:3: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )?
             int alt103=2;
             alt103 = dfa103.predict(input);
             switch (alt103) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:6888:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')'
+                    // InternalPerspectiveDsl.g:6890:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')'
                     {
-                    // InternalPerspectiveDsl.g:6888:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) )
-                    // InternalPerspectiveDsl.g:6889:5: ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' )
+                    // InternalPerspectiveDsl.g:6890:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) )
+                    // InternalPerspectiveDsl.g:6891:5: ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' )
                     {
-                    // InternalPerspectiveDsl.g:6893:5: (lv_explicitOperationCall_7_0= '(' )
-                    // InternalPerspectiveDsl.g:6894:6: lv_explicitOperationCall_7_0= '('
+                    // InternalPerspectiveDsl.g:6895:5: (lv_explicitOperationCall_7_0= '(' )
+                    // InternalPerspectiveDsl.g:6896:6: lv_explicitOperationCall_7_0= '('
                     {
                     lv_explicitOperationCall_7_0=(Token)match(input,58,FOLLOW_61); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -19046,18 +19046,18 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:6906:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?
+                    // InternalPerspectiveDsl.g:6908:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?
                     int alt102=3;
                     alt102 = dfa102.predict(input);
                     switch (alt102) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:6907:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
+                            // InternalPerspectiveDsl.g:6909:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
                             {
-                            // InternalPerspectiveDsl.g:6907:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
-                            // InternalPerspectiveDsl.g:6908:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure )
+                            // InternalPerspectiveDsl.g:6909:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
+                            // InternalPerspectiveDsl.g:6910:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure )
                             {
-                            // InternalPerspectiveDsl.g:6933:6: (lv_featureCallArguments_8_0= ruleXShortClosure )
-                            // InternalPerspectiveDsl.g:6934:7: lv_featureCallArguments_8_0= ruleXShortClosure
+                            // InternalPerspectiveDsl.g:6935:6: (lv_featureCallArguments_8_0= ruleXShortClosure )
+                            // InternalPerspectiveDsl.g:6936:7: lv_featureCallArguments_8_0= ruleXShortClosure
                             {
                             if ( state.backtracking==0 ) {
 
@@ -19092,16 +19092,16 @@
                             }
                             break;
                         case 2 :
-                            // InternalPerspectiveDsl.g:6952:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
+                            // InternalPerspectiveDsl.g:6954:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
                             {
-                            // InternalPerspectiveDsl.g:6952:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
-                            // InternalPerspectiveDsl.g:6953:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
+                            // InternalPerspectiveDsl.g:6954:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
+                            // InternalPerspectiveDsl.g:6955:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
                             {
-                            // InternalPerspectiveDsl.g:6953:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) )
-                            // InternalPerspectiveDsl.g:6954:7: (lv_featureCallArguments_9_0= ruleXExpression )
+                            // InternalPerspectiveDsl.g:6955:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) )
+                            // InternalPerspectiveDsl.g:6956:7: (lv_featureCallArguments_9_0= ruleXExpression )
                             {
-                            // InternalPerspectiveDsl.g:6954:7: (lv_featureCallArguments_9_0= ruleXExpression )
-                            // InternalPerspectiveDsl.g:6955:8: lv_featureCallArguments_9_0= ruleXExpression
+                            // InternalPerspectiveDsl.g:6956:7: (lv_featureCallArguments_9_0= ruleXExpression )
+                            // InternalPerspectiveDsl.g:6957:8: lv_featureCallArguments_9_0= ruleXExpression
                             {
                             if ( state.backtracking==0 ) {
 
@@ -19132,7 +19132,7 @@
 
                             }
 
-                            // InternalPerspectiveDsl.g:6972:6: (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
+                            // InternalPerspectiveDsl.g:6974:6: (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
                             loop101:
                             do {
                                 int alt101=2;
@@ -19145,7 +19145,7 @@
 
                                 switch (alt101) {
                             	case 1 :
-                            	    // InternalPerspectiveDsl.g:6973:7: otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) )
+                            	    // InternalPerspectiveDsl.g:6975:7: otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) )
                             	    {
                             	    otherlv_10=(Token)match(input,59,FOLLOW_33); if (state.failed) return current;
                             	    if ( state.backtracking==0 ) {
@@ -19153,11 +19153,11 @@
                             	      							newLeafNode(otherlv_10, grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0());
                             	      						
                             	    }
-                            	    // InternalPerspectiveDsl.g:6977:7: ( (lv_featureCallArguments_11_0= ruleXExpression ) )
-                            	    // InternalPerspectiveDsl.g:6978:8: (lv_featureCallArguments_11_0= ruleXExpression )
+                            	    // InternalPerspectiveDsl.g:6979:7: ( (lv_featureCallArguments_11_0= ruleXExpression ) )
+                            	    // InternalPerspectiveDsl.g:6980:8: (lv_featureCallArguments_11_0= ruleXExpression )
                             	    {
-                            	    // InternalPerspectiveDsl.g:6978:8: (lv_featureCallArguments_11_0= ruleXExpression )
-                            	    // InternalPerspectiveDsl.g:6979:9: lv_featureCallArguments_11_0= ruleXExpression
+                            	    // InternalPerspectiveDsl.g:6980:8: (lv_featureCallArguments_11_0= ruleXExpression )
+                            	    // InternalPerspectiveDsl.g:6981:9: lv_featureCallArguments_11_0= ruleXExpression
                             	    {
                             	    if ( state.backtracking==0 ) {
 
@@ -19218,15 +19218,15 @@
 
             }
 
-            // InternalPerspectiveDsl.g:7004:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
+            // InternalPerspectiveDsl.g:7006:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
             int alt104=2;
             alt104 = dfa104.predict(input);
             switch (alt104) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:7005:4: ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure )
+                    // InternalPerspectiveDsl.g:7007:4: ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure )
                     {
-                    // InternalPerspectiveDsl.g:7011:4: (lv_featureCallArguments_13_0= ruleXClosure )
-                    // InternalPerspectiveDsl.g:7012:5: lv_featureCallArguments_13_0= ruleXClosure
+                    // InternalPerspectiveDsl.g:7013:4: (lv_featureCallArguments_13_0= ruleXClosure )
+                    // InternalPerspectiveDsl.g:7014:5: lv_featureCallArguments_13_0= ruleXClosure
                     {
                     if ( state.backtracking==0 ) {
 
@@ -19285,7 +19285,7 @@
 
 
     // $ANTLR start "entryRuleFeatureCallID"
-    // InternalPerspectiveDsl.g:7033:1: entryRuleFeatureCallID returns [String current=null] : iv_ruleFeatureCallID= ruleFeatureCallID EOF ;
+    // InternalPerspectiveDsl.g:7035:1: entryRuleFeatureCallID returns [String current=null] : iv_ruleFeatureCallID= ruleFeatureCallID EOF ;
     public final String entryRuleFeatureCallID() throws RecognitionException {
         String current = null;
 
@@ -19293,8 +19293,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:7033:53: (iv_ruleFeatureCallID= ruleFeatureCallID EOF )
-            // InternalPerspectiveDsl.g:7034:2: iv_ruleFeatureCallID= ruleFeatureCallID EOF
+            // InternalPerspectiveDsl.g:7035:53: (iv_ruleFeatureCallID= ruleFeatureCallID EOF )
+            // InternalPerspectiveDsl.g:7036:2: iv_ruleFeatureCallID= ruleFeatureCallID EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getFeatureCallIDRule()); 
@@ -19325,7 +19325,7 @@
 
 
     // $ANTLR start "ruleFeatureCallID"
-    // InternalPerspectiveDsl.g:7040:1: ruleFeatureCallID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) ;
+    // InternalPerspectiveDsl.g:7042:1: ruleFeatureCallID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) ;
     public final AntlrDatatypeRuleToken ruleFeatureCallID() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -19337,10 +19337,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:7046:2: ( (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) )
-            // InternalPerspectiveDsl.g:7047:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
+            // InternalPerspectiveDsl.g:7048:2: ( (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) )
+            // InternalPerspectiveDsl.g:7049:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
             {
-            // InternalPerspectiveDsl.g:7047:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
+            // InternalPerspectiveDsl.g:7049:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
             int alt105=5;
             switch ( input.LA(1) ) {
             case RULE_ID:
@@ -19378,7 +19378,7 @@
 
             switch (alt105) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:7048:3: this_ValidID_0= ruleValidID
+                    // InternalPerspectiveDsl.g:7050:3: this_ValidID_0= ruleValidID
                     {
                     if ( state.backtracking==0 ) {
 
@@ -19404,7 +19404,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:7059:3: kw= 'extends'
+                    // InternalPerspectiveDsl.g:7061:3: kw= 'extends'
                     {
                     kw=(Token)match(input,110,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -19417,7 +19417,7 @@
                     }
                     break;
                 case 3 :
-                    // InternalPerspectiveDsl.g:7065:3: kw= 'static'
+                    // InternalPerspectiveDsl.g:7067:3: kw= 'static'
                     {
                     kw=(Token)match(input,52,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -19430,7 +19430,7 @@
                     }
                     break;
                 case 4 :
-                    // InternalPerspectiveDsl.g:7071:3: kw= 'import'
+                    // InternalPerspectiveDsl.g:7073:3: kw= 'import'
                     {
                     kw=(Token)match(input,51,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -19443,7 +19443,7 @@
                     }
                     break;
                 case 5 :
-                    // InternalPerspectiveDsl.g:7077:3: kw= 'extension'
+                    // InternalPerspectiveDsl.g:7079:3: kw= 'extension'
                     {
                     kw=(Token)match(input,53,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -19480,7 +19480,7 @@
 
 
     // $ANTLR start "entryRuleIdOrSuper"
-    // InternalPerspectiveDsl.g:7086:1: entryRuleIdOrSuper returns [String current=null] : iv_ruleIdOrSuper= ruleIdOrSuper EOF ;
+    // InternalPerspectiveDsl.g:7088:1: entryRuleIdOrSuper returns [String current=null] : iv_ruleIdOrSuper= ruleIdOrSuper EOF ;
     public final String entryRuleIdOrSuper() throws RecognitionException {
         String current = null;
 
@@ -19488,8 +19488,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:7086:49: (iv_ruleIdOrSuper= ruleIdOrSuper EOF )
-            // InternalPerspectiveDsl.g:7087:2: iv_ruleIdOrSuper= ruleIdOrSuper EOF
+            // InternalPerspectiveDsl.g:7088:49: (iv_ruleIdOrSuper= ruleIdOrSuper EOF )
+            // InternalPerspectiveDsl.g:7089:2: iv_ruleIdOrSuper= ruleIdOrSuper EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getIdOrSuperRule()); 
@@ -19520,7 +19520,7 @@
 
 
     // $ANTLR start "ruleIdOrSuper"
-    // InternalPerspectiveDsl.g:7093:1: ruleIdOrSuper returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) ;
+    // InternalPerspectiveDsl.g:7095:1: ruleIdOrSuper returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) ;
     public final AntlrDatatypeRuleToken ruleIdOrSuper() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -19532,10 +19532,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:7099:2: ( (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) )
-            // InternalPerspectiveDsl.g:7100:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
+            // InternalPerspectiveDsl.g:7101:2: ( (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) )
+            // InternalPerspectiveDsl.g:7102:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
             {
-            // InternalPerspectiveDsl.g:7100:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
+            // InternalPerspectiveDsl.g:7102:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
             int alt106=2;
             int LA106_0 = input.LA(1);
 
@@ -19554,7 +19554,7 @@
             }
             switch (alt106) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:7101:3: this_FeatureCallID_0= ruleFeatureCallID
+                    // InternalPerspectiveDsl.g:7103:3: this_FeatureCallID_0= ruleFeatureCallID
                     {
                     if ( state.backtracking==0 ) {
 
@@ -19580,7 +19580,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:7112:3: kw= 'super'
+                    // InternalPerspectiveDsl.g:7114:3: kw= 'super'
                     {
                     kw=(Token)match(input,111,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -19617,7 +19617,7 @@
 
 
     // $ANTLR start "entryRuleXConstructorCall"
-    // InternalPerspectiveDsl.g:7121:1: entryRuleXConstructorCall returns [EObject current=null] : iv_ruleXConstructorCall= ruleXConstructorCall EOF ;
+    // InternalPerspectiveDsl.g:7123:1: entryRuleXConstructorCall returns [EObject current=null] : iv_ruleXConstructorCall= ruleXConstructorCall EOF ;
     public final EObject entryRuleXConstructorCall() throws RecognitionException {
         EObject current = null;
 
@@ -19625,8 +19625,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:7121:57: (iv_ruleXConstructorCall= ruleXConstructorCall EOF )
-            // InternalPerspectiveDsl.g:7122:2: iv_ruleXConstructorCall= ruleXConstructorCall EOF
+            // InternalPerspectiveDsl.g:7123:57: (iv_ruleXConstructorCall= ruleXConstructorCall EOF )
+            // InternalPerspectiveDsl.g:7124:2: iv_ruleXConstructorCall= ruleXConstructorCall EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXConstructorCallRule()); 
@@ -19657,7 +19657,7 @@
 
 
     // $ANTLR start "ruleXConstructorCall"
-    // InternalPerspectiveDsl.g:7128:1: ruleXConstructorCall returns [EObject current=null] : ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? ) ;
+    // InternalPerspectiveDsl.g:7130:1: ruleXConstructorCall returns [EObject current=null] : ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? ) ;
     public final EObject ruleXConstructorCall() throws RecognitionException {
         EObject current = null;
 
@@ -19685,14 +19685,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:7134:2: ( ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? ) )
-            // InternalPerspectiveDsl.g:7135:2: ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? )
+            // InternalPerspectiveDsl.g:7136:2: ( ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? ) )
+            // InternalPerspectiveDsl.g:7137:2: ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? )
             {
-            // InternalPerspectiveDsl.g:7135:2: ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? )
-            // InternalPerspectiveDsl.g:7136:3: () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
+            // InternalPerspectiveDsl.g:7137:2: ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? )
+            // InternalPerspectiveDsl.g:7138:3: () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
             {
-            // InternalPerspectiveDsl.g:7136:3: ()
-            // InternalPerspectiveDsl.g:7137:4: 
+            // InternalPerspectiveDsl.g:7138:3: ()
+            // InternalPerspectiveDsl.g:7139:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -19710,11 +19710,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getXConstructorCallAccess().getNewKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:7147:3: ( ( ruleQualifiedName ) )
-            // InternalPerspectiveDsl.g:7148:4: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:7149:3: ( ( ruleQualifiedName ) )
+            // InternalPerspectiveDsl.g:7150:4: ( ruleQualifiedName )
             {
-            // InternalPerspectiveDsl.g:7148:4: ( ruleQualifiedName )
-            // InternalPerspectiveDsl.g:7149:5: ruleQualifiedName
+            // InternalPerspectiveDsl.g:7150:4: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:7151:5: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
 
@@ -19744,15 +19744,15 @@
 
             }
 
-            // InternalPerspectiveDsl.g:7163:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?
+            // InternalPerspectiveDsl.g:7165:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?
             int alt108=2;
             alt108 = dfa108.predict(input);
             switch (alt108) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:7164:4: ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>'
+                    // InternalPerspectiveDsl.g:7166:4: ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>'
                     {
-                    // InternalPerspectiveDsl.g:7164:4: ( ( '<' )=>otherlv_3= '<' )
-                    // InternalPerspectiveDsl.g:7165:5: ( '<' )=>otherlv_3= '<'
+                    // InternalPerspectiveDsl.g:7166:4: ( ( '<' )=>otherlv_3= '<' )
+                    // InternalPerspectiveDsl.g:7167:5: ( '<' )=>otherlv_3= '<'
                     {
                     otherlv_3=(Token)match(input,70,FOLLOW_58); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -19763,11 +19763,11 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:7171:4: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
-                    // InternalPerspectiveDsl.g:7172:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    // InternalPerspectiveDsl.g:7173:4: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
+                    // InternalPerspectiveDsl.g:7174:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                     {
-                    // InternalPerspectiveDsl.g:7172:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
-                    // InternalPerspectiveDsl.g:7173:6: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
+                    // InternalPerspectiveDsl.g:7174:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    // InternalPerspectiveDsl.g:7175:6: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
                     {
                     if ( state.backtracking==0 ) {
 
@@ -19798,7 +19798,7 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:7190:4: (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )*
+                    // InternalPerspectiveDsl.g:7192:4: (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )*
                     loop107:
                     do {
                         int alt107=2;
@@ -19811,7 +19811,7 @@
 
                         switch (alt107) {
                     	case 1 :
-                    	    // InternalPerspectiveDsl.g:7191:5: otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalPerspectiveDsl.g:7193:5: otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
                     	    {
                     	    otherlv_5=(Token)match(input,59,FOLLOW_58); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
@@ -19819,11 +19819,11 @@
                     	      					newLeafNode(otherlv_5, grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0());
                     	      				
                     	    }
-                    	    // InternalPerspectiveDsl.g:7195:5: ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
-                    	    // InternalPerspectiveDsl.g:7196:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
+                    	    // InternalPerspectiveDsl.g:7197:5: ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalPerspectiveDsl.g:7198:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
                     	    {
-                    	    // InternalPerspectiveDsl.g:7196:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
-                    	    // InternalPerspectiveDsl.g:7197:7: lv_typeArguments_6_0= ruleJvmArgumentTypeReference
+                    	    // InternalPerspectiveDsl.g:7198:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
+                    	    // InternalPerspectiveDsl.g:7199:7: lv_typeArguments_6_0= ruleJvmArgumentTypeReference
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -19875,18 +19875,18 @@
 
             }
 
-            // InternalPerspectiveDsl.g:7220:3: ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )?
+            // InternalPerspectiveDsl.g:7222:3: ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )?
             int alt111=2;
             alt111 = dfa111.predict(input);
             switch (alt111) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:7221:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')'
+                    // InternalPerspectiveDsl.g:7223:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')'
                     {
-                    // InternalPerspectiveDsl.g:7221:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) )
-                    // InternalPerspectiveDsl.g:7222:5: ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' )
+                    // InternalPerspectiveDsl.g:7223:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) )
+                    // InternalPerspectiveDsl.g:7224:5: ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' )
                     {
-                    // InternalPerspectiveDsl.g:7226:5: (lv_explicitConstructorCall_8_0= '(' )
-                    // InternalPerspectiveDsl.g:7227:6: lv_explicitConstructorCall_8_0= '('
+                    // InternalPerspectiveDsl.g:7228:5: (lv_explicitConstructorCall_8_0= '(' )
+                    // InternalPerspectiveDsl.g:7229:6: lv_explicitConstructorCall_8_0= '('
                     {
                     lv_explicitConstructorCall_8_0=(Token)match(input,58,FOLLOW_61); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -19908,18 +19908,18 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:7239:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?
+                    // InternalPerspectiveDsl.g:7241:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?
                     int alt110=3;
                     alt110 = dfa110.predict(input);
                     switch (alt110) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:7240:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
+                            // InternalPerspectiveDsl.g:7242:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
                             {
-                            // InternalPerspectiveDsl.g:7240:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
-                            // InternalPerspectiveDsl.g:7241:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure )
+                            // InternalPerspectiveDsl.g:7242:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
+                            // InternalPerspectiveDsl.g:7243:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure )
                             {
-                            // InternalPerspectiveDsl.g:7266:6: (lv_arguments_9_0= ruleXShortClosure )
-                            // InternalPerspectiveDsl.g:7267:7: lv_arguments_9_0= ruleXShortClosure
+                            // InternalPerspectiveDsl.g:7268:6: (lv_arguments_9_0= ruleXShortClosure )
+                            // InternalPerspectiveDsl.g:7269:7: lv_arguments_9_0= ruleXShortClosure
                             {
                             if ( state.backtracking==0 ) {
 
@@ -19954,16 +19954,16 @@
                             }
                             break;
                         case 2 :
-                            // InternalPerspectiveDsl.g:7285:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
+                            // InternalPerspectiveDsl.g:7287:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
                             {
-                            // InternalPerspectiveDsl.g:7285:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
-                            // InternalPerspectiveDsl.g:7286:6: ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
+                            // InternalPerspectiveDsl.g:7287:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
+                            // InternalPerspectiveDsl.g:7288:6: ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
                             {
-                            // InternalPerspectiveDsl.g:7286:6: ( (lv_arguments_10_0= ruleXExpression ) )
-                            // InternalPerspectiveDsl.g:7287:7: (lv_arguments_10_0= ruleXExpression )
+                            // InternalPerspectiveDsl.g:7288:6: ( (lv_arguments_10_0= ruleXExpression ) )
+                            // InternalPerspectiveDsl.g:7289:7: (lv_arguments_10_0= ruleXExpression )
                             {
-                            // InternalPerspectiveDsl.g:7287:7: (lv_arguments_10_0= ruleXExpression )
-                            // InternalPerspectiveDsl.g:7288:8: lv_arguments_10_0= ruleXExpression
+                            // InternalPerspectiveDsl.g:7289:7: (lv_arguments_10_0= ruleXExpression )
+                            // InternalPerspectiveDsl.g:7290:8: lv_arguments_10_0= ruleXExpression
                             {
                             if ( state.backtracking==0 ) {
 
@@ -19994,7 +19994,7 @@
 
                             }
 
-                            // InternalPerspectiveDsl.g:7305:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
+                            // InternalPerspectiveDsl.g:7307:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
                             loop109:
                             do {
                                 int alt109=2;
@@ -20007,7 +20007,7 @@
 
                                 switch (alt109) {
                             	case 1 :
-                            	    // InternalPerspectiveDsl.g:7306:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) )
+                            	    // InternalPerspectiveDsl.g:7308:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) )
                             	    {
                             	    otherlv_11=(Token)match(input,59,FOLLOW_33); if (state.failed) return current;
                             	    if ( state.backtracking==0 ) {
@@ -20015,11 +20015,11 @@
                             	      							newLeafNode(otherlv_11, grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0());
                             	      						
                             	    }
-                            	    // InternalPerspectiveDsl.g:7310:7: ( (lv_arguments_12_0= ruleXExpression ) )
-                            	    // InternalPerspectiveDsl.g:7311:8: (lv_arguments_12_0= ruleXExpression )
+                            	    // InternalPerspectiveDsl.g:7312:7: ( (lv_arguments_12_0= ruleXExpression ) )
+                            	    // InternalPerspectiveDsl.g:7313:8: (lv_arguments_12_0= ruleXExpression )
                             	    {
-                            	    // InternalPerspectiveDsl.g:7311:8: (lv_arguments_12_0= ruleXExpression )
-                            	    // InternalPerspectiveDsl.g:7312:9: lv_arguments_12_0= ruleXExpression
+                            	    // InternalPerspectiveDsl.g:7313:8: (lv_arguments_12_0= ruleXExpression )
+                            	    // InternalPerspectiveDsl.g:7314:9: lv_arguments_12_0= ruleXExpression
                             	    {
                             	    if ( state.backtracking==0 ) {
 
@@ -20080,15 +20080,15 @@
 
             }
 
-            // InternalPerspectiveDsl.g:7337:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
+            // InternalPerspectiveDsl.g:7339:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
             int alt112=2;
             alt112 = dfa112.predict(input);
             switch (alt112) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:7338:4: ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure )
+                    // InternalPerspectiveDsl.g:7340:4: ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure )
                     {
-                    // InternalPerspectiveDsl.g:7344:4: (lv_arguments_14_0= ruleXClosure )
-                    // InternalPerspectiveDsl.g:7345:5: lv_arguments_14_0= ruleXClosure
+                    // InternalPerspectiveDsl.g:7346:4: (lv_arguments_14_0= ruleXClosure )
+                    // InternalPerspectiveDsl.g:7347:5: lv_arguments_14_0= ruleXClosure
                     {
                     if ( state.backtracking==0 ) {
 
@@ -20147,7 +20147,7 @@
 
 
     // $ANTLR start "entryRuleXBooleanLiteral"
-    // InternalPerspectiveDsl.g:7366:1: entryRuleXBooleanLiteral returns [EObject current=null] : iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF ;
+    // InternalPerspectiveDsl.g:7368:1: entryRuleXBooleanLiteral returns [EObject current=null] : iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF ;
     public final EObject entryRuleXBooleanLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -20155,8 +20155,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:7366:56: (iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF )
-            // InternalPerspectiveDsl.g:7367:2: iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF
+            // InternalPerspectiveDsl.g:7368:56: (iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF )
+            // InternalPerspectiveDsl.g:7369:2: iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXBooleanLiteralRule()); 
@@ -20187,7 +20187,7 @@
 
 
     // $ANTLR start "ruleXBooleanLiteral"
-    // InternalPerspectiveDsl.g:7373:1: ruleXBooleanLiteral returns [EObject current=null] : ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) ;
+    // InternalPerspectiveDsl.g:7375:1: ruleXBooleanLiteral returns [EObject current=null] : ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) ;
     public final EObject ruleXBooleanLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -20198,14 +20198,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:7379:2: ( ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) )
-            // InternalPerspectiveDsl.g:7380:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
+            // InternalPerspectiveDsl.g:7381:2: ( ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) )
+            // InternalPerspectiveDsl.g:7382:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
             {
-            // InternalPerspectiveDsl.g:7380:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
-            // InternalPerspectiveDsl.g:7381:3: () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
+            // InternalPerspectiveDsl.g:7382:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
+            // InternalPerspectiveDsl.g:7383:3: () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
             {
-            // InternalPerspectiveDsl.g:7381:3: ()
-            // InternalPerspectiveDsl.g:7382:4: 
+            // InternalPerspectiveDsl.g:7383:3: ()
+            // InternalPerspectiveDsl.g:7384:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -20217,7 +20217,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:7388:3: (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
+            // InternalPerspectiveDsl.g:7390:3: (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
             int alt113=2;
             int LA113_0 = input.LA(1);
 
@@ -20236,7 +20236,7 @@
             }
             switch (alt113) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:7389:4: otherlv_1= 'false'
+                    // InternalPerspectiveDsl.g:7391:4: otherlv_1= 'false'
                     {
                     otherlv_1=(Token)match(input,113,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -20248,13 +20248,13 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:7394:4: ( (lv_isTrue_2_0= 'true' ) )
+                    // InternalPerspectiveDsl.g:7396:4: ( (lv_isTrue_2_0= 'true' ) )
                     {
-                    // InternalPerspectiveDsl.g:7394:4: ( (lv_isTrue_2_0= 'true' ) )
-                    // InternalPerspectiveDsl.g:7395:5: (lv_isTrue_2_0= 'true' )
+                    // InternalPerspectiveDsl.g:7396:4: ( (lv_isTrue_2_0= 'true' ) )
+                    // InternalPerspectiveDsl.g:7397:5: (lv_isTrue_2_0= 'true' )
                     {
-                    // InternalPerspectiveDsl.g:7395:5: (lv_isTrue_2_0= 'true' )
-                    // InternalPerspectiveDsl.g:7396:6: lv_isTrue_2_0= 'true'
+                    // InternalPerspectiveDsl.g:7397:5: (lv_isTrue_2_0= 'true' )
+                    // InternalPerspectiveDsl.g:7398:6: lv_isTrue_2_0= 'true'
                     {
                     lv_isTrue_2_0=(Token)match(input,114,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -20307,7 +20307,7 @@
 
 
     // $ANTLR start "entryRuleXNullLiteral"
-    // InternalPerspectiveDsl.g:7413:1: entryRuleXNullLiteral returns [EObject current=null] : iv_ruleXNullLiteral= ruleXNullLiteral EOF ;
+    // InternalPerspectiveDsl.g:7415:1: entryRuleXNullLiteral returns [EObject current=null] : iv_ruleXNullLiteral= ruleXNullLiteral EOF ;
     public final EObject entryRuleXNullLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -20315,8 +20315,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:7413:53: (iv_ruleXNullLiteral= ruleXNullLiteral EOF )
-            // InternalPerspectiveDsl.g:7414:2: iv_ruleXNullLiteral= ruleXNullLiteral EOF
+            // InternalPerspectiveDsl.g:7415:53: (iv_ruleXNullLiteral= ruleXNullLiteral EOF )
+            // InternalPerspectiveDsl.g:7416:2: iv_ruleXNullLiteral= ruleXNullLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXNullLiteralRule()); 
@@ -20347,7 +20347,7 @@
 
 
     // $ANTLR start "ruleXNullLiteral"
-    // InternalPerspectiveDsl.g:7420:1: ruleXNullLiteral returns [EObject current=null] : ( () otherlv_1= 'null' ) ;
+    // InternalPerspectiveDsl.g:7422:1: ruleXNullLiteral returns [EObject current=null] : ( () otherlv_1= 'null' ) ;
     public final EObject ruleXNullLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -20357,14 +20357,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:7426:2: ( ( () otherlv_1= 'null' ) )
-            // InternalPerspectiveDsl.g:7427:2: ( () otherlv_1= 'null' )
+            // InternalPerspectiveDsl.g:7428:2: ( ( () otherlv_1= 'null' ) )
+            // InternalPerspectiveDsl.g:7429:2: ( () otherlv_1= 'null' )
             {
-            // InternalPerspectiveDsl.g:7427:2: ( () otherlv_1= 'null' )
-            // InternalPerspectiveDsl.g:7428:3: () otherlv_1= 'null'
+            // InternalPerspectiveDsl.g:7429:2: ( () otherlv_1= 'null' )
+            // InternalPerspectiveDsl.g:7430:3: () otherlv_1= 'null'
             {
-            // InternalPerspectiveDsl.g:7428:3: ()
-            // InternalPerspectiveDsl.g:7429:4: 
+            // InternalPerspectiveDsl.g:7430:3: ()
+            // InternalPerspectiveDsl.g:7431:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -20407,7 +20407,7 @@
 
 
     // $ANTLR start "entryRuleXNumberLiteral"
-    // InternalPerspectiveDsl.g:7443:1: entryRuleXNumberLiteral returns [EObject current=null] : iv_ruleXNumberLiteral= ruleXNumberLiteral EOF ;
+    // InternalPerspectiveDsl.g:7445:1: entryRuleXNumberLiteral returns [EObject current=null] : iv_ruleXNumberLiteral= ruleXNumberLiteral EOF ;
     public final EObject entryRuleXNumberLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -20415,8 +20415,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:7443:55: (iv_ruleXNumberLiteral= ruleXNumberLiteral EOF )
-            // InternalPerspectiveDsl.g:7444:2: iv_ruleXNumberLiteral= ruleXNumberLiteral EOF
+            // InternalPerspectiveDsl.g:7445:55: (iv_ruleXNumberLiteral= ruleXNumberLiteral EOF )
+            // InternalPerspectiveDsl.g:7446:2: iv_ruleXNumberLiteral= ruleXNumberLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXNumberLiteralRule()); 
@@ -20447,7 +20447,7 @@
 
 
     // $ANTLR start "ruleXNumberLiteral"
-    // InternalPerspectiveDsl.g:7450:1: ruleXNumberLiteral returns [EObject current=null] : ( () ( (lv_value_1_0= ruleNumber ) ) ) ;
+    // InternalPerspectiveDsl.g:7452:1: ruleXNumberLiteral returns [EObject current=null] : ( () ( (lv_value_1_0= ruleNumber ) ) ) ;
     public final EObject ruleXNumberLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -20458,14 +20458,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:7456:2: ( ( () ( (lv_value_1_0= ruleNumber ) ) ) )
-            // InternalPerspectiveDsl.g:7457:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
+            // InternalPerspectiveDsl.g:7458:2: ( ( () ( (lv_value_1_0= ruleNumber ) ) ) )
+            // InternalPerspectiveDsl.g:7459:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
             {
-            // InternalPerspectiveDsl.g:7457:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
-            // InternalPerspectiveDsl.g:7458:3: () ( (lv_value_1_0= ruleNumber ) )
+            // InternalPerspectiveDsl.g:7459:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
+            // InternalPerspectiveDsl.g:7460:3: () ( (lv_value_1_0= ruleNumber ) )
             {
-            // InternalPerspectiveDsl.g:7458:3: ()
-            // InternalPerspectiveDsl.g:7459:4: 
+            // InternalPerspectiveDsl.g:7460:3: ()
+            // InternalPerspectiveDsl.g:7461:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -20477,11 +20477,11 @@
 
             }
 
-            // InternalPerspectiveDsl.g:7465:3: ( (lv_value_1_0= ruleNumber ) )
-            // InternalPerspectiveDsl.g:7466:4: (lv_value_1_0= ruleNumber )
+            // InternalPerspectiveDsl.g:7467:3: ( (lv_value_1_0= ruleNumber ) )
+            // InternalPerspectiveDsl.g:7468:4: (lv_value_1_0= ruleNumber )
             {
-            // InternalPerspectiveDsl.g:7466:4: (lv_value_1_0= ruleNumber )
-            // InternalPerspectiveDsl.g:7467:5: lv_value_1_0= ruleNumber
+            // InternalPerspectiveDsl.g:7468:4: (lv_value_1_0= ruleNumber )
+            // InternalPerspectiveDsl.g:7469:5: lv_value_1_0= ruleNumber
             {
             if ( state.backtracking==0 ) {
 
@@ -20537,7 +20537,7 @@
 
 
     // $ANTLR start "entryRuleXStringLiteral"
-    // InternalPerspectiveDsl.g:7488:1: entryRuleXStringLiteral returns [EObject current=null] : iv_ruleXStringLiteral= ruleXStringLiteral EOF ;
+    // InternalPerspectiveDsl.g:7490:1: entryRuleXStringLiteral returns [EObject current=null] : iv_ruleXStringLiteral= ruleXStringLiteral EOF ;
     public final EObject entryRuleXStringLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -20545,8 +20545,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:7488:55: (iv_ruleXStringLiteral= ruleXStringLiteral EOF )
-            // InternalPerspectiveDsl.g:7489:2: iv_ruleXStringLiteral= ruleXStringLiteral EOF
+            // InternalPerspectiveDsl.g:7490:55: (iv_ruleXStringLiteral= ruleXStringLiteral EOF )
+            // InternalPerspectiveDsl.g:7491:2: iv_ruleXStringLiteral= ruleXStringLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXStringLiteralRule()); 
@@ -20577,7 +20577,7 @@
 
 
     // $ANTLR start "ruleXStringLiteral"
-    // InternalPerspectiveDsl.g:7495:1: ruleXStringLiteral returns [EObject current=null] : ( () ( (lv_value_1_0= RULE_STRING ) ) ) ;
+    // InternalPerspectiveDsl.g:7497:1: ruleXStringLiteral returns [EObject current=null] : ( () ( (lv_value_1_0= RULE_STRING ) ) ) ;
     public final EObject ruleXStringLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -20587,14 +20587,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:7501:2: ( ( () ( (lv_value_1_0= RULE_STRING ) ) ) )
-            // InternalPerspectiveDsl.g:7502:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
+            // InternalPerspectiveDsl.g:7503:2: ( ( () ( (lv_value_1_0= RULE_STRING ) ) ) )
+            // InternalPerspectiveDsl.g:7504:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
             {
-            // InternalPerspectiveDsl.g:7502:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
-            // InternalPerspectiveDsl.g:7503:3: () ( (lv_value_1_0= RULE_STRING ) )
+            // InternalPerspectiveDsl.g:7504:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
+            // InternalPerspectiveDsl.g:7505:3: () ( (lv_value_1_0= RULE_STRING ) )
             {
-            // InternalPerspectiveDsl.g:7503:3: ()
-            // InternalPerspectiveDsl.g:7504:4: 
+            // InternalPerspectiveDsl.g:7505:3: ()
+            // InternalPerspectiveDsl.g:7506:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -20606,11 +20606,11 @@
 
             }
 
-            // InternalPerspectiveDsl.g:7510:3: ( (lv_value_1_0= RULE_STRING ) )
-            // InternalPerspectiveDsl.g:7511:4: (lv_value_1_0= RULE_STRING )
+            // InternalPerspectiveDsl.g:7512:3: ( (lv_value_1_0= RULE_STRING ) )
+            // InternalPerspectiveDsl.g:7513:4: (lv_value_1_0= RULE_STRING )
             {
-            // InternalPerspectiveDsl.g:7511:4: (lv_value_1_0= RULE_STRING )
-            // InternalPerspectiveDsl.g:7512:5: lv_value_1_0= RULE_STRING
+            // InternalPerspectiveDsl.g:7513:4: (lv_value_1_0= RULE_STRING )
+            // InternalPerspectiveDsl.g:7514:5: lv_value_1_0= RULE_STRING
             {
             lv_value_1_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -20661,7 +20661,7 @@
 
 
     // $ANTLR start "entryRuleXTypeLiteral"
-    // InternalPerspectiveDsl.g:7532:1: entryRuleXTypeLiteral returns [EObject current=null] : iv_ruleXTypeLiteral= ruleXTypeLiteral EOF ;
+    // InternalPerspectiveDsl.g:7534:1: entryRuleXTypeLiteral returns [EObject current=null] : iv_ruleXTypeLiteral= ruleXTypeLiteral EOF ;
     public final EObject entryRuleXTypeLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -20669,8 +20669,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:7532:53: (iv_ruleXTypeLiteral= ruleXTypeLiteral EOF )
-            // InternalPerspectiveDsl.g:7533:2: iv_ruleXTypeLiteral= ruleXTypeLiteral EOF
+            // InternalPerspectiveDsl.g:7534:53: (iv_ruleXTypeLiteral= ruleXTypeLiteral EOF )
+            // InternalPerspectiveDsl.g:7535:2: iv_ruleXTypeLiteral= ruleXTypeLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXTypeLiteralRule()); 
@@ -20701,7 +20701,7 @@
 
 
     // $ANTLR start "ruleXTypeLiteral"
-    // InternalPerspectiveDsl.g:7539:1: ruleXTypeLiteral returns [EObject current=null] : ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) ;
+    // InternalPerspectiveDsl.g:7541:1: ruleXTypeLiteral returns [EObject current=null] : ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) ;
     public final EObject ruleXTypeLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -20715,14 +20715,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:7545:2: ( ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) )
-            // InternalPerspectiveDsl.g:7546:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
+            // InternalPerspectiveDsl.g:7547:2: ( ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) )
+            // InternalPerspectiveDsl.g:7548:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
             {
-            // InternalPerspectiveDsl.g:7546:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
-            // InternalPerspectiveDsl.g:7547:3: () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')'
+            // InternalPerspectiveDsl.g:7548:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
+            // InternalPerspectiveDsl.g:7549:3: () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')'
             {
-            // InternalPerspectiveDsl.g:7547:3: ()
-            // InternalPerspectiveDsl.g:7548:4: 
+            // InternalPerspectiveDsl.g:7549:3: ()
+            // InternalPerspectiveDsl.g:7550:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -20746,11 +20746,11 @@
               			newLeafNode(otherlv_2, grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2());
               		
             }
-            // InternalPerspectiveDsl.g:7562:3: ( ( ruleQualifiedName ) )
-            // InternalPerspectiveDsl.g:7563:4: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:7564:3: ( ( ruleQualifiedName ) )
+            // InternalPerspectiveDsl.g:7565:4: ( ruleQualifiedName )
             {
-            // InternalPerspectiveDsl.g:7563:4: ( ruleQualifiedName )
-            // InternalPerspectiveDsl.g:7564:5: ruleQualifiedName
+            // InternalPerspectiveDsl.g:7565:4: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:7566:5: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
 
@@ -20780,7 +20780,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:7578:3: ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )*
+            // InternalPerspectiveDsl.g:7580:3: ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )*
             loop114:
             do {
                 int alt114=2;
@@ -20793,10 +20793,10 @@
 
                 switch (alt114) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:7579:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
+            	    // InternalPerspectiveDsl.g:7581:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
             	    {
-            	    // InternalPerspectiveDsl.g:7579:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
-            	    // InternalPerspectiveDsl.g:7580:5: lv_arrayDimensions_4_0= ruleArrayBrackets
+            	    // InternalPerspectiveDsl.g:7581:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
+            	    // InternalPerspectiveDsl.g:7582:5: lv_arrayDimensions_4_0= ruleArrayBrackets
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -20864,7 +20864,7 @@
 
 
     // $ANTLR start "entryRuleXThrowExpression"
-    // InternalPerspectiveDsl.g:7605:1: entryRuleXThrowExpression returns [EObject current=null] : iv_ruleXThrowExpression= ruleXThrowExpression EOF ;
+    // InternalPerspectiveDsl.g:7607:1: entryRuleXThrowExpression returns [EObject current=null] : iv_ruleXThrowExpression= ruleXThrowExpression EOF ;
     public final EObject entryRuleXThrowExpression() throws RecognitionException {
         EObject current = null;
 
@@ -20872,8 +20872,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:7605:57: (iv_ruleXThrowExpression= ruleXThrowExpression EOF )
-            // InternalPerspectiveDsl.g:7606:2: iv_ruleXThrowExpression= ruleXThrowExpression EOF
+            // InternalPerspectiveDsl.g:7607:57: (iv_ruleXThrowExpression= ruleXThrowExpression EOF )
+            // InternalPerspectiveDsl.g:7608:2: iv_ruleXThrowExpression= ruleXThrowExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXThrowExpressionRule()); 
@@ -20904,7 +20904,7 @@
 
 
     // $ANTLR start "ruleXThrowExpression"
-    // InternalPerspectiveDsl.g:7612:1: ruleXThrowExpression returns [EObject current=null] : ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) ;
+    // InternalPerspectiveDsl.g:7614:1: ruleXThrowExpression returns [EObject current=null] : ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) ;
     public final EObject ruleXThrowExpression() throws RecognitionException {
         EObject current = null;
 
@@ -20916,14 +20916,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:7618:2: ( ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) )
-            // InternalPerspectiveDsl.g:7619:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
+            // InternalPerspectiveDsl.g:7620:2: ( ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) )
+            // InternalPerspectiveDsl.g:7621:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
             {
-            // InternalPerspectiveDsl.g:7619:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
-            // InternalPerspectiveDsl.g:7620:3: () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:7621:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
+            // InternalPerspectiveDsl.g:7622:3: () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) )
             {
-            // InternalPerspectiveDsl.g:7620:3: ()
-            // InternalPerspectiveDsl.g:7621:4: 
+            // InternalPerspectiveDsl.g:7622:3: ()
+            // InternalPerspectiveDsl.g:7623:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -20941,11 +20941,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:7631:3: ( (lv_expression_2_0= ruleXExpression ) )
-            // InternalPerspectiveDsl.g:7632:4: (lv_expression_2_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:7633:3: ( (lv_expression_2_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:7634:4: (lv_expression_2_0= ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:7632:4: (lv_expression_2_0= ruleXExpression )
-            // InternalPerspectiveDsl.g:7633:5: lv_expression_2_0= ruleXExpression
+            // InternalPerspectiveDsl.g:7634:4: (lv_expression_2_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:7635:5: lv_expression_2_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -21001,7 +21001,7 @@
 
 
     // $ANTLR start "entryRuleXReturnExpression"
-    // InternalPerspectiveDsl.g:7654:1: entryRuleXReturnExpression returns [EObject current=null] : iv_ruleXReturnExpression= ruleXReturnExpression EOF ;
+    // InternalPerspectiveDsl.g:7656:1: entryRuleXReturnExpression returns [EObject current=null] : iv_ruleXReturnExpression= ruleXReturnExpression EOF ;
     public final EObject entryRuleXReturnExpression() throws RecognitionException {
         EObject current = null;
 
@@ -21009,8 +21009,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:7654:58: (iv_ruleXReturnExpression= ruleXReturnExpression EOF )
-            // InternalPerspectiveDsl.g:7655:2: iv_ruleXReturnExpression= ruleXReturnExpression EOF
+            // InternalPerspectiveDsl.g:7656:58: (iv_ruleXReturnExpression= ruleXReturnExpression EOF )
+            // InternalPerspectiveDsl.g:7657:2: iv_ruleXReturnExpression= ruleXReturnExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXReturnExpressionRule()); 
@@ -21041,7 +21041,7 @@
 
 
     // $ANTLR start "ruleXReturnExpression"
-    // InternalPerspectiveDsl.g:7661:1: ruleXReturnExpression returns [EObject current=null] : ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? ) ;
+    // InternalPerspectiveDsl.g:7663:1: ruleXReturnExpression returns [EObject current=null] : ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? ) ;
     public final EObject ruleXReturnExpression() throws RecognitionException {
         EObject current = null;
 
@@ -21053,14 +21053,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:7667:2: ( ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? ) )
-            // InternalPerspectiveDsl.g:7668:2: ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? )
+            // InternalPerspectiveDsl.g:7669:2: ( ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? ) )
+            // InternalPerspectiveDsl.g:7670:2: ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? )
             {
-            // InternalPerspectiveDsl.g:7668:2: ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? )
-            // InternalPerspectiveDsl.g:7669:3: () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?
+            // InternalPerspectiveDsl.g:7670:2: ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? )
+            // InternalPerspectiveDsl.g:7671:3: () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?
             {
-            // InternalPerspectiveDsl.g:7669:3: ()
-            // InternalPerspectiveDsl.g:7670:4: 
+            // InternalPerspectiveDsl.g:7671:3: ()
+            // InternalPerspectiveDsl.g:7672:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -21078,15 +21078,15 @@
               			newLeafNode(otherlv_1, grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:7680:3: ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?
+            // InternalPerspectiveDsl.g:7682:3: ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?
             int alt115=2;
             alt115 = dfa115.predict(input);
             switch (alt115) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:7681:4: ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:7683:4: ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression )
                     {
-                    // InternalPerspectiveDsl.g:7682:4: (lv_expression_2_0= ruleXExpression )
-                    // InternalPerspectiveDsl.g:7683:5: lv_expression_2_0= ruleXExpression
+                    // InternalPerspectiveDsl.g:7684:4: (lv_expression_2_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:7685:5: lv_expression_2_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -21145,7 +21145,7 @@
 
 
     // $ANTLR start "entryRuleXTryCatchFinallyExpression"
-    // InternalPerspectiveDsl.g:7704:1: entryRuleXTryCatchFinallyExpression returns [EObject current=null] : iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF ;
+    // InternalPerspectiveDsl.g:7706:1: entryRuleXTryCatchFinallyExpression returns [EObject current=null] : iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF ;
     public final EObject entryRuleXTryCatchFinallyExpression() throws RecognitionException {
         EObject current = null;
 
@@ -21153,8 +21153,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:7704:67: (iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF )
-            // InternalPerspectiveDsl.g:7705:2: iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF
+            // InternalPerspectiveDsl.g:7706:67: (iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF )
+            // InternalPerspectiveDsl.g:7707:2: iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionRule()); 
@@ -21185,7 +21185,7 @@
 
 
     // $ANTLR start "ruleXTryCatchFinallyExpression"
-    // InternalPerspectiveDsl.g:7711:1: ruleXTryCatchFinallyExpression returns [EObject current=null] : ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) ) ;
+    // InternalPerspectiveDsl.g:7713:1: ruleXTryCatchFinallyExpression returns [EObject current=null] : ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) ) ;
     public final EObject ruleXTryCatchFinallyExpression() throws RecognitionException {
         EObject current = null;
 
@@ -21205,14 +21205,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:7717:2: ( ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) ) )
-            // InternalPerspectiveDsl.g:7718:2: ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) )
+            // InternalPerspectiveDsl.g:7719:2: ( ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) ) )
+            // InternalPerspectiveDsl.g:7720:2: ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) )
             {
-            // InternalPerspectiveDsl.g:7718:2: ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) )
-            // InternalPerspectiveDsl.g:7719:3: () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) )
+            // InternalPerspectiveDsl.g:7720:2: ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) )
+            // InternalPerspectiveDsl.g:7721:3: () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) )
             {
-            // InternalPerspectiveDsl.g:7719:3: ()
-            // InternalPerspectiveDsl.g:7720:4: 
+            // InternalPerspectiveDsl.g:7721:3: ()
+            // InternalPerspectiveDsl.g:7722:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -21230,11 +21230,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:7730:3: ( (lv_expression_2_0= ruleXExpression ) )
-            // InternalPerspectiveDsl.g:7731:4: (lv_expression_2_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:7732:3: ( (lv_expression_2_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:7733:4: (lv_expression_2_0= ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:7731:4: (lv_expression_2_0= ruleXExpression )
-            // InternalPerspectiveDsl.g:7732:5: lv_expression_2_0= ruleXExpression
+            // InternalPerspectiveDsl.g:7733:4: (lv_expression_2_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:7734:5: lv_expression_2_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -21265,7 +21265,7 @@
 
             }
 
-            // InternalPerspectiveDsl.g:7749:3: ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) )
+            // InternalPerspectiveDsl.g:7751:3: ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) )
             int alt118=2;
             int LA118_0 = input.LA(1);
 
@@ -21284,12 +21284,12 @@
             }
             switch (alt118) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:7750:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
+                    // InternalPerspectiveDsl.g:7752:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
                     {
-                    // InternalPerspectiveDsl.g:7750:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
-                    // InternalPerspectiveDsl.g:7751:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
+                    // InternalPerspectiveDsl.g:7752:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
+                    // InternalPerspectiveDsl.g:7753:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
                     {
-                    // InternalPerspectiveDsl.g:7751:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+
+                    // InternalPerspectiveDsl.g:7753:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+
                     int cnt116=0;
                     loop116:
                     do {
@@ -21309,10 +21309,10 @@
 
                         switch (alt116) {
                     	case 1 :
-                    	    // InternalPerspectiveDsl.g:7752:6: ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause )
+                    	    // InternalPerspectiveDsl.g:7754:6: ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause )
                     	    {
-                    	    // InternalPerspectiveDsl.g:7753:6: (lv_catchClauses_3_0= ruleXCatchClause )
-                    	    // InternalPerspectiveDsl.g:7754:7: lv_catchClauses_3_0= ruleXCatchClause
+                    	    // InternalPerspectiveDsl.g:7755:6: (lv_catchClauses_3_0= ruleXCatchClause )
+                    	    // InternalPerspectiveDsl.g:7756:7: lv_catchClauses_3_0= ruleXCatchClause
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -21354,7 +21354,7 @@
                         cnt116++;
                     } while (true);
 
-                    // InternalPerspectiveDsl.g:7771:5: ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
+                    // InternalPerspectiveDsl.g:7773:5: ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
                     int alt117=2;
                     int LA117_0 = input.LA(1);
 
@@ -21367,10 +21367,10 @@
                     }
                     switch (alt117) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:7772:6: ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) )
+                            // InternalPerspectiveDsl.g:7774:6: ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) )
                             {
-                            // InternalPerspectiveDsl.g:7772:6: ( ( 'finally' )=>otherlv_4= 'finally' )
-                            // InternalPerspectiveDsl.g:7773:7: ( 'finally' )=>otherlv_4= 'finally'
+                            // InternalPerspectiveDsl.g:7774:6: ( ( 'finally' )=>otherlv_4= 'finally' )
+                            // InternalPerspectiveDsl.g:7775:7: ( 'finally' )=>otherlv_4= 'finally'
                             {
                             otherlv_4=(Token)match(input,120,FOLLOW_33); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
@@ -21381,11 +21381,11 @@
 
                             }
 
-                            // InternalPerspectiveDsl.g:7779:6: ( (lv_finallyExpression_5_0= ruleXExpression ) )
-                            // InternalPerspectiveDsl.g:7780:7: (lv_finallyExpression_5_0= ruleXExpression )
+                            // InternalPerspectiveDsl.g:7781:6: ( (lv_finallyExpression_5_0= ruleXExpression ) )
+                            // InternalPerspectiveDsl.g:7782:7: (lv_finallyExpression_5_0= ruleXExpression )
                             {
-                            // InternalPerspectiveDsl.g:7780:7: (lv_finallyExpression_5_0= ruleXExpression )
-                            // InternalPerspectiveDsl.g:7781:8: lv_finallyExpression_5_0= ruleXExpression
+                            // InternalPerspectiveDsl.g:7782:7: (lv_finallyExpression_5_0= ruleXExpression )
+                            // InternalPerspectiveDsl.g:7783:8: lv_finallyExpression_5_0= ruleXExpression
                             {
                             if ( state.backtracking==0 ) {
 
@@ -21429,10 +21429,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:7801:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
+                    // InternalPerspectiveDsl.g:7803:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
                     {
-                    // InternalPerspectiveDsl.g:7801:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
-                    // InternalPerspectiveDsl.g:7802:5: otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) )
+                    // InternalPerspectiveDsl.g:7803:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
+                    // InternalPerspectiveDsl.g:7804:5: otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) )
                     {
                     otherlv_6=(Token)match(input,120,FOLLOW_33); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -21440,11 +21440,11 @@
                       					newLeafNode(otherlv_6, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0());
                       				
                     }
-                    // InternalPerspectiveDsl.g:7806:5: ( (lv_finallyExpression_7_0= ruleXExpression ) )
-                    // InternalPerspectiveDsl.g:7807:6: (lv_finallyExpression_7_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:7808:5: ( (lv_finallyExpression_7_0= ruleXExpression ) )
+                    // InternalPerspectiveDsl.g:7809:6: (lv_finallyExpression_7_0= ruleXExpression )
                     {
-                    // InternalPerspectiveDsl.g:7807:6: (lv_finallyExpression_7_0= ruleXExpression )
-                    // InternalPerspectiveDsl.g:7808:7: lv_finallyExpression_7_0= ruleXExpression
+                    // InternalPerspectiveDsl.g:7809:6: (lv_finallyExpression_7_0= ruleXExpression )
+                    // InternalPerspectiveDsl.g:7810:7: lv_finallyExpression_7_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -21509,7 +21509,7 @@
 
 
     // $ANTLR start "entryRuleXSynchronizedExpression"
-    // InternalPerspectiveDsl.g:7831:1: entryRuleXSynchronizedExpression returns [EObject current=null] : iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF ;
+    // InternalPerspectiveDsl.g:7833:1: entryRuleXSynchronizedExpression returns [EObject current=null] : iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF ;
     public final EObject entryRuleXSynchronizedExpression() throws RecognitionException {
         EObject current = null;
 
@@ -21517,8 +21517,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:7831:64: (iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF )
-            // InternalPerspectiveDsl.g:7832:2: iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF
+            // InternalPerspectiveDsl.g:7833:64: (iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF )
+            // InternalPerspectiveDsl.g:7834:2: iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXSynchronizedExpressionRule()); 
@@ -21549,7 +21549,7 @@
 
 
     // $ANTLR start "ruleXSynchronizedExpression"
-    // InternalPerspectiveDsl.g:7838:1: ruleXSynchronizedExpression returns [EObject current=null] : ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) ;
+    // InternalPerspectiveDsl.g:7840:1: ruleXSynchronizedExpression returns [EObject current=null] : ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) ;
     public final EObject ruleXSynchronizedExpression() throws RecognitionException {
         EObject current = null;
 
@@ -21565,20 +21565,20 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:7844:2: ( ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) )
-            // InternalPerspectiveDsl.g:7845:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
+            // InternalPerspectiveDsl.g:7846:2: ( ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) )
+            // InternalPerspectiveDsl.g:7847:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
             {
-            // InternalPerspectiveDsl.g:7845:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
-            // InternalPerspectiveDsl.g:7846:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:7847:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
+            // InternalPerspectiveDsl.g:7848:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) )
             {
-            // InternalPerspectiveDsl.g:7846:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) )
-            // InternalPerspectiveDsl.g:7847:4: ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' )
+            // InternalPerspectiveDsl.g:7848:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) )
+            // InternalPerspectiveDsl.g:7849:4: ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' )
             {
-            // InternalPerspectiveDsl.g:7854:4: ( () otherlv_1= 'synchronized' otherlv_2= '(' )
-            // InternalPerspectiveDsl.g:7855:5: () otherlv_1= 'synchronized' otherlv_2= '('
+            // InternalPerspectiveDsl.g:7856:4: ( () otherlv_1= 'synchronized' otherlv_2= '(' )
+            // InternalPerspectiveDsl.g:7857:5: () otherlv_1= 'synchronized' otherlv_2= '('
             {
-            // InternalPerspectiveDsl.g:7855:5: ()
-            // InternalPerspectiveDsl.g:7856:6: 
+            // InternalPerspectiveDsl.g:7857:5: ()
+            // InternalPerspectiveDsl.g:7858:6: 
             {
             if ( state.backtracking==0 ) {
 
@@ -21608,11 +21608,11 @@
 
             }
 
-            // InternalPerspectiveDsl.g:7872:3: ( (lv_param_3_0= ruleXExpression ) )
-            // InternalPerspectiveDsl.g:7873:4: (lv_param_3_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:7874:3: ( (lv_param_3_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:7875:4: (lv_param_3_0= ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:7873:4: (lv_param_3_0= ruleXExpression )
-            // InternalPerspectiveDsl.g:7874:5: lv_param_3_0= ruleXExpression
+            // InternalPerspectiveDsl.g:7875:4: (lv_param_3_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:7876:5: lv_param_3_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -21649,11 +21649,11 @@
               			newLeafNode(otherlv_4, grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2());
               		
             }
-            // InternalPerspectiveDsl.g:7895:3: ( (lv_expression_5_0= ruleXExpression ) )
-            // InternalPerspectiveDsl.g:7896:4: (lv_expression_5_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:7897:3: ( (lv_expression_5_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:7898:4: (lv_expression_5_0= ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:7896:4: (lv_expression_5_0= ruleXExpression )
-            // InternalPerspectiveDsl.g:7897:5: lv_expression_5_0= ruleXExpression
+            // InternalPerspectiveDsl.g:7898:4: (lv_expression_5_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:7899:5: lv_expression_5_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -21709,7 +21709,7 @@
 
 
     // $ANTLR start "entryRuleXCatchClause"
-    // InternalPerspectiveDsl.g:7918:1: entryRuleXCatchClause returns [EObject current=null] : iv_ruleXCatchClause= ruleXCatchClause EOF ;
+    // InternalPerspectiveDsl.g:7920:1: entryRuleXCatchClause returns [EObject current=null] : iv_ruleXCatchClause= ruleXCatchClause EOF ;
     public final EObject entryRuleXCatchClause() throws RecognitionException {
         EObject current = null;
 
@@ -21717,8 +21717,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:7918:53: (iv_ruleXCatchClause= ruleXCatchClause EOF )
-            // InternalPerspectiveDsl.g:7919:2: iv_ruleXCatchClause= ruleXCatchClause EOF
+            // InternalPerspectiveDsl.g:7920:53: (iv_ruleXCatchClause= ruleXCatchClause EOF )
+            // InternalPerspectiveDsl.g:7921:2: iv_ruleXCatchClause= ruleXCatchClause EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXCatchClauseRule()); 
@@ -21749,7 +21749,7 @@
 
 
     // $ANTLR start "ruleXCatchClause"
-    // InternalPerspectiveDsl.g:7925:1: ruleXCatchClause returns [EObject current=null] : ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) ;
+    // InternalPerspectiveDsl.g:7927:1: ruleXCatchClause returns [EObject current=null] : ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) ;
     public final EObject ruleXCatchClause() throws RecognitionException {
         EObject current = null;
 
@@ -21765,14 +21765,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:7931:2: ( ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) )
-            // InternalPerspectiveDsl.g:7932:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
+            // InternalPerspectiveDsl.g:7933:2: ( ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) )
+            // InternalPerspectiveDsl.g:7934:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
             {
-            // InternalPerspectiveDsl.g:7932:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
-            // InternalPerspectiveDsl.g:7933:3: ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:7934:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
+            // InternalPerspectiveDsl.g:7935:3: ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) )
             {
-            // InternalPerspectiveDsl.g:7933:3: ( ( 'catch' )=>otherlv_0= 'catch' )
-            // InternalPerspectiveDsl.g:7934:4: ( 'catch' )=>otherlv_0= 'catch'
+            // InternalPerspectiveDsl.g:7935:3: ( ( 'catch' )=>otherlv_0= 'catch' )
+            // InternalPerspectiveDsl.g:7936:4: ( 'catch' )=>otherlv_0= 'catch'
             {
             otherlv_0=(Token)match(input,122,FOLLOW_72); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -21789,11 +21789,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:7944:3: ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) )
-            // InternalPerspectiveDsl.g:7945:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
+            // InternalPerspectiveDsl.g:7946:3: ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) )
+            // InternalPerspectiveDsl.g:7947:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
             {
-            // InternalPerspectiveDsl.g:7945:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
-            // InternalPerspectiveDsl.g:7946:5: lv_declaredParam_2_0= ruleFullJvmFormalParameter
+            // InternalPerspectiveDsl.g:7947:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
+            // InternalPerspectiveDsl.g:7948:5: lv_declaredParam_2_0= ruleFullJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
 
@@ -21830,11 +21830,11 @@
               			newLeafNode(otherlv_3, grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3());
               		
             }
-            // InternalPerspectiveDsl.g:7967:3: ( (lv_expression_4_0= ruleXExpression ) )
-            // InternalPerspectiveDsl.g:7968:4: (lv_expression_4_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:7969:3: ( (lv_expression_4_0= ruleXExpression ) )
+            // InternalPerspectiveDsl.g:7970:4: (lv_expression_4_0= ruleXExpression )
             {
-            // InternalPerspectiveDsl.g:7968:4: (lv_expression_4_0= ruleXExpression )
-            // InternalPerspectiveDsl.g:7969:5: lv_expression_4_0= ruleXExpression
+            // InternalPerspectiveDsl.g:7970:4: (lv_expression_4_0= ruleXExpression )
+            // InternalPerspectiveDsl.g:7971:5: lv_expression_4_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -21890,7 +21890,7 @@
 
 
     // $ANTLR start "entryRuleQualifiedName"
-    // InternalPerspectiveDsl.g:7990:1: entryRuleQualifiedName returns [String current=null] : iv_ruleQualifiedName= ruleQualifiedName EOF ;
+    // InternalPerspectiveDsl.g:7992:1: entryRuleQualifiedName returns [String current=null] : iv_ruleQualifiedName= ruleQualifiedName EOF ;
     public final String entryRuleQualifiedName() throws RecognitionException {
         String current = null;
 
@@ -21898,8 +21898,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:7990:53: (iv_ruleQualifiedName= ruleQualifiedName EOF )
-            // InternalPerspectiveDsl.g:7991:2: iv_ruleQualifiedName= ruleQualifiedName EOF
+            // InternalPerspectiveDsl.g:7992:53: (iv_ruleQualifiedName= ruleQualifiedName EOF )
+            // InternalPerspectiveDsl.g:7993:2: iv_ruleQualifiedName= ruleQualifiedName EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getQualifiedNameRule()); 
@@ -21930,7 +21930,7 @@
 
 
     // $ANTLR start "ruleQualifiedName"
-    // InternalPerspectiveDsl.g:7997:1: ruleQualifiedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) ;
+    // InternalPerspectiveDsl.g:7999:1: ruleQualifiedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) ;
     public final AntlrDatatypeRuleToken ruleQualifiedName() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -21944,11 +21944,11 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:8003:2: ( (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) )
-            // InternalPerspectiveDsl.g:8004:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
+            // InternalPerspectiveDsl.g:8005:2: ( (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) )
+            // InternalPerspectiveDsl.g:8006:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
             {
-            // InternalPerspectiveDsl.g:8004:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
-            // InternalPerspectiveDsl.g:8005:3: this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
+            // InternalPerspectiveDsl.g:8006:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
+            // InternalPerspectiveDsl.g:8007:3: this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
             {
             if ( state.backtracking==0 ) {
 
@@ -21970,7 +21970,7 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalPerspectiveDsl.g:8015:3: ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
+            // InternalPerspectiveDsl.g:8017:3: ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
             loop119:
             do {
                 int alt119=2;
@@ -21995,10 +21995,10 @@
 
                 switch (alt119) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:8016:4: ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID
+            	    // InternalPerspectiveDsl.g:8018:4: ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID
             	    {
-            	    // InternalPerspectiveDsl.g:8016:4: ( ( '.' )=>kw= '.' )
-            	    // InternalPerspectiveDsl.g:8017:5: ( '.' )=>kw= '.'
+            	    // InternalPerspectiveDsl.g:8018:4: ( ( '.' )=>kw= '.' )
+            	    // InternalPerspectiveDsl.g:8019:5: ( '.' )=>kw= '.'
             	    {
             	    kw=(Token)match(input,95,FOLLOW_4); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -22064,7 +22064,7 @@
 
 
     // $ANTLR start "entryRuleNumber"
-    // InternalPerspectiveDsl.g:8039:1: entryRuleNumber returns [String current=null] : iv_ruleNumber= ruleNumber EOF ;
+    // InternalPerspectiveDsl.g:8041:1: entryRuleNumber returns [String current=null] : iv_ruleNumber= ruleNumber EOF ;
     public final String entryRuleNumber() throws RecognitionException {
         String current = null;
 
@@ -22075,8 +22075,8 @@
         	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
 
         try {
-            // InternalPerspectiveDsl.g:8041:2: (iv_ruleNumber= ruleNumber EOF )
-            // InternalPerspectiveDsl.g:8042:2: iv_ruleNumber= ruleNumber EOF
+            // InternalPerspectiveDsl.g:8043:2: (iv_ruleNumber= ruleNumber EOF )
+            // InternalPerspectiveDsl.g:8044:2: iv_ruleNumber= ruleNumber EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getNumberRule()); 
@@ -22110,7 +22110,7 @@
 
 
     // $ANTLR start "ruleNumber"
-    // InternalPerspectiveDsl.g:8051:1: ruleNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) ) ;
+    // InternalPerspectiveDsl.g:8053:1: ruleNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) ) ;
     public final AntlrDatatypeRuleToken ruleNumber() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -22126,10 +22126,10 @@
         	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
 
         try {
-            // InternalPerspectiveDsl.g:8058:2: ( (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) ) )
-            // InternalPerspectiveDsl.g:8059:2: (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) )
+            // InternalPerspectiveDsl.g:8060:2: ( (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) ) )
+            // InternalPerspectiveDsl.g:8061:2: (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) )
             {
-            // InternalPerspectiveDsl.g:8059:2: (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) )
+            // InternalPerspectiveDsl.g:8061:2: (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) )
             int alt123=2;
             int LA123_0 = input.LA(1);
 
@@ -22148,7 +22148,7 @@
             }
             switch (alt123) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:8060:3: this_HEX_0= RULE_HEX
+                    // InternalPerspectiveDsl.g:8062:3: this_HEX_0= RULE_HEX
                     {
                     this_HEX_0=(Token)match(input,RULE_HEX,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -22165,12 +22165,12 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:8068:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
+                    // InternalPerspectiveDsl.g:8070:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
                     {
-                    // InternalPerspectiveDsl.g:8068:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
-                    // InternalPerspectiveDsl.g:8069:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
+                    // InternalPerspectiveDsl.g:8070:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
+                    // InternalPerspectiveDsl.g:8071:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
                     {
-                    // InternalPerspectiveDsl.g:8069:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL )
+                    // InternalPerspectiveDsl.g:8071:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL )
                     int alt120=2;
                     int LA120_0 = input.LA(1);
 
@@ -22189,7 +22189,7 @@
                     }
                     switch (alt120) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:8070:5: this_INT_1= RULE_INT
+                            // InternalPerspectiveDsl.g:8072:5: this_INT_1= RULE_INT
                             {
                             this_INT_1=(Token)match(input,RULE_INT,FOLLOW_96); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
@@ -22206,7 +22206,7 @@
                             }
                             break;
                         case 2 :
-                            // InternalPerspectiveDsl.g:8078:5: this_DECIMAL_2= RULE_DECIMAL
+                            // InternalPerspectiveDsl.g:8080:5: this_DECIMAL_2= RULE_DECIMAL
                             {
                             this_DECIMAL_2=(Token)match(input,RULE_DECIMAL,FOLLOW_96); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
@@ -22225,7 +22225,7 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:8086:4: (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
+                    // InternalPerspectiveDsl.g:8088:4: (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
                     int alt122=2;
                     int LA122_0 = input.LA(1);
 
@@ -22238,7 +22238,7 @@
                     }
                     switch (alt122) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:8087:5: kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
+                            // InternalPerspectiveDsl.g:8089:5: kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
                             {
                             kw=(Token)match(input,95,FOLLOW_97); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
@@ -22247,7 +22247,7 @@
                               					newLeafNode(kw, grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0());
                               				
                             }
-                            // InternalPerspectiveDsl.g:8092:5: (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
+                            // InternalPerspectiveDsl.g:8094:5: (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
                             int alt121=2;
                             int LA121_0 = input.LA(1);
 
@@ -22266,7 +22266,7 @@
                             }
                             switch (alt121) {
                                 case 1 :
-                                    // InternalPerspectiveDsl.g:8093:6: this_INT_4= RULE_INT
+                                    // InternalPerspectiveDsl.g:8095:6: this_INT_4= RULE_INT
                                     {
                                     this_INT_4=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                                     if ( state.backtracking==0 ) {
@@ -22283,7 +22283,7 @@
                                     }
                                     break;
                                 case 2 :
-                                    // InternalPerspectiveDsl.g:8101:6: this_DECIMAL_5= RULE_DECIMAL
+                                    // InternalPerspectiveDsl.g:8103:6: this_DECIMAL_5= RULE_DECIMAL
                                     {
                                     this_DECIMAL_5=(Token)match(input,RULE_DECIMAL,FOLLOW_2); if (state.failed) return current;
                                     if ( state.backtracking==0 ) {
@@ -22342,7 +22342,7 @@
 
 
     // $ANTLR start "entryRuleJvmTypeReference"
-    // InternalPerspectiveDsl.g:8118:1: entryRuleJvmTypeReference returns [EObject current=null] : iv_ruleJvmTypeReference= ruleJvmTypeReference EOF ;
+    // InternalPerspectiveDsl.g:8120:1: entryRuleJvmTypeReference returns [EObject current=null] : iv_ruleJvmTypeReference= ruleJvmTypeReference EOF ;
     public final EObject entryRuleJvmTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -22350,8 +22350,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:8118:57: (iv_ruleJvmTypeReference= ruleJvmTypeReference EOF )
-            // InternalPerspectiveDsl.g:8119:2: iv_ruleJvmTypeReference= ruleJvmTypeReference EOF
+            // InternalPerspectiveDsl.g:8120:57: (iv_ruleJvmTypeReference= ruleJvmTypeReference EOF )
+            // InternalPerspectiveDsl.g:8121:2: iv_ruleJvmTypeReference= ruleJvmTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmTypeReferenceRule()); 
@@ -22382,7 +22382,7 @@
 
 
     // $ANTLR start "ruleJvmTypeReference"
-    // InternalPerspectiveDsl.g:8125:1: ruleJvmTypeReference returns [EObject current=null] : ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) ;
+    // InternalPerspectiveDsl.g:8127:1: ruleJvmTypeReference returns [EObject current=null] : ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) ;
     public final EObject ruleJvmTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -22395,10 +22395,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:8131:2: ( ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) )
-            // InternalPerspectiveDsl.g:8132:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
+            // InternalPerspectiveDsl.g:8133:2: ( ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) )
+            // InternalPerspectiveDsl.g:8134:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
             {
-            // InternalPerspectiveDsl.g:8132:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
+            // InternalPerspectiveDsl.g:8134:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
             int alt125=2;
             int LA125_0 = input.LA(1);
 
@@ -22417,10 +22417,10 @@
             }
             switch (alt125) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:8133:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
+                    // InternalPerspectiveDsl.g:8135:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
                     {
-                    // InternalPerspectiveDsl.g:8133:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
-                    // InternalPerspectiveDsl.g:8134:4: this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
+                    // InternalPerspectiveDsl.g:8135:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
+                    // InternalPerspectiveDsl.g:8136:4: this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
                     {
                     if ( state.backtracking==0 ) {
 
@@ -22438,7 +22438,7 @@
                       				afterParserOrEnumRuleCall();
                       			
                     }
-                    // InternalPerspectiveDsl.g:8142:4: ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
+                    // InternalPerspectiveDsl.g:8144:4: ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
                     loop124:
                     do {
                         int alt124=2;
@@ -22463,13 +22463,13 @@
 
                         switch (alt124) {
                     	case 1 :
-                    	    // InternalPerspectiveDsl.g:8143:5: ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets )
+                    	    // InternalPerspectiveDsl.g:8145:5: ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets )
                     	    {
-                    	    // InternalPerspectiveDsl.g:8149:5: ( () ruleArrayBrackets )
-                    	    // InternalPerspectiveDsl.g:8150:6: () ruleArrayBrackets
+                    	    // InternalPerspectiveDsl.g:8151:5: ( () ruleArrayBrackets )
+                    	    // InternalPerspectiveDsl.g:8152:6: () ruleArrayBrackets
                     	    {
-                    	    // InternalPerspectiveDsl.g:8150:6: ()
-                    	    // InternalPerspectiveDsl.g:8151:7: 
+                    	    // InternalPerspectiveDsl.g:8152:6: ()
+                    	    // InternalPerspectiveDsl.g:8153:7: 
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -22515,7 +22515,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:8168:3: this_XFunctionTypeRef_3= ruleXFunctionTypeRef
+                    // InternalPerspectiveDsl.g:8170:3: this_XFunctionTypeRef_3= ruleXFunctionTypeRef
                     {
                     if ( state.backtracking==0 ) {
 
@@ -22561,7 +22561,7 @@
 
 
     // $ANTLR start "entryRuleArrayBrackets"
-    // InternalPerspectiveDsl.g:8180:1: entryRuleArrayBrackets returns [String current=null] : iv_ruleArrayBrackets= ruleArrayBrackets EOF ;
+    // InternalPerspectiveDsl.g:8182:1: entryRuleArrayBrackets returns [String current=null] : iv_ruleArrayBrackets= ruleArrayBrackets EOF ;
     public final String entryRuleArrayBrackets() throws RecognitionException {
         String current = null;
 
@@ -22569,8 +22569,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:8180:53: (iv_ruleArrayBrackets= ruleArrayBrackets EOF )
-            // InternalPerspectiveDsl.g:8181:2: iv_ruleArrayBrackets= ruleArrayBrackets EOF
+            // InternalPerspectiveDsl.g:8182:53: (iv_ruleArrayBrackets= ruleArrayBrackets EOF )
+            // InternalPerspectiveDsl.g:8183:2: iv_ruleArrayBrackets= ruleArrayBrackets EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getArrayBracketsRule()); 
@@ -22601,7 +22601,7 @@
 
 
     // $ANTLR start "ruleArrayBrackets"
-    // InternalPerspectiveDsl.g:8187:1: ruleArrayBrackets returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '[' kw= ']' ) ;
+    // InternalPerspectiveDsl.g:8189:1: ruleArrayBrackets returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '[' kw= ']' ) ;
     public final AntlrDatatypeRuleToken ruleArrayBrackets() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -22611,11 +22611,11 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:8193:2: ( (kw= '[' kw= ']' ) )
-            // InternalPerspectiveDsl.g:8194:2: (kw= '[' kw= ']' )
+            // InternalPerspectiveDsl.g:8195:2: ( (kw= '[' kw= ']' ) )
+            // InternalPerspectiveDsl.g:8196:2: (kw= '[' kw= ']' )
             {
-            // InternalPerspectiveDsl.g:8194:2: (kw= '[' kw= ']' )
-            // InternalPerspectiveDsl.g:8195:3: kw= '[' kw= ']'
+            // InternalPerspectiveDsl.g:8196:2: (kw= '[' kw= ']' )
+            // InternalPerspectiveDsl.g:8197:3: kw= '[' kw= ']'
             {
             kw=(Token)match(input,63,FOLLOW_69); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -22656,7 +22656,7 @@
 
 
     // $ANTLR start "entryRuleXFunctionTypeRef"
-    // InternalPerspectiveDsl.g:8209:1: entryRuleXFunctionTypeRef returns [EObject current=null] : iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF ;
+    // InternalPerspectiveDsl.g:8211:1: entryRuleXFunctionTypeRef returns [EObject current=null] : iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF ;
     public final EObject entryRuleXFunctionTypeRef() throws RecognitionException {
         EObject current = null;
 
@@ -22664,8 +22664,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:8209:57: (iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF )
-            // InternalPerspectiveDsl.g:8210:2: iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF
+            // InternalPerspectiveDsl.g:8211:57: (iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF )
+            // InternalPerspectiveDsl.g:8212:2: iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXFunctionTypeRefRule()); 
@@ -22696,7 +22696,7 @@
 
 
     // $ANTLR start "ruleXFunctionTypeRef"
-    // InternalPerspectiveDsl.g:8216:1: ruleXFunctionTypeRef returns [EObject current=null] : ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) ;
+    // InternalPerspectiveDsl.g:8218:1: ruleXFunctionTypeRef returns [EObject current=null] : ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) ;
     public final EObject ruleXFunctionTypeRef() throws RecognitionException {
         EObject current = null;
 
@@ -22715,13 +22715,13 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:8222:2: ( ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) )
-            // InternalPerspectiveDsl.g:8223:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
+            // InternalPerspectiveDsl.g:8224:2: ( ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) )
+            // InternalPerspectiveDsl.g:8225:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
             {
-            // InternalPerspectiveDsl.g:8223:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
-            // InternalPerspectiveDsl.g:8224:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:8225:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
+            // InternalPerspectiveDsl.g:8226:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) )
             {
-            // InternalPerspectiveDsl.g:8224:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )?
+            // InternalPerspectiveDsl.g:8226:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )?
             int alt128=2;
             int LA128_0 = input.LA(1);
 
@@ -22730,7 +22730,7 @@
             }
             switch (alt128) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:8225:4: otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')'
+                    // InternalPerspectiveDsl.g:8227:4: otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')'
                     {
                     otherlv_0=(Token)match(input,58,FOLLOW_98); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -22738,7 +22738,7 @@
                       				newLeafNode(otherlv_0, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0());
                       			
                     }
-                    // InternalPerspectiveDsl.g:8229:4: ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )?
+                    // InternalPerspectiveDsl.g:8231:4: ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )?
                     int alt127=2;
                     int LA127_0 = input.LA(1);
 
@@ -22747,13 +22747,13 @@
                     }
                     switch (alt127) {
                         case 1 :
-                            // InternalPerspectiveDsl.g:8230:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
+                            // InternalPerspectiveDsl.g:8232:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
                             {
-                            // InternalPerspectiveDsl.g:8230:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) )
-                            // InternalPerspectiveDsl.g:8231:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
+                            // InternalPerspectiveDsl.g:8232:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) )
+                            // InternalPerspectiveDsl.g:8233:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
                             {
-                            // InternalPerspectiveDsl.g:8231:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
-                            // InternalPerspectiveDsl.g:8232:7: lv_paramTypes_1_0= ruleJvmTypeReference
+                            // InternalPerspectiveDsl.g:8233:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
+                            // InternalPerspectiveDsl.g:8234:7: lv_paramTypes_1_0= ruleJvmTypeReference
                             {
                             if ( state.backtracking==0 ) {
 
@@ -22784,7 +22784,7 @@
 
                             }
 
-                            // InternalPerspectiveDsl.g:8249:5: (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
+                            // InternalPerspectiveDsl.g:8251:5: (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
                             loop126:
                             do {
                                 int alt126=2;
@@ -22797,7 +22797,7 @@
 
                                 switch (alt126) {
                             	case 1 :
-                            	    // InternalPerspectiveDsl.g:8250:6: otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
+                            	    // InternalPerspectiveDsl.g:8252:6: otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
                             	    {
                             	    otherlv_2=(Token)match(input,59,FOLLOW_46); if (state.failed) return current;
                             	    if ( state.backtracking==0 ) {
@@ -22805,11 +22805,11 @@
                             	      						newLeafNode(otherlv_2, grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0());
                             	      					
                             	    }
-                            	    // InternalPerspectiveDsl.g:8254:6: ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
-                            	    // InternalPerspectiveDsl.g:8255:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
+                            	    // InternalPerspectiveDsl.g:8256:6: ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
+                            	    // InternalPerspectiveDsl.g:8257:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
                             	    {
-                            	    // InternalPerspectiveDsl.g:8255:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
-                            	    // InternalPerspectiveDsl.g:8256:8: lv_paramTypes_3_0= ruleJvmTypeReference
+                            	    // InternalPerspectiveDsl.g:8257:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
+                            	    // InternalPerspectiveDsl.g:8258:8: lv_paramTypes_3_0= ruleJvmTypeReference
                             	    {
                             	    if ( state.backtracking==0 ) {
 
@@ -22873,11 +22873,11 @@
               			newLeafNode(otherlv_5, grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:8284:3: ( (lv_returnType_6_0= ruleJvmTypeReference ) )
-            // InternalPerspectiveDsl.g:8285:4: (lv_returnType_6_0= ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:8286:3: ( (lv_returnType_6_0= ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:8287:4: (lv_returnType_6_0= ruleJvmTypeReference )
             {
-            // InternalPerspectiveDsl.g:8285:4: (lv_returnType_6_0= ruleJvmTypeReference )
-            // InternalPerspectiveDsl.g:8286:5: lv_returnType_6_0= ruleJvmTypeReference
+            // InternalPerspectiveDsl.g:8287:4: (lv_returnType_6_0= ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:8288:5: lv_returnType_6_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
 
@@ -22933,7 +22933,7 @@
 
 
     // $ANTLR start "entryRuleJvmParameterizedTypeReference"
-    // InternalPerspectiveDsl.g:8307:1: entryRuleJvmParameterizedTypeReference returns [EObject current=null] : iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF ;
+    // InternalPerspectiveDsl.g:8309:1: entryRuleJvmParameterizedTypeReference returns [EObject current=null] : iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF ;
     public final EObject entryRuleJvmParameterizedTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -22941,8 +22941,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:8307:70: (iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF )
-            // InternalPerspectiveDsl.g:8308:2: iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF
+            // InternalPerspectiveDsl.g:8309:70: (iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF )
+            // InternalPerspectiveDsl.g:8310:2: iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
@@ -22973,7 +22973,7 @@
 
 
     // $ANTLR start "ruleJvmParameterizedTypeReference"
-    // InternalPerspectiveDsl.g:8314:1: ruleJvmParameterizedTypeReference returns [EObject current=null] : ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? ) ;
+    // InternalPerspectiveDsl.g:8316:1: ruleJvmParameterizedTypeReference returns [EObject current=null] : ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? ) ;
     public final EObject ruleJvmParameterizedTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -22997,17 +22997,17 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:8320:2: ( ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? ) )
-            // InternalPerspectiveDsl.g:8321:2: ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? )
+            // InternalPerspectiveDsl.g:8322:2: ( ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? ) )
+            // InternalPerspectiveDsl.g:8323:2: ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? )
             {
-            // InternalPerspectiveDsl.g:8321:2: ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? )
-            // InternalPerspectiveDsl.g:8322:3: ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?
+            // InternalPerspectiveDsl.g:8323:2: ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? )
+            // InternalPerspectiveDsl.g:8324:3: ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?
             {
-            // InternalPerspectiveDsl.g:8322:3: ( ( ruleQualifiedName ) )
-            // InternalPerspectiveDsl.g:8323:4: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:8324:3: ( ( ruleQualifiedName ) )
+            // InternalPerspectiveDsl.g:8325:4: ( ruleQualifiedName )
             {
-            // InternalPerspectiveDsl.g:8323:4: ( ruleQualifiedName )
-            // InternalPerspectiveDsl.g:8324:5: ruleQualifiedName
+            // InternalPerspectiveDsl.g:8325:4: ( ruleQualifiedName )
+            // InternalPerspectiveDsl.g:8326:5: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
 
@@ -23037,15 +23037,15 @@
 
             }
 
-            // InternalPerspectiveDsl.g:8338:3: ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?
+            // InternalPerspectiveDsl.g:8340:3: ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?
             int alt133=2;
             alt133 = dfa133.predict(input);
             switch (alt133) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:8339:4: ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
+                    // InternalPerspectiveDsl.g:8341:4: ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
                     {
-                    // InternalPerspectiveDsl.g:8339:4: ( ( '<' )=>otherlv_1= '<' )
-                    // InternalPerspectiveDsl.g:8340:5: ( '<' )=>otherlv_1= '<'
+                    // InternalPerspectiveDsl.g:8341:4: ( ( '<' )=>otherlv_1= '<' )
+                    // InternalPerspectiveDsl.g:8342:5: ( '<' )=>otherlv_1= '<'
                     {
                     otherlv_1=(Token)match(input,70,FOLLOW_58); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -23056,11 +23056,11 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:8346:4: ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) )
-                    // InternalPerspectiveDsl.g:8347:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
+                    // InternalPerspectiveDsl.g:8348:4: ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) )
+                    // InternalPerspectiveDsl.g:8349:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
                     {
-                    // InternalPerspectiveDsl.g:8347:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
-                    // InternalPerspectiveDsl.g:8348:6: lv_arguments_2_0= ruleJvmArgumentTypeReference
+                    // InternalPerspectiveDsl.g:8349:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
+                    // InternalPerspectiveDsl.g:8350:6: lv_arguments_2_0= ruleJvmArgumentTypeReference
                     {
                     if ( state.backtracking==0 ) {
 
@@ -23091,7 +23091,7 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:8365:4: (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )*
+                    // InternalPerspectiveDsl.g:8367:4: (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )*
                     loop129:
                     do {
                         int alt129=2;
@@ -23104,7 +23104,7 @@
 
                         switch (alt129) {
                     	case 1 :
-                    	    // InternalPerspectiveDsl.g:8366:5: otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalPerspectiveDsl.g:8368:5: otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
                     	    {
                     	    otherlv_3=(Token)match(input,59,FOLLOW_58); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
@@ -23112,11 +23112,11 @@
                     	      					newLeafNode(otherlv_3, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0());
                     	      				
                     	    }
-                    	    // InternalPerspectiveDsl.g:8370:5: ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
-                    	    // InternalPerspectiveDsl.g:8371:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
+                    	    // InternalPerspectiveDsl.g:8372:5: ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalPerspectiveDsl.g:8373:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
                     	    {
-                    	    // InternalPerspectiveDsl.g:8371:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
-                    	    // InternalPerspectiveDsl.g:8372:7: lv_arguments_4_0= ruleJvmArgumentTypeReference
+                    	    // InternalPerspectiveDsl.g:8373:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
+                    	    // InternalPerspectiveDsl.g:8374:7: lv_arguments_4_0= ruleJvmArgumentTypeReference
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -23162,7 +23162,7 @@
                       				newLeafNode(otherlv_5, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3());
                       			
                     }
-                    // InternalPerspectiveDsl.g:8394:4: ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
+                    // InternalPerspectiveDsl.g:8396:4: ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
                     loop132:
                     do {
                         int alt132=2;
@@ -23187,16 +23187,16 @@
 
                         switch (alt132) {
                     	case 1 :
-                    	    // InternalPerspectiveDsl.g:8395:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
+                    	    // InternalPerspectiveDsl.g:8397:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
                     	    {
-                    	    // InternalPerspectiveDsl.g:8395:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) )
-                    	    // InternalPerspectiveDsl.g:8396:6: ( ( () '.' ) )=> ( () otherlv_7= '.' )
+                    	    // InternalPerspectiveDsl.g:8397:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) )
+                    	    // InternalPerspectiveDsl.g:8398:6: ( ( () '.' ) )=> ( () otherlv_7= '.' )
                     	    {
-                    	    // InternalPerspectiveDsl.g:8402:6: ( () otherlv_7= '.' )
-                    	    // InternalPerspectiveDsl.g:8403:7: () otherlv_7= '.'
+                    	    // InternalPerspectiveDsl.g:8404:6: ( () otherlv_7= '.' )
+                    	    // InternalPerspectiveDsl.g:8405:7: () otherlv_7= '.'
                     	    {
-                    	    // InternalPerspectiveDsl.g:8403:7: ()
-                    	    // InternalPerspectiveDsl.g:8404:8: 
+                    	    // InternalPerspectiveDsl.g:8405:7: ()
+                    	    // InternalPerspectiveDsl.g:8406:8: 
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -23220,11 +23220,11 @@
 
                     	    }
 
-                    	    // InternalPerspectiveDsl.g:8416:5: ( ( ruleValidID ) )
-                    	    // InternalPerspectiveDsl.g:8417:6: ( ruleValidID )
+                    	    // InternalPerspectiveDsl.g:8418:5: ( ( ruleValidID ) )
+                    	    // InternalPerspectiveDsl.g:8419:6: ( ruleValidID )
                     	    {
-                    	    // InternalPerspectiveDsl.g:8417:6: ( ruleValidID )
-                    	    // InternalPerspectiveDsl.g:8418:7: ruleValidID
+                    	    // InternalPerspectiveDsl.g:8419:6: ( ruleValidID )
+                    	    // InternalPerspectiveDsl.g:8420:7: ruleValidID
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -23254,15 +23254,15 @@
 
                     	    }
 
-                    	    // InternalPerspectiveDsl.g:8432:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
+                    	    // InternalPerspectiveDsl.g:8434:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
                     	    int alt131=2;
                     	    alt131 = dfa131.predict(input);
                     	    switch (alt131) {
                     	        case 1 :
-                    	            // InternalPerspectiveDsl.g:8433:6: ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>'
+                    	            // InternalPerspectiveDsl.g:8435:6: ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>'
                     	            {
-                    	            // InternalPerspectiveDsl.g:8433:6: ( ( '<' )=>otherlv_9= '<' )
-                    	            // InternalPerspectiveDsl.g:8434:7: ( '<' )=>otherlv_9= '<'
+                    	            // InternalPerspectiveDsl.g:8435:6: ( ( '<' )=>otherlv_9= '<' )
+                    	            // InternalPerspectiveDsl.g:8436:7: ( '<' )=>otherlv_9= '<'
                     	            {
                     	            otherlv_9=(Token)match(input,70,FOLLOW_58); if (state.failed) return current;
                     	            if ( state.backtracking==0 ) {
@@ -23273,11 +23273,11 @@
 
                     	            }
 
-                    	            // InternalPerspectiveDsl.g:8440:6: ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) )
-                    	            // InternalPerspectiveDsl.g:8441:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
+                    	            // InternalPerspectiveDsl.g:8442:6: ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) )
+                    	            // InternalPerspectiveDsl.g:8443:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
                     	            {
-                    	            // InternalPerspectiveDsl.g:8441:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
-                    	            // InternalPerspectiveDsl.g:8442:8: lv_arguments_10_0= ruleJvmArgumentTypeReference
+                    	            // InternalPerspectiveDsl.g:8443:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
+                    	            // InternalPerspectiveDsl.g:8444:8: lv_arguments_10_0= ruleJvmArgumentTypeReference
                     	            {
                     	            if ( state.backtracking==0 ) {
 
@@ -23308,7 +23308,7 @@
 
                     	            }
 
-                    	            // InternalPerspectiveDsl.g:8459:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )*
+                    	            // InternalPerspectiveDsl.g:8461:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )*
                     	            loop130:
                     	            do {
                     	                int alt130=2;
@@ -23321,7 +23321,7 @@
 
                     	                switch (alt130) {
                     	            	case 1 :
-                    	            	    // InternalPerspectiveDsl.g:8460:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
+                    	            	    // InternalPerspectiveDsl.g:8462:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
                     	            	    {
                     	            	    otherlv_11=(Token)match(input,59,FOLLOW_58); if (state.failed) return current;
                     	            	    if ( state.backtracking==0 ) {
@@ -23329,11 +23329,11 @@
                     	            	      							newLeafNode(otherlv_11, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0());
                     	            	      						
                     	            	    }
-                    	            	    // InternalPerspectiveDsl.g:8464:7: ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
-                    	            	    // InternalPerspectiveDsl.g:8465:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
+                    	            	    // InternalPerspectiveDsl.g:8466:7: ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
+                    	            	    // InternalPerspectiveDsl.g:8467:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
                     	            	    {
-                    	            	    // InternalPerspectiveDsl.g:8465:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
-                    	            	    // InternalPerspectiveDsl.g:8466:9: lv_arguments_12_0= ruleJvmArgumentTypeReference
+                    	            	    // InternalPerspectiveDsl.g:8467:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
+                    	            	    // InternalPerspectiveDsl.g:8468:9: lv_arguments_12_0= ruleJvmArgumentTypeReference
                     	            	    {
                     	            	    if ( state.backtracking==0 ) {
 
@@ -23425,7 +23425,7 @@
 
 
     // $ANTLR start "entryRuleJvmArgumentTypeReference"
-    // InternalPerspectiveDsl.g:8495:1: entryRuleJvmArgumentTypeReference returns [EObject current=null] : iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF ;
+    // InternalPerspectiveDsl.g:8497:1: entryRuleJvmArgumentTypeReference returns [EObject current=null] : iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF ;
     public final EObject entryRuleJvmArgumentTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -23433,8 +23433,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:8495:65: (iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF )
-            // InternalPerspectiveDsl.g:8496:2: iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF
+            // InternalPerspectiveDsl.g:8497:65: (iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF )
+            // InternalPerspectiveDsl.g:8498:2: iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceRule()); 
@@ -23465,7 +23465,7 @@
 
 
     // $ANTLR start "ruleJvmArgumentTypeReference"
-    // InternalPerspectiveDsl.g:8502:1: ruleJvmArgumentTypeReference returns [EObject current=null] : (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) ;
+    // InternalPerspectiveDsl.g:8504:1: ruleJvmArgumentTypeReference returns [EObject current=null] : (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) ;
     public final EObject ruleJvmArgumentTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -23478,10 +23478,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:8508:2: ( (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) )
-            // InternalPerspectiveDsl.g:8509:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
+            // InternalPerspectiveDsl.g:8510:2: ( (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) )
+            // InternalPerspectiveDsl.g:8511:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
             {
-            // InternalPerspectiveDsl.g:8509:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
+            // InternalPerspectiveDsl.g:8511:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
             int alt134=2;
             int LA134_0 = input.LA(1);
 
@@ -23500,7 +23500,7 @@
             }
             switch (alt134) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:8510:3: this_JvmTypeReference_0= ruleJvmTypeReference
+                    // InternalPerspectiveDsl.g:8512:3: this_JvmTypeReference_0= ruleJvmTypeReference
                     {
                     if ( state.backtracking==0 ) {
 
@@ -23522,7 +23522,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:8519:3: this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference
+                    // InternalPerspectiveDsl.g:8521:3: this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference
                     {
                     if ( state.backtracking==0 ) {
 
@@ -23568,7 +23568,7 @@
 
 
     // $ANTLR start "entryRuleJvmWildcardTypeReference"
-    // InternalPerspectiveDsl.g:8531:1: entryRuleJvmWildcardTypeReference returns [EObject current=null] : iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF ;
+    // InternalPerspectiveDsl.g:8533:1: entryRuleJvmWildcardTypeReference returns [EObject current=null] : iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF ;
     public final EObject entryRuleJvmWildcardTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -23576,8 +23576,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:8531:65: (iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF )
-            // InternalPerspectiveDsl.g:8532:2: iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF
+            // InternalPerspectiveDsl.g:8533:65: (iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF )
+            // InternalPerspectiveDsl.g:8534:2: iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceRule()); 
@@ -23608,7 +23608,7 @@
 
 
     // $ANTLR start "ruleJvmWildcardTypeReference"
-    // InternalPerspectiveDsl.g:8538:1: ruleJvmWildcardTypeReference returns [EObject current=null] : ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) ;
+    // InternalPerspectiveDsl.g:8540:1: ruleJvmWildcardTypeReference returns [EObject current=null] : ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) ;
     public final EObject ruleJvmWildcardTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -23626,14 +23626,14 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:8544:2: ( ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) )
-            // InternalPerspectiveDsl.g:8545:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
+            // InternalPerspectiveDsl.g:8546:2: ( ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) )
+            // InternalPerspectiveDsl.g:8547:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
             {
-            // InternalPerspectiveDsl.g:8545:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
-            // InternalPerspectiveDsl.g:8546:3: () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
+            // InternalPerspectiveDsl.g:8547:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
+            // InternalPerspectiveDsl.g:8548:3: () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
             {
-            // InternalPerspectiveDsl.g:8546:3: ()
-            // InternalPerspectiveDsl.g:8547:4: 
+            // InternalPerspectiveDsl.g:8548:3: ()
+            // InternalPerspectiveDsl.g:8549:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -23651,7 +23651,7 @@
               			newLeafNode(otherlv_1, grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1());
               		
             }
-            // InternalPerspectiveDsl.g:8557:3: ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
+            // InternalPerspectiveDsl.g:8559:3: ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
             int alt137=3;
             int LA137_0 = input.LA(1);
 
@@ -23663,16 +23663,16 @@
             }
             switch (alt137) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:8558:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
+                    // InternalPerspectiveDsl.g:8560:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
                     {
-                    // InternalPerspectiveDsl.g:8558:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
-                    // InternalPerspectiveDsl.g:8559:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
+                    // InternalPerspectiveDsl.g:8560:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
+                    // InternalPerspectiveDsl.g:8561:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
                     {
-                    // InternalPerspectiveDsl.g:8559:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) )
-                    // InternalPerspectiveDsl.g:8560:6: (lv_constraints_2_0= ruleJvmUpperBound )
+                    // InternalPerspectiveDsl.g:8561:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) )
+                    // InternalPerspectiveDsl.g:8562:6: (lv_constraints_2_0= ruleJvmUpperBound )
                     {
-                    // InternalPerspectiveDsl.g:8560:6: (lv_constraints_2_0= ruleJvmUpperBound )
-                    // InternalPerspectiveDsl.g:8561:7: lv_constraints_2_0= ruleJvmUpperBound
+                    // InternalPerspectiveDsl.g:8562:6: (lv_constraints_2_0= ruleJvmUpperBound )
+                    // InternalPerspectiveDsl.g:8563:7: lv_constraints_2_0= ruleJvmUpperBound
                     {
                     if ( state.backtracking==0 ) {
 
@@ -23703,7 +23703,7 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:8578:5: ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
+                    // InternalPerspectiveDsl.g:8580:5: ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
                     loop135:
                     do {
                         int alt135=2;
@@ -23716,10 +23716,10 @@
 
                         switch (alt135) {
                     	case 1 :
-                    	    // InternalPerspectiveDsl.g:8579:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
+                    	    // InternalPerspectiveDsl.g:8581:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
                     	    {
-                    	    // InternalPerspectiveDsl.g:8579:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
-                    	    // InternalPerspectiveDsl.g:8580:7: lv_constraints_3_0= ruleJvmUpperBoundAnded
+                    	    // InternalPerspectiveDsl.g:8581:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
+                    	    // InternalPerspectiveDsl.g:8582:7: lv_constraints_3_0= ruleJvmUpperBoundAnded
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -23763,16 +23763,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:8599:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
+                    // InternalPerspectiveDsl.g:8601:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
                     {
-                    // InternalPerspectiveDsl.g:8599:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
-                    // InternalPerspectiveDsl.g:8600:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
+                    // InternalPerspectiveDsl.g:8601:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
+                    // InternalPerspectiveDsl.g:8602:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
                     {
-                    // InternalPerspectiveDsl.g:8600:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) )
-                    // InternalPerspectiveDsl.g:8601:6: (lv_constraints_4_0= ruleJvmLowerBound )
+                    // InternalPerspectiveDsl.g:8602:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) )
+                    // InternalPerspectiveDsl.g:8603:6: (lv_constraints_4_0= ruleJvmLowerBound )
                     {
-                    // InternalPerspectiveDsl.g:8601:6: (lv_constraints_4_0= ruleJvmLowerBound )
-                    // InternalPerspectiveDsl.g:8602:7: lv_constraints_4_0= ruleJvmLowerBound
+                    // InternalPerspectiveDsl.g:8603:6: (lv_constraints_4_0= ruleJvmLowerBound )
+                    // InternalPerspectiveDsl.g:8604:7: lv_constraints_4_0= ruleJvmLowerBound
                     {
                     if ( state.backtracking==0 ) {
 
@@ -23803,7 +23803,7 @@
 
                     }
 
-                    // InternalPerspectiveDsl.g:8619:5: ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
+                    // InternalPerspectiveDsl.g:8621:5: ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
                     loop136:
                     do {
                         int alt136=2;
@@ -23816,10 +23816,10 @@
 
                         switch (alt136) {
                     	case 1 :
-                    	    // InternalPerspectiveDsl.g:8620:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
+                    	    // InternalPerspectiveDsl.g:8622:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
                     	    {
-                    	    // InternalPerspectiveDsl.g:8620:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
-                    	    // InternalPerspectiveDsl.g:8621:7: lv_constraints_5_0= ruleJvmLowerBoundAnded
+                    	    // InternalPerspectiveDsl.g:8622:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
+                    	    // InternalPerspectiveDsl.g:8623:7: lv_constraints_5_0= ruleJvmLowerBoundAnded
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -23890,7 +23890,7 @@
 
 
     // $ANTLR start "entryRuleJvmUpperBound"
-    // InternalPerspectiveDsl.g:8644:1: entryRuleJvmUpperBound returns [EObject current=null] : iv_ruleJvmUpperBound= ruleJvmUpperBound EOF ;
+    // InternalPerspectiveDsl.g:8646:1: entryRuleJvmUpperBound returns [EObject current=null] : iv_ruleJvmUpperBound= ruleJvmUpperBound EOF ;
     public final EObject entryRuleJvmUpperBound() throws RecognitionException {
         EObject current = null;
 
@@ -23898,8 +23898,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:8644:54: (iv_ruleJvmUpperBound= ruleJvmUpperBound EOF )
-            // InternalPerspectiveDsl.g:8645:2: iv_ruleJvmUpperBound= ruleJvmUpperBound EOF
+            // InternalPerspectiveDsl.g:8646:54: (iv_ruleJvmUpperBound= ruleJvmUpperBound EOF )
+            // InternalPerspectiveDsl.g:8647:2: iv_ruleJvmUpperBound= ruleJvmUpperBound EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmUpperBoundRule()); 
@@ -23930,7 +23930,7 @@
 
 
     // $ANTLR start "ruleJvmUpperBound"
-    // InternalPerspectiveDsl.g:8651:1: ruleJvmUpperBound returns [EObject current=null] : (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
+    // InternalPerspectiveDsl.g:8653:1: ruleJvmUpperBound returns [EObject current=null] : (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
     public final EObject ruleJvmUpperBound() throws RecognitionException {
         EObject current = null;
 
@@ -23942,11 +23942,11 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:8657:2: ( (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
-            // InternalPerspectiveDsl.g:8658:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalPerspectiveDsl.g:8659:2: ( (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalPerspectiveDsl.g:8660:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
             {
-            // InternalPerspectiveDsl.g:8658:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
-            // InternalPerspectiveDsl.g:8659:3: otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:8660:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalPerspectiveDsl.g:8661:3: otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
             {
             otherlv_0=(Token)match(input,110,FOLLOW_46); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -23954,11 +23954,11 @@
               			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0());
               		
             }
-            // InternalPerspectiveDsl.g:8663:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
-            // InternalPerspectiveDsl.g:8664:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:8665:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:8666:4: (lv_typeReference_1_0= ruleJvmTypeReference )
             {
-            // InternalPerspectiveDsl.g:8664:4: (lv_typeReference_1_0= ruleJvmTypeReference )
-            // InternalPerspectiveDsl.g:8665:5: lv_typeReference_1_0= ruleJvmTypeReference
+            // InternalPerspectiveDsl.g:8666:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:8667:5: lv_typeReference_1_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
 
@@ -24014,7 +24014,7 @@
 
 
     // $ANTLR start "entryRuleJvmUpperBoundAnded"
-    // InternalPerspectiveDsl.g:8686:1: entryRuleJvmUpperBoundAnded returns [EObject current=null] : iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF ;
+    // InternalPerspectiveDsl.g:8688:1: entryRuleJvmUpperBoundAnded returns [EObject current=null] : iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF ;
     public final EObject entryRuleJvmUpperBoundAnded() throws RecognitionException {
         EObject current = null;
 
@@ -24022,8 +24022,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:8686:59: (iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF )
-            // InternalPerspectiveDsl.g:8687:2: iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF
+            // InternalPerspectiveDsl.g:8688:59: (iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF )
+            // InternalPerspectiveDsl.g:8689:2: iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmUpperBoundAndedRule()); 
@@ -24054,7 +24054,7 @@
 
 
     // $ANTLR start "ruleJvmUpperBoundAnded"
-    // InternalPerspectiveDsl.g:8693:1: ruleJvmUpperBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
+    // InternalPerspectiveDsl.g:8695:1: ruleJvmUpperBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
     public final EObject ruleJvmUpperBoundAnded() throws RecognitionException {
         EObject current = null;
 
@@ -24066,11 +24066,11 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:8699:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
-            // InternalPerspectiveDsl.g:8700:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalPerspectiveDsl.g:8701:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalPerspectiveDsl.g:8702:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
             {
-            // InternalPerspectiveDsl.g:8700:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
-            // InternalPerspectiveDsl.g:8701:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:8702:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalPerspectiveDsl.g:8703:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
             {
             otherlv_0=(Token)match(input,124,FOLLOW_46); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -24078,11 +24078,11 @@
               			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0());
               		
             }
-            // InternalPerspectiveDsl.g:8705:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
-            // InternalPerspectiveDsl.g:8706:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:8707:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:8708:4: (lv_typeReference_1_0= ruleJvmTypeReference )
             {
-            // InternalPerspectiveDsl.g:8706:4: (lv_typeReference_1_0= ruleJvmTypeReference )
-            // InternalPerspectiveDsl.g:8707:5: lv_typeReference_1_0= ruleJvmTypeReference
+            // InternalPerspectiveDsl.g:8708:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:8709:5: lv_typeReference_1_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
 
@@ -24138,7 +24138,7 @@
 
 
     // $ANTLR start "entryRuleJvmLowerBound"
-    // InternalPerspectiveDsl.g:8728:1: entryRuleJvmLowerBound returns [EObject current=null] : iv_ruleJvmLowerBound= ruleJvmLowerBound EOF ;
+    // InternalPerspectiveDsl.g:8730:1: entryRuleJvmLowerBound returns [EObject current=null] : iv_ruleJvmLowerBound= ruleJvmLowerBound EOF ;
     public final EObject entryRuleJvmLowerBound() throws RecognitionException {
         EObject current = null;
 
@@ -24146,8 +24146,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:8728:54: (iv_ruleJvmLowerBound= ruleJvmLowerBound EOF )
-            // InternalPerspectiveDsl.g:8729:2: iv_ruleJvmLowerBound= ruleJvmLowerBound EOF
+            // InternalPerspectiveDsl.g:8730:54: (iv_ruleJvmLowerBound= ruleJvmLowerBound EOF )
+            // InternalPerspectiveDsl.g:8731:2: iv_ruleJvmLowerBound= ruleJvmLowerBound EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmLowerBoundRule()); 
@@ -24178,7 +24178,7 @@
 
 
     // $ANTLR start "ruleJvmLowerBound"
-    // InternalPerspectiveDsl.g:8735:1: ruleJvmLowerBound returns [EObject current=null] : (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
+    // InternalPerspectiveDsl.g:8737:1: ruleJvmLowerBound returns [EObject current=null] : (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
     public final EObject ruleJvmLowerBound() throws RecognitionException {
         EObject current = null;
 
@@ -24190,11 +24190,11 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:8741:2: ( (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
-            // InternalPerspectiveDsl.g:8742:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalPerspectiveDsl.g:8743:2: ( (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalPerspectiveDsl.g:8744:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
             {
-            // InternalPerspectiveDsl.g:8742:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
-            // InternalPerspectiveDsl.g:8743:3: otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:8744:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalPerspectiveDsl.g:8745:3: otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
             {
             otherlv_0=(Token)match(input,111,FOLLOW_46); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -24202,11 +24202,11 @@
               			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0());
               		
             }
-            // InternalPerspectiveDsl.g:8747:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
-            // InternalPerspectiveDsl.g:8748:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:8749:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:8750:4: (lv_typeReference_1_0= ruleJvmTypeReference )
             {
-            // InternalPerspectiveDsl.g:8748:4: (lv_typeReference_1_0= ruleJvmTypeReference )
-            // InternalPerspectiveDsl.g:8749:5: lv_typeReference_1_0= ruleJvmTypeReference
+            // InternalPerspectiveDsl.g:8750:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:8751:5: lv_typeReference_1_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
 
@@ -24262,7 +24262,7 @@
 
 
     // $ANTLR start "entryRuleJvmLowerBoundAnded"
-    // InternalPerspectiveDsl.g:8770:1: entryRuleJvmLowerBoundAnded returns [EObject current=null] : iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF ;
+    // InternalPerspectiveDsl.g:8772:1: entryRuleJvmLowerBoundAnded returns [EObject current=null] : iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF ;
     public final EObject entryRuleJvmLowerBoundAnded() throws RecognitionException {
         EObject current = null;
 
@@ -24270,8 +24270,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:8770:59: (iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF )
-            // InternalPerspectiveDsl.g:8771:2: iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF
+            // InternalPerspectiveDsl.g:8772:59: (iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF )
+            // InternalPerspectiveDsl.g:8773:2: iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmLowerBoundAndedRule()); 
@@ -24302,7 +24302,7 @@
 
 
     // $ANTLR start "ruleJvmLowerBoundAnded"
-    // InternalPerspectiveDsl.g:8777:1: ruleJvmLowerBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
+    // InternalPerspectiveDsl.g:8779:1: ruleJvmLowerBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
     public final EObject ruleJvmLowerBoundAnded() throws RecognitionException {
         EObject current = null;
 
@@ -24314,11 +24314,11 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:8783:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
-            // InternalPerspectiveDsl.g:8784:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalPerspectiveDsl.g:8785:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalPerspectiveDsl.g:8786:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
             {
-            // InternalPerspectiveDsl.g:8784:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
-            // InternalPerspectiveDsl.g:8785:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:8786:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalPerspectiveDsl.g:8787:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
             {
             otherlv_0=(Token)match(input,124,FOLLOW_46); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -24326,11 +24326,11 @@
               			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0());
               		
             }
-            // InternalPerspectiveDsl.g:8789:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
-            // InternalPerspectiveDsl.g:8790:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:8791:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalPerspectiveDsl.g:8792:4: (lv_typeReference_1_0= ruleJvmTypeReference )
             {
-            // InternalPerspectiveDsl.g:8790:4: (lv_typeReference_1_0= ruleJvmTypeReference )
-            // InternalPerspectiveDsl.g:8791:5: lv_typeReference_1_0= ruleJvmTypeReference
+            // InternalPerspectiveDsl.g:8792:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalPerspectiveDsl.g:8793:5: lv_typeReference_1_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
 
@@ -24386,7 +24386,7 @@
 
 
     // $ANTLR start "entryRuleQualifiedNameWithWildcard"
-    // InternalPerspectiveDsl.g:8812:1: entryRuleQualifiedNameWithWildcard returns [String current=null] : iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF ;
+    // InternalPerspectiveDsl.g:8814:1: entryRuleQualifiedNameWithWildcard returns [String current=null] : iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF ;
     public final String entryRuleQualifiedNameWithWildcard() throws RecognitionException {
         String current = null;
 
@@ -24394,8 +24394,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:8812:65: (iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF )
-            // InternalPerspectiveDsl.g:8813:2: iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF
+            // InternalPerspectiveDsl.g:8814:65: (iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF )
+            // InternalPerspectiveDsl.g:8815:2: iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getQualifiedNameWithWildcardRule()); 
@@ -24426,7 +24426,7 @@
 
 
     // $ANTLR start "ruleQualifiedNameWithWildcard"
-    // InternalPerspectiveDsl.g:8819:1: ruleQualifiedNameWithWildcard returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) ;
+    // InternalPerspectiveDsl.g:8821:1: ruleQualifiedNameWithWildcard returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) ;
     public final AntlrDatatypeRuleToken ruleQualifiedNameWithWildcard() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -24438,11 +24438,11 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:8825:2: ( (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) )
-            // InternalPerspectiveDsl.g:8826:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
+            // InternalPerspectiveDsl.g:8827:2: ( (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) )
+            // InternalPerspectiveDsl.g:8828:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
             {
-            // InternalPerspectiveDsl.g:8826:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
-            // InternalPerspectiveDsl.g:8827:3: this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*'
+            // InternalPerspectiveDsl.g:8828:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
+            // InternalPerspectiveDsl.g:8829:3: this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*'
             {
             if ( state.backtracking==0 ) {
 
@@ -24503,7 +24503,7 @@
 
 
     // $ANTLR start "entryRuleValidID"
-    // InternalPerspectiveDsl.g:8851:1: entryRuleValidID returns [String current=null] : iv_ruleValidID= ruleValidID EOF ;
+    // InternalPerspectiveDsl.g:8853:1: entryRuleValidID returns [String current=null] : iv_ruleValidID= ruleValidID EOF ;
     public final String entryRuleValidID() throws RecognitionException {
         String current = null;
 
@@ -24511,8 +24511,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:8851:47: (iv_ruleValidID= ruleValidID EOF )
-            // InternalPerspectiveDsl.g:8852:2: iv_ruleValidID= ruleValidID EOF
+            // InternalPerspectiveDsl.g:8853:47: (iv_ruleValidID= ruleValidID EOF )
+            // InternalPerspectiveDsl.g:8854:2: iv_ruleValidID= ruleValidID EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getValidIDRule()); 
@@ -24543,7 +24543,7 @@
 
 
     // $ANTLR start "ruleValidID"
-    // InternalPerspectiveDsl.g:8858:1: ruleValidID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= RULE_ID ;
+    // InternalPerspectiveDsl.g:8860:1: ruleValidID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= RULE_ID ;
     public final AntlrDatatypeRuleToken ruleValidID() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -24553,8 +24553,8 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:8864:2: (this_ID_0= RULE_ID )
-            // InternalPerspectiveDsl.g:8865:2: this_ID_0= RULE_ID
+            // InternalPerspectiveDsl.g:8866:2: (this_ID_0= RULE_ID )
+            // InternalPerspectiveDsl.g:8867:2: this_ID_0= RULE_ID
             {
             this_ID_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -24589,7 +24589,7 @@
 
 
     // $ANTLR start "entryRuleXImportSection"
-    // InternalPerspectiveDsl.g:8875:1: entryRuleXImportSection returns [EObject current=null] : iv_ruleXImportSection= ruleXImportSection EOF ;
+    // InternalPerspectiveDsl.g:8877:1: entryRuleXImportSection returns [EObject current=null] : iv_ruleXImportSection= ruleXImportSection EOF ;
     public final EObject entryRuleXImportSection() throws RecognitionException {
         EObject current = null;
 
@@ -24597,8 +24597,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:8875:55: (iv_ruleXImportSection= ruleXImportSection EOF )
-            // InternalPerspectiveDsl.g:8876:2: iv_ruleXImportSection= ruleXImportSection EOF
+            // InternalPerspectiveDsl.g:8877:55: (iv_ruleXImportSection= ruleXImportSection EOF )
+            // InternalPerspectiveDsl.g:8878:2: iv_ruleXImportSection= ruleXImportSection EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXImportSectionRule()); 
@@ -24629,7 +24629,7 @@
 
 
     // $ANTLR start "ruleXImportSection"
-    // InternalPerspectiveDsl.g:8882:1: ruleXImportSection returns [EObject current=null] : ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ ;
+    // InternalPerspectiveDsl.g:8884:1: ruleXImportSection returns [EObject current=null] : ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ ;
     public final EObject ruleXImportSection() throws RecognitionException {
         EObject current = null;
 
@@ -24640,10 +24640,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:8888:2: ( ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ )
-            // InternalPerspectiveDsl.g:8889:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
+            // InternalPerspectiveDsl.g:8890:2: ( ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ )
+            // InternalPerspectiveDsl.g:8891:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
             {
-            // InternalPerspectiveDsl.g:8889:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
+            // InternalPerspectiveDsl.g:8891:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
             int cnt138=0;
             loop138:
             do {
@@ -24657,10 +24657,10 @@
 
                 switch (alt138) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:8890:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
+            	    // InternalPerspectiveDsl.g:8892:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
             	    {
-            	    // InternalPerspectiveDsl.g:8890:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
-            	    // InternalPerspectiveDsl.g:8891:4: lv_importDeclarations_0_0= ruleXImportDeclaration
+            	    // InternalPerspectiveDsl.g:8892:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
+            	    // InternalPerspectiveDsl.g:8893:4: lv_importDeclarations_0_0= ruleXImportDeclaration
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -24724,7 +24724,7 @@
 
 
     // $ANTLR start "entryRuleQualifiedNameInStaticImport"
-    // InternalPerspectiveDsl.g:8911:1: entryRuleQualifiedNameInStaticImport returns [String current=null] : iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF ;
+    // InternalPerspectiveDsl.g:8913:1: entryRuleQualifiedNameInStaticImport returns [String current=null] : iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF ;
     public final String entryRuleQualifiedNameInStaticImport() throws RecognitionException {
         String current = null;
 
@@ -24732,8 +24732,8 @@
 
 
         try {
-            // InternalPerspectiveDsl.g:8911:67: (iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF )
-            // InternalPerspectiveDsl.g:8912:2: iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF
+            // InternalPerspectiveDsl.g:8913:67: (iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF )
+            // InternalPerspectiveDsl.g:8914:2: iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getQualifiedNameInStaticImportRule()); 
@@ -24764,7 +24764,7 @@
 
 
     // $ANTLR start "ruleQualifiedNameInStaticImport"
-    // InternalPerspectiveDsl.g:8918:1: ruleQualifiedNameInStaticImport returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID kw= '.' )+ ;
+    // InternalPerspectiveDsl.g:8920:1: ruleQualifiedNameInStaticImport returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID kw= '.' )+ ;
     public final AntlrDatatypeRuleToken ruleQualifiedNameInStaticImport() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -24776,10 +24776,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:8924:2: ( (this_ValidID_0= ruleValidID kw= '.' )+ )
-            // InternalPerspectiveDsl.g:8925:2: (this_ValidID_0= ruleValidID kw= '.' )+
+            // InternalPerspectiveDsl.g:8926:2: ( (this_ValidID_0= ruleValidID kw= '.' )+ )
+            // InternalPerspectiveDsl.g:8927:2: (this_ValidID_0= ruleValidID kw= '.' )+
             {
-            // InternalPerspectiveDsl.g:8925:2: (this_ValidID_0= ruleValidID kw= '.' )+
+            // InternalPerspectiveDsl.g:8927:2: (this_ValidID_0= ruleValidID kw= '.' )+
             int cnt139=0;
             loop139:
             do {
@@ -24799,7 +24799,7 @@
 
                 switch (alt139) {
             	case 1 :
-            	    // InternalPerspectiveDsl.g:8926:3: this_ValidID_0= ruleValidID kw= '.'
+            	    // InternalPerspectiveDsl.g:8928:3: this_ValidID_0= ruleValidID kw= '.'
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -24864,7 +24864,7 @@
 
 
     // $ANTLR start "ruleSashOrientation"
-    // InternalPerspectiveDsl.g:8945:1: ruleSashOrientation returns [Enumerator current=null] : ( (enumLiteral_0= 'horizontal' ) | (enumLiteral_1= 'vertical' ) ) ;
+    // InternalPerspectiveDsl.g:8947:1: ruleSashOrientation returns [Enumerator current=null] : ( (enumLiteral_0= 'horizontal' ) | (enumLiteral_1= 'vertical' ) ) ;
     public final Enumerator ruleSashOrientation() throws RecognitionException {
         Enumerator current = null;
 
@@ -24875,10 +24875,10 @@
         	enterRule();
 
         try {
-            // InternalPerspectiveDsl.g:8951:2: ( ( (enumLiteral_0= 'horizontal' ) | (enumLiteral_1= 'vertical' ) ) )
-            // InternalPerspectiveDsl.g:8952:2: ( (enumLiteral_0= 'horizontal' ) | (enumLiteral_1= 'vertical' ) )
+            // InternalPerspectiveDsl.g:8953:2: ( ( (enumLiteral_0= 'horizontal' ) | (enumLiteral_1= 'vertical' ) ) )
+            // InternalPerspectiveDsl.g:8954:2: ( (enumLiteral_0= 'horizontal' ) | (enumLiteral_1= 'vertical' ) )
             {
-            // InternalPerspectiveDsl.g:8952:2: ( (enumLiteral_0= 'horizontal' ) | (enumLiteral_1= 'vertical' ) )
+            // InternalPerspectiveDsl.g:8954:2: ( (enumLiteral_0= 'horizontal' ) | (enumLiteral_1= 'vertical' ) )
             int alt140=2;
             int LA140_0 = input.LA(1);
 
@@ -24897,10 +24897,10 @@
             }
             switch (alt140) {
                 case 1 :
-                    // InternalPerspectiveDsl.g:8953:3: (enumLiteral_0= 'horizontal' )
+                    // InternalPerspectiveDsl.g:8955:3: (enumLiteral_0= 'horizontal' )
                     {
-                    // InternalPerspectiveDsl.g:8953:3: (enumLiteral_0= 'horizontal' )
-                    // InternalPerspectiveDsl.g:8954:4: enumLiteral_0= 'horizontal'
+                    // InternalPerspectiveDsl.g:8955:3: (enumLiteral_0= 'horizontal' )
+                    // InternalPerspectiveDsl.g:8956:4: enumLiteral_0= 'horizontal'
                     {
                     enumLiteral_0=(Token)match(input,125,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -24916,10 +24916,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalPerspectiveDsl.g:8961:3: (enumLiteral_1= 'vertical' )
+                    // InternalPerspectiveDsl.g:8963:3: (enumLiteral_1= 'vertical' )
                     {
-                    // InternalPerspectiveDsl.g:8961:3: (enumLiteral_1= 'vertical' )
-                    // InternalPerspectiveDsl.g:8962:4: enumLiteral_1= 'vertical'
+                    // InternalPerspectiveDsl.g:8963:3: (enumLiteral_1= 'vertical' )
+                    // InternalPerspectiveDsl.g:8964:4: enumLiteral_1= 'vertical'
                     {
                     enumLiteral_1=(Token)match(input,126,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -24959,8 +24959,8 @@
 
     // $ANTLR start synpred1_InternalPerspectiveDsl
     public final void synpred1_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:2321:5: ( '(' )
-        // InternalPerspectiveDsl.g:2321:6: '('
+        // InternalPerspectiveDsl.g:2323:5: ( '(' )
+        // InternalPerspectiveDsl.g:2323:6: '('
         {
         match(input,58,FOLLOW_2); if (state.failed) return ;
 
@@ -24970,17 +24970,17 @@
 
     // $ANTLR start synpred2_InternalPerspectiveDsl
     public final void synpred2_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:2330:7: ( ( ( ( ruleValidID ) ) '=' ) )
-        // InternalPerspectiveDsl.g:2330:8: ( ( ( ruleValidID ) ) '=' )
+        // InternalPerspectiveDsl.g:2332:7: ( ( ( ( ruleValidID ) ) '=' ) )
+        // InternalPerspectiveDsl.g:2332:8: ( ( ( ruleValidID ) ) '=' )
         {
-        // InternalPerspectiveDsl.g:2330:8: ( ( ( ruleValidID ) ) '=' )
-        // InternalPerspectiveDsl.g:2331:8: ( ( ruleValidID ) ) '='
+        // InternalPerspectiveDsl.g:2332:8: ( ( ( ruleValidID ) ) '=' )
+        // InternalPerspectiveDsl.g:2333:8: ( ( ruleValidID ) ) '='
         {
-        // InternalPerspectiveDsl.g:2331:8: ( ( ruleValidID ) )
-        // InternalPerspectiveDsl.g:2332:9: ( ruleValidID )
+        // InternalPerspectiveDsl.g:2333:8: ( ( ruleValidID ) )
+        // InternalPerspectiveDsl.g:2334:9: ( ruleValidID )
         {
-        // InternalPerspectiveDsl.g:2332:9: ( ruleValidID )
-        // InternalPerspectiveDsl.g:2333:10: ruleValidID
+        // InternalPerspectiveDsl.g:2334:9: ( ruleValidID )
+        // InternalPerspectiveDsl.g:2335:10: ruleValidID
         {
         pushFollow(FOLLOW_32);
         ruleValidID();
@@ -25004,14 +25004,14 @@
 
     // $ANTLR start synpred5_InternalPerspectiveDsl
     public final void synpred5_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:2510:5: ( ( () '#' '[' ) )
-        // InternalPerspectiveDsl.g:2510:6: ( () '#' '[' )
+        // InternalPerspectiveDsl.g:2512:5: ( ( () '#' '[' ) )
+        // InternalPerspectiveDsl.g:2512:6: ( () '#' '[' )
         {
-        // InternalPerspectiveDsl.g:2510:6: ( () '#' '[' )
-        // InternalPerspectiveDsl.g:2511:6: () '#' '['
+        // InternalPerspectiveDsl.g:2512:6: ( () '#' '[' )
+        // InternalPerspectiveDsl.g:2513:6: () '#' '['
         {
-        // InternalPerspectiveDsl.g:2511:6: ()
-        // InternalPerspectiveDsl.g:2512:6: 
+        // InternalPerspectiveDsl.g:2513:6: ()
+        // InternalPerspectiveDsl.g:2514:6: 
         {
         }
 
@@ -25027,14 +25027,14 @@
 
     // $ANTLR start synpred6_InternalPerspectiveDsl
     public final void synpred6_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:2652:5: ( ( () '#' '[' ) )
-        // InternalPerspectiveDsl.g:2652:6: ( () '#' '[' )
+        // InternalPerspectiveDsl.g:2654:5: ( ( () '#' '[' ) )
+        // InternalPerspectiveDsl.g:2654:6: ( () '#' '[' )
         {
-        // InternalPerspectiveDsl.g:2652:6: ( () '#' '[' )
-        // InternalPerspectiveDsl.g:2653:6: () '#' '['
+        // InternalPerspectiveDsl.g:2654:6: ( () '#' '[' )
+        // InternalPerspectiveDsl.g:2655:6: () '#' '['
         {
-        // InternalPerspectiveDsl.g:2653:6: ()
-        // InternalPerspectiveDsl.g:2654:6: 
+        // InternalPerspectiveDsl.g:2655:6: ()
+        // InternalPerspectiveDsl.g:2656:6: 
         {
         }
 
@@ -25050,22 +25050,22 @@
 
     // $ANTLR start synpred7_InternalPerspectiveDsl
     public final void synpred7_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:2880:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )
-        // InternalPerspectiveDsl.g:2880:7: ( () ( ( ruleOpMultiAssign ) ) )
+        // InternalPerspectiveDsl.g:2882:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )
+        // InternalPerspectiveDsl.g:2882:7: ( () ( ( ruleOpMultiAssign ) ) )
         {
-        // InternalPerspectiveDsl.g:2880:7: ( () ( ( ruleOpMultiAssign ) ) )
-        // InternalPerspectiveDsl.g:2881:7: () ( ( ruleOpMultiAssign ) )
+        // InternalPerspectiveDsl.g:2882:7: ( () ( ( ruleOpMultiAssign ) ) )
+        // InternalPerspectiveDsl.g:2883:7: () ( ( ruleOpMultiAssign ) )
         {
-        // InternalPerspectiveDsl.g:2881:7: ()
-        // InternalPerspectiveDsl.g:2882:7: 
+        // InternalPerspectiveDsl.g:2883:7: ()
+        // InternalPerspectiveDsl.g:2884:7: 
         {
         }
 
-        // InternalPerspectiveDsl.g:2883:7: ( ( ruleOpMultiAssign ) )
-        // InternalPerspectiveDsl.g:2884:8: ( ruleOpMultiAssign )
+        // InternalPerspectiveDsl.g:2885:7: ( ( ruleOpMultiAssign ) )
+        // InternalPerspectiveDsl.g:2886:8: ( ruleOpMultiAssign )
         {
-        // InternalPerspectiveDsl.g:2884:8: ( ruleOpMultiAssign )
-        // InternalPerspectiveDsl.g:2885:9: ruleOpMultiAssign
+        // InternalPerspectiveDsl.g:2886:8: ( ruleOpMultiAssign )
+        // InternalPerspectiveDsl.g:2887:9: ruleOpMultiAssign
         {
         pushFollow(FOLLOW_2);
         ruleOpMultiAssign();
@@ -25088,22 +25088,22 @@
 
     // $ANTLR start synpred8_InternalPerspectiveDsl
     public final void synpred8_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:3074:5: ( ( () ( ( ruleOpOr ) ) ) )
-        // InternalPerspectiveDsl.g:3074:6: ( () ( ( ruleOpOr ) ) )
+        // InternalPerspectiveDsl.g:3076:5: ( ( () ( ( ruleOpOr ) ) ) )
+        // InternalPerspectiveDsl.g:3076:6: ( () ( ( ruleOpOr ) ) )
         {
-        // InternalPerspectiveDsl.g:3074:6: ( () ( ( ruleOpOr ) ) )
-        // InternalPerspectiveDsl.g:3075:6: () ( ( ruleOpOr ) )
+        // InternalPerspectiveDsl.g:3076:6: ( () ( ( ruleOpOr ) ) )
+        // InternalPerspectiveDsl.g:3077:6: () ( ( ruleOpOr ) )
         {
-        // InternalPerspectiveDsl.g:3075:6: ()
-        // InternalPerspectiveDsl.g:3076:6: 
+        // InternalPerspectiveDsl.g:3077:6: ()
+        // InternalPerspectiveDsl.g:3078:6: 
         {
         }
 
-        // InternalPerspectiveDsl.g:3077:6: ( ( ruleOpOr ) )
-        // InternalPerspectiveDsl.g:3078:7: ( ruleOpOr )
+        // InternalPerspectiveDsl.g:3079:6: ( ( ruleOpOr ) )
+        // InternalPerspectiveDsl.g:3080:7: ( ruleOpOr )
         {
-        // InternalPerspectiveDsl.g:3078:7: ( ruleOpOr )
-        // InternalPerspectiveDsl.g:3079:8: ruleOpOr
+        // InternalPerspectiveDsl.g:3080:7: ( ruleOpOr )
+        // InternalPerspectiveDsl.g:3081:8: ruleOpOr
         {
         pushFollow(FOLLOW_2);
         ruleOpOr();
@@ -25126,22 +25126,22 @@
 
     // $ANTLR start synpred9_InternalPerspectiveDsl
     public final void synpred9_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:3181:5: ( ( () ( ( ruleOpAnd ) ) ) )
-        // InternalPerspectiveDsl.g:3181:6: ( () ( ( ruleOpAnd ) ) )
+        // InternalPerspectiveDsl.g:3183:5: ( ( () ( ( ruleOpAnd ) ) ) )
+        // InternalPerspectiveDsl.g:3183:6: ( () ( ( ruleOpAnd ) ) )
         {
-        // InternalPerspectiveDsl.g:3181:6: ( () ( ( ruleOpAnd ) ) )
-        // InternalPerspectiveDsl.g:3182:6: () ( ( ruleOpAnd ) )
+        // InternalPerspectiveDsl.g:3183:6: ( () ( ( ruleOpAnd ) ) )
+        // InternalPerspectiveDsl.g:3184:6: () ( ( ruleOpAnd ) )
         {
-        // InternalPerspectiveDsl.g:3182:6: ()
-        // InternalPerspectiveDsl.g:3183:6: 
+        // InternalPerspectiveDsl.g:3184:6: ()
+        // InternalPerspectiveDsl.g:3185:6: 
         {
         }
 
-        // InternalPerspectiveDsl.g:3184:6: ( ( ruleOpAnd ) )
-        // InternalPerspectiveDsl.g:3185:7: ( ruleOpAnd )
+        // InternalPerspectiveDsl.g:3186:6: ( ( ruleOpAnd ) )
+        // InternalPerspectiveDsl.g:3187:7: ( ruleOpAnd )
         {
-        // InternalPerspectiveDsl.g:3185:7: ( ruleOpAnd )
-        // InternalPerspectiveDsl.g:3186:8: ruleOpAnd
+        // InternalPerspectiveDsl.g:3187:7: ( ruleOpAnd )
+        // InternalPerspectiveDsl.g:3188:8: ruleOpAnd
         {
         pushFollow(FOLLOW_2);
         ruleOpAnd();
@@ -25164,22 +25164,22 @@
 
     // $ANTLR start synpred10_InternalPerspectiveDsl
     public final void synpred10_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:3288:5: ( ( () ( ( ruleOpEquality ) ) ) )
-        // InternalPerspectiveDsl.g:3288:6: ( () ( ( ruleOpEquality ) ) )
+        // InternalPerspectiveDsl.g:3290:5: ( ( () ( ( ruleOpEquality ) ) ) )
+        // InternalPerspectiveDsl.g:3290:6: ( () ( ( ruleOpEquality ) ) )
         {
-        // InternalPerspectiveDsl.g:3288:6: ( () ( ( ruleOpEquality ) ) )
-        // InternalPerspectiveDsl.g:3289:6: () ( ( ruleOpEquality ) )
+        // InternalPerspectiveDsl.g:3290:6: ( () ( ( ruleOpEquality ) ) )
+        // InternalPerspectiveDsl.g:3291:6: () ( ( ruleOpEquality ) )
         {
-        // InternalPerspectiveDsl.g:3289:6: ()
-        // InternalPerspectiveDsl.g:3290:6: 
+        // InternalPerspectiveDsl.g:3291:6: ()
+        // InternalPerspectiveDsl.g:3292:6: 
         {
         }
 
-        // InternalPerspectiveDsl.g:3291:6: ( ( ruleOpEquality ) )
-        // InternalPerspectiveDsl.g:3292:7: ( ruleOpEquality )
+        // InternalPerspectiveDsl.g:3293:6: ( ( ruleOpEquality ) )
+        // InternalPerspectiveDsl.g:3294:7: ( ruleOpEquality )
         {
-        // InternalPerspectiveDsl.g:3292:7: ( ruleOpEquality )
-        // InternalPerspectiveDsl.g:3293:8: ruleOpEquality
+        // InternalPerspectiveDsl.g:3294:7: ( ruleOpEquality )
+        // InternalPerspectiveDsl.g:3295:8: ruleOpEquality
         {
         pushFollow(FOLLOW_2);
         ruleOpEquality();
@@ -25202,14 +25202,14 @@
 
     // $ANTLR start synpred11_InternalPerspectiveDsl
     public final void synpred11_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:3416:6: ( ( () 'instanceof' ) )
-        // InternalPerspectiveDsl.g:3416:7: ( () 'instanceof' )
+        // InternalPerspectiveDsl.g:3418:6: ( ( () 'instanceof' ) )
+        // InternalPerspectiveDsl.g:3418:7: ( () 'instanceof' )
         {
-        // InternalPerspectiveDsl.g:3416:7: ( () 'instanceof' )
-        // InternalPerspectiveDsl.g:3417:7: () 'instanceof'
+        // InternalPerspectiveDsl.g:3418:7: ( () 'instanceof' )
+        // InternalPerspectiveDsl.g:3419:7: () 'instanceof'
         {
-        // InternalPerspectiveDsl.g:3417:7: ()
-        // InternalPerspectiveDsl.g:3418:7: 
+        // InternalPerspectiveDsl.g:3419:7: ()
+        // InternalPerspectiveDsl.g:3420:7: 
         {
         }
 
@@ -25224,22 +25224,22 @@
 
     // $ANTLR start synpred12_InternalPerspectiveDsl
     public final void synpred12_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:3459:6: ( ( () ( ( ruleOpCompare ) ) ) )
-        // InternalPerspectiveDsl.g:3459:7: ( () ( ( ruleOpCompare ) ) )
+        // InternalPerspectiveDsl.g:3461:6: ( ( () ( ( ruleOpCompare ) ) ) )
+        // InternalPerspectiveDsl.g:3461:7: ( () ( ( ruleOpCompare ) ) )
         {
-        // InternalPerspectiveDsl.g:3459:7: ( () ( ( ruleOpCompare ) ) )
-        // InternalPerspectiveDsl.g:3460:7: () ( ( ruleOpCompare ) )
+        // InternalPerspectiveDsl.g:3461:7: ( () ( ( ruleOpCompare ) ) )
+        // InternalPerspectiveDsl.g:3462:7: () ( ( ruleOpCompare ) )
         {
-        // InternalPerspectiveDsl.g:3460:7: ()
-        // InternalPerspectiveDsl.g:3461:7: 
+        // InternalPerspectiveDsl.g:3462:7: ()
+        // InternalPerspectiveDsl.g:3463:7: 
         {
         }
 
-        // InternalPerspectiveDsl.g:3462:7: ( ( ruleOpCompare ) )
-        // InternalPerspectiveDsl.g:3463:8: ( ruleOpCompare )
+        // InternalPerspectiveDsl.g:3464:7: ( ( ruleOpCompare ) )
+        // InternalPerspectiveDsl.g:3465:8: ( ruleOpCompare )
         {
-        // InternalPerspectiveDsl.g:3463:8: ( ruleOpCompare )
-        // InternalPerspectiveDsl.g:3464:9: ruleOpCompare
+        // InternalPerspectiveDsl.g:3465:8: ( ruleOpCompare )
+        // InternalPerspectiveDsl.g:3466:9: ruleOpCompare
         {
         pushFollow(FOLLOW_2);
         ruleOpCompare();
@@ -25262,22 +25262,22 @@
 
     // $ANTLR start synpred13_InternalPerspectiveDsl
     public final void synpred13_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:3594:5: ( ( () ( ( ruleOpOther ) ) ) )
-        // InternalPerspectiveDsl.g:3594:6: ( () ( ( ruleOpOther ) ) )
+        // InternalPerspectiveDsl.g:3596:5: ( ( () ( ( ruleOpOther ) ) ) )
+        // InternalPerspectiveDsl.g:3596:6: ( () ( ( ruleOpOther ) ) )
         {
-        // InternalPerspectiveDsl.g:3594:6: ( () ( ( ruleOpOther ) ) )
-        // InternalPerspectiveDsl.g:3595:6: () ( ( ruleOpOther ) )
+        // InternalPerspectiveDsl.g:3596:6: ( () ( ( ruleOpOther ) ) )
+        // InternalPerspectiveDsl.g:3597:6: () ( ( ruleOpOther ) )
         {
-        // InternalPerspectiveDsl.g:3595:6: ()
-        // InternalPerspectiveDsl.g:3596:6: 
+        // InternalPerspectiveDsl.g:3597:6: ()
+        // InternalPerspectiveDsl.g:3598:6: 
         {
         }
 
-        // InternalPerspectiveDsl.g:3597:6: ( ( ruleOpOther ) )
-        // InternalPerspectiveDsl.g:3598:7: ( ruleOpOther )
+        // InternalPerspectiveDsl.g:3599:6: ( ( ruleOpOther ) )
+        // InternalPerspectiveDsl.g:3600:7: ( ruleOpOther )
         {
-        // InternalPerspectiveDsl.g:3598:7: ( ruleOpOther )
-        // InternalPerspectiveDsl.g:3599:8: ruleOpOther
+        // InternalPerspectiveDsl.g:3600:7: ( ruleOpOther )
+        // InternalPerspectiveDsl.g:3601:8: ruleOpOther
         {
         pushFollow(FOLLOW_2);
         ruleOpOther();
@@ -25300,11 +25300,11 @@
 
     // $ANTLR start synpred14_InternalPerspectiveDsl
     public final void synpred14_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:3714:6: ( ( '>' '>' ) )
-        // InternalPerspectiveDsl.g:3714:7: ( '>' '>' )
+        // InternalPerspectiveDsl.g:3716:6: ( ( '>' '>' ) )
+        // InternalPerspectiveDsl.g:3716:7: ( '>' '>' )
         {
-        // InternalPerspectiveDsl.g:3714:7: ( '>' '>' )
-        // InternalPerspectiveDsl.g:3715:7: '>' '>'
+        // InternalPerspectiveDsl.g:3716:7: ( '>' '>' )
+        // InternalPerspectiveDsl.g:3717:7: '>' '>'
         {
         match(input,71,FOLLOW_49); if (state.failed) return ;
         match(input,71,FOLLOW_2); if (state.failed) return ;
@@ -25318,11 +25318,11 @@
 
     // $ANTLR start synpred15_InternalPerspectiveDsl
     public final void synpred15_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:3749:6: ( ( '<' '<' ) )
-        // InternalPerspectiveDsl.g:3749:7: ( '<' '<' )
+        // InternalPerspectiveDsl.g:3751:6: ( ( '<' '<' ) )
+        // InternalPerspectiveDsl.g:3751:7: ( '<' '<' )
         {
-        // InternalPerspectiveDsl.g:3749:7: ( '<' '<' )
-        // InternalPerspectiveDsl.g:3750:7: '<' '<'
+        // InternalPerspectiveDsl.g:3751:7: ( '<' '<' )
+        // InternalPerspectiveDsl.g:3752:7: '<' '<'
         {
         match(input,70,FOLLOW_39); if (state.failed) return ;
         match(input,70,FOLLOW_2); if (state.failed) return ;
@@ -25336,22 +25336,22 @@
 
     // $ANTLR start synpred16_InternalPerspectiveDsl
     public final void synpred16_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:3822:5: ( ( () ( ( ruleOpAdd ) ) ) )
-        // InternalPerspectiveDsl.g:3822:6: ( () ( ( ruleOpAdd ) ) )
+        // InternalPerspectiveDsl.g:3824:5: ( ( () ( ( ruleOpAdd ) ) ) )
+        // InternalPerspectiveDsl.g:3824:6: ( () ( ( ruleOpAdd ) ) )
         {
-        // InternalPerspectiveDsl.g:3822:6: ( () ( ( ruleOpAdd ) ) )
-        // InternalPerspectiveDsl.g:3823:6: () ( ( ruleOpAdd ) )
+        // InternalPerspectiveDsl.g:3824:6: ( () ( ( ruleOpAdd ) ) )
+        // InternalPerspectiveDsl.g:3825:6: () ( ( ruleOpAdd ) )
         {
-        // InternalPerspectiveDsl.g:3823:6: ()
-        // InternalPerspectiveDsl.g:3824:6: 
+        // InternalPerspectiveDsl.g:3825:6: ()
+        // InternalPerspectiveDsl.g:3826:6: 
         {
         }
 
-        // InternalPerspectiveDsl.g:3825:6: ( ( ruleOpAdd ) )
-        // InternalPerspectiveDsl.g:3826:7: ( ruleOpAdd )
+        // InternalPerspectiveDsl.g:3827:6: ( ( ruleOpAdd ) )
+        // InternalPerspectiveDsl.g:3828:7: ( ruleOpAdd )
         {
-        // InternalPerspectiveDsl.g:3826:7: ( ruleOpAdd )
-        // InternalPerspectiveDsl.g:3827:8: ruleOpAdd
+        // InternalPerspectiveDsl.g:3828:7: ( ruleOpAdd )
+        // InternalPerspectiveDsl.g:3829:8: ruleOpAdd
         {
         pushFollow(FOLLOW_2);
         ruleOpAdd();
@@ -25374,22 +25374,22 @@
 
     // $ANTLR start synpred17_InternalPerspectiveDsl
     public final void synpred17_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:3937:5: ( ( () ( ( ruleOpMulti ) ) ) )
-        // InternalPerspectiveDsl.g:3937:6: ( () ( ( ruleOpMulti ) ) )
+        // InternalPerspectiveDsl.g:3939:5: ( ( () ( ( ruleOpMulti ) ) ) )
+        // InternalPerspectiveDsl.g:3939:6: ( () ( ( ruleOpMulti ) ) )
         {
-        // InternalPerspectiveDsl.g:3937:6: ( () ( ( ruleOpMulti ) ) )
-        // InternalPerspectiveDsl.g:3938:6: () ( ( ruleOpMulti ) )
+        // InternalPerspectiveDsl.g:3939:6: ( () ( ( ruleOpMulti ) ) )
+        // InternalPerspectiveDsl.g:3940:6: () ( ( ruleOpMulti ) )
         {
-        // InternalPerspectiveDsl.g:3938:6: ()
-        // InternalPerspectiveDsl.g:3939:6: 
+        // InternalPerspectiveDsl.g:3940:6: ()
+        // InternalPerspectiveDsl.g:3941:6: 
         {
         }
 
-        // InternalPerspectiveDsl.g:3940:6: ( ( ruleOpMulti ) )
-        // InternalPerspectiveDsl.g:3941:7: ( ruleOpMulti )
+        // InternalPerspectiveDsl.g:3942:6: ( ( ruleOpMulti ) )
+        // InternalPerspectiveDsl.g:3943:7: ( ruleOpMulti )
         {
-        // InternalPerspectiveDsl.g:3941:7: ( ruleOpMulti )
-        // InternalPerspectiveDsl.g:3942:8: ruleOpMulti
+        // InternalPerspectiveDsl.g:3943:7: ( ruleOpMulti )
+        // InternalPerspectiveDsl.g:3944:8: ruleOpMulti
         {
         pushFollow(FOLLOW_2);
         ruleOpMulti();
@@ -25412,14 +25412,14 @@
 
     // $ANTLR start synpred18_InternalPerspectiveDsl
     public final void synpred18_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:4172:5: ( ( () 'as' ) )
-        // InternalPerspectiveDsl.g:4172:6: ( () 'as' )
+        // InternalPerspectiveDsl.g:4174:5: ( ( () 'as' ) )
+        // InternalPerspectiveDsl.g:4174:6: ( () 'as' )
         {
-        // InternalPerspectiveDsl.g:4172:6: ( () 'as' )
-        // InternalPerspectiveDsl.g:4173:6: () 'as'
+        // InternalPerspectiveDsl.g:4174:6: ( () 'as' )
+        // InternalPerspectiveDsl.g:4175:6: () 'as'
         {
-        // InternalPerspectiveDsl.g:4173:6: ()
-        // InternalPerspectiveDsl.g:4174:6: 
+        // InternalPerspectiveDsl.g:4175:6: ()
+        // InternalPerspectiveDsl.g:4176:6: 
         {
         }
 
@@ -25434,22 +25434,22 @@
 
     // $ANTLR start synpred19_InternalPerspectiveDsl
     public final void synpred19_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:4240:4: ( ( () ( ( ruleOpPostfix ) ) ) )
-        // InternalPerspectiveDsl.g:4240:5: ( () ( ( ruleOpPostfix ) ) )
+        // InternalPerspectiveDsl.g:4242:4: ( ( () ( ( ruleOpPostfix ) ) ) )
+        // InternalPerspectiveDsl.g:4242:5: ( () ( ( ruleOpPostfix ) ) )
         {
-        // InternalPerspectiveDsl.g:4240:5: ( () ( ( ruleOpPostfix ) ) )
-        // InternalPerspectiveDsl.g:4241:5: () ( ( ruleOpPostfix ) )
+        // InternalPerspectiveDsl.g:4242:5: ( () ( ( ruleOpPostfix ) ) )
+        // InternalPerspectiveDsl.g:4243:5: () ( ( ruleOpPostfix ) )
         {
-        // InternalPerspectiveDsl.g:4241:5: ()
-        // InternalPerspectiveDsl.g:4242:5: 
+        // InternalPerspectiveDsl.g:4243:5: ()
+        // InternalPerspectiveDsl.g:4244:5: 
         {
         }
 
-        // InternalPerspectiveDsl.g:4243:5: ( ( ruleOpPostfix ) )
-        // InternalPerspectiveDsl.g:4244:6: ( ruleOpPostfix )
+        // InternalPerspectiveDsl.g:4245:5: ( ( ruleOpPostfix ) )
+        // InternalPerspectiveDsl.g:4246:6: ( ruleOpPostfix )
         {
-        // InternalPerspectiveDsl.g:4244:6: ( ruleOpPostfix )
-        // InternalPerspectiveDsl.g:4245:7: ruleOpPostfix
+        // InternalPerspectiveDsl.g:4246:6: ( ruleOpPostfix )
+        // InternalPerspectiveDsl.g:4247:7: ruleOpPostfix
         {
         pushFollow(FOLLOW_2);
         ruleOpPostfix();
@@ -25472,18 +25472,18 @@
 
     // $ANTLR start synpred20_InternalPerspectiveDsl
     public final void synpred20_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:4336:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
-        // InternalPerspectiveDsl.g:4336:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+        // InternalPerspectiveDsl.g:4338:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
+        // InternalPerspectiveDsl.g:4338:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
         {
-        // InternalPerspectiveDsl.g:4336:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
-        // InternalPerspectiveDsl.g:4337:7: () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
+        // InternalPerspectiveDsl.g:4338:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+        // InternalPerspectiveDsl.g:4339:7: () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
         {
-        // InternalPerspectiveDsl.g:4337:7: ()
-        // InternalPerspectiveDsl.g:4338:7: 
+        // InternalPerspectiveDsl.g:4339:7: ()
+        // InternalPerspectiveDsl.g:4340:7: 
         {
         }
 
-        // InternalPerspectiveDsl.g:4339:7: ( '.' | ( ( '::' ) ) )
+        // InternalPerspectiveDsl.g:4341:7: ( '.' | ( ( '::' ) ) )
         int alt141=2;
         int LA141_0 = input.LA(1);
 
@@ -25502,20 +25502,20 @@
         }
         switch (alt141) {
             case 1 :
-                // InternalPerspectiveDsl.g:4340:8: '.'
+                // InternalPerspectiveDsl.g:4342:8: '.'
                 {
                 match(input,95,FOLLOW_56); if (state.failed) return ;
 
                 }
                 break;
             case 2 :
-                // InternalPerspectiveDsl.g:4342:8: ( ( '::' ) )
+                // InternalPerspectiveDsl.g:4344:8: ( ( '::' ) )
                 {
-                // InternalPerspectiveDsl.g:4342:8: ( ( '::' ) )
-                // InternalPerspectiveDsl.g:4343:9: ( '::' )
+                // InternalPerspectiveDsl.g:4344:8: ( ( '::' ) )
+                // InternalPerspectiveDsl.g:4345:9: ( '::' )
                 {
-                // InternalPerspectiveDsl.g:4343:9: ( '::' )
-                // InternalPerspectiveDsl.g:4344:10: '::'
+                // InternalPerspectiveDsl.g:4345:9: ( '::' )
+                // InternalPerspectiveDsl.g:4346:10: '::'
                 {
                 match(input,96,FOLLOW_56); if (state.failed) return ;
 
@@ -25530,11 +25530,11 @@
 
         }
 
-        // InternalPerspectiveDsl.g:4348:7: ( ( ruleFeatureCallID ) )
-        // InternalPerspectiveDsl.g:4349:8: ( ruleFeatureCallID )
+        // InternalPerspectiveDsl.g:4350:7: ( ( ruleFeatureCallID ) )
+        // InternalPerspectiveDsl.g:4351:8: ( ruleFeatureCallID )
         {
-        // InternalPerspectiveDsl.g:4349:8: ( ruleFeatureCallID )
-        // InternalPerspectiveDsl.g:4350:9: ruleFeatureCallID
+        // InternalPerspectiveDsl.g:4351:8: ( ruleFeatureCallID )
+        // InternalPerspectiveDsl.g:4352:9: ruleFeatureCallID
         {
         pushFollow(FOLLOW_32);
         ruleFeatureCallID();
@@ -25562,18 +25562,18 @@
 
     // $ANTLR start synpred21_InternalPerspectiveDsl
     public final void synpred21_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:4433:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )
-        // InternalPerspectiveDsl.g:4433:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
+        // InternalPerspectiveDsl.g:4435:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )
+        // InternalPerspectiveDsl.g:4435:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
         {
-        // InternalPerspectiveDsl.g:4433:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
-        // InternalPerspectiveDsl.g:4434:7: () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
+        // InternalPerspectiveDsl.g:4435:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
+        // InternalPerspectiveDsl.g:4436:7: () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
         {
-        // InternalPerspectiveDsl.g:4434:7: ()
-        // InternalPerspectiveDsl.g:4435:7: 
+        // InternalPerspectiveDsl.g:4436:7: ()
+        // InternalPerspectiveDsl.g:4437:7: 
         {
         }
 
-        // InternalPerspectiveDsl.g:4436:7: ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
+        // InternalPerspectiveDsl.g:4438:7: ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
         int alt142=3;
         switch ( input.LA(1) ) {
         case 95:
@@ -25601,20 +25601,20 @@
 
         switch (alt142) {
             case 1 :
-                // InternalPerspectiveDsl.g:4437:8: '.'
+                // InternalPerspectiveDsl.g:4439:8: '.'
                 {
                 match(input,95,FOLLOW_2); if (state.failed) return ;
 
                 }
                 break;
             case 2 :
-                // InternalPerspectiveDsl.g:4439:8: ( ( '?.' ) )
+                // InternalPerspectiveDsl.g:4441:8: ( ( '?.' ) )
                 {
-                // InternalPerspectiveDsl.g:4439:8: ( ( '?.' ) )
-                // InternalPerspectiveDsl.g:4440:9: ( '?.' )
+                // InternalPerspectiveDsl.g:4441:8: ( ( '?.' ) )
+                // InternalPerspectiveDsl.g:4442:9: ( '?.' )
                 {
-                // InternalPerspectiveDsl.g:4440:9: ( '?.' )
-                // InternalPerspectiveDsl.g:4441:10: '?.'
+                // InternalPerspectiveDsl.g:4442:9: ( '?.' )
+                // InternalPerspectiveDsl.g:4443:10: '?.'
                 {
                 match(input,97,FOLLOW_2); if (state.failed) return ;
 
@@ -25627,13 +25627,13 @@
                 }
                 break;
             case 3 :
-                // InternalPerspectiveDsl.g:4445:8: ( ( '::' ) )
+                // InternalPerspectiveDsl.g:4447:8: ( ( '::' ) )
                 {
-                // InternalPerspectiveDsl.g:4445:8: ( ( '::' ) )
-                // InternalPerspectiveDsl.g:4446:9: ( '::' )
+                // InternalPerspectiveDsl.g:4447:8: ( ( '::' ) )
+                // InternalPerspectiveDsl.g:4448:9: ( '::' )
                 {
-                // InternalPerspectiveDsl.g:4446:9: ( '::' )
-                // InternalPerspectiveDsl.g:4447:10: '::'
+                // InternalPerspectiveDsl.g:4448:9: ( '::' )
+                // InternalPerspectiveDsl.g:4449:10: '::'
                 {
                 match(input,96,FOLLOW_2); if (state.failed) return ;
 
@@ -25658,11 +25658,11 @@
 
     // $ANTLR start synpred22_InternalPerspectiveDsl
     public final void synpred22_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:4571:7: ( ( '(' ) )
-        // InternalPerspectiveDsl.g:4571:8: ( '(' )
+        // InternalPerspectiveDsl.g:4573:7: ( ( '(' ) )
+        // InternalPerspectiveDsl.g:4573:8: ( '(' )
         {
-        // InternalPerspectiveDsl.g:4571:8: ( '(' )
-        // InternalPerspectiveDsl.g:4572:8: '('
+        // InternalPerspectiveDsl.g:4573:8: ( '(' )
+        // InternalPerspectiveDsl.g:4574:8: '('
         {
         match(input,58,FOLLOW_2); if (state.failed) return ;
 
@@ -25675,18 +25675,18 @@
 
     // $ANTLR start synpred23_InternalPerspectiveDsl
     public final void synpred23_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:4590:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
-        // InternalPerspectiveDsl.g:4590:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalPerspectiveDsl.g:4592:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalPerspectiveDsl.g:4592:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
         {
-        // InternalPerspectiveDsl.g:4590:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
-        // InternalPerspectiveDsl.g:4591:9: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        // InternalPerspectiveDsl.g:4592:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalPerspectiveDsl.g:4593:9: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
         {
-        // InternalPerspectiveDsl.g:4591:9: ()
-        // InternalPerspectiveDsl.g:4592:9: 
+        // InternalPerspectiveDsl.g:4593:9: ()
+        // InternalPerspectiveDsl.g:4594:9: 
         {
         }
 
-        // InternalPerspectiveDsl.g:4593:9: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        // InternalPerspectiveDsl.g:4595:9: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
         int alt144=2;
         int LA144_0 = input.LA(1);
 
@@ -25695,13 +25695,13 @@
         }
         switch (alt144) {
             case 1 :
-                // InternalPerspectiveDsl.g:4594:10: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                // InternalPerspectiveDsl.g:4596:10: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                 {
-                // InternalPerspectiveDsl.g:4594:10: ( ( ruleJvmFormalParameter ) )
-                // InternalPerspectiveDsl.g:4595:11: ( ruleJvmFormalParameter )
+                // InternalPerspectiveDsl.g:4596:10: ( ( ruleJvmFormalParameter ) )
+                // InternalPerspectiveDsl.g:4597:11: ( ruleJvmFormalParameter )
                 {
-                // InternalPerspectiveDsl.g:4595:11: ( ruleJvmFormalParameter )
-                // InternalPerspectiveDsl.g:4596:12: ruleJvmFormalParameter
+                // InternalPerspectiveDsl.g:4597:11: ( ruleJvmFormalParameter )
+                // InternalPerspectiveDsl.g:4598:12: ruleJvmFormalParameter
                 {
                 pushFollow(FOLLOW_67);
                 ruleJvmFormalParameter();
@@ -25714,7 +25714,7 @@
 
                 }
 
-                // InternalPerspectiveDsl.g:4599:10: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                // InternalPerspectiveDsl.g:4601:10: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                 loop143:
                 do {
                     int alt143=2;
@@ -25727,14 +25727,14 @@
 
                     switch (alt143) {
                 	case 1 :
-                	    // InternalPerspectiveDsl.g:4600:11: ',' ( ( ruleJvmFormalParameter ) )
+                	    // InternalPerspectiveDsl.g:4602:11: ',' ( ( ruleJvmFormalParameter ) )
                 	    {
                 	    match(input,59,FOLLOW_46); if (state.failed) return ;
-                	    // InternalPerspectiveDsl.g:4601:11: ( ( ruleJvmFormalParameter ) )
-                	    // InternalPerspectiveDsl.g:4602:12: ( ruleJvmFormalParameter )
+                	    // InternalPerspectiveDsl.g:4603:11: ( ( ruleJvmFormalParameter ) )
+                	    // InternalPerspectiveDsl.g:4604:12: ( ruleJvmFormalParameter )
                 	    {
-                	    // InternalPerspectiveDsl.g:4602:12: ( ruleJvmFormalParameter )
-                	    // InternalPerspectiveDsl.g:4603:13: ruleJvmFormalParameter
+                	    // InternalPerspectiveDsl.g:4604:12: ( ruleJvmFormalParameter )
+                	    // InternalPerspectiveDsl.g:4605:13: ruleJvmFormalParameter
                 	    {
                 	    pushFollow(FOLLOW_67);
                 	    ruleJvmFormalParameter();
@@ -25762,11 +25762,11 @@
 
         }
 
-        // InternalPerspectiveDsl.g:4608:9: ( ( '|' ) )
-        // InternalPerspectiveDsl.g:4609:10: ( '|' )
+        // InternalPerspectiveDsl.g:4610:9: ( ( '|' ) )
+        // InternalPerspectiveDsl.g:4611:10: ( '|' )
         {
-        // InternalPerspectiveDsl.g:4609:10: ( '|' )
-        // InternalPerspectiveDsl.g:4610:11: '|'
+        // InternalPerspectiveDsl.g:4611:10: ( '|' )
+        // InternalPerspectiveDsl.g:4612:11: '|'
         {
         match(input,98,FOLLOW_2); if (state.failed) return ;
 
@@ -25785,14 +25785,14 @@
 
     // $ANTLR start synpred24_InternalPerspectiveDsl
     public final void synpred24_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:4687:6: ( ( () '[' ) )
-        // InternalPerspectiveDsl.g:4687:7: ( () '[' )
+        // InternalPerspectiveDsl.g:4689:6: ( ( () '[' ) )
+        // InternalPerspectiveDsl.g:4689:7: ( () '[' )
         {
-        // InternalPerspectiveDsl.g:4687:7: ( () '[' )
-        // InternalPerspectiveDsl.g:4688:7: () '['
+        // InternalPerspectiveDsl.g:4689:7: ( () '[' )
+        // InternalPerspectiveDsl.g:4690:7: () '['
         {
-        // InternalPerspectiveDsl.g:4688:7: ()
-        // InternalPerspectiveDsl.g:4689:7: 
+        // InternalPerspectiveDsl.g:4690:7: ()
+        // InternalPerspectiveDsl.g:4691:7: 
         {
         }
 
@@ -25807,14 +25807,14 @@
 
     // $ANTLR start synpred25_InternalPerspectiveDsl
     public final void synpred25_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:4760:4: ( ( () 'synchronized' '(' ) )
-        // InternalPerspectiveDsl.g:4760:5: ( () 'synchronized' '(' )
+        // InternalPerspectiveDsl.g:4762:4: ( ( () 'synchronized' '(' ) )
+        // InternalPerspectiveDsl.g:4762:5: ( () 'synchronized' '(' )
         {
-        // InternalPerspectiveDsl.g:4760:5: ( () 'synchronized' '(' )
-        // InternalPerspectiveDsl.g:4761:5: () 'synchronized' '('
+        // InternalPerspectiveDsl.g:4762:5: ( () 'synchronized' '(' )
+        // InternalPerspectiveDsl.g:4763:5: () 'synchronized' '('
         {
-        // InternalPerspectiveDsl.g:4761:5: ()
-        // InternalPerspectiveDsl.g:4762:5: 
+        // InternalPerspectiveDsl.g:4763:5: ()
+        // InternalPerspectiveDsl.g:4764:5: 
         {
         }
 
@@ -25830,24 +25830,24 @@
 
     // $ANTLR start synpred26_InternalPerspectiveDsl
     public final void synpred26_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:4805:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
-        // InternalPerspectiveDsl.g:4805:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalPerspectiveDsl.g:4807:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
+        // InternalPerspectiveDsl.g:4807:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
         {
-        // InternalPerspectiveDsl.g:4805:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
-        // InternalPerspectiveDsl.g:4806:5: () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':'
+        // InternalPerspectiveDsl.g:4807:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalPerspectiveDsl.g:4808:5: () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':'
         {
-        // InternalPerspectiveDsl.g:4806:5: ()
-        // InternalPerspectiveDsl.g:4807:5: 
+        // InternalPerspectiveDsl.g:4808:5: ()
+        // InternalPerspectiveDsl.g:4809:5: 
         {
         }
 
         match(input,105,FOLLOW_72); if (state.failed) return ;
         match(input,58,FOLLOW_46); if (state.failed) return ;
-        // InternalPerspectiveDsl.g:4810:5: ( ( ruleJvmFormalParameter ) )
-        // InternalPerspectiveDsl.g:4811:6: ( ruleJvmFormalParameter )
+        // InternalPerspectiveDsl.g:4812:5: ( ( ruleJvmFormalParameter ) )
+        // InternalPerspectiveDsl.g:4813:6: ( ruleJvmFormalParameter )
         {
-        // InternalPerspectiveDsl.g:4811:6: ( ruleJvmFormalParameter )
-        // InternalPerspectiveDsl.g:4812:7: ruleJvmFormalParameter
+        // InternalPerspectiveDsl.g:4813:6: ( ruleJvmFormalParameter )
+        // InternalPerspectiveDsl.g:4814:7: ruleJvmFormalParameter
         {
         pushFollow(FOLLOW_75);
         ruleJvmFormalParameter();
@@ -25871,14 +25871,14 @@
 
     // $ANTLR start synpred27_InternalPerspectiveDsl
     public final void synpred27_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:4919:4: ( ( () '[' ) )
-        // InternalPerspectiveDsl.g:4919:5: ( () '[' )
+        // InternalPerspectiveDsl.g:4921:4: ( ( () '[' ) )
+        // InternalPerspectiveDsl.g:4921:5: ( () '[' )
         {
-        // InternalPerspectiveDsl.g:4919:5: ( () '[' )
-        // InternalPerspectiveDsl.g:4920:5: () '['
+        // InternalPerspectiveDsl.g:4921:5: ( () '[' )
+        // InternalPerspectiveDsl.g:4922:5: () '['
         {
-        // InternalPerspectiveDsl.g:4920:5: ()
-        // InternalPerspectiveDsl.g:4921:5: 
+        // InternalPerspectiveDsl.g:4922:5: ()
+        // InternalPerspectiveDsl.g:4923:5: 
         {
         }
 
@@ -25893,13 +25893,13 @@
 
     // $ANTLR start synpred29_InternalPerspectiveDsl
     public final void synpred29_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:5224:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
-        // InternalPerspectiveDsl.g:5224:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalPerspectiveDsl.g:5226:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalPerspectiveDsl.g:5226:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
         {
-        // InternalPerspectiveDsl.g:5224:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
-        // InternalPerspectiveDsl.g:5225:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        // InternalPerspectiveDsl.g:5226:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalPerspectiveDsl.g:5227:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
         {
-        // InternalPerspectiveDsl.g:5225:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        // InternalPerspectiveDsl.g:5227:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
         int alt146=2;
         int LA146_0 = input.LA(1);
 
@@ -25908,13 +25908,13 @@
         }
         switch (alt146) {
             case 1 :
-                // InternalPerspectiveDsl.g:5226:6: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                // InternalPerspectiveDsl.g:5228:6: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                 {
-                // InternalPerspectiveDsl.g:5226:6: ( ( ruleJvmFormalParameter ) )
-                // InternalPerspectiveDsl.g:5227:7: ( ruleJvmFormalParameter )
+                // InternalPerspectiveDsl.g:5228:6: ( ( ruleJvmFormalParameter ) )
+                // InternalPerspectiveDsl.g:5229:7: ( ruleJvmFormalParameter )
                 {
-                // InternalPerspectiveDsl.g:5227:7: ( ruleJvmFormalParameter )
-                // InternalPerspectiveDsl.g:5228:8: ruleJvmFormalParameter
+                // InternalPerspectiveDsl.g:5229:7: ( ruleJvmFormalParameter )
+                // InternalPerspectiveDsl.g:5230:8: ruleJvmFormalParameter
                 {
                 pushFollow(FOLLOW_67);
                 ruleJvmFormalParameter();
@@ -25927,7 +25927,7 @@
 
                 }
 
-                // InternalPerspectiveDsl.g:5231:6: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                // InternalPerspectiveDsl.g:5233:6: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                 loop145:
                 do {
                     int alt145=2;
@@ -25940,14 +25940,14 @@
 
                     switch (alt145) {
                 	case 1 :
-                	    // InternalPerspectiveDsl.g:5232:7: ',' ( ( ruleJvmFormalParameter ) )
+                	    // InternalPerspectiveDsl.g:5234:7: ',' ( ( ruleJvmFormalParameter ) )
                 	    {
                 	    match(input,59,FOLLOW_46); if (state.failed) return ;
-                	    // InternalPerspectiveDsl.g:5233:7: ( ( ruleJvmFormalParameter ) )
-                	    // InternalPerspectiveDsl.g:5234:8: ( ruleJvmFormalParameter )
+                	    // InternalPerspectiveDsl.g:5235:7: ( ( ruleJvmFormalParameter ) )
+                	    // InternalPerspectiveDsl.g:5236:8: ( ruleJvmFormalParameter )
                 	    {
-                	    // InternalPerspectiveDsl.g:5234:8: ( ruleJvmFormalParameter )
-                	    // InternalPerspectiveDsl.g:5235:9: ruleJvmFormalParameter
+                	    // InternalPerspectiveDsl.g:5236:8: ( ruleJvmFormalParameter )
+                	    // InternalPerspectiveDsl.g:5237:9: ruleJvmFormalParameter
                 	    {
                 	    pushFollow(FOLLOW_67);
                 	    ruleJvmFormalParameter();
@@ -25975,11 +25975,11 @@
 
         }
 
-        // InternalPerspectiveDsl.g:5240:5: ( ( '|' ) )
-        // InternalPerspectiveDsl.g:5241:6: ( '|' )
+        // InternalPerspectiveDsl.g:5242:5: ( ( '|' ) )
+        // InternalPerspectiveDsl.g:5243:6: ( '|' )
         {
-        // InternalPerspectiveDsl.g:5241:6: ( '|' )
-        // InternalPerspectiveDsl.g:5242:7: '|'
+        // InternalPerspectiveDsl.g:5243:6: ( '|' )
+        // InternalPerspectiveDsl.g:5244:7: '|'
         {
         match(input,98,FOLLOW_2); if (state.failed) return ;
 
@@ -25998,8 +25998,8 @@
 
     // $ANTLR start synpred31_InternalPerspectiveDsl
     public final void synpred31_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:5633:5: ( 'else' )
-        // InternalPerspectiveDsl.g:5633:6: 'else'
+        // InternalPerspectiveDsl.g:5635:5: ( 'else' )
+        // InternalPerspectiveDsl.g:5635:6: 'else'
         {
         match(input,100,FOLLOW_2); if (state.failed) return ;
 
@@ -26009,18 +26009,18 @@
 
     // $ANTLR start synpred32_InternalPerspectiveDsl
     public final void synpred32_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:5692:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
-        // InternalPerspectiveDsl.g:5692:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalPerspectiveDsl.g:5694:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
+        // InternalPerspectiveDsl.g:5694:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
         {
-        // InternalPerspectiveDsl.g:5692:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
-        // InternalPerspectiveDsl.g:5693:7: '(' ( ( ruleJvmFormalParameter ) ) ':'
+        // InternalPerspectiveDsl.g:5694:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalPerspectiveDsl.g:5695:7: '(' ( ( ruleJvmFormalParameter ) ) ':'
         {
         match(input,58,FOLLOW_46); if (state.failed) return ;
-        // InternalPerspectiveDsl.g:5694:7: ( ( ruleJvmFormalParameter ) )
-        // InternalPerspectiveDsl.g:5695:8: ( ruleJvmFormalParameter )
+        // InternalPerspectiveDsl.g:5696:7: ( ( ruleJvmFormalParameter ) )
+        // InternalPerspectiveDsl.g:5697:8: ( ruleJvmFormalParameter )
         {
-        // InternalPerspectiveDsl.g:5695:8: ( ruleJvmFormalParameter )
-        // InternalPerspectiveDsl.g:5696:9: ruleJvmFormalParameter
+        // InternalPerspectiveDsl.g:5697:8: ( ruleJvmFormalParameter )
+        // InternalPerspectiveDsl.g:5698:9: ruleJvmFormalParameter
         {
         pushFollow(FOLLOW_75);
         ruleJvmFormalParameter();
@@ -26044,17 +26044,17 @@
 
     // $ANTLR start synpred33_InternalPerspectiveDsl
     public final void synpred33_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:5759:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )
-        // InternalPerspectiveDsl.g:5759:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalPerspectiveDsl.g:5761:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )
+        // InternalPerspectiveDsl.g:5761:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
         {
-        // InternalPerspectiveDsl.g:5759:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
-        // InternalPerspectiveDsl.g:5760:7: ( ( ruleJvmFormalParameter ) ) ':'
+        // InternalPerspectiveDsl.g:5761:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalPerspectiveDsl.g:5762:7: ( ( ruleJvmFormalParameter ) ) ':'
         {
-        // InternalPerspectiveDsl.g:5760:7: ( ( ruleJvmFormalParameter ) )
-        // InternalPerspectiveDsl.g:5761:8: ( ruleJvmFormalParameter )
+        // InternalPerspectiveDsl.g:5762:7: ( ( ruleJvmFormalParameter ) )
+        // InternalPerspectiveDsl.g:5763:8: ( ruleJvmFormalParameter )
         {
-        // InternalPerspectiveDsl.g:5761:8: ( ruleJvmFormalParameter )
-        // InternalPerspectiveDsl.g:5762:9: ruleJvmFormalParameter
+        // InternalPerspectiveDsl.g:5763:8: ( ruleJvmFormalParameter )
+        // InternalPerspectiveDsl.g:5764:9: ruleJvmFormalParameter
         {
         pushFollow(FOLLOW_75);
         ruleJvmFormalParameter();
@@ -26078,17 +26078,17 @@
 
     // $ANTLR start synpred35_InternalPerspectiveDsl
     public final void synpred35_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:6577:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )
-        // InternalPerspectiveDsl.g:6577:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
+        // InternalPerspectiveDsl.g:6579:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )
+        // InternalPerspectiveDsl.g:6579:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
         {
-        // InternalPerspectiveDsl.g:6577:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
-        // InternalPerspectiveDsl.g:6578:6: ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) )
+        // InternalPerspectiveDsl.g:6579:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
+        // InternalPerspectiveDsl.g:6580:6: ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) )
         {
-        // InternalPerspectiveDsl.g:6578:6: ( ( ruleJvmTypeReference ) )
-        // InternalPerspectiveDsl.g:6579:7: ( ruleJvmTypeReference )
+        // InternalPerspectiveDsl.g:6580:6: ( ( ruleJvmTypeReference ) )
+        // InternalPerspectiveDsl.g:6581:7: ( ruleJvmTypeReference )
         {
-        // InternalPerspectiveDsl.g:6579:7: ( ruleJvmTypeReference )
-        // InternalPerspectiveDsl.g:6580:8: ruleJvmTypeReference
+        // InternalPerspectiveDsl.g:6581:7: ( ruleJvmTypeReference )
+        // InternalPerspectiveDsl.g:6582:8: ruleJvmTypeReference
         {
         pushFollow(FOLLOW_4);
         ruleJvmTypeReference();
@@ -26101,11 +26101,11 @@
 
         }
 
-        // InternalPerspectiveDsl.g:6583:6: ( ( ruleValidID ) )
-        // InternalPerspectiveDsl.g:6584:7: ( ruleValidID )
+        // InternalPerspectiveDsl.g:6585:6: ( ( ruleValidID ) )
+        // InternalPerspectiveDsl.g:6586:7: ( ruleValidID )
         {
-        // InternalPerspectiveDsl.g:6584:7: ( ruleValidID )
-        // InternalPerspectiveDsl.g:6585:8: ruleValidID
+        // InternalPerspectiveDsl.g:6586:7: ( ruleValidID )
+        // InternalPerspectiveDsl.g:6587:8: ruleValidID
         {
         pushFollow(FOLLOW_2);
         ruleValidID();
@@ -26128,11 +26128,11 @@
 
     // $ANTLR start synpred36_InternalPerspectiveDsl
     public final void synpred36_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:6889:5: ( ( '(' ) )
-        // InternalPerspectiveDsl.g:6889:6: ( '(' )
+        // InternalPerspectiveDsl.g:6891:5: ( ( '(' ) )
+        // InternalPerspectiveDsl.g:6891:6: ( '(' )
         {
-        // InternalPerspectiveDsl.g:6889:6: ( '(' )
-        // InternalPerspectiveDsl.g:6890:6: '('
+        // InternalPerspectiveDsl.g:6891:6: ( '(' )
+        // InternalPerspectiveDsl.g:6892:6: '('
         {
         match(input,58,FOLLOW_2); if (state.failed) return ;
 
@@ -26145,18 +26145,18 @@
 
     // $ANTLR start synpred37_InternalPerspectiveDsl
     public final void synpred37_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:6908:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
-        // InternalPerspectiveDsl.g:6908:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalPerspectiveDsl.g:6910:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalPerspectiveDsl.g:6910:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
         {
-        // InternalPerspectiveDsl.g:6908:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
-        // InternalPerspectiveDsl.g:6909:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        // InternalPerspectiveDsl.g:6910:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalPerspectiveDsl.g:6911:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
         {
-        // InternalPerspectiveDsl.g:6909:7: ()
-        // InternalPerspectiveDsl.g:6910:7: 
+        // InternalPerspectiveDsl.g:6911:7: ()
+        // InternalPerspectiveDsl.g:6912:7: 
         {
         }
 
-        // InternalPerspectiveDsl.g:6911:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        // InternalPerspectiveDsl.g:6913:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
         int alt150=2;
         int LA150_0 = input.LA(1);
 
@@ -26165,13 +26165,13 @@
         }
         switch (alt150) {
             case 1 :
-                // InternalPerspectiveDsl.g:6912:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                // InternalPerspectiveDsl.g:6914:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                 {
-                // InternalPerspectiveDsl.g:6912:8: ( ( ruleJvmFormalParameter ) )
-                // InternalPerspectiveDsl.g:6913:9: ( ruleJvmFormalParameter )
+                // InternalPerspectiveDsl.g:6914:8: ( ( ruleJvmFormalParameter ) )
+                // InternalPerspectiveDsl.g:6915:9: ( ruleJvmFormalParameter )
                 {
-                // InternalPerspectiveDsl.g:6913:9: ( ruleJvmFormalParameter )
-                // InternalPerspectiveDsl.g:6914:10: ruleJvmFormalParameter
+                // InternalPerspectiveDsl.g:6915:9: ( ruleJvmFormalParameter )
+                // InternalPerspectiveDsl.g:6916:10: ruleJvmFormalParameter
                 {
                 pushFollow(FOLLOW_67);
                 ruleJvmFormalParameter();
@@ -26184,7 +26184,7 @@
 
                 }
 
-                // InternalPerspectiveDsl.g:6917:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                // InternalPerspectiveDsl.g:6919:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                 loop149:
                 do {
                     int alt149=2;
@@ -26197,14 +26197,14 @@
 
                     switch (alt149) {
                 	case 1 :
-                	    // InternalPerspectiveDsl.g:6918:9: ',' ( ( ruleJvmFormalParameter ) )
+                	    // InternalPerspectiveDsl.g:6920:9: ',' ( ( ruleJvmFormalParameter ) )
                 	    {
                 	    match(input,59,FOLLOW_46); if (state.failed) return ;
-                	    // InternalPerspectiveDsl.g:6919:9: ( ( ruleJvmFormalParameter ) )
-                	    // InternalPerspectiveDsl.g:6920:10: ( ruleJvmFormalParameter )
+                	    // InternalPerspectiveDsl.g:6921:9: ( ( ruleJvmFormalParameter ) )
+                	    // InternalPerspectiveDsl.g:6922:10: ( ruleJvmFormalParameter )
                 	    {
-                	    // InternalPerspectiveDsl.g:6920:10: ( ruleJvmFormalParameter )
-                	    // InternalPerspectiveDsl.g:6921:11: ruleJvmFormalParameter
+                	    // InternalPerspectiveDsl.g:6922:10: ( ruleJvmFormalParameter )
+                	    // InternalPerspectiveDsl.g:6923:11: ruleJvmFormalParameter
                 	    {
                 	    pushFollow(FOLLOW_67);
                 	    ruleJvmFormalParameter();
@@ -26232,11 +26232,11 @@
 
         }
 
-        // InternalPerspectiveDsl.g:6926:7: ( ( '|' ) )
-        // InternalPerspectiveDsl.g:6927:8: ( '|' )
+        // InternalPerspectiveDsl.g:6928:7: ( ( '|' ) )
+        // InternalPerspectiveDsl.g:6929:8: ( '|' )
         {
-        // InternalPerspectiveDsl.g:6927:8: ( '|' )
-        // InternalPerspectiveDsl.g:6928:9: '|'
+        // InternalPerspectiveDsl.g:6929:8: ( '|' )
+        // InternalPerspectiveDsl.g:6930:9: '|'
         {
         match(input,98,FOLLOW_2); if (state.failed) return ;
 
@@ -26255,14 +26255,14 @@
 
     // $ANTLR start synpred38_InternalPerspectiveDsl
     public final void synpred38_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:7005:4: ( ( () '[' ) )
-        // InternalPerspectiveDsl.g:7005:5: ( () '[' )
+        // InternalPerspectiveDsl.g:7007:4: ( ( () '[' ) )
+        // InternalPerspectiveDsl.g:7007:5: ( () '[' )
         {
-        // InternalPerspectiveDsl.g:7005:5: ( () '[' )
-        // InternalPerspectiveDsl.g:7006:5: () '['
+        // InternalPerspectiveDsl.g:7007:5: ( () '[' )
+        // InternalPerspectiveDsl.g:7008:5: () '['
         {
-        // InternalPerspectiveDsl.g:7006:5: ()
-        // InternalPerspectiveDsl.g:7007:5: 
+        // InternalPerspectiveDsl.g:7008:5: ()
+        // InternalPerspectiveDsl.g:7009:5: 
         {
         }
 
@@ -26277,8 +26277,8 @@
 
     // $ANTLR start synpred39_InternalPerspectiveDsl
     public final void synpred39_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:7165:5: ( '<' )
-        // InternalPerspectiveDsl.g:7165:6: '<'
+        // InternalPerspectiveDsl.g:7167:5: ( '<' )
+        // InternalPerspectiveDsl.g:7167:6: '<'
         {
         match(input,70,FOLLOW_2); if (state.failed) return ;
 
@@ -26288,11 +26288,11 @@
 
     // $ANTLR start synpred40_InternalPerspectiveDsl
     public final void synpred40_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:7222:5: ( ( '(' ) )
-        // InternalPerspectiveDsl.g:7222:6: ( '(' )
+        // InternalPerspectiveDsl.g:7224:5: ( ( '(' ) )
+        // InternalPerspectiveDsl.g:7224:6: ( '(' )
         {
-        // InternalPerspectiveDsl.g:7222:6: ( '(' )
-        // InternalPerspectiveDsl.g:7223:6: '('
+        // InternalPerspectiveDsl.g:7224:6: ( '(' )
+        // InternalPerspectiveDsl.g:7225:6: '('
         {
         match(input,58,FOLLOW_2); if (state.failed) return ;
 
@@ -26305,18 +26305,18 @@
 
     // $ANTLR start synpred41_InternalPerspectiveDsl
     public final void synpred41_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:7241:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
-        // InternalPerspectiveDsl.g:7241:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalPerspectiveDsl.g:7243:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalPerspectiveDsl.g:7243:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
         {
-        // InternalPerspectiveDsl.g:7241:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
-        // InternalPerspectiveDsl.g:7242:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        // InternalPerspectiveDsl.g:7243:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalPerspectiveDsl.g:7244:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
         {
-        // InternalPerspectiveDsl.g:7242:7: ()
-        // InternalPerspectiveDsl.g:7243:7: 
+        // InternalPerspectiveDsl.g:7244:7: ()
+        // InternalPerspectiveDsl.g:7245:7: 
         {
         }
 
-        // InternalPerspectiveDsl.g:7244:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        // InternalPerspectiveDsl.g:7246:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
         int alt152=2;
         int LA152_0 = input.LA(1);
 
@@ -26325,13 +26325,13 @@
         }
         switch (alt152) {
             case 1 :
-                // InternalPerspectiveDsl.g:7245:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                // InternalPerspectiveDsl.g:7247:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                 {
-                // InternalPerspectiveDsl.g:7245:8: ( ( ruleJvmFormalParameter ) )
-                // InternalPerspectiveDsl.g:7246:9: ( ruleJvmFormalParameter )
+                // InternalPerspectiveDsl.g:7247:8: ( ( ruleJvmFormalParameter ) )
+                // InternalPerspectiveDsl.g:7248:9: ( ruleJvmFormalParameter )
                 {
-                // InternalPerspectiveDsl.g:7246:9: ( ruleJvmFormalParameter )
-                // InternalPerspectiveDsl.g:7247:10: ruleJvmFormalParameter
+                // InternalPerspectiveDsl.g:7248:9: ( ruleJvmFormalParameter )
+                // InternalPerspectiveDsl.g:7249:10: ruleJvmFormalParameter
                 {
                 pushFollow(FOLLOW_67);
                 ruleJvmFormalParameter();
@@ -26344,7 +26344,7 @@
 
                 }
 
-                // InternalPerspectiveDsl.g:7250:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                // InternalPerspectiveDsl.g:7252:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
                 loop151:
                 do {
                     int alt151=2;
@@ -26357,14 +26357,14 @@
 
                     switch (alt151) {
                 	case 1 :
-                	    // InternalPerspectiveDsl.g:7251:9: ',' ( ( ruleJvmFormalParameter ) )
+                	    // InternalPerspectiveDsl.g:7253:9: ',' ( ( ruleJvmFormalParameter ) )
                 	    {
                 	    match(input,59,FOLLOW_46); if (state.failed) return ;
-                	    // InternalPerspectiveDsl.g:7252:9: ( ( ruleJvmFormalParameter ) )
-                	    // InternalPerspectiveDsl.g:7253:10: ( ruleJvmFormalParameter )
+                	    // InternalPerspectiveDsl.g:7254:9: ( ( ruleJvmFormalParameter ) )
+                	    // InternalPerspectiveDsl.g:7255:10: ( ruleJvmFormalParameter )
                 	    {
-                	    // InternalPerspectiveDsl.g:7253:10: ( ruleJvmFormalParameter )
-                	    // InternalPerspectiveDsl.g:7254:11: ruleJvmFormalParameter
+                	    // InternalPerspectiveDsl.g:7255:10: ( ruleJvmFormalParameter )
+                	    // InternalPerspectiveDsl.g:7256:11: ruleJvmFormalParameter
                 	    {
                 	    pushFollow(FOLLOW_67);
                 	    ruleJvmFormalParameter();
@@ -26392,11 +26392,11 @@
 
         }
 
-        // InternalPerspectiveDsl.g:7259:7: ( ( '|' ) )
-        // InternalPerspectiveDsl.g:7260:8: ( '|' )
+        // InternalPerspectiveDsl.g:7261:7: ( ( '|' ) )
+        // InternalPerspectiveDsl.g:7262:8: ( '|' )
         {
-        // InternalPerspectiveDsl.g:7260:8: ( '|' )
-        // InternalPerspectiveDsl.g:7261:9: '|'
+        // InternalPerspectiveDsl.g:7262:8: ( '|' )
+        // InternalPerspectiveDsl.g:7263:9: '|'
         {
         match(input,98,FOLLOW_2); if (state.failed) return ;
 
@@ -26415,14 +26415,14 @@
 
     // $ANTLR start synpred42_InternalPerspectiveDsl
     public final void synpred42_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:7338:4: ( ( () '[' ) )
-        // InternalPerspectiveDsl.g:7338:5: ( () '[' )
+        // InternalPerspectiveDsl.g:7340:4: ( ( () '[' ) )
+        // InternalPerspectiveDsl.g:7340:5: ( () '[' )
         {
-        // InternalPerspectiveDsl.g:7338:5: ( () '[' )
-        // InternalPerspectiveDsl.g:7339:5: () '['
+        // InternalPerspectiveDsl.g:7340:5: ( () '[' )
+        // InternalPerspectiveDsl.g:7341:5: () '['
         {
-        // InternalPerspectiveDsl.g:7339:5: ()
-        // InternalPerspectiveDsl.g:7340:5: 
+        // InternalPerspectiveDsl.g:7341:5: ()
+        // InternalPerspectiveDsl.g:7342:5: 
         {
         }
 
@@ -26437,7 +26437,7 @@
 
     // $ANTLR start synpred43_InternalPerspectiveDsl
     public final void synpred43_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:7681:4: ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )
+        // InternalPerspectiveDsl.g:7683:4: ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )
         // InternalPerspectiveDsl.g:
         {
         if ( (input.LA(1)>=RULE_ID && input.LA(1)<=RULE_DECIMAL)||input.LA(1)==14||(input.LA(1)>=51 && input.LA(1)<=53)||input.LA(1)==58||(input.LA(1)>=62 && input.LA(1)<=63)||input.LA(1)==70||(input.LA(1)>=86 && input.LA(1)<=87)||input.LA(1)==91||input.LA(1)==99||input.LA(1)==101||(input.LA(1)>=105 && input.LA(1)<=107)||(input.LA(1)>=110 && input.LA(1)<=119)||input.LA(1)==121 ) {
@@ -26457,8 +26457,8 @@
 
     // $ANTLR start synpred44_InternalPerspectiveDsl
     public final void synpred44_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:7752:6: ( 'catch' )
-        // InternalPerspectiveDsl.g:7752:7: 'catch'
+        // InternalPerspectiveDsl.g:7754:6: ( 'catch' )
+        // InternalPerspectiveDsl.g:7754:7: 'catch'
         {
         match(input,122,FOLLOW_2); if (state.failed) return ;
 
@@ -26468,8 +26468,8 @@
 
     // $ANTLR start synpred45_InternalPerspectiveDsl
     public final void synpred45_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:7773:7: ( 'finally' )
-        // InternalPerspectiveDsl.g:7773:8: 'finally'
+        // InternalPerspectiveDsl.g:7775:7: ( 'finally' )
+        // InternalPerspectiveDsl.g:7775:8: 'finally'
         {
         match(input,120,FOLLOW_2); if (state.failed) return ;
 
@@ -26479,8 +26479,8 @@
 
     // $ANTLR start synpred48_InternalPerspectiveDsl
     public final void synpred48_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:8017:5: ( '.' )
-        // InternalPerspectiveDsl.g:8017:6: '.'
+        // InternalPerspectiveDsl.g:8019:5: ( '.' )
+        // InternalPerspectiveDsl.g:8019:6: '.'
         {
         match(input,95,FOLLOW_2); if (state.failed) return ;
 
@@ -26490,14 +26490,14 @@
 
     // $ANTLR start synpred49_InternalPerspectiveDsl
     public final void synpred49_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:8143:5: ( ( () ruleArrayBrackets ) )
-        // InternalPerspectiveDsl.g:8143:6: ( () ruleArrayBrackets )
+        // InternalPerspectiveDsl.g:8145:5: ( ( () ruleArrayBrackets ) )
+        // InternalPerspectiveDsl.g:8145:6: ( () ruleArrayBrackets )
         {
-        // InternalPerspectiveDsl.g:8143:6: ( () ruleArrayBrackets )
-        // InternalPerspectiveDsl.g:8144:6: () ruleArrayBrackets
+        // InternalPerspectiveDsl.g:8145:6: ( () ruleArrayBrackets )
+        // InternalPerspectiveDsl.g:8146:6: () ruleArrayBrackets
         {
-        // InternalPerspectiveDsl.g:8144:6: ()
-        // InternalPerspectiveDsl.g:8145:6: 
+        // InternalPerspectiveDsl.g:8146:6: ()
+        // InternalPerspectiveDsl.g:8147:6: 
         {
         }
 
@@ -26516,8 +26516,8 @@
 
     // $ANTLR start synpred50_InternalPerspectiveDsl
     public final void synpred50_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:8340:5: ( '<' )
-        // InternalPerspectiveDsl.g:8340:6: '<'
+        // InternalPerspectiveDsl.g:8342:5: ( '<' )
+        // InternalPerspectiveDsl.g:8342:6: '<'
         {
         match(input,70,FOLLOW_2); if (state.failed) return ;
 
@@ -26527,14 +26527,14 @@
 
     // $ANTLR start synpred51_InternalPerspectiveDsl
     public final void synpred51_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:8396:6: ( ( () '.' ) )
-        // InternalPerspectiveDsl.g:8396:7: ( () '.' )
+        // InternalPerspectiveDsl.g:8398:6: ( ( () '.' ) )
+        // InternalPerspectiveDsl.g:8398:7: ( () '.' )
         {
-        // InternalPerspectiveDsl.g:8396:7: ( () '.' )
-        // InternalPerspectiveDsl.g:8397:7: () '.'
+        // InternalPerspectiveDsl.g:8398:7: ( () '.' )
+        // InternalPerspectiveDsl.g:8399:7: () '.'
         {
-        // InternalPerspectiveDsl.g:8397:7: ()
-        // InternalPerspectiveDsl.g:8398:7: 
+        // InternalPerspectiveDsl.g:8399:7: ()
+        // InternalPerspectiveDsl.g:8400:7: 
         {
         }
 
@@ -26549,8 +26549,8 @@
 
     // $ANTLR start synpred52_InternalPerspectiveDsl
     public final void synpred52_InternalPerspectiveDsl_fragment() throws RecognitionException {   
-        // InternalPerspectiveDsl.g:8434:7: ( '<' )
-        // InternalPerspectiveDsl.g:8434:8: '<'
+        // InternalPerspectiveDsl.g:8436:7: ( '<' )
+        // InternalPerspectiveDsl.g:8436:8: '<'
         {
         match(input,70,FOLLOW_2); if (state.failed) return ;
 
@@ -27255,7 +27255,7 @@
             this.transition = dfa_7;
         }
         public String getDescription() {
-            return "2110:3: ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) )";
+            return "2112:3: ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) )";
         }
     }
     static final String dfa_8s = "\44\uffff";
@@ -27323,7 +27323,7 @@
             this.transition = dfa_13;
         }
         public String getDescription() {
-            return "2327:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?";
+            return "2329:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -27416,7 +27416,7 @@
             this.transition = dfa_19;
         }
         public String getDescription() {
-            return "2507:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )";
+            return "2509:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -27460,7 +27460,7 @@
             this.transition = dfa_19;
         }
         public String getDescription() {
-            return "2649:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )";
+            return "2651:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -27530,7 +27530,7 @@
             this.transition = dfa_26;
         }
         public String getDescription() {
-            return "2878:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?";
+            return "2880:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -27691,7 +27691,7 @@
             this.transition = dfa_33;
         }
         public String getDescription() {
-            return "()* loopback of 3592:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*";
+            return "()* loopback of 3594:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -27862,7 +27862,7 @@
             this.transition = dfa_38;
         }
         public String getDescription() {
-            return "3668:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )";
+            return "3670:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )";
         }
     }
     static final String dfa_39s = "\116\uffff";
@@ -27974,7 +27974,7 @@
             this.transition = dfa_45;
         }
         public String getDescription() {
-            return "4569:5: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )?";
+            return "4571:5: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -28065,7 +28065,7 @@
             this.transition = dfa_50;
         }
         public String getDescription() {
-            return "4588:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?";
+            return "4590:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -28228,7 +28228,7 @@
             this.transition = dfa_51;
         }
         public String getDescription() {
-            return "4686:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?";
+            return "4688:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -28318,7 +28318,7 @@
             this.transition = dfa_57;
         }
         public String getDescription() {
-            return "4731:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )";
+            return "4733:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -28453,7 +28453,7 @@
             this.transition = dfa_63;
         }
         public String getDescription() {
-            return "5223:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?";
+            return "5225:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -28571,7 +28571,7 @@
             this.transition = dfa_64;
         }
         public String getDescription() {
-            return "5689:3: ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) )";
+            return "5691:3: ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) )";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -28663,7 +28663,7 @@
             this.transition = dfa_70;
         }
         public String getDescription() {
-            return "5758:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?";
+            return "5760:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -28741,7 +28741,7 @@
             this.transition = dfa_45;
         }
         public String getDescription() {
-            return "6887:3: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )?";
+            return "6889:3: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -28785,7 +28785,7 @@
             this.transition = dfa_50;
         }
         public String getDescription() {
-            return "6906:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?";
+            return "6908:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -28867,7 +28867,7 @@
             this.transition = dfa_51;
         }
         public String getDescription() {
-            return "7004:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?";
+            return "7006:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -28992,7 +28992,7 @@
             this.transition = dfa_71;
         }
         public String getDescription() {
-            return "7163:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?";
+            return "7165:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -29036,7 +29036,7 @@
             this.transition = dfa_45;
         }
         public String getDescription() {
-            return "7220:3: ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )?";
+            return "7222:3: ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -29080,7 +29080,7 @@
             this.transition = dfa_50;
         }
         public String getDescription() {
-            return "7239:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?";
+            return "7241:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -29162,7 +29162,7 @@
             this.transition = dfa_51;
         }
         public String getDescription() {
-            return "7337:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?";
+            return "7339:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -29297,7 +29297,7 @@
             this.transition = dfa_77;
         }
         public String getDescription() {
-            return "7680:3: ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?";
+            return "7682:3: ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -29901,7 +29901,7 @@
             this.transition = dfa_84;
         }
         public String getDescription() {
-            return "8338:3: ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?";
+            return "8340:3: ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -29945,7 +29945,7 @@
             this.transition = dfa_84;
         }
         public String getDescription() {
-            return "8432:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?";
+            return "8434:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
diff --git a/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/serializer/PerspectiveDslSemanticSequencer.java b/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/serializer/PerspectiveDslSemanticSequencer.java
index 1e30803..294117f 100644
--- a/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/serializer/PerspectiveDslSemanticSequencer.java
+++ b/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/serializer/PerspectiveDslSemanticSequencer.java
@@ -544,7 +544,7 @@
 	 *     PerspectiveDataInterchange returns PerspectiveDataInterchange
 	 *
 	 * Constraint:
-	 *     ref=[DataInterchangePackage|ID]
+	 *     ref=[DataInterchangeGroup|ID]
 	 */
 	protected void sequence_PerspectiveDataInterchange(ISerializationContext context, PerspectiveDataInterchange semanticObject) {
 		if (errorAcceptor != null) {
@@ -552,7 +552,7 @@
 				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, PerspectiveDslPackage.Literals.PERSPECTIVE_DATA_INTERCHANGE__REF));
 		}
 		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
-		feeder.accept(grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangePackageIDTerminalRuleCall_2_0_1(), semanticObject.eGet(PerspectiveDslPackage.Literals.PERSPECTIVE_DATA_INTERCHANGE__REF, false));
+		feeder.accept(grammarAccess.getPerspectiveDataInterchangeAccess().getRefDataInterchangeGroupIDTerminalRuleCall_2_0_1(), semanticObject.eGet(PerspectiveDslPackage.Literals.PERSPECTIVE_DATA_INTERCHANGE__REF, false));
 		feeder.finish();
 	}
 	
diff --git a/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/services/PerspectiveDslGrammarAccess.java b/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/services/PerspectiveDslGrammarAccess.java
index 1eeda34..ec17301 100644
--- a/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/services/PerspectiveDslGrammarAccess.java
+++ b/org.eclipse.osbp.xtext.perspective/src-gen/org/eclipse/osbp/xtext/perspective/services/PerspectiveDslGrammarAccess.java
@@ -1144,14 +1144,14 @@
 		private final Action cPerspectiveDataInterchangeAction_0 = (Action)cGroup.eContents().get(0);
 		private final Keyword cDataInterchangeKeyword_1 = (Keyword)cGroup.eContents().get(1);
 		private final Assignment cRefAssignment_2 = (Assignment)cGroup.eContents().get(2);
-		private final CrossReference cRefDataInterchangePackageCrossReference_2_0 = (CrossReference)cRefAssignment_2.eContents().get(0);
-		private final RuleCall cRefDataInterchangePackageIDTerminalRuleCall_2_0_1 = (RuleCall)cRefDataInterchangePackageCrossReference_2_0.eContents().get(1);
+		private final CrossReference cRefDataInterchangeGroupCrossReference_2_0 = (CrossReference)cRefAssignment_2.eContents().get(0);
+		private final RuleCall cRefDataInterchangeGroupIDTerminalRuleCall_2_0_1 = (RuleCall)cRefDataInterchangeGroupCrossReference_2_0.eContents().get(1);
 		
 		//PerspectiveDataInterchange:
-		//	{PerspectiveDataInterchange} 'dataInterchange' ref=[data::DataInterchangePackage];
+		//	{PerspectiveDataInterchange} 'dataInterchange' ref=[data::DataInterchangeGroup];
 		@Override public ParserRule getRule() { return rule; }
 		
-		//{PerspectiveDataInterchange} 'dataInterchange' ref=[data::DataInterchangePackage]
+		//{PerspectiveDataInterchange} 'dataInterchange' ref=[data::DataInterchangeGroup]
 		public Group getGroup() { return cGroup; }
 		
 		//{PerspectiveDataInterchange}
@@ -1160,14 +1160,14 @@
 		//'dataInterchange'
 		public Keyword getDataInterchangeKeyword_1() { return cDataInterchangeKeyword_1; }
 		
-		//ref=[data::DataInterchangePackage]
+		//ref=[data::DataInterchangeGroup]
 		public Assignment getRefAssignment_2() { return cRefAssignment_2; }
 		
-		//[data::DataInterchangePackage]
-		public CrossReference getRefDataInterchangePackageCrossReference_2_0() { return cRefDataInterchangePackageCrossReference_2_0; }
+		//[data::DataInterchangeGroup]
+		public CrossReference getRefDataInterchangeGroupCrossReference_2_0() { return cRefDataInterchangeGroupCrossReference_2_0; }
 		
 		//ID
-		public RuleCall getRefDataInterchangePackageIDTerminalRuleCall_2_0_1() { return cRefDataInterchangePackageIDTerminalRuleCall_2_0_1; }
+		public RuleCall getRefDataInterchangeGroupIDTerminalRuleCall_2_0_1() { return cRefDataInterchangeGroupIDTerminalRuleCall_2_0_1; }
 	}
 	public class PerspectiveTitleElements extends AbstractParserRuleElementFinder {
 		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.perspective.PerspectiveDsl.PerspectiveTitle");
@@ -1604,7 +1604,7 @@
 	}
 	
 	//PerspectiveDataInterchange:
-	//	{PerspectiveDataInterchange} 'dataInterchange' ref=[data::DataInterchangePackage];
+	//	{PerspectiveDataInterchange} 'dataInterchange' ref=[data::DataInterchangeGroup];
 	public PerspectiveDataInterchangeElements getPerspectiveDataInterchangeAccess() {
 		return pPerspectiveDataInterchange;
 	}
diff --git a/org.eclipse.osbp.xtext.perspective/src/org/eclipse/osbp/xtext/perspective/PerspectiveDsl.xtext b/org.eclipse.osbp.xtext.perspective/src/org/eclipse/osbp/xtext/perspective/PerspectiveDsl.xtext
index c6751fb..02f3fe7 100644
--- a/org.eclipse.osbp.xtext.perspective/src/org/eclipse/osbp/xtext/perspective/PerspectiveDsl.xtext
+++ b/org.eclipse.osbp.xtext.perspective/src/org/eclipse/osbp/xtext/perspective/PerspectiveDsl.xtext
@@ -115,7 +115,7 @@
 	{PerspectiveSearch} 'search' 'in' dtoRef=[dto::LDto] (('depth' depth=INT)? & ('filterColumns' filterCols=INT)?);
 
 PerspectiveDataInterchange:
-	{PerspectiveDataInterchange} 'dataInterchange' ref=[data::DataInterchangePackage];
+	{PerspectiveDataInterchange} 'dataInterchange' ref=[data::DataInterchangeGroup];
 
 PerspectiveTitle:
 	{PerspectiveTitle} 'title' htmlName=STRING;
diff --git a/org.eclipse.osbp.xtext.perspective/src/org/eclipse/osbp/xtext/perspective/imports/ShouldImportProvider.java b/org.eclipse.osbp.xtext.perspective/src/org/eclipse/osbp/xtext/perspective/imports/ShouldImportProvider.java
index 0849e37..db22029 100644
--- a/org.eclipse.osbp.xtext.perspective/src/org/eclipse/osbp/xtext/perspective/imports/ShouldImportProvider.java
+++ b/org.eclipse.osbp.xtext.perspective/src/org/eclipse/osbp/xtext/perspective/imports/ShouldImportProvider.java
@@ -12,8 +12,7 @@
 import org.eclipse.osbp.xtext.chart.Chart;
 import org.eclipse.osbp.xtext.chart.ChartDSLPackage;
 import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage;
-import org.eclipse.osbp.xtext.datainterchange.DataInterchange;
-import org.eclipse.osbp.xtext.datainterchange.DataInterchangePackage;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeGroup;
 import org.eclipse.osbp.xtext.dialogdsl.Dialog;
 import org.eclipse.osbp.xtext.dialogdsl.DialogDSLPackage;
 import org.eclipse.osbp.xtext.organizationdsl.Organization;
@@ -32,7 +31,7 @@
 		return toImport instanceof Table || toImport instanceof Report || toImport instanceof Blip
 				|| toImport instanceof Chart || toImport instanceof Organization || toImport instanceof Topology
 				|| toImport instanceof Dialog || toImport instanceof ActionToolbar || toImport instanceof LDto ||
-				toImport instanceof DataInterchangePackage;
+				toImport instanceof DataInterchangeGroup;
 	}
 
 	protected boolean doShouldProposeAllElements(EObject object, EReference reference) {
@@ -46,7 +45,7 @@
 				|| DialogDSLPackage.Literals.DIALOG.isSuperTypeOf(type)
 				|| ActionDSLPackage.Literals.ACTION_TOOLBAR.isSuperTypeOf(type)
 				|| OSBPDtoPackage.Literals.LDTO.isSuperTypeOf(type)
-				|| DataDSLPackage.Literals.DATA_INTERCHANGE_PACKAGE.isSuperTypeOf(type);
+				|| DataDSLPackage.Literals.DATA_INTERCHANGE_GROUP.isSuperTypeOf(type);
 		
 	}
 }
diff --git a/org.eclipse.osbp.xtext.perspective/src/org/eclipse/osbp/xtext/perspective/linking/PerspectiveJvmLinkingHelper.java b/org.eclipse.osbp.xtext.perspective/src/org/eclipse/osbp/xtext/perspective/linking/PerspectiveJvmLinkingHelper.java
index 6ce32b9..8d2593f 100644
--- a/org.eclipse.osbp.xtext.perspective/src/org/eclipse/osbp/xtext/perspective/linking/PerspectiveJvmLinkingHelper.java
+++ b/org.eclipse.osbp.xtext.perspective/src/org/eclipse/osbp/xtext/perspective/linking/PerspectiveJvmLinkingHelper.java
@@ -107,8 +107,7 @@
 					@Override
 					public String enhance(EObject context,
 							EStructuralFeature feature, String crossRefString) {
-						// as the class is created by the package, we supply extra segment so the package calculation can discard the last segment 
-						return crossRefString + "." + StringExtensions.toFirstUpper(crossRefString) + "TriggerView";
+						return crossRefString + "TriggerView";
 					}
 				}, null);
 	}
diff --git a/org.eclipse.osbp.xtext.perspective/src/org/eclipse/osbp/xtext/perspective/scoping/PerspectiveDSLScopeProvider.xtend b/org.eclipse.osbp.xtext.perspective/src/org/eclipse/osbp/xtext/perspective/scoping/PerspectiveDSLScopeProvider.xtend
index 3939c78..92b1d2e 100644
--- a/org.eclipse.osbp.xtext.perspective/src/org/eclipse/osbp/xtext/perspective/scoping/PerspectiveDSLScopeProvider.xtend
+++ b/org.eclipse.osbp.xtext.perspective/src/org/eclipse/osbp/xtext/perspective/scoping/PerspectiveDSLScopeProvider.xtend
@@ -26,6 +26,7 @@
 import org.eclipse.xtext.scoping.IScope
 import org.eclipse.xtext.scoping.impl.FilteringScope
 import org.eclipse.xtext.scoping.impl.MapBasedScope
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeGroup
 
 /**
  * This class contains custom scoping description.
@@ -117,12 +118,14 @@
 	def getDataRef(PerspectiveDataInterchange dataView, EReference reference) {
 		var superScope = super.getScope(dataView, reference)
 		val FilteringScope scope = new FilteringScope(superScope, [
-			if (it.EObjectOrProxy instanceof DataInterchangePackage) {
-				return true
+			if (it.EObjectOrProxy instanceof DataInterchangeGroup) {
+				var group = it.EObjectOrProxy as DataInterchangeGroup
+				group = EcoreUtil3.resolve(group, dataView.eResource.resourceSet) as DataInterchangeGroup
+				return group instanceof DataInterchangeGroup
 			}
 			return false
 		])
-		return superScope
+		return scope
 	}
 
 	def getSelectionRef(PerspectiveSelection selectionView,
diff --git a/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/derivedstate/PerspectiveModelDerivedStateComputerx.java b/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/derivedstate/PerspectiveModelDerivedStateComputerx.java
index a2232bc..e9a2c18 100644
--- a/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/derivedstate/PerspectiveModelDerivedStateComputerx.java
+++ b/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/derivedstate/PerspectiveModelDerivedStateComputerx.java
@@ -2,10 +2,10 @@
  * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
  * 
  *  All rights reserved. This program and the accompanying materials
- *  are made available under the terms of the Eclipse Public License 2.0 
+ *  are made available under the terms of the Eclipse Public License 2.0
  *  which accompanies this distribution, and is available at
  *  https://www.eclipse.org/legal/epl-2.0/
- *
+ * 
  *  SPDX-License-Identifier: EPL-2.0
  * 
  *  Contributors:
diff --git a/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/formatting/PerspectiveDslFormatter.java b/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/formatting/PerspectiveDslFormatter.java
index ac11832..381162c 100644
--- a/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/formatting/PerspectiveDslFormatter.java
+++ b/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/formatting/PerspectiveDslFormatter.java
@@ -2,10 +2,10 @@
  * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
  * 
  *  All rights reserved. This program and the accompanying materials
- *  are made available under the terms of the Eclipse Public License 2.0 
+ *  are made available under the terms of the Eclipse Public License 2.0
  *  which accompanies this distribution, and is available at
  *  https://www.eclipse.org/legal/epl-2.0/
- *
+ * 
  *  SPDX-License-Identifier: EPL-2.0
  * 
  *  Contributors:
diff --git a/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/jvmmodel/PerspectiveDslJvmModelInferrer.java b/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/jvmmodel/PerspectiveDslJvmModelInferrer.java
index 40f9dfb..d522b38 100644
--- a/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/jvmmodel/PerspectiveDslJvmModelInferrer.java
+++ b/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/jvmmodel/PerspectiveDslJvmModelInferrer.java
@@ -2,10 +2,10 @@
  * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
  * 
  *  All rights reserved. This program and the accompanying materials
- *  are made available under the terms of the Eclipse Public License 2.0 
+ *  are made available under the terms of the Eclipse Public License 2.0
  *  which accompanies this distribution, and is available at
  *  https://www.eclipse.org/legal/epl-2.0/
- *
+ * 
  *  SPDX-License-Identifier: EPL-2.0
  * 
  *  Contributors:
diff --git a/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/jvmmodel/PerspectiveModelGenerator.java b/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/jvmmodel/PerspectiveModelGenerator.java
index e18694f..f991c60 100644
--- a/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/jvmmodel/PerspectiveModelGenerator.java
+++ b/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/jvmmodel/PerspectiveModelGenerator.java
@@ -2,10 +2,10 @@
  * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
  * 
  *  All rights reserved. This program and the accompanying materials
- *  are made available under the terms of the Eclipse Public License 2.0 
+ *  are made available under the terms of the Eclipse Public License 2.0
  *  which accompanies this distribution, and is available at
  *  https://www.eclipse.org/legal/epl-2.0/
- *
+ * 
  *  SPDX-License-Identifier: EPL-2.0
  * 
  *  Contributors:
diff --git a/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/validation/PerspectiveDslValidator.java b/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/validation/PerspectiveDslValidator.java
index 2e1e1e0..722b120 100644
--- a/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/validation/PerspectiveDslValidator.java
+++ b/org.eclipse.osbp.xtext.perspective/xtend-gen/org/eclipse/osbp/xtext/perspective/validation/PerspectiveDslValidator.java
@@ -2,10 +2,10 @@
  * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
  * 
  *  All rights reserved. This program and the accompanying materials
- *  are made available under the terms of the Eclipse Public License 2.0 
+ *  are made available under the terms of the Eclipse Public License 2.0
  *  which accompanies this distribution, and is available at
  *  https://www.eclipse.org/legal/epl-2.0/
- *
+ * 
  *  SPDX-License-Identifier: EPL-2.0
  * 
  *  Contributors:
