docs: public final EObject ruleXAnnotation() throws RecognitionException {
          EObject current = null;
  
          Token otherlv_1=null;
          Token otherlv_3=null;
          Token otherlv_5=null;
          Token otherlv_8=null;
          EObject lv_elementValuePairs_4_0 = null;
  
          EObject lv_elementValuePairs_6_0 = null;
  
          EObject lv_value_7_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalSARL.g:11524: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= ')' )? ) )
              // InternalSARL.g:11525: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= ')' )? )
              {
              // InternalSARL.g:11525: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= ')' )? )
              // InternalSARL.g:11526: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= ')' )?
              {
              // InternalSARL.g:11526:3: ()
              // InternalSARL.g:11527:4: 
              {
              if ( state.backtracking==0 ) {
  
                				current = forceCreateModelElement(
                					grammarAccess.getXAnnotationAccess().getXAnnotationAction_0(),
                					current);
                			
              }
  
              }
  
              otherlv_1=(Token)match(input,105,FOLLOW_3); if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                			newLeafNode(otherlv_1, grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1());
                		
              }
              // InternalSARL.g:11537:3: ( ( ruleQualifiedName ) )
              // InternalSARL.g:11538:4: ( ruleQualifiedName )
              {
              // InternalSARL.g:11538:4: ( ruleQualifiedName )
              // InternalSARL.g:11539:5: ruleQualifiedName
              {
              if ( state.backtracking==0 ) {
  
                					if (current==null) {
                						current = createModelElement(grammarAccess.getXAnnotationRule());
                					}
                				
              }
              if ( state.backtracking==0 ) {
  
                					newCompositeNode(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeCrossReference_2_0());
                				
              }
              pushFollow(FOLLOW_108);
              ruleQualifiedName();
  
              state._fsp--;
              if (state.failed) return current;
              if ( state.backtracking==0 ) {
  
                					afterParserOrEnumRuleCall();
                				
              }
  
              }
  
  
              }
  
              // InternalSARL.g:11553: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 alt288=2;
              int LA288_0 = input.LA(1);
  
              if ( (LA288_0==49) && (synpred24_InternalSARL())) {
                  alt288=1;
              }
              switch (alt288) {
                  case 1 :
                      // InternalSARL.g:11554:4: ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')'
                      {
                      // InternalSARL.g:11554:4: ( ( '(' )=>otherlv_3= '(' )
                      // InternalSARL.g:11555:5: ( '(' )=>otherlv_3= '('
                      {
                      otherlv_3=(Token)match(input,49,FOLLOW_109); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_3, grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0());
                        				
                      }
  
                      }
  
                      // InternalSARL.g:11561:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?
                      int alt287=3;
                      alt287 = dfa287.predict(input);
                      switch (alt287) {
                          case 1 :
                              // InternalSARL.g:11562:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
                              {
                              // InternalSARL.g:11562:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
                              // InternalSARL.g:11563:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
                              {
                              // InternalSARL.g:11563:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) )
                              // InternalSARL.g:11564:7: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
                              {
                              // InternalSARL.g:11573:7: (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
                              // InternalSARL.g:11574:8: lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair
                              {
                              if ( state.backtracking==0 ) {
  
                                								newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0());
                                							
                              }
                              pushFollow(FOLLOW_51);
                              lv_elementValuePairs_4_0=ruleXAnnotationElementValuePair();
  
                              state._fsp--;
                              if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                								if (current==null) {
                                									current = createModelElementForParent(grammarAccess.getXAnnotationRule());
                                								}
                                								add(
                                									current,
                                									"elementValuePairs",
                                									lv_elementValuePairs_4_0,
                                									"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValuePair");
                                								afterParserOrEnumRuleCall();
                                							
                              }
  
                              }
  
  
                              }
  
                              // InternalSARL.g:11591:6: (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
                              loop286:
                              do {
                                  int alt286=2;
                                  int LA286_0 = input.LA(1);
  
                                  if ( (LA286_0==32) ) {
                                      alt286=1;
                                  }
  
  
                                  switch (alt286) {
                              	case 1 :
                              	    // InternalSARL.g:11592:7: otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
                              	    {
                              	    otherlv_5=(Token)match(input,32,FOLLOW_3); if (state.failed) return current;
                              	    if ( state.backtracking==0 ) {
  
                              	      							newLeafNode(otherlv_5, grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0());
                              	      						
                              	    }
                              	    // InternalSARL.g:11596:7: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
                              	    // InternalSARL.g:11597:8: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
                              	    {
                              	    // InternalSARL.g:11606:8: (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
                              	    // InternalSARL.g:11607:9: lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair
                              	    {
                              	    if ( state.backtracking==0 ) {
  
                              	      									newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0());
                              	      								
                              	    }
                              	    pushFollow(FOLLOW_51);
                              	    lv_elementValuePairs_6_0=ruleXAnnotationElementValuePair();
  
                              	    state._fsp--;
                              	    if (state.failed) return current;
                              	    if ( state.backtracking==0 ) {
  
                              	      									if (current==null) {
                              	      										current = createModelElementForParent(grammarAccess.getXAnnotationRule());
                              	      									}
                              	      									add(
                              	      										current,
                              	      										"elementValuePairs",
                              	      										lv_elementValuePairs_6_0,
                              	      										"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValuePair");
                              	      									afterParserOrEnumRuleCall();
                              	      								
                              	    }
  
                              	    }
  
  
                              	    }
  
  
                              	    }
                              	    break;
  
                              	default :
                              	    break loop286;
                                  }
                              } while (true);
  
  
                              }
  
  
                              }
                              break;
                          case 2 :
                              // InternalSARL.g:11627:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
                              {
                              // InternalSARL.g:11627:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
                              // InternalSARL.g:11628:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
                              {
                              // InternalSARL.g:11628:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
                              // InternalSARL.g:11629:7: lv_value_7_0= ruleXAnnotationElementValueOrCommaList
                              {
                              if ( state.backtracking==0 ) {
  
                                							newCompositeNode(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0());
                                						
                              }
                              pushFollow(FOLLOW_81);
                              lv_value_7_0=ruleXAnnotationElementValueOrCommaList();
  
                              state._fsp--;
                              if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                							if (current==null) {
                                								current = createModelElementForParent(grammarAccess.getXAnnotationRule());
                                							}
                                							set(
                                								current,
                                								"value",
                                								lv_value_7_0,
                                								"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotationElementValueOrCommaList");
                                							afterParserOrEnumRuleCall();
                                						
                              }
  
                              }
  
  
                              }
  
  
                              }
                              break;
  
                      }
  
                      otherlv_8=(Token)match(input,50,FOLLOW_2); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        				newLeafNode(otherlv_8, grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2());
                        			
                      }
  
                      }
                      break;
  
              }
  
  
              }
  
  
              }
  
              if ( state.backtracking==0 ) {
  
                	leaveRule();
  
              }
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }