docs: public final EObject ruleJvmParameterizedTypeReference() throws RecognitionException {
          EObject current = null;
  
          Token otherlv_1=null;
          Token otherlv_3=null;
          Token otherlv_5=null;
          Token otherlv_7=null;
          Token otherlv_9=null;
          Token otherlv_11=null;
          Token otherlv_13=null;
          EObject lv_arguments_2_0 = null;
  
          EObject lv_arguments_4_0 = null;
  
          EObject lv_arguments_10_0 = null;
  
          EObject lv_arguments_12_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalSARL.g:16070: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= '>' )? )* )? ) )
              // InternalSARL.g:16071: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= '>' )? )* )? )
              {
              // InternalSARL.g:16071: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= '>' )? )* )? )
              // InternalSARL.g:16072: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= '>' )? )* )?
              {
              // InternalSARL.g:16072:3: ( ( ruleQualifiedName ) )
              // InternalSARL.g:16073:4: ( ruleQualifiedName )
              {
              // InternalSARL.g:16073:4: ( ruleQualifiedName )
              // InternalSARL.g:16074:5: ruleQualifiedName
              {
              if ( state.backtracking==0 ) {
  
                					if (current==null) {
                						current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
                					}
                				
              }
              if ( state.backtracking==0 ) {
  
                					newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0());
                				
              }
              pushFollow(FOLLOW_152);
              ruleQualifiedName();
  
              state._fsp--;
              if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                					afterParserOrEnumRuleCall();
                				
              }
  
              }
  
  
              }
  
              // InternalSARL.g:16088: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 alt374=2;
              alt374 = dfa374.predict(input);
              switch (alt374) {
                  case 1 :
                      // InternalSARL.g:16089: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= '>' )? )*
                      {
                      // InternalSARL.g:16089:4: ( ( '<' )=>otherlv_1= '<' )
                      // InternalSARL.g:16090:5: ( '<' )=>otherlv_1= '<'
                      {
                      otherlv_1=(Token)match(input,40,FOLLOW_92); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_1, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0());
                        				
                      }
  
                      }
  
                      // InternalSARL.g:16096:4: ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) )
                      // InternalSARL.g:16097:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
                      {
                      // InternalSARL.g:16097:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
                      // InternalSARL.g:16098:6: lv_arguments_2_0= ruleJvmArgumentTypeReference
                      {
                      if ( state.backtracking==0 ) {
  
                        						newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
                        					
                      }
                      pushFollow(FOLLOW_28);
                      lv_arguments_2_0=ruleJvmArgumentTypeReference();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        						if (current==null) {
                        							current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
                        						}
                        						add(
                        							current,
                        							"arguments",
                        							lv_arguments_2_0,
                        							"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                        						afterParserOrEnumRuleCall();
                        					
                      }
  
                      }
  
  
                      }
  
                      // InternalSARL.g:16115:4: (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )*
                      loop370:
                      do {
                          int alt370=2;
                          int LA370_0 = input.LA(1);
  
                          if ( (LA370_0==32) ) {
                              alt370=1;
                          }
  
  
                          switch (alt370) {
                      	case 1 :
                      	    // InternalSARL.g:16116:5: otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
                      	    {
                      	    otherlv_3=(Token)match(input,32,FOLLOW_92); if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      					newLeafNode(otherlv_3, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0());
                      	      				
                      	    }
                      	    // InternalSARL.g:16120:5: ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
                      	    // InternalSARL.g:16121:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
                      	    {
                      	    // InternalSARL.g:16121:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
                      	    // InternalSARL.g:16122:7: lv_arguments_4_0= ruleJvmArgumentTypeReference
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_28);
                      	    lv_arguments_4_0=ruleJvmArgumentTypeReference();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"arguments",
                      	      								lv_arguments_4_0,
                      	      								"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop370;
                          }
                      } while (true);
  
                      otherlv_5=(Token)match(input,41,FOLLOW_93); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        				newLeafNode(otherlv_5, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3());
                        			
                      }
                      // InternalSARL.g:16144:4: ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
                      loop373:
                      do {
                          int alt373=2;
                          alt373 = dfa373.predict(input);
                          switch (alt373) {
                      	case 1 :
                      	    // InternalSARL.g:16145:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
                      	    {
                      	    // InternalSARL.g:16145:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) )
                      	    // InternalSARL.g:16146:6: ( ( () '.' ) )=> ( () otherlv_7= '.' )
                      	    {
                      	    // InternalSARL.g:16152:6: ( () otherlv_7= '.' )
                      	    // InternalSARL.g:16153:7: () otherlv_7= '.'
                      	    {
                      	    // InternalSARL.g:16153:7: ()
                      	    // InternalSARL.g:16154:8: 
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      								current = forceCreateModelElementAndSet(
                      	      									grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0(),
                      	      									current);
                      	      							
                      	    }
  
                      	    }
  
                      	    otherlv_7=(Token)match(input,77,FOLLOW_3); if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							newLeafNode(otherlv_7, grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1());
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
  
                      	    // InternalSARL.g:16166:5: ( ( ruleValidID ) )
                      	    // InternalSARL.g:16167:6: ( ruleValidID )
                      	    {
                      	    // InternalSARL.g:16167:6: ( ruleValidID )
                      	    // InternalSARL.g:16168:7: ruleValidID
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElement(grammarAccess.getJvmParameterizedTypeReferenceRule());
                      	      							}
                      	      						
                      	    }
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_94);
                      	    ruleValidID();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
  
                      	    // InternalSARL.g:16182:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
                      	    int alt372=2;
                      	    alt372 = dfa372.predict(input);
                      	    switch (alt372) {
                      	        case 1 :
                      	            // InternalSARL.g:16183:6: ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>'
                      	            {
                      	            // InternalSARL.g:16183:6: ( ( '<' )=>otherlv_9= '<' )
                      	            // InternalSARL.g:16184:7: ( '<' )=>otherlv_9= '<'
                      	            {
                      	            otherlv_9=(Token)match(input,40,FOLLOW_92); if (state.failed) return current;
                      	            if ( state.backtracking==0 ) {
  
                      	              							newLeafNode(otherlv_9, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0());
                      	              						
                      	            }
  
                      	            }
  
                      	            // InternalSARL.g:16190:6: ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) )
                      	            // InternalSARL.g:16191:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
                      	            {
                      	            // InternalSARL.g:16191:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
                      	            // InternalSARL.g:16192:8: lv_arguments_10_0= ruleJvmArgumentTypeReference
                      	            {
                      	            if ( state.backtracking==0 ) {
  
                      	              								newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0());
                      	              							
                      	            }
                      	            pushFollow(FOLLOW_28);
                      	            lv_arguments_10_0=ruleJvmArgumentTypeReference();
  
                      	            state._fsp--;
                      	            if (state.failed) return current;
                      	            if ( state.backtracking==0 ) {
  
                      	              								if (current==null) {
                      	              									current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
                      	              								}
                      	              								add(
                      	              									current,
                      	              									"arguments",
                      	              									lv_arguments_10_0,
                      	              									"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                      	              								afterParserOrEnumRuleCall();
                      	              							
                      	            }
  
                      	            }
  
  
                      	            }
  
                      	            // InternalSARL.g:16209:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )*
                      	            loop371:
                      	            do {
                      	                int alt371=2;
                      	                int LA371_0 = input.LA(1);
  
                      	                if ( (LA371_0==32) ) {
                      	                    alt371=1;
                      	                }
  
  
                      	                switch (alt371) {
                      	            	case 1 :
                      	            	    // InternalSARL.g:16210:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
                      	            	    {
                      	            	    otherlv_11=(Token)match(input,32,FOLLOW_92); if (state.failed) return current;
                      	            	    if ( state.backtracking==0 ) {
  
                      	            	      							newLeafNode(otherlv_11, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0());
                      	            	      						
                      	            	    }
                      	            	    // InternalSARL.g:16214:7: ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
                      	            	    // InternalSARL.g:16215:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
                      	            	    {
                      	            	    // InternalSARL.g:16215:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
                      	            	    // InternalSARL.g:16216:9: lv_arguments_12_0= ruleJvmArgumentTypeReference
                      	            	    {
                      	            	    if ( state.backtracking==0 ) {
  
                      	            	      									newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0());
                      	            	      								
                      	            	    }
                      	            	    pushFollow(FOLLOW_28);
                      	            	    lv_arguments_12_0=ruleJvmArgumentTypeReference();
  
                      	            	    state._fsp--;
                      	            	    if (state.failed) return current;
                      	            	    if ( state.backtracking==0 ) {
  
                      	            	      									if (current==null) {
                      	            	      										current = createModelElementForParent(grammarAccess.getJvmParameterizedTypeReferenceRule());
                      	            	      									}
                      	            	      									add(
                      	            	      										current,
                      	            	      										"arguments",
                      	            	      										lv_arguments_12_0,
                      	            	      										"org.eclipse.xtext.xbase.Xtype.JvmArgumentTypeReference");
                      	            	      									afterParserOrEnumRuleCall();
                      	            	      								
                      	            	    }
  
                      	            	    }
  
  
                      	            	    }
  
  
                      	            	    }
                      	            	    break;
  
                      	            	default :
                      	            	    break loop371;
                      	                }
                      	            } while (true);
  
                      	            otherlv_13=(Token)match(input,41,FOLLOW_93); if (state.failed) return current;
                      	            if ( state.backtracking==0 ) {
  
                      	              						newLeafNode(otherlv_13, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3());
                      	              					
                      	            }
  
                      	            }
                      	            break;
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop373;
                          }
                      } while (true);
  
  
                      }
                      break;
  
              }
  
  
              }
  
  
              }
  
              if ( state.backtracking==0 ) {
  
                	leaveRule();
  
              }
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }