docs: public final EObject ruleType() throws RecognitionException {
          EObject current = null;
  
          Token otherlv_4=null;
          Token otherlv_6=null;
          Token otherlv_8=null;
          Token otherlv_10=null;
          Token otherlv_13=null;
          Token otherlv_15=null;
          Token otherlv_17=null;
          Token otherlv_19=null;
          Token otherlv_21=null;
          Token otherlv_24=null;
          Token otherlv_26=null;
          Token otherlv_28=null;
          Token otherlv_30=null;
          Token otherlv_33=null;
          Token otherlv_35=null;
          Token otherlv_37=null;
          Token otherlv_39=null;
          Token otherlv_42=null;
          Token otherlv_45=null;
          Token otherlv_47=null;
          Token otherlv_49=null;
          Token otherlv_51=null;
          Token otherlv_53=null;
          Token otherlv_56=null;
          Token otherlv_58=null;
          Token otherlv_59=null;
          Token otherlv_62=null;
          Token otherlv_64=null;
          Token otherlv_65=null;
          Token otherlv_68=null;
          Token otherlv_70=null;
          Token otherlv_72=null;
          Token otherlv_74=null;
          Token otherlv_76=null;
          Token otherlv_78=null;
          Token otherlv_80=null;
          Token otherlv_82=null;
          Token otherlv_84=null;
          Token otherlv_87=null;
          Token otherlv_89=null;
          Token otherlv_91=null;
          Token otherlv_93=null;
          Token otherlv_94=null;
          Token otherlv_96=null;
          Token otherlv_98=null;
          Token otherlv_100=null;
          Token otherlv_103=null;
          Token otherlv_105=null;
          Token otherlv_107=null;
          Token otherlv_109=null;
          Token otherlv_110=null;
          Token otherlv_113=null;
          Token otherlv_115=null;
          Token otherlv_117=null;
          EObject lv_annotations_1_0 = null;
  
          AntlrDatatypeRuleToken lv_modifiers_3_0 = null;
  
          AntlrDatatypeRuleToken lv_name_5_0 = null;
  
          EObject lv_extends_7_0 = null;
  
          EObject lv_members_9_0 = null;
  
          AntlrDatatypeRuleToken lv_modifiers_12_0 = null;
  
          AntlrDatatypeRuleToken lv_name_14_0 = null;
  
          EObject lv_extends_16_0 = null;
  
          EObject lv_extends_18_0 = null;
  
          EObject lv_members_20_0 = null;
  
          AntlrDatatypeRuleToken lv_modifiers_23_0 = null;
  
          AntlrDatatypeRuleToken lv_name_25_0 = null;
  
          EObject lv_extends_27_0 = null;
  
          EObject lv_members_29_0 = null;
  
          AntlrDatatypeRuleToken lv_modifiers_32_0 = null;
  
          AntlrDatatypeRuleToken lv_name_34_0 = null;
  
          EObject lv_extends_36_0 = null;
  
          EObject lv_members_38_0 = null;
  
          AntlrDatatypeRuleToken lv_modifiers_41_0 = null;
  
          AntlrDatatypeRuleToken lv_name_43_0 = null;
  
          EObject lv_extends_46_0 = null;
  
          EObject lv_implements_48_0 = null;
  
          EObject lv_implements_50_0 = null;
  
          EObject lv_members_52_0 = null;
  
          AntlrDatatypeRuleToken lv_modifiers_55_0 = null;
  
          AntlrDatatypeRuleToken lv_name_57_0 = null;
  
          AntlrDatatypeRuleToken lv_modifiers_61_0 = null;
  
          AntlrDatatypeRuleToken lv_name_63_0 = null;
  
          AntlrDatatypeRuleToken lv_modifiers_67_0 = null;
  
          AntlrDatatypeRuleToken lv_name_69_0 = null;
  
          EObject lv_typeParameters_71_0 = null;
  
          EObject lv_typeParameters_73_0 = null;
  
          EObject lv_extends_77_0 = null;
  
          EObject lv_implements_79_0 = null;
  
          EObject lv_implements_81_0 = null;
  
          EObject lv_members_83_0 = null;
  
          AntlrDatatypeRuleToken lv_modifiers_86_0 = null;
  
          AntlrDatatypeRuleToken lv_name_88_0 = null;
  
          EObject lv_typeParameters_90_0 = null;
  
          EObject lv_typeParameters_92_0 = null;
  
          EObject lv_extends_95_0 = null;
  
          EObject lv_extends_97_0 = null;
  
          EObject lv_members_99_0 = null;
  
          AntlrDatatypeRuleToken lv_modifiers_102_0 = null;
  
          AntlrDatatypeRuleToken lv_name_104_0 = null;
  
          EObject lv_members_106_0 = null;
  
          EObject lv_members_108_0 = null;
  
          AntlrDatatypeRuleToken lv_modifiers_112_0 = null;
  
          AntlrDatatypeRuleToken lv_name_114_0 = null;
  
          EObject lv_members_116_0 = null;
  
  
  
          	enterRule();
  
          try {
              // InternalSARL.g:192:2: ( ( () ( (lv_annotations_1_0= ruleXAnnotation ) )* ( ( () ( (lv_modifiers_3_0= ruleCommonModifier ) )* otherlv_4= 'event' ( (lv_name_5_0= ruleValidID ) ) (otherlv_6= 'extends' ( (lv_extends_7_0= ruleJvmParameterizedTypeReference ) ) )? (otherlv_8= '{' ( (lv_members_9_0= ruleEventMember ) )* otherlv_10= '}' )? ) | ( () ( (lv_modifiers_12_0= ruleCommonModifier ) )* otherlv_13= 'capacity' ( (lv_name_14_0= ruleValidID ) ) (otherlv_15= 'extends' ( (lv_extends_16_0= ruleJvmParameterizedTypeReference ) ) (otherlv_17= ',' ( (lv_extends_18_0= ruleJvmParameterizedTypeReference ) ) )* )? otherlv_19= '{' ( (lv_members_20_0= ruleCapacityMember ) )* otherlv_21= '}' ) | ( () ( (lv_modifiers_23_0= ruleCommonModifier ) )* otherlv_24= 'agent' ( (lv_name_25_0= ruleValidID ) ) (otherlv_26= 'extends' ( (lv_extends_27_0= ruleJvmParameterizedTypeReference ) ) )? otherlv_28= '{' ( (lv_members_29_0= ruleAOPMember ) )* otherlv_30= '}' ) | ( () ( (lv_modifiers_32_0= ruleCommonModifier ) )* otherlv_33= 'behavior' ( (lv_name_34_0= ruleValidID ) ) (otherlv_35= 'extends' ( (lv_extends_36_0= ruleJvmParameterizedTypeReference ) ) )? otherlv_37= '{' ( (lv_members_38_0= ruleAOPMember ) )* otherlv_39= '}' ) | ( () ( (lv_modifiers_41_0= ruleCommonModifier ) )* otherlv_42= 'skill' ( (lv_name_43_0= ruleValidID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) ) ) otherlv_51= '{' ( (lv_members_52_0= ruleAOPMember ) )* otherlv_53= '}' ) | ( () ( (lv_modifiers_55_0= ruleCommonModifier ) )* otherlv_56= 'space' ( (lv_name_57_0= ruleValidID ) ) otherlv_58= '{' otherlv_59= '}' ) | ( () ( (lv_modifiers_61_0= ruleCommonModifier ) )* otherlv_62= 'artifact' ( (lv_name_63_0= ruleValidID ) ) otherlv_64= '{' otherlv_65= '}' ) | ( () ( (lv_modifiers_67_0= ruleCommonModifier ) )* otherlv_68= 'class' ( (lv_name_69_0= ruleValidID ) ) (otherlv_70= '<' ( (lv_typeParameters_71_0= ruleJvmTypeParameter ) ) (otherlv_72= ',' ( (lv_typeParameters_73_0= ruleJvmTypeParameter ) ) )* otherlv_74= '>' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) ) ) otherlv_82= '{' ( (lv_members_83_0= ruleMember ) )* otherlv_84= '}' ) | ( () ( (lv_modifiers_86_0= ruleCommonModifier ) )* otherlv_87= 'interface' ( (lv_name_88_0= ruleValidID ) ) (otherlv_89= '<' ( (lv_typeParameters_90_0= ruleJvmTypeParameter ) ) (otherlv_91= ',' ( (lv_typeParameters_92_0= ruleJvmTypeParameter ) ) )* otherlv_93= '>' )? (otherlv_94= 'extends' ( (lv_extends_95_0= ruleJvmParameterizedTypeReference ) ) (otherlv_96= ',' ( (lv_extends_97_0= ruleJvmParameterizedTypeReference ) ) )* )? otherlv_98= '{' ( (lv_members_99_0= ruleMember ) )* otherlv_100= '}' ) | ( () ( (lv_modifiers_102_0= ruleCommonModifier ) )* otherlv_103= 'enum' ( (lv_name_104_0= ruleValidID ) ) otherlv_105= '{' ( ( (lv_members_106_0= ruleXtendEnumLiteral ) ) (otherlv_107= ',' ( (lv_members_108_0= ruleXtendEnumLiteral ) ) )* )? (otherlv_109= ';' )? otherlv_110= '}' ) | ( () ( (lv_modifiers_112_0= ruleCommonModifier ) )* otherlv_113= 'annotation' ( (lv_name_114_0= ruleValidID ) ) otherlv_115= '{' ( (lv_members_116_0= ruleAnnotationField ) )* otherlv_117= '}' ) ) ) )
              // InternalSARL.g:193:2: ( () ( (lv_annotations_1_0= ruleXAnnotation ) )* ( ( () ( (lv_modifiers_3_0= ruleCommonModifier ) )* otherlv_4= 'event' ( (lv_name_5_0= ruleValidID ) ) (otherlv_6= 'extends' ( (lv_extends_7_0= ruleJvmParameterizedTypeReference ) ) )? (otherlv_8= '{' ( (lv_members_9_0= ruleEventMember ) )* otherlv_10= '}' )? ) | ( () ( (lv_modifiers_12_0= ruleCommonModifier ) )* otherlv_13= 'capacity' ( (lv_name_14_0= ruleValidID ) ) (otherlv_15= 'extends' ( (lv_extends_16_0= ruleJvmParameterizedTypeReference ) ) (otherlv_17= ',' ( (lv_extends_18_0= ruleJvmParameterizedTypeReference ) ) )* )? otherlv_19= '{' ( (lv_members_20_0= ruleCapacityMember ) )* otherlv_21= '}' ) | ( () ( (lv_modifiers_23_0= ruleCommonModifier ) )* otherlv_24= 'agent' ( (lv_name_25_0= ruleValidID ) ) (otherlv_26= 'extends' ( (lv_extends_27_0= ruleJvmParameterizedTypeReference ) ) )? otherlv_28= '{' ( (lv_members_29_0= ruleAOPMember ) )* otherlv_30= '}' ) | ( () ( (lv_modifiers_32_0= ruleCommonModifier ) )* otherlv_33= 'behavior' ( (lv_name_34_0= ruleValidID ) ) (otherlv_35= 'extends' ( (lv_extends_36_0= ruleJvmParameterizedTypeReference ) ) )? otherlv_37= '{' ( (lv_members_38_0= ruleAOPMember ) )* otherlv_39= '}' ) | ( () ( (lv_modifiers_41_0= ruleCommonModifier ) )* otherlv_42= 'skill' ( (lv_name_43_0= ruleValidID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) ) ) otherlv_51= '{' ( (lv_members_52_0= ruleAOPMember ) )* otherlv_53= '}' ) | ( () ( (lv_modifiers_55_0= ruleCommonModifier ) )* otherlv_56= 'space' ( (lv_name_57_0= ruleValidID ) ) otherlv_58= '{' otherlv_59= '}' ) | ( () ( (lv_modifiers_61_0= ruleCommonModifier ) )* otherlv_62= 'artifact' ( (lv_name_63_0= ruleValidID ) ) otherlv_64= '{' otherlv_65= '}' ) | ( () ( (lv_modifiers_67_0= ruleCommonModifier ) )* otherlv_68= 'class' ( (lv_name_69_0= ruleValidID ) ) (otherlv_70= '<' ( (lv_typeParameters_71_0= ruleJvmTypeParameter ) ) (otherlv_72= ',' ( (lv_typeParameters_73_0= ruleJvmTypeParameter ) ) )* otherlv_74= '>' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) ) ) otherlv_82= '{' ( (lv_members_83_0= ruleMember ) )* otherlv_84= '}' ) | ( () ( (lv_modifiers_86_0= ruleCommonModifier ) )* otherlv_87= 'interface' ( (lv_name_88_0= ruleValidID ) ) (otherlv_89= '<' ( (lv_typeParameters_90_0= ruleJvmTypeParameter ) ) (otherlv_91= ',' ( (lv_typeParameters_92_0= ruleJvmTypeParameter ) ) )* otherlv_93= '>' )? (otherlv_94= 'extends' ( (lv_extends_95_0= ruleJvmParameterizedTypeReference ) ) (otherlv_96= ',' ( (lv_extends_97_0= ruleJvmParameterizedTypeReference ) ) )* )? otherlv_98= '{' ( (lv_members_99_0= ruleMember ) )* otherlv_100= '}' ) | ( () ( (lv_modifiers_102_0= ruleCommonModifier ) )* otherlv_103= 'enum' ( (lv_name_104_0= ruleValidID ) ) otherlv_105= '{' ( ( (lv_members_106_0= ruleXtendEnumLiteral ) ) (otherlv_107= ',' ( (lv_members_108_0= ruleXtendEnumLiteral ) ) )* )? (otherlv_109= ';' )? otherlv_110= '}' ) | ( () ( (lv_modifiers_112_0= ruleCommonModifier ) )* otherlv_113= 'annotation' ( (lv_name_114_0= ruleValidID ) ) otherlv_115= '{' ( (lv_members_116_0= ruleAnnotationField ) )* otherlv_117= '}' ) ) )
              {
              // InternalSARL.g:193:2: ( () ( (lv_annotations_1_0= ruleXAnnotation ) )* ( ( () ( (lv_modifiers_3_0= ruleCommonModifier ) )* otherlv_4= 'event' ( (lv_name_5_0= ruleValidID ) ) (otherlv_6= 'extends' ( (lv_extends_7_0= ruleJvmParameterizedTypeReference ) ) )? (otherlv_8= '{' ( (lv_members_9_0= ruleEventMember ) )* otherlv_10= '}' )? ) | ( () ( (lv_modifiers_12_0= ruleCommonModifier ) )* otherlv_13= 'capacity' ( (lv_name_14_0= ruleValidID ) ) (otherlv_15= 'extends' ( (lv_extends_16_0= ruleJvmParameterizedTypeReference ) ) (otherlv_17= ',' ( (lv_extends_18_0= ruleJvmParameterizedTypeReference ) ) )* )? otherlv_19= '{' ( (lv_members_20_0= ruleCapacityMember ) )* otherlv_21= '}' ) | ( () ( (lv_modifiers_23_0= ruleCommonModifier ) )* otherlv_24= 'agent' ( (lv_name_25_0= ruleValidID ) ) (otherlv_26= 'extends' ( (lv_extends_27_0= ruleJvmParameterizedTypeReference ) ) )? otherlv_28= '{' ( (lv_members_29_0= ruleAOPMember ) )* otherlv_30= '}' ) | ( () ( (lv_modifiers_32_0= ruleCommonModifier ) )* otherlv_33= 'behavior' ( (lv_name_34_0= ruleValidID ) ) (otherlv_35= 'extends' ( (lv_extends_36_0= ruleJvmParameterizedTypeReference ) ) )? otherlv_37= '{' ( (lv_members_38_0= ruleAOPMember ) )* otherlv_39= '}' ) | ( () ( (lv_modifiers_41_0= ruleCommonModifier ) )* otherlv_42= 'skill' ( (lv_name_43_0= ruleValidID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) ) ) otherlv_51= '{' ( (lv_members_52_0= ruleAOPMember ) )* otherlv_53= '}' ) | ( () ( (lv_modifiers_55_0= ruleCommonModifier ) )* otherlv_56= 'space' ( (lv_name_57_0= ruleValidID ) ) otherlv_58= '{' otherlv_59= '}' ) | ( () ( (lv_modifiers_61_0= ruleCommonModifier ) )* otherlv_62= 'artifact' ( (lv_name_63_0= ruleValidID ) ) otherlv_64= '{' otherlv_65= '}' ) | ( () ( (lv_modifiers_67_0= ruleCommonModifier ) )* otherlv_68= 'class' ( (lv_name_69_0= ruleValidID ) ) (otherlv_70= '<' ( (lv_typeParameters_71_0= ruleJvmTypeParameter ) ) (otherlv_72= ',' ( (lv_typeParameters_73_0= ruleJvmTypeParameter ) ) )* otherlv_74= '>' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) ) ) otherlv_82= '{' ( (lv_members_83_0= ruleMember ) )* otherlv_84= '}' ) | ( () ( (lv_modifiers_86_0= ruleCommonModifier ) )* otherlv_87= 'interface' ( (lv_name_88_0= ruleValidID ) ) (otherlv_89= '<' ( (lv_typeParameters_90_0= ruleJvmTypeParameter ) ) (otherlv_91= ',' ( (lv_typeParameters_92_0= ruleJvmTypeParameter ) ) )* otherlv_93= '>' )? (otherlv_94= 'extends' ( (lv_extends_95_0= ruleJvmParameterizedTypeReference ) ) (otherlv_96= ',' ( (lv_extends_97_0= ruleJvmParameterizedTypeReference ) ) )* )? otherlv_98= '{' ( (lv_members_99_0= ruleMember ) )* otherlv_100= '}' ) | ( () ( (lv_modifiers_102_0= ruleCommonModifier ) )* otherlv_103= 'enum' ( (lv_name_104_0= ruleValidID ) ) otherlv_105= '{' ( ( (lv_members_106_0= ruleXtendEnumLiteral ) ) (otherlv_107= ',' ( (lv_members_108_0= ruleXtendEnumLiteral ) ) )* )? (otherlv_109= ';' )? otherlv_110= '}' ) | ( () ( (lv_modifiers_112_0= ruleCommonModifier ) )* otherlv_113= 'annotation' ( (lv_name_114_0= ruleValidID ) ) otherlv_115= '{' ( (lv_members_116_0= ruleAnnotationField ) )* otherlv_117= '}' ) ) )
              // InternalSARL.g:194:3: () ( (lv_annotations_1_0= ruleXAnnotation ) )* ( ( () ( (lv_modifiers_3_0= ruleCommonModifier ) )* otherlv_4= 'event' ( (lv_name_5_0= ruleValidID ) ) (otherlv_6= 'extends' ( (lv_extends_7_0= ruleJvmParameterizedTypeReference ) ) )? (otherlv_8= '{' ( (lv_members_9_0= ruleEventMember ) )* otherlv_10= '}' )? ) | ( () ( (lv_modifiers_12_0= ruleCommonModifier ) )* otherlv_13= 'capacity' ( (lv_name_14_0= ruleValidID ) ) (otherlv_15= 'extends' ( (lv_extends_16_0= ruleJvmParameterizedTypeReference ) ) (otherlv_17= ',' ( (lv_extends_18_0= ruleJvmParameterizedTypeReference ) ) )* )? otherlv_19= '{' ( (lv_members_20_0= ruleCapacityMember ) )* otherlv_21= '}' ) | ( () ( (lv_modifiers_23_0= ruleCommonModifier ) )* otherlv_24= 'agent' ( (lv_name_25_0= ruleValidID ) ) (otherlv_26= 'extends' ( (lv_extends_27_0= ruleJvmParameterizedTypeReference ) ) )? otherlv_28= '{' ( (lv_members_29_0= ruleAOPMember ) )* otherlv_30= '}' ) | ( () ( (lv_modifiers_32_0= ruleCommonModifier ) )* otherlv_33= 'behavior' ( (lv_name_34_0= ruleValidID ) ) (otherlv_35= 'extends' ( (lv_extends_36_0= ruleJvmParameterizedTypeReference ) ) )? otherlv_37= '{' ( (lv_members_38_0= ruleAOPMember ) )* otherlv_39= '}' ) | ( () ( (lv_modifiers_41_0= ruleCommonModifier ) )* otherlv_42= 'skill' ( (lv_name_43_0= ruleValidID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) ) ) otherlv_51= '{' ( (lv_members_52_0= ruleAOPMember ) )* otherlv_53= '}' ) | ( () ( (lv_modifiers_55_0= ruleCommonModifier ) )* otherlv_56= 'space' ( (lv_name_57_0= ruleValidID ) ) otherlv_58= '{' otherlv_59= '}' ) | ( () ( (lv_modifiers_61_0= ruleCommonModifier ) )* otherlv_62= 'artifact' ( (lv_name_63_0= ruleValidID ) ) otherlv_64= '{' otherlv_65= '}' ) | ( () ( (lv_modifiers_67_0= ruleCommonModifier ) )* otherlv_68= 'class' ( (lv_name_69_0= ruleValidID ) ) (otherlv_70= '<' ( (lv_typeParameters_71_0= ruleJvmTypeParameter ) ) (otherlv_72= ',' ( (lv_typeParameters_73_0= ruleJvmTypeParameter ) ) )* otherlv_74= '>' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) ) ) otherlv_82= '{' ( (lv_members_83_0= ruleMember ) )* otherlv_84= '}' ) | ( () ( (lv_modifiers_86_0= ruleCommonModifier ) )* otherlv_87= 'interface' ( (lv_name_88_0= ruleValidID ) ) (otherlv_89= '<' ( (lv_typeParameters_90_0= ruleJvmTypeParameter ) ) (otherlv_91= ',' ( (lv_typeParameters_92_0= ruleJvmTypeParameter ) ) )* otherlv_93= '>' )? (otherlv_94= 'extends' ( (lv_extends_95_0= ruleJvmParameterizedTypeReference ) ) (otherlv_96= ',' ( (lv_extends_97_0= ruleJvmParameterizedTypeReference ) ) )* )? otherlv_98= '{' ( (lv_members_99_0= ruleMember ) )* otherlv_100= '}' ) | ( () ( (lv_modifiers_102_0= ruleCommonModifier ) )* otherlv_103= 'enum' ( (lv_name_104_0= ruleValidID ) ) otherlv_105= '{' ( ( (lv_members_106_0= ruleXtendEnumLiteral ) ) (otherlv_107= ',' ( (lv_members_108_0= ruleXtendEnumLiteral ) ) )* )? (otherlv_109= ';' )? otherlv_110= '}' ) | ( () ( (lv_modifiers_112_0= ruleCommonModifier ) )* otherlv_113= 'annotation' ( (lv_name_114_0= ruleValidID ) ) otherlv_115= '{' ( (lv_members_116_0= ruleAnnotationField ) )* otherlv_117= '}' ) )
              {
              // InternalSARL.g:194:3: ()
              // InternalSARL.g:195:4: 
              {
              if ( state.backtracking==0 ) {
  
                				current = forceCreateModelElement(
                					grammarAccess.getTypeAccess().getXtendTypeDeclarationAction_0(),
                					current);
                			
              }
  
              }
  
              // InternalSARL.g:201:3: ( (lv_annotations_1_0= ruleXAnnotation ) )*
              loop5:
              do {
                  int alt5=2;
                  int LA5_0 = input.LA(1);
  
                  if ( (LA5_0==105) ) {
                      alt5=1;
                  }
  
  
                  switch (alt5) {
              	case 1 :
              	    // InternalSARL.g:202:4: (lv_annotations_1_0= ruleXAnnotation )
              	    {
              	    // InternalSARL.g:202:4: (lv_annotations_1_0= ruleXAnnotation )
              	    // InternalSARL.g:203:5: lv_annotations_1_0= ruleXAnnotation
              	    {
              	    if ( state.backtracking==0 ) {
  
              	      					newCompositeNode(grammarAccess.getTypeAccess().getAnnotationsXAnnotationParserRuleCall_1_0());
              	      				
              	    }
              	    pushFollow(FOLLOW_7);
              	    lv_annotations_1_0=ruleXAnnotation();
  
              	    state._fsp--;
              	    if (state.failed) return current;
              	    if ( state.backtracking==0 ) {
  
              	      					if (current==null) {
              	      						current = createModelElementForParent(grammarAccess.getTypeRule());
              	      					}
              	      					add(
              	      						current,
              	      						"annotations",
              	      						lv_annotations_1_0,
              	      						"org.eclipse.xtext.xbase.annotations.XbaseWithAnnotations.XAnnotation");
              	      					afterParserOrEnumRuleCall();
              	      				
              	    }
  
              	    }
  
  
              	    }
              	    break;
  
              	default :
              	    break loop5;
                  }
              } while (true);
  
              // InternalSARL.g:220:3: ( ( () ( (lv_modifiers_3_0= ruleCommonModifier ) )* otherlv_4= 'event' ( (lv_name_5_0= ruleValidID ) ) (otherlv_6= 'extends' ( (lv_extends_7_0= ruleJvmParameterizedTypeReference ) ) )? (otherlv_8= '{' ( (lv_members_9_0= ruleEventMember ) )* otherlv_10= '}' )? ) | ( () ( (lv_modifiers_12_0= ruleCommonModifier ) )* otherlv_13= 'capacity' ( (lv_name_14_0= ruleValidID ) ) (otherlv_15= 'extends' ( (lv_extends_16_0= ruleJvmParameterizedTypeReference ) ) (otherlv_17= ',' ( (lv_extends_18_0= ruleJvmParameterizedTypeReference ) ) )* )? otherlv_19= '{' ( (lv_members_20_0= ruleCapacityMember ) )* otherlv_21= '}' ) | ( () ( (lv_modifiers_23_0= ruleCommonModifier ) )* otherlv_24= 'agent' ( (lv_name_25_0= ruleValidID ) ) (otherlv_26= 'extends' ( (lv_extends_27_0= ruleJvmParameterizedTypeReference ) ) )? otherlv_28= '{' ( (lv_members_29_0= ruleAOPMember ) )* otherlv_30= '}' ) | ( () ( (lv_modifiers_32_0= ruleCommonModifier ) )* otherlv_33= 'behavior' ( (lv_name_34_0= ruleValidID ) ) (otherlv_35= 'extends' ( (lv_extends_36_0= ruleJvmParameterizedTypeReference ) ) )? otherlv_37= '{' ( (lv_members_38_0= ruleAOPMember ) )* otherlv_39= '}' ) | ( () ( (lv_modifiers_41_0= ruleCommonModifier ) )* otherlv_42= 'skill' ( (lv_name_43_0= ruleValidID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) ) ) otherlv_51= '{' ( (lv_members_52_0= ruleAOPMember ) )* otherlv_53= '}' ) | ( () ( (lv_modifiers_55_0= ruleCommonModifier ) )* otherlv_56= 'space' ( (lv_name_57_0= ruleValidID ) ) otherlv_58= '{' otherlv_59= '}' ) | ( () ( (lv_modifiers_61_0= ruleCommonModifier ) )* otherlv_62= 'artifact' ( (lv_name_63_0= ruleValidID ) ) otherlv_64= '{' otherlv_65= '}' ) | ( () ( (lv_modifiers_67_0= ruleCommonModifier ) )* otherlv_68= 'class' ( (lv_name_69_0= ruleValidID ) ) (otherlv_70= '<' ( (lv_typeParameters_71_0= ruleJvmTypeParameter ) ) (otherlv_72= ',' ( (lv_typeParameters_73_0= ruleJvmTypeParameter ) ) )* otherlv_74= '>' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) ) ) otherlv_82= '{' ( (lv_members_83_0= ruleMember ) )* otherlv_84= '}' ) | ( () ( (lv_modifiers_86_0= ruleCommonModifier ) )* otherlv_87= 'interface' ( (lv_name_88_0= ruleValidID ) ) (otherlv_89= '<' ( (lv_typeParameters_90_0= ruleJvmTypeParameter ) ) (otherlv_91= ',' ( (lv_typeParameters_92_0= ruleJvmTypeParameter ) ) )* otherlv_93= '>' )? (otherlv_94= 'extends' ( (lv_extends_95_0= ruleJvmParameterizedTypeReference ) ) (otherlv_96= ',' ( (lv_extends_97_0= ruleJvmParameterizedTypeReference ) ) )* )? otherlv_98= '{' ( (lv_members_99_0= ruleMember ) )* otherlv_100= '}' ) | ( () ( (lv_modifiers_102_0= ruleCommonModifier ) )* otherlv_103= 'enum' ( (lv_name_104_0= ruleValidID ) ) otherlv_105= '{' ( ( (lv_members_106_0= ruleXtendEnumLiteral ) ) (otherlv_107= ',' ( (lv_members_108_0= ruleXtendEnumLiteral ) ) )* )? (otherlv_109= ';' )? otherlv_110= '}' ) | ( () ( (lv_modifiers_112_0= ruleCommonModifier ) )* otherlv_113= 'annotation' ( (lv_name_114_0= ruleValidID ) ) otherlv_115= '{' ( (lv_members_116_0= ruleAnnotationField ) )* otherlv_117= '}' ) )
              int alt44=11;
              alt44 = dfa44.predict(input);
              switch (alt44) {
                  case 1 :
                      // InternalSARL.g:221:4: ( () ( (lv_modifiers_3_0= ruleCommonModifier ) )* otherlv_4= 'event' ( (lv_name_5_0= ruleValidID ) ) (otherlv_6= 'extends' ( (lv_extends_7_0= ruleJvmParameterizedTypeReference ) ) )? (otherlv_8= '{' ( (lv_members_9_0= ruleEventMember ) )* otherlv_10= '}' )? )
                      {
                      // InternalSARL.g:221:4: ( () ( (lv_modifiers_3_0= ruleCommonModifier ) )* otherlv_4= 'event' ( (lv_name_5_0= ruleValidID ) ) (otherlv_6= 'extends' ( (lv_extends_7_0= ruleJvmParameterizedTypeReference ) ) )? (otherlv_8= '{' ( (lv_members_9_0= ruleEventMember ) )* otherlv_10= '}' )? )
                      // InternalSARL.g:222:5: () ( (lv_modifiers_3_0= ruleCommonModifier ) )* otherlv_4= 'event' ( (lv_name_5_0= ruleValidID ) ) (otherlv_6= 'extends' ( (lv_extends_7_0= ruleJvmParameterizedTypeReference ) ) )? (otherlv_8= '{' ( (lv_members_9_0= ruleEventMember ) )* otherlv_10= '}' )?
                      {
                      // InternalSARL.g:222:5: ()
                      // InternalSARL.g:223:6: 
                      {
                      if ( state.backtracking==0 ) {
  
                        						current = forceCreateModelElementAndSet(
                        							grammarAccess.getTypeAccess().getSarlEventAnnotationInfoAction_2_0_0(),
                        							current);
                        					
                      }
  
                      }
  
                      // InternalSARL.g:229:5: ( (lv_modifiers_3_0= ruleCommonModifier ) )*
                      loop6:
                      do {
                          int alt6=2;
                          int LA6_0 = input.LA(1);
  
                          if ( (LA6_0==25||(LA6_0>=78 && LA6_0<=89)) ) {
                              alt6=1;
                          }
  
  
                          switch (alt6) {
                      	case 1 :
                      	    // InternalSARL.g:230:6: (lv_modifiers_3_0= ruleCommonModifier )
                      	    {
                      	    // InternalSARL.g:230:6: (lv_modifiers_3_0= ruleCommonModifier )
                      	    // InternalSARL.g:231:7: lv_modifiers_3_0= ruleCommonModifier
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getTypeAccess().getModifiersCommonModifierParserRuleCall_2_0_1_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_8);
                      	    lv_modifiers_3_0=ruleCommonModifier();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"modifiers",
                      	      								lv_modifiers_3_0,
                      	      								"org.eclipse.xtend.core.Xtend.CommonModifier");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop6;
                          }
                      } while (true);
  
                      otherlv_4=(Token)match(input,27,FOLLOW_3); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_4, grammarAccess.getTypeAccess().getEventKeyword_2_0_2());
                        				
                      }
                      // InternalSARL.g:252:5: ( (lv_name_5_0= ruleValidID ) )
                      // InternalSARL.g:253:6: (lv_name_5_0= ruleValidID )
                      {
                      // InternalSARL.g:253:6: (lv_name_5_0= ruleValidID )
                      // InternalSARL.g:254:7: lv_name_5_0= ruleValidID
                      {
                      if ( state.backtracking==0 ) {
  
                        							newCompositeNode(grammarAccess.getTypeAccess().getNameValidIDParserRuleCall_2_0_3_0());
                        						
                      }
                      pushFollow(FOLLOW_9);
                      lv_name_5_0=ruleValidID();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        							if (current==null) {
                        								current = createModelElementForParent(grammarAccess.getTypeRule());
                        							}
                        							set(
                        								current,
                        								"name",
                        								lv_name_5_0,
                        								"org.eclipse.xtend.core.Xtend.ValidID");
                        							afterParserOrEnumRuleCall();
                        						
                      }
  
                      }
  
  
                      }
  
                      // InternalSARL.g:271:5: (otherlv_6= 'extends' ( (lv_extends_7_0= ruleJvmParameterizedTypeReference ) ) )?
                      int alt7=2;
                      int LA7_0 = input.LA(1);
  
                      if ( (LA7_0==28) ) {
                          alt7=1;
                      }
                      switch (alt7) {
                          case 1 :
                              // InternalSARL.g:272:6: otherlv_6= 'extends' ( (lv_extends_7_0= ruleJvmParameterizedTypeReference ) )
                              {
                              otherlv_6=(Token)match(input,28,FOLLOW_3); if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                						newLeafNode(otherlv_6, grammarAccess.getTypeAccess().getExtendsKeyword_2_0_4_0());
                                					
                              }
                              // InternalSARL.g:276:6: ( (lv_extends_7_0= ruleJvmParameterizedTypeReference ) )
                              // InternalSARL.g:277:7: (lv_extends_7_0= ruleJvmParameterizedTypeReference )
                              {
                              // InternalSARL.g:277:7: (lv_extends_7_0= ruleJvmParameterizedTypeReference )
                              // InternalSARL.g:278:8: lv_extends_7_0= ruleJvmParameterizedTypeReference
                              {
                              if ( state.backtracking==0 ) {
  
                                								newCompositeNode(grammarAccess.getTypeAccess().getExtendsJvmParameterizedTypeReferenceParserRuleCall_2_0_4_1_0());
                                							
                              }
                              pushFollow(FOLLOW_10);
                              lv_extends_7_0=ruleJvmParameterizedTypeReference();
  
                              state._fsp--;
                              if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                								if (current==null) {
                                									current = createModelElementForParent(grammarAccess.getTypeRule());
                                								}
                                								set(
                                									current,
                                									"extends",
                                									lv_extends_7_0,
                                									"org.eclipse.xtext.xbase.Xtype.JvmParameterizedTypeReference");
                                								afterParserOrEnumRuleCall();
                                							
                              }
  
                              }
  
  
                              }
  
  
                              }
                              break;
  
                      }
  
                      // InternalSARL.g:296:5: (otherlv_8= '{' ( (lv_members_9_0= ruleEventMember ) )* otherlv_10= '}' )?
                      int alt9=2;
                      int LA9_0 = input.LA(1);
  
                      if ( (LA9_0==29) ) {
                          alt9=1;
                      }
                      switch (alt9) {
                          case 1 :
                              // InternalSARL.g:297:6: otherlv_8= '{' ( (lv_members_9_0= ruleEventMember ) )* otherlv_10= '}'
                              {
                              otherlv_8=(Token)match(input,29,FOLLOW_11); if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                						newLeafNode(otherlv_8, grammarAccess.getTypeAccess().getLeftCurlyBracketKeyword_2_0_5_0());
                                					
                              }
                              // InternalSARL.g:301:6: ( (lv_members_9_0= ruleEventMember ) )*
                              loop8:
                              do {
                                  int alt8=2;
                                  int LA8_0 = input.LA(1);
  
                                  if ( (LA8_0==25||LA8_0==45||LA8_0==48||(LA8_0>=65 && LA8_0<=66)||(LA8_0>=78 && LA8_0<=89)||LA8_0==105) ) {
                                      alt8=1;
                                  }
  
  
                                  switch (alt8) {
                              	case 1 :
                              	    // InternalSARL.g:302:7: (lv_members_9_0= ruleEventMember )
                              	    {
                              	    // InternalSARL.g:302:7: (lv_members_9_0= ruleEventMember )
                              	    // InternalSARL.g:303:8: lv_members_9_0= ruleEventMember
                              	    {
                              	    if ( state.backtracking==0 ) {
  
                              	      								newCompositeNode(grammarAccess.getTypeAccess().getMembersEventMemberParserRuleCall_2_0_5_1_0());
                              	      							
                              	    }
                              	    pushFollow(FOLLOW_11);
                              	    lv_members_9_0=ruleEventMember();
  
                              	    state._fsp--;
                              	    if (state.failed) return current;
                              	    if ( state.backtracking==0 ) {
  
                              	      								if (current==null) {
                              	      									current = createModelElementForParent(grammarAccess.getTypeRule());
                              	      								}
                              	      								add(
                              	      									current,
                              	      									"members",
                              	      									lv_members_9_0,
                              	      									"io.sarl.lang.SARL.EventMember");
                              	      								afterParserOrEnumRuleCall();
                              	      							
                              	    }
  
                              	    }
  
  
                              	    }
                              	    break;
  
                              	default :
                              	    break loop8;
                                  }
                              } while (true);
  
                              otherlv_10=(Token)match(input,30,FOLLOW_2); if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                						newLeafNode(otherlv_10, grammarAccess.getTypeAccess().getRightCurlyBracketKeyword_2_0_5_2());
                                					
                              }
  
                              }
                              break;
  
                      }
  
  
                      }
  
  
                      }
                      break;
                  case 2 :
                      // InternalSARL.g:327:4: ( () ( (lv_modifiers_12_0= ruleCommonModifier ) )* otherlv_13= 'capacity' ( (lv_name_14_0= ruleValidID ) ) (otherlv_15= 'extends' ( (lv_extends_16_0= ruleJvmParameterizedTypeReference ) ) (otherlv_17= ',' ( (lv_extends_18_0= ruleJvmParameterizedTypeReference ) ) )* )? otherlv_19= '{' ( (lv_members_20_0= ruleCapacityMember ) )* otherlv_21= '}' )
                      {
                      // InternalSARL.g:327:4: ( () ( (lv_modifiers_12_0= ruleCommonModifier ) )* otherlv_13= 'capacity' ( (lv_name_14_0= ruleValidID ) ) (otherlv_15= 'extends' ( (lv_extends_16_0= ruleJvmParameterizedTypeReference ) ) (otherlv_17= ',' ( (lv_extends_18_0= ruleJvmParameterizedTypeReference ) ) )* )? otherlv_19= '{' ( (lv_members_20_0= ruleCapacityMember ) )* otherlv_21= '}' )
                      // InternalSARL.g:328:5: () ( (lv_modifiers_12_0= ruleCommonModifier ) )* otherlv_13= 'capacity' ( (lv_name_14_0= ruleValidID ) ) (otherlv_15= 'extends' ( (lv_extends_16_0= ruleJvmParameterizedTypeReference ) ) (otherlv_17= ',' ( (lv_extends_18_0= ruleJvmParameterizedTypeReference ) ) )* )? otherlv_19= '{' ( (lv_members_20_0= ruleCapacityMember ) )* otherlv_21= '}'
                      {
                      // InternalSARL.g:328:5: ()
                      // InternalSARL.g:329:6: 
                      {
                      if ( state.backtracking==0 ) {
  
                        						current = forceCreateModelElementAndSet(
                        							grammarAccess.getTypeAccess().getSarlCapacityAnnotationInfoAction_2_1_0(),
                        							current);
                        					
                      }
  
                      }
  
                      // InternalSARL.g:335:5: ( (lv_modifiers_12_0= ruleCommonModifier ) )*
                      loop10:
                      do {
                          int alt10=2;
                          int LA10_0 = input.LA(1);
  
                          if ( (LA10_0==25||(LA10_0>=78 && LA10_0<=89)) ) {
                              alt10=1;
                          }
  
  
                          switch (alt10) {
                      	case 1 :
                      	    // InternalSARL.g:336:6: (lv_modifiers_12_0= ruleCommonModifier )
                      	    {
                      	    // InternalSARL.g:336:6: (lv_modifiers_12_0= ruleCommonModifier )
                      	    // InternalSARL.g:337:7: lv_modifiers_12_0= ruleCommonModifier
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getTypeAccess().getModifiersCommonModifierParserRuleCall_2_1_1_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_12);
                      	    lv_modifiers_12_0=ruleCommonModifier();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"modifiers",
                      	      								lv_modifiers_12_0,
                      	      								"org.eclipse.xtend.core.Xtend.CommonModifier");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop10;
                          }
                      } while (true);
  
                      otherlv_13=(Token)match(input,31,FOLLOW_3); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_13, grammarAccess.getTypeAccess().getCapacityKeyword_2_1_2());
                        				
                      }
                      // InternalSARL.g:358:5: ( (lv_name_14_0= ruleValidID ) )
                      // InternalSARL.g:359:6: (lv_name_14_0= ruleValidID )
                      {
                      // InternalSARL.g:359:6: (lv_name_14_0= ruleValidID )
                      // InternalSARL.g:360:7: lv_name_14_0= ruleValidID
                      {
                      if ( state.backtracking==0 ) {
  
                        							newCompositeNode(grammarAccess.getTypeAccess().getNameValidIDParserRuleCall_2_1_3_0());
                        						
                      }
                      pushFollow(FOLLOW_13);
                      lv_name_14_0=ruleValidID();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        							if (current==null) {
                        								current = createModelElementForParent(grammarAccess.getTypeRule());
                        							}
                        							set(
                        								current,
                        								"name",
                        								lv_name_14_0,
                        								"org.eclipse.xtend.core.Xtend.ValidID");
                        							afterParserOrEnumRuleCall();
                        						
                      }
  
                      }
  
  
                      }
  
                      // InternalSARL.g:377:5: (otherlv_15= 'extends' ( (lv_extends_16_0= ruleJvmParameterizedTypeReference ) ) (otherlv_17= ',' ( (lv_extends_18_0= ruleJvmParameterizedTypeReference ) ) )* )?
                      int alt12=2;
                      int LA12_0 = input.LA(1);
  
                      if ( (LA12_0==28) ) {
                          alt12=1;
                      }
                      switch (alt12) {
                          case 1 :
                              // InternalSARL.g:378:6: otherlv_15= 'extends' ( (lv_extends_16_0= ruleJvmParameterizedTypeReference ) ) (otherlv_17= ',' ( (lv_extends_18_0= ruleJvmParameterizedTypeReference ) ) )*
                              {
                              otherlv_15=(Token)match(input,28,FOLLOW_3); if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                						newLeafNode(otherlv_15, grammarAccess.getTypeAccess().getExtendsKeyword_2_1_4_0());
                                					
                              }
                              // InternalSARL.g:382:6: ( (lv_extends_16_0= ruleJvmParameterizedTypeReference ) )
                              // InternalSARL.g:383:7: (lv_extends_16_0= ruleJvmParameterizedTypeReference )
                              {
                              // InternalSARL.g:383:7: (lv_extends_16_0= ruleJvmParameterizedTypeReference )
                              // InternalSARL.g:384:8: lv_extends_16_0= ruleJvmParameterizedTypeReference
                              {
                              if ( state.backtracking==0 ) {
  
                                								newCompositeNode(grammarAccess.getTypeAccess().getExtendsJvmParameterizedTypeReferenceParserRuleCall_2_1_4_1_0());
                                							
                              }
                              pushFollow(FOLLOW_14);
                              lv_extends_16_0=ruleJvmParameterizedTypeReference();
  
                              state._fsp--;
                              if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                								if (current==null) {
                                									current = createModelElementForParent(grammarAccess.getTypeRule());
                                								}
                                								add(
                                									current,
                                									"extends",
                                									lv_extends_16_0,
                                									"org.eclipse.xtext.xbase.Xtype.JvmParameterizedTypeReference");
                                								afterParserOrEnumRuleCall();
                                							
                              }
  
                              }
  
  
                              }
  
                              // InternalSARL.g:401:6: (otherlv_17= ',' ( (lv_extends_18_0= ruleJvmParameterizedTypeReference ) ) )*
                              loop11:
                              do {
                                  int alt11=2;
                                  int LA11_0 = input.LA(1);
  
                                  if ( (LA11_0==32) ) {
                                      alt11=1;
                                  }
  
  
                                  switch (alt11) {
                              	case 1 :
                              	    // InternalSARL.g:402:7: otherlv_17= ',' ( (lv_extends_18_0= ruleJvmParameterizedTypeReference ) )
                              	    {
                              	    otherlv_17=(Token)match(input,32,FOLLOW_3); if (state.failed) return current;
                              	    if ( state.backtracking==0 ) {
  
                              	      							newLeafNode(otherlv_17, grammarAccess.getTypeAccess().getCommaKeyword_2_1_4_2_0());
                              	      						
                              	    }
                              	    // InternalSARL.g:406:7: ( (lv_extends_18_0= ruleJvmParameterizedTypeReference ) )
                              	    // InternalSARL.g:407:8: (lv_extends_18_0= ruleJvmParameterizedTypeReference )
                              	    {
                              	    // InternalSARL.g:407:8: (lv_extends_18_0= ruleJvmParameterizedTypeReference )
                              	    // InternalSARL.g:408:9: lv_extends_18_0= ruleJvmParameterizedTypeReference
                              	    {
                              	    if ( state.backtracking==0 ) {
  
                              	      									newCompositeNode(grammarAccess.getTypeAccess().getExtendsJvmParameterizedTypeReferenceParserRuleCall_2_1_4_2_1_0());
                              	      								
                              	    }
                              	    pushFollow(FOLLOW_14);
                              	    lv_extends_18_0=ruleJvmParameterizedTypeReference();
  
                              	    state._fsp--;
                              	    if (state.failed) return current;
                              	    if ( state.backtracking==0 ) {
  
                              	      									if (current==null) {
                              	      										current = createModelElementForParent(grammarAccess.getTypeRule());
                              	      									}
                              	      									add(
                              	      										current,
                              	      										"extends",
                              	      										lv_extends_18_0,
                              	      										"org.eclipse.xtext.xbase.Xtype.JvmParameterizedTypeReference");
                              	      									afterParserOrEnumRuleCall();
                              	      								
                              	    }
  
                              	    }
  
  
                              	    }
  
  
                              	    }
                              	    break;
  
                              	default :
                              	    break loop11;
                                  }
                              } while (true);
  
  
                              }
                              break;
  
                      }
  
                      otherlv_19=(Token)match(input,29,FOLLOW_15); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_19, grammarAccess.getTypeAccess().getLeftCurlyBracketKeyword_2_1_5());
                        				
                      }
                      // InternalSARL.g:431:5: ( (lv_members_20_0= ruleCapacityMember ) )*
                      loop13:
                      do {
                          int alt13=2;
                          int LA13_0 = input.LA(1);
  
                          if ( (LA13_0==25||(LA13_0>=78 && LA13_0<=91)||LA13_0==105) ) {
                              alt13=1;
                          }
  
  
                          switch (alt13) {
                      	case 1 :
                      	    // InternalSARL.g:432:6: (lv_members_20_0= ruleCapacityMember )
                      	    {
                      	    // InternalSARL.g:432:6: (lv_members_20_0= ruleCapacityMember )
                      	    // InternalSARL.g:433:7: lv_members_20_0= ruleCapacityMember
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getTypeAccess().getMembersCapacityMemberParserRuleCall_2_1_6_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_15);
                      	    lv_members_20_0=ruleCapacityMember();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"members",
                      	      								lv_members_20_0,
                      	      								"io.sarl.lang.SARL.CapacityMember");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop13;
                          }
                      } while (true);
  
                      otherlv_21=(Token)match(input,30,FOLLOW_2); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_21, grammarAccess.getTypeAccess().getRightCurlyBracketKeyword_2_1_7());
                        				
                      }
  
                      }
  
  
                      }
                      break;
                  case 3 :
                      // InternalSARL.g:456:4: ( () ( (lv_modifiers_23_0= ruleCommonModifier ) )* otherlv_24= 'agent' ( (lv_name_25_0= ruleValidID ) ) (otherlv_26= 'extends' ( (lv_extends_27_0= ruleJvmParameterizedTypeReference ) ) )? otherlv_28= '{' ( (lv_members_29_0= ruleAOPMember ) )* otherlv_30= '}' )
                      {
                      // InternalSARL.g:456:4: ( () ( (lv_modifiers_23_0= ruleCommonModifier ) )* otherlv_24= 'agent' ( (lv_name_25_0= ruleValidID ) ) (otherlv_26= 'extends' ( (lv_extends_27_0= ruleJvmParameterizedTypeReference ) ) )? otherlv_28= '{' ( (lv_members_29_0= ruleAOPMember ) )* otherlv_30= '}' )
                      // InternalSARL.g:457:5: () ( (lv_modifiers_23_0= ruleCommonModifier ) )* otherlv_24= 'agent' ( (lv_name_25_0= ruleValidID ) ) (otherlv_26= 'extends' ( (lv_extends_27_0= ruleJvmParameterizedTypeReference ) ) )? otherlv_28= '{' ( (lv_members_29_0= ruleAOPMember ) )* otherlv_30= '}'
                      {
                      // InternalSARL.g:457:5: ()
                      // InternalSARL.g:458:6: 
                      {
                      if ( state.backtracking==0 ) {
  
                        						current = forceCreateModelElementAndSet(
                        							grammarAccess.getTypeAccess().getSarlAgentAnnotationInfoAction_2_2_0(),
                        							current);
                        					
                      }
  
                      }
  
                      // InternalSARL.g:464:5: ( (lv_modifiers_23_0= ruleCommonModifier ) )*
                      loop14:
                      do {
                          int alt14=2;
                          int LA14_0 = input.LA(1);
  
                          if ( (LA14_0==25||(LA14_0>=78 && LA14_0<=89)) ) {
                              alt14=1;
                          }
  
  
                          switch (alt14) {
                      	case 1 :
                      	    // InternalSARL.g:465:6: (lv_modifiers_23_0= ruleCommonModifier )
                      	    {
                      	    // InternalSARL.g:465:6: (lv_modifiers_23_0= ruleCommonModifier )
                      	    // InternalSARL.g:466:7: lv_modifiers_23_0= ruleCommonModifier
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getTypeAccess().getModifiersCommonModifierParserRuleCall_2_2_1_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_16);
                      	    lv_modifiers_23_0=ruleCommonModifier();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"modifiers",
                      	      								lv_modifiers_23_0,
                      	      								"org.eclipse.xtend.core.Xtend.CommonModifier");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop14;
                          }
                      } while (true);
  
                      otherlv_24=(Token)match(input,33,FOLLOW_3); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_24, grammarAccess.getTypeAccess().getAgentKeyword_2_2_2());
                        				
                      }
                      // InternalSARL.g:487:5: ( (lv_name_25_0= ruleValidID ) )
                      // InternalSARL.g:488:6: (lv_name_25_0= ruleValidID )
                      {
                      // InternalSARL.g:488:6: (lv_name_25_0= ruleValidID )
                      // InternalSARL.g:489:7: lv_name_25_0= ruleValidID
                      {
                      if ( state.backtracking==0 ) {
  
                        							newCompositeNode(grammarAccess.getTypeAccess().getNameValidIDParserRuleCall_2_2_3_0());
                        						
                      }
                      pushFollow(FOLLOW_13);
                      lv_name_25_0=ruleValidID();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        							if (current==null) {
                        								current = createModelElementForParent(grammarAccess.getTypeRule());
                        							}
                        							set(
                        								current,
                        								"name",
                        								lv_name_25_0,
                        								"org.eclipse.xtend.core.Xtend.ValidID");
                        							afterParserOrEnumRuleCall();
                        						
                      }
  
                      }
  
  
                      }
  
                      // InternalSARL.g:506:5: (otherlv_26= 'extends' ( (lv_extends_27_0= ruleJvmParameterizedTypeReference ) ) )?
                      int alt15=2;
                      int LA15_0 = input.LA(1);
  
                      if ( (LA15_0==28) ) {
                          alt15=1;
                      }
                      switch (alt15) {
                          case 1 :
                              // InternalSARL.g:507:6: otherlv_26= 'extends' ( (lv_extends_27_0= ruleJvmParameterizedTypeReference ) )
                              {
                              otherlv_26=(Token)match(input,28,FOLLOW_3); if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                						newLeafNode(otherlv_26, grammarAccess.getTypeAccess().getExtendsKeyword_2_2_4_0());
                                					
                              }
                              // InternalSARL.g:511:6: ( (lv_extends_27_0= ruleJvmParameterizedTypeReference ) )
                              // InternalSARL.g:512:7: (lv_extends_27_0= ruleJvmParameterizedTypeReference )
                              {
                              // InternalSARL.g:512:7: (lv_extends_27_0= ruleJvmParameterizedTypeReference )
                              // InternalSARL.g:513:8: lv_extends_27_0= ruleJvmParameterizedTypeReference
                              {
                              if ( state.backtracking==0 ) {
  
                                								newCompositeNode(grammarAccess.getTypeAccess().getExtendsJvmParameterizedTypeReferenceParserRuleCall_2_2_4_1_0());
                                							
                              }
                              pushFollow(FOLLOW_17);
                              lv_extends_27_0=ruleJvmParameterizedTypeReference();
  
                              state._fsp--;
                              if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                								if (current==null) {
                                									current = createModelElementForParent(grammarAccess.getTypeRule());
                                								}
                                								set(
                                									current,
                                									"extends",
                                									lv_extends_27_0,
                                									"org.eclipse.xtext.xbase.Xtype.JvmParameterizedTypeReference");
                                								afterParserOrEnumRuleCall();
                                							
                              }
  
                              }
  
  
                              }
  
  
                              }
                              break;
  
                      }
  
                      otherlv_28=(Token)match(input,29,FOLLOW_18); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_28, grammarAccess.getTypeAccess().getLeftCurlyBracketKeyword_2_2_5());
                        				
                      }
                      // InternalSARL.g:535:5: ( (lv_members_29_0= ruleAOPMember ) )*
                      loop16:
                      do {
                          int alt16=2;
                          int LA16_0 = input.LA(1);
  
                          if ( (LA16_0==25||LA16_0==39||(LA16_0>=42 && LA16_0<=45)||LA16_0==48||LA16_0==54||(LA16_0>=57 && LA16_0<=58)||(LA16_0>=65 && LA16_0<=66)||(LA16_0>=78 && LA16_0<=91)||LA16_0==105) ) {
                              alt16=1;
                          }
  
  
                          switch (alt16) {
                      	case 1 :
                      	    // InternalSARL.g:536:6: (lv_members_29_0= ruleAOPMember )
                      	    {
                      	    // InternalSARL.g:536:6: (lv_members_29_0= ruleAOPMember )
                      	    // InternalSARL.g:537:7: lv_members_29_0= ruleAOPMember
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getTypeAccess().getMembersAOPMemberParserRuleCall_2_2_6_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_18);
                      	    lv_members_29_0=ruleAOPMember();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"members",
                      	      								lv_members_29_0,
                      	      								"io.sarl.lang.SARL.AOPMember");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop16;
                          }
                      } while (true);
  
                      otherlv_30=(Token)match(input,30,FOLLOW_2); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_30, grammarAccess.getTypeAccess().getRightCurlyBracketKeyword_2_2_7());
                        				
                      }
  
                      }
  
  
                      }
                      break;
                  case 4 :
                      // InternalSARL.g:560:4: ( () ( (lv_modifiers_32_0= ruleCommonModifier ) )* otherlv_33= 'behavior' ( (lv_name_34_0= ruleValidID ) ) (otherlv_35= 'extends' ( (lv_extends_36_0= ruleJvmParameterizedTypeReference ) ) )? otherlv_37= '{' ( (lv_members_38_0= ruleAOPMember ) )* otherlv_39= '}' )
                      {
                      // InternalSARL.g:560:4: ( () ( (lv_modifiers_32_0= ruleCommonModifier ) )* otherlv_33= 'behavior' ( (lv_name_34_0= ruleValidID ) ) (otherlv_35= 'extends' ( (lv_extends_36_0= ruleJvmParameterizedTypeReference ) ) )? otherlv_37= '{' ( (lv_members_38_0= ruleAOPMember ) )* otherlv_39= '}' )
                      // InternalSARL.g:561:5: () ( (lv_modifiers_32_0= ruleCommonModifier ) )* otherlv_33= 'behavior' ( (lv_name_34_0= ruleValidID ) ) (otherlv_35= 'extends' ( (lv_extends_36_0= ruleJvmParameterizedTypeReference ) ) )? otherlv_37= '{' ( (lv_members_38_0= ruleAOPMember ) )* otherlv_39= '}'
                      {
                      // InternalSARL.g:561:5: ()
                      // InternalSARL.g:562:6: 
                      {
                      if ( state.backtracking==0 ) {
  
                        						current = forceCreateModelElementAndSet(
                        							grammarAccess.getTypeAccess().getSarlBehaviorAnnotationInfoAction_2_3_0(),
                        							current);
                        					
                      }
  
                      }
  
                      // InternalSARL.g:568:5: ( (lv_modifiers_32_0= ruleCommonModifier ) )*
                      loop17:
                      do {
                          int alt17=2;
                          int LA17_0 = input.LA(1);
  
                          if ( (LA17_0==25||(LA17_0>=78 && LA17_0<=89)) ) {
                              alt17=1;
                          }
  
  
                          switch (alt17) {
                      	case 1 :
                      	    // InternalSARL.g:569:6: (lv_modifiers_32_0= ruleCommonModifier )
                      	    {
                      	    // InternalSARL.g:569:6: (lv_modifiers_32_0= ruleCommonModifier )
                      	    // InternalSARL.g:570:7: lv_modifiers_32_0= ruleCommonModifier
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getTypeAccess().getModifiersCommonModifierParserRuleCall_2_3_1_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_19);
                      	    lv_modifiers_32_0=ruleCommonModifier();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"modifiers",
                      	      								lv_modifiers_32_0,
                      	      								"org.eclipse.xtend.core.Xtend.CommonModifier");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop17;
                          }
                      } while (true);
  
                      otherlv_33=(Token)match(input,34,FOLLOW_3); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_33, grammarAccess.getTypeAccess().getBehaviorKeyword_2_3_2());
                        				
                      }
                      // InternalSARL.g:591:5: ( (lv_name_34_0= ruleValidID ) )
                      // InternalSARL.g:592:6: (lv_name_34_0= ruleValidID )
                      {
                      // InternalSARL.g:592:6: (lv_name_34_0= ruleValidID )
                      // InternalSARL.g:593:7: lv_name_34_0= ruleValidID
                      {
                      if ( state.backtracking==0 ) {
  
                        							newCompositeNode(grammarAccess.getTypeAccess().getNameValidIDParserRuleCall_2_3_3_0());
                        						
                      }
                      pushFollow(FOLLOW_13);
                      lv_name_34_0=ruleValidID();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        							if (current==null) {
                        								current = createModelElementForParent(grammarAccess.getTypeRule());
                        							}
                        							set(
                        								current,
                        								"name",
                        								lv_name_34_0,
                        								"org.eclipse.xtend.core.Xtend.ValidID");
                        							afterParserOrEnumRuleCall();
                        						
                      }
  
                      }
  
  
                      }
  
                      // InternalSARL.g:610:5: (otherlv_35= 'extends' ( (lv_extends_36_0= ruleJvmParameterizedTypeReference ) ) )?
                      int alt18=2;
                      int LA18_0 = input.LA(1);
  
                      if ( (LA18_0==28) ) {
                          alt18=1;
                      }
                      switch (alt18) {
                          case 1 :
                              // InternalSARL.g:611:6: otherlv_35= 'extends' ( (lv_extends_36_0= ruleJvmParameterizedTypeReference ) )
                              {
                              otherlv_35=(Token)match(input,28,FOLLOW_3); if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                						newLeafNode(otherlv_35, grammarAccess.getTypeAccess().getExtendsKeyword_2_3_4_0());
                                					
                              }
                              // InternalSARL.g:615:6: ( (lv_extends_36_0= ruleJvmParameterizedTypeReference ) )
                              // InternalSARL.g:616:7: (lv_extends_36_0= ruleJvmParameterizedTypeReference )
                              {
                              // InternalSARL.g:616:7: (lv_extends_36_0= ruleJvmParameterizedTypeReference )
                              // InternalSARL.g:617:8: lv_extends_36_0= ruleJvmParameterizedTypeReference
                              {
                              if ( state.backtracking==0 ) {
  
                                								newCompositeNode(grammarAccess.getTypeAccess().getExtendsJvmParameterizedTypeReferenceParserRuleCall_2_3_4_1_0());
                                							
                              }
                              pushFollow(FOLLOW_17);
                              lv_extends_36_0=ruleJvmParameterizedTypeReference();
  
                              state._fsp--;
                              if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                								if (current==null) {
                                									current = createModelElementForParent(grammarAccess.getTypeRule());
                                								}
                                								set(
                                									current,
                                									"extends",
                                									lv_extends_36_0,
                                									"org.eclipse.xtext.xbase.Xtype.JvmParameterizedTypeReference");
                                								afterParserOrEnumRuleCall();
                                							
                              }
  
                              }
  
  
                              }
  
  
                              }
                              break;
  
                      }
  
                      otherlv_37=(Token)match(input,29,FOLLOW_18); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_37, grammarAccess.getTypeAccess().getLeftCurlyBracketKeyword_2_3_5());
                        				
                      }
                      // InternalSARL.g:639:5: ( (lv_members_38_0= ruleAOPMember ) )*
                      loop19:
                      do {
                          int alt19=2;
                          int LA19_0 = input.LA(1);
  
                          if ( (LA19_0==25||LA19_0==39||(LA19_0>=42 && LA19_0<=45)||LA19_0==48||LA19_0==54||(LA19_0>=57 && LA19_0<=58)||(LA19_0>=65 && LA19_0<=66)||(LA19_0>=78 && LA19_0<=91)||LA19_0==105) ) {
                              alt19=1;
                          }
  
  
                          switch (alt19) {
                      	case 1 :
                      	    // InternalSARL.g:640:6: (lv_members_38_0= ruleAOPMember )
                      	    {
                      	    // InternalSARL.g:640:6: (lv_members_38_0= ruleAOPMember )
                      	    // InternalSARL.g:641:7: lv_members_38_0= ruleAOPMember
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getTypeAccess().getMembersAOPMemberParserRuleCall_2_3_6_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_18);
                      	    lv_members_38_0=ruleAOPMember();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"members",
                      	      								lv_members_38_0,
                      	      								"io.sarl.lang.SARL.AOPMember");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop19;
                          }
                      } while (true);
  
                      otherlv_39=(Token)match(input,30,FOLLOW_2); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_39, grammarAccess.getTypeAccess().getRightCurlyBracketKeyword_2_3_7());
                        				
                      }
  
                      }
  
  
                      }
                      break;
                  case 5 :
                      // InternalSARL.g:664:4: ( () ( (lv_modifiers_41_0= ruleCommonModifier ) )* otherlv_42= 'skill' ( (lv_name_43_0= ruleValidID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) ) ) otherlv_51= '{' ( (lv_members_52_0= ruleAOPMember ) )* otherlv_53= '}' )
                      {
                      // InternalSARL.g:664:4: ( () ( (lv_modifiers_41_0= ruleCommonModifier ) )* otherlv_42= 'skill' ( (lv_name_43_0= ruleValidID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) ) ) otherlv_51= '{' ( (lv_members_52_0= ruleAOPMember ) )* otherlv_53= '}' )
                      // InternalSARL.g:665:5: () ( (lv_modifiers_41_0= ruleCommonModifier ) )* otherlv_42= 'skill' ( (lv_name_43_0= ruleValidID ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) ) ) otherlv_51= '{' ( (lv_members_52_0= ruleAOPMember ) )* otherlv_53= '}'
                      {
                      // InternalSARL.g:665:5: ()
                      // InternalSARL.g:666:6: 
                      {
                      if ( state.backtracking==0 ) {
  
                        						current = forceCreateModelElementAndSet(
                        							grammarAccess.getTypeAccess().getSarlSkillAnnotationInfoAction_2_4_0(),
                        							current);
                        					
                      }
  
                      }
  
                      // InternalSARL.g:672:5: ( (lv_modifiers_41_0= ruleCommonModifier ) )*
                      loop20:
                      do {
                          int alt20=2;
                          int LA20_0 = input.LA(1);
  
                          if ( (LA20_0==25||(LA20_0>=78 && LA20_0<=89)) ) {
                              alt20=1;
                          }
  
  
                          switch (alt20) {
                      	case 1 :
                      	    // InternalSARL.g:673:6: (lv_modifiers_41_0= ruleCommonModifier )
                      	    {
                      	    // InternalSARL.g:673:6: (lv_modifiers_41_0= ruleCommonModifier )
                      	    // InternalSARL.g:674:7: lv_modifiers_41_0= ruleCommonModifier
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getTypeAccess().getModifiersCommonModifierParserRuleCall_2_4_1_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_20);
                      	    lv_modifiers_41_0=ruleCommonModifier();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"modifiers",
                      	      								lv_modifiers_41_0,
                      	      								"org.eclipse.xtend.core.Xtend.CommonModifier");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop20;
                          }
                      } while (true);
  
                      otherlv_42=(Token)match(input,35,FOLLOW_3); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_42, grammarAccess.getTypeAccess().getSkillKeyword_2_4_2());
                        				
                      }
                      // InternalSARL.g:695:5: ( (lv_name_43_0= ruleValidID ) )
                      // InternalSARL.g:696:6: (lv_name_43_0= ruleValidID )
                      {
                      // InternalSARL.g:696:6: (lv_name_43_0= ruleValidID )
                      // InternalSARL.g:697:7: lv_name_43_0= ruleValidID
                      {
                      if ( state.backtracking==0 ) {
  
                        							newCompositeNode(grammarAccess.getTypeAccess().getNameValidIDParserRuleCall_2_4_3_0());
                        						
                      }
                      pushFollow(FOLLOW_21);
                      lv_name_43_0=ruleValidID();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        							if (current==null) {
                        								current = createModelElementForParent(grammarAccess.getTypeRule());
                        							}
                        							set(
                        								current,
                        								"name",
                        								lv_name_43_0,
                        								"org.eclipse.xtend.core.Xtend.ValidID");
                        							afterParserOrEnumRuleCall();
                        						
                      }
  
                      }
  
  
                      }
  
                      // InternalSARL.g:714:5: ( ( ( ( ({...}? => ( ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) ) )
                      // InternalSARL.g:715:6: ( ( ( ({...}? => ( ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) )
                      {
                      // InternalSARL.g:715:6: ( ( ( ({...}? => ( ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) )
                      // InternalSARL.g:716:7: ( ( ({...}? => ( ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* )
                      {
                      getUnorderedGroupHelper().enter(grammarAccess.getTypeAccess().getUnorderedGroup_2_4_4());
                      // InternalSARL.g:719:7: ( ( ({...}? => ( ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* )
                      // InternalSARL.g:720:8: ( ({...}? => ( ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )*
                      {
                      // InternalSARL.g:720:8: ( ({...}? => ( ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )*
                      loop22:
                      do {
                          int alt22=3;
                          int LA22_0 = input.LA(1);
  
                          if ( LA22_0 == 28 && getUnorderedGroupHelper().canSelect(grammarAccess.getTypeAccess().getUnorderedGroup_2_4_4(), 0) ) {
                              alt22=1;
                          }
                          else if ( LA22_0 == 36 && getUnorderedGroupHelper().canSelect(grammarAccess.getTypeAccess().getUnorderedGroup_2_4_4(), 1) ) {
                              alt22=2;
                          }
  
  
                          switch (alt22) {
                      	case 1 :
                      	    // InternalSARL.g:721:6: ({...}? => ( ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) ) ) )
                      	    {
                      	    // InternalSARL.g:721:6: ({...}? => ( ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) ) ) )
                      	    // InternalSARL.g:722:7: {...}? => ( ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) ) )
                      	    {
                      	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getTypeAccess().getUnorderedGroup_2_4_4(), 0) ) {
                      	        if (state.backtracking>0) {state.failed=true; return current;}
                      	        throw new FailedPredicateException(input, "ruleType", "getUnorderedGroupHelper().canSelect(grammarAccess.getTypeAccess().getUnorderedGroup_2_4_4(), 0)");
                      	    }
                      	    // InternalSARL.g:722:107: ( ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) ) )
                      	    // InternalSARL.g:723:8: ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) )
                      	    {
                      	    getUnorderedGroupHelper().select(grammarAccess.getTypeAccess().getUnorderedGroup_2_4_4(), 0);
                      	    // InternalSARL.g:726:11: ({...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) ) )
                      	    // InternalSARL.g:726:12: {...}? => (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) )
                      	    {
                      	    if ( !((true)) ) {
                      	        if (state.backtracking>0) {state.failed=true; return current;}
                      	        throw new FailedPredicateException(input, "ruleType", "true");
                      	    }
                      	    // InternalSARL.g:726:21: (otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) ) )
                      	    // InternalSARL.g:726:22: otherlv_45= 'extends' ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) )
                      	    {
                      	    otherlv_45=(Token)match(input,28,FOLLOW_3); if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      											newLeafNode(otherlv_45, grammarAccess.getTypeAccess().getExtendsKeyword_2_4_4_0_0());
                      	      										
                      	    }
                      	    // InternalSARL.g:730:11: ( (lv_extends_46_0= ruleJvmParameterizedTypeReference ) )
                      	    // InternalSARL.g:731:12: (lv_extends_46_0= ruleJvmParameterizedTypeReference )
                      	    {
                      	    // InternalSARL.g:731:12: (lv_extends_46_0= ruleJvmParameterizedTypeReference )
                      	    // InternalSARL.g:732:13: lv_extends_46_0= ruleJvmParameterizedTypeReference
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      													newCompositeNode(grammarAccess.getTypeAccess().getExtendsJvmParameterizedTypeReferenceParserRuleCall_2_4_4_0_1_0());
                      	      												
                      	    }
                      	    pushFollow(FOLLOW_21);
                      	    lv_extends_46_0=ruleJvmParameterizedTypeReference();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      													if (current==null) {
                      	      														current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      													}
                      	      													set(
                      	      														current,
                      	      														"extends",
                      	      														lv_extends_46_0,
                      	      														"org.eclipse.xtext.xbase.Xtype.JvmParameterizedTypeReference");
                      	      													afterParserOrEnumRuleCall();
                      	      												
                      	    }
  
                      	    }
  
  
                      	    }
  
  
                      	    }
  
  
                      	    }
  
                      	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getTypeAccess().getUnorderedGroup_2_4_4());
  
                      	    }
  
  
                      	    }
  
  
                      	    }
                      	    break;
                      	case 2 :
                      	    // InternalSARL.g:755:6: ({...}? => ( ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) )
                      	    {
                      	    // InternalSARL.g:755:6: ({...}? => ( ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) )
                      	    // InternalSARL.g:756:7: {...}? => ( ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) ) )
                      	    {
                      	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getTypeAccess().getUnorderedGroup_2_4_4(), 1) ) {
                      	        if (state.backtracking>0) {state.failed=true; return current;}
                      	        throw new FailedPredicateException(input, "ruleType", "getUnorderedGroupHelper().canSelect(grammarAccess.getTypeAccess().getUnorderedGroup_2_4_4(), 1)");
                      	    }
                      	    // InternalSARL.g:756:107: ( ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) ) )
                      	    // InternalSARL.g:757:8: ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) )
                      	    {
                      	    getUnorderedGroupHelper().select(grammarAccess.getTypeAccess().getUnorderedGroup_2_4_4(), 1);
                      	    // InternalSARL.g:760:11: ({...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* ) )
                      	    // InternalSARL.g:760:12: {...}? => (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* )
                      	    {
                      	    if ( !((true)) ) {
                      	        if (state.backtracking>0) {state.failed=true; return current;}
                      	        throw new FailedPredicateException(input, "ruleType", "true");
                      	    }
                      	    // InternalSARL.g:760:21: (otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )* )
                      	    // InternalSARL.g:760:22: otherlv_47= 'implements' ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) ) (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )*
                      	    {
                      	    otherlv_47=(Token)match(input,36,FOLLOW_3); if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      											newLeafNode(otherlv_47, grammarAccess.getTypeAccess().getImplementsKeyword_2_4_4_1_0());
                      	      										
                      	    }
                      	    // InternalSARL.g:764:11: ( (lv_implements_48_0= ruleJvmParameterizedTypeReference ) )
                      	    // InternalSARL.g:765:12: (lv_implements_48_0= ruleJvmParameterizedTypeReference )
                      	    {
                      	    // InternalSARL.g:765:12: (lv_implements_48_0= ruleJvmParameterizedTypeReference )
                      	    // InternalSARL.g:766:13: lv_implements_48_0= ruleJvmParameterizedTypeReference
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      													newCompositeNode(grammarAccess.getTypeAccess().getImplementsJvmParameterizedTypeReferenceParserRuleCall_2_4_4_1_1_0());
                      	      												
                      	    }
                      	    pushFollow(FOLLOW_22);
                      	    lv_implements_48_0=ruleJvmParameterizedTypeReference();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      													if (current==null) {
                      	      														current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      													}
                      	      													add(
                      	      														current,
                      	      														"implements",
                      	      														lv_implements_48_0,
                      	      														"org.eclipse.xtext.xbase.Xtype.JvmParameterizedTypeReference");
                      	      													afterParserOrEnumRuleCall();
                      	      												
                      	    }
  
                      	    }
  
  
                      	    }
  
                      	    // InternalSARL.g:783:11: (otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) ) )*
                      	    loop21:
                      	    do {
                      	        int alt21=2;
                      	        int LA21_0 = input.LA(1);
  
                      	        if ( (LA21_0==32) ) {
                      	            alt21=1;
                      	        }
  
  
                      	        switch (alt21) {
                      	    	case 1 :
                      	    	    // InternalSARL.g:784:12: otherlv_49= ',' ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) )
                      	    	    {
                      	    	    otherlv_49=(Token)match(input,32,FOLLOW_3); if (state.failed) return current;
                      	    	    if ( state.backtracking==0 ) {
  
                      	    	      												newLeafNode(otherlv_49, grammarAccess.getTypeAccess().getCommaKeyword_2_4_4_1_2_0());
                      	    	      											
                      	    	    }
                      	    	    // InternalSARL.g:788:12: ( (lv_implements_50_0= ruleJvmParameterizedTypeReference ) )
                      	    	    // InternalSARL.g:789:13: (lv_implements_50_0= ruleJvmParameterizedTypeReference )
                      	    	    {
                      	    	    // InternalSARL.g:789:13: (lv_implements_50_0= ruleJvmParameterizedTypeReference )
                      	    	    // InternalSARL.g:790:14: lv_implements_50_0= ruleJvmParameterizedTypeReference
                      	    	    {
                      	    	    if ( state.backtracking==0 ) {
  
                      	    	      														newCompositeNode(grammarAccess.getTypeAccess().getImplementsJvmParameterizedTypeReferenceParserRuleCall_2_4_4_1_2_1_0());
                      	    	      													
                      	    	    }
                      	    	    pushFollow(FOLLOW_22);
                      	    	    lv_implements_50_0=ruleJvmParameterizedTypeReference();
  
                      	    	    state._fsp--;
                      	    	    if (state.failed) return current;
                      	    	    if ( state.backtracking==0 ) {
  
                      	    	      														if (current==null) {
                      	    	      															current = createModelElementForParent(grammarAccess.getTypeRule());
                      	    	      														}
                      	    	      														add(
                      	    	      															current,
                      	    	      															"implements",
                      	    	      															lv_implements_50_0,
                      	    	      															"org.eclipse.xtext.xbase.Xtype.JvmParameterizedTypeReference");
                      	    	      														afterParserOrEnumRuleCall();
                      	    	      													
                      	    	    }
  
                      	    	    }
  
  
                      	    	    }
  
  
                      	    	    }
                      	    	    break;
  
                      	    	default :
                      	    	    break loop21;
                      	        }
                      	    } while (true);
  
  
                      	    }
  
  
                      	    }
  
                      	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getTypeAccess().getUnorderedGroup_2_4_4());
  
                      	    }
  
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop22;
                          }
                      } while (true);
  
  
                      }
  
  
                      }
  
                      getUnorderedGroupHelper().leave(grammarAccess.getTypeAccess().getUnorderedGroup_2_4_4());
  
                      }
  
                      otherlv_51=(Token)match(input,29,FOLLOW_18); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_51, grammarAccess.getTypeAccess().getLeftCurlyBracketKeyword_2_4_5());
                        				
                      }
                      // InternalSARL.g:825:5: ( (lv_members_52_0= ruleAOPMember ) )*
                      loop23:
                      do {
                          int alt23=2;
                          int LA23_0 = input.LA(1);
  
                          if ( (LA23_0==25||LA23_0==39||(LA23_0>=42 && LA23_0<=45)||LA23_0==48||LA23_0==54||(LA23_0>=57 && LA23_0<=58)||(LA23_0>=65 && LA23_0<=66)||(LA23_0>=78 && LA23_0<=91)||LA23_0==105) ) {
                              alt23=1;
                          }
  
  
                          switch (alt23) {
                      	case 1 :
                      	    // InternalSARL.g:826:6: (lv_members_52_0= ruleAOPMember )
                      	    {
                      	    // InternalSARL.g:826:6: (lv_members_52_0= ruleAOPMember )
                      	    // InternalSARL.g:827:7: lv_members_52_0= ruleAOPMember
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getTypeAccess().getMembersAOPMemberParserRuleCall_2_4_6_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_18);
                      	    lv_members_52_0=ruleAOPMember();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"members",
                      	      								lv_members_52_0,
                      	      								"io.sarl.lang.SARL.AOPMember");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop23;
                          }
                      } while (true);
  
                      otherlv_53=(Token)match(input,30,FOLLOW_2); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_53, grammarAccess.getTypeAccess().getRightCurlyBracketKeyword_2_4_7());
                        				
                      }
  
                      }
  
  
                      }
                      break;
                  case 6 :
                      // InternalSARL.g:850:4: ( () ( (lv_modifiers_55_0= ruleCommonModifier ) )* otherlv_56= 'space' ( (lv_name_57_0= ruleValidID ) ) otherlv_58= '{' otherlv_59= '}' )
                      {
                      // InternalSARL.g:850:4: ( () ( (lv_modifiers_55_0= ruleCommonModifier ) )* otherlv_56= 'space' ( (lv_name_57_0= ruleValidID ) ) otherlv_58= '{' otherlv_59= '}' )
                      // InternalSARL.g:851:5: () ( (lv_modifiers_55_0= ruleCommonModifier ) )* otherlv_56= 'space' ( (lv_name_57_0= ruleValidID ) ) otherlv_58= '{' otherlv_59= '}'
                      {
                      // InternalSARL.g:851:5: ()
                      // InternalSARL.g:852:6: 
                      {
                      if ( state.backtracking==0 ) {
  
                        						current = forceCreateModelElementAndSet(
                        							grammarAccess.getTypeAccess().getSarlSpaceAnnotationInfoAction_2_5_0(),
                        							current);
                        					
                      }
  
                      }
  
                      // InternalSARL.g:858:5: ( (lv_modifiers_55_0= ruleCommonModifier ) )*
                      loop24:
                      do {
                          int alt24=2;
                          int LA24_0 = input.LA(1);
  
                          if ( (LA24_0==25||(LA24_0>=78 && LA24_0<=89)) ) {
                              alt24=1;
                          }
  
  
                          switch (alt24) {
                      	case 1 :
                      	    // InternalSARL.g:859:6: (lv_modifiers_55_0= ruleCommonModifier )
                      	    {
                      	    // InternalSARL.g:859:6: (lv_modifiers_55_0= ruleCommonModifier )
                      	    // InternalSARL.g:860:7: lv_modifiers_55_0= ruleCommonModifier
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getTypeAccess().getModifiersCommonModifierParserRuleCall_2_5_1_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_23);
                      	    lv_modifiers_55_0=ruleCommonModifier();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"modifiers",
                      	      								lv_modifiers_55_0,
                      	      								"org.eclipse.xtend.core.Xtend.CommonModifier");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop24;
                          }
                      } while (true);
  
                      otherlv_56=(Token)match(input,37,FOLLOW_3); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_56, grammarAccess.getTypeAccess().getSpaceKeyword_2_5_2());
                        				
                      }
                      // InternalSARL.g:881:5: ( (lv_name_57_0= ruleValidID ) )
                      // InternalSARL.g:882:6: (lv_name_57_0= ruleValidID )
                      {
                      // InternalSARL.g:882:6: (lv_name_57_0= ruleValidID )
                      // InternalSARL.g:883:7: lv_name_57_0= ruleValidID
                      {
                      if ( state.backtracking==0 ) {
  
                        							newCompositeNode(grammarAccess.getTypeAccess().getNameValidIDParserRuleCall_2_5_3_0());
                        						
                      }
                      pushFollow(FOLLOW_17);
                      lv_name_57_0=ruleValidID();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        							if (current==null) {
                        								current = createModelElementForParent(grammarAccess.getTypeRule());
                        							}
                        							set(
                        								current,
                        								"name",
                        								lv_name_57_0,
                        								"org.eclipse.xtend.core.Xtend.ValidID");
                        							afterParserOrEnumRuleCall();
                        						
                      }
  
                      }
  
  
                      }
  
                      otherlv_58=(Token)match(input,29,FOLLOW_24); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_58, grammarAccess.getTypeAccess().getLeftCurlyBracketKeyword_2_5_4());
                        				
                      }
                      otherlv_59=(Token)match(input,30,FOLLOW_2); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_59, grammarAccess.getTypeAccess().getRightCurlyBracketKeyword_2_5_5());
                        				
                      }
  
                      }
  
  
                      }
                      break;
                  case 7 :
                      // InternalSARL.g:910:4: ( () ( (lv_modifiers_61_0= ruleCommonModifier ) )* otherlv_62= 'artifact' ( (lv_name_63_0= ruleValidID ) ) otherlv_64= '{' otherlv_65= '}' )
                      {
                      // InternalSARL.g:910:4: ( () ( (lv_modifiers_61_0= ruleCommonModifier ) )* otherlv_62= 'artifact' ( (lv_name_63_0= ruleValidID ) ) otherlv_64= '{' otherlv_65= '}' )
                      // InternalSARL.g:911:5: () ( (lv_modifiers_61_0= ruleCommonModifier ) )* otherlv_62= 'artifact' ( (lv_name_63_0= ruleValidID ) ) otherlv_64= '{' otherlv_65= '}'
                      {
                      // InternalSARL.g:911:5: ()
                      // InternalSARL.g:912:6: 
                      {
                      if ( state.backtracking==0 ) {
  
                        						current = forceCreateModelElementAndSet(
                        							grammarAccess.getTypeAccess().getSarlArtifactAnnotationInfoAction_2_6_0(),
                        							current);
                        					
                      }
  
                      }
  
                      // InternalSARL.g:918:5: ( (lv_modifiers_61_0= ruleCommonModifier ) )*
                      loop25:
                      do {
                          int alt25=2;
                          int LA25_0 = input.LA(1);
  
                          if ( (LA25_0==25||(LA25_0>=78 && LA25_0<=89)) ) {
                              alt25=1;
                          }
  
  
                          switch (alt25) {
                      	case 1 :
                      	    // InternalSARL.g:919:6: (lv_modifiers_61_0= ruleCommonModifier )
                      	    {
                      	    // InternalSARL.g:919:6: (lv_modifiers_61_0= ruleCommonModifier )
                      	    // InternalSARL.g:920:7: lv_modifiers_61_0= ruleCommonModifier
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getTypeAccess().getModifiersCommonModifierParserRuleCall_2_6_1_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_25);
                      	    lv_modifiers_61_0=ruleCommonModifier();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"modifiers",
                      	      								lv_modifiers_61_0,
                      	      								"org.eclipse.xtend.core.Xtend.CommonModifier");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop25;
                          }
                      } while (true);
  
                      otherlv_62=(Token)match(input,38,FOLLOW_3); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_62, grammarAccess.getTypeAccess().getArtifactKeyword_2_6_2());
                        				
                      }
                      // InternalSARL.g:941:5: ( (lv_name_63_0= ruleValidID ) )
                      // InternalSARL.g:942:6: (lv_name_63_0= ruleValidID )
                      {
                      // InternalSARL.g:942:6: (lv_name_63_0= ruleValidID )
                      // InternalSARL.g:943:7: lv_name_63_0= ruleValidID
                      {
                      if ( state.backtracking==0 ) {
  
                        							newCompositeNode(grammarAccess.getTypeAccess().getNameValidIDParserRuleCall_2_6_3_0());
                        						
                      }
                      pushFollow(FOLLOW_17);
                      lv_name_63_0=ruleValidID();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        							if (current==null) {
                        								current = createModelElementForParent(grammarAccess.getTypeRule());
                        							}
                        							set(
                        								current,
                        								"name",
                        								lv_name_63_0,
                        								"org.eclipse.xtend.core.Xtend.ValidID");
                        							afterParserOrEnumRuleCall();
                        						
                      }
  
                      }
  
  
                      }
  
                      otherlv_64=(Token)match(input,29,FOLLOW_24); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_64, grammarAccess.getTypeAccess().getLeftCurlyBracketKeyword_2_6_4());
                        				
                      }
                      otherlv_65=(Token)match(input,30,FOLLOW_2); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_65, grammarAccess.getTypeAccess().getRightCurlyBracketKeyword_2_6_5());
                        				
                      }
  
                      }
  
  
                      }
                      break;
                  case 8 :
                      // InternalSARL.g:970:4: ( () ( (lv_modifiers_67_0= ruleCommonModifier ) )* otherlv_68= 'class' ( (lv_name_69_0= ruleValidID ) ) (otherlv_70= '<' ( (lv_typeParameters_71_0= ruleJvmTypeParameter ) ) (otherlv_72= ',' ( (lv_typeParameters_73_0= ruleJvmTypeParameter ) ) )* otherlv_74= '>' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) ) ) otherlv_82= '{' ( (lv_members_83_0= ruleMember ) )* otherlv_84= '}' )
                      {
                      // InternalSARL.g:970:4: ( () ( (lv_modifiers_67_0= ruleCommonModifier ) )* otherlv_68= 'class' ( (lv_name_69_0= ruleValidID ) ) (otherlv_70= '<' ( (lv_typeParameters_71_0= ruleJvmTypeParameter ) ) (otherlv_72= ',' ( (lv_typeParameters_73_0= ruleJvmTypeParameter ) ) )* otherlv_74= '>' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) ) ) otherlv_82= '{' ( (lv_members_83_0= ruleMember ) )* otherlv_84= '}' )
                      // InternalSARL.g:971:5: () ( (lv_modifiers_67_0= ruleCommonModifier ) )* otherlv_68= 'class' ( (lv_name_69_0= ruleValidID ) ) (otherlv_70= '<' ( (lv_typeParameters_71_0= ruleJvmTypeParameter ) ) (otherlv_72= ',' ( (lv_typeParameters_73_0= ruleJvmTypeParameter ) ) )* otherlv_74= '>' )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) ) ) otherlv_82= '{' ( (lv_members_83_0= ruleMember ) )* otherlv_84= '}'
                      {
                      // InternalSARL.g:971:5: ()
                      // InternalSARL.g:972:6: 
                      {
                      if ( state.backtracking==0 ) {
  
                        						current = forceCreateModelElementAndSet(
                        							grammarAccess.getTypeAccess().getSarlClassAnnotationInfoAction_2_7_0(),
                        							current);
                        					
                      }
  
                      }
  
                      // InternalSARL.g:978:5: ( (lv_modifiers_67_0= ruleCommonModifier ) )*
                      loop26:
                      do {
                          int alt26=2;
                          int LA26_0 = input.LA(1);
  
                          if ( (LA26_0==25||(LA26_0>=78 && LA26_0<=89)) ) {
                              alt26=1;
                          }
  
  
                          switch (alt26) {
                      	case 1 :
                      	    // InternalSARL.g:979:6: (lv_modifiers_67_0= ruleCommonModifier )
                      	    {
                      	    // InternalSARL.g:979:6: (lv_modifiers_67_0= ruleCommonModifier )
                      	    // InternalSARL.g:980:7: lv_modifiers_67_0= ruleCommonModifier
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getTypeAccess().getModifiersCommonModifierParserRuleCall_2_7_1_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_26);
                      	    lv_modifiers_67_0=ruleCommonModifier();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"modifiers",
                      	      								lv_modifiers_67_0,
                      	      								"org.eclipse.xtend.core.Xtend.CommonModifier");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop26;
                          }
                      } while (true);
  
                      otherlv_68=(Token)match(input,39,FOLLOW_3); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_68, grammarAccess.getTypeAccess().getClassKeyword_2_7_2());
                        				
                      }
                      // InternalSARL.g:1001:5: ( (lv_name_69_0= ruleValidID ) )
                      // InternalSARL.g:1002:6: (lv_name_69_0= ruleValidID )
                      {
                      // InternalSARL.g:1002:6: (lv_name_69_0= ruleValidID )
                      // InternalSARL.g:1003:7: lv_name_69_0= ruleValidID
                      {
                      if ( state.backtracking==0 ) {
  
                        							newCompositeNode(grammarAccess.getTypeAccess().getNameValidIDParserRuleCall_2_7_3_0());
                        						
                      }
                      pushFollow(FOLLOW_27);
                      lv_name_69_0=ruleValidID();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        							if (current==null) {
                        								current = createModelElementForParent(grammarAccess.getTypeRule());
                        							}
                        							set(
                        								current,
                        								"name",
                        								lv_name_69_0,
                        								"org.eclipse.xtend.core.Xtend.ValidID");
                        							afterParserOrEnumRuleCall();
                        						
                      }
  
                      }
  
  
                      }
  
                      // InternalSARL.g:1020:5: (otherlv_70= '<' ( (lv_typeParameters_71_0= ruleJvmTypeParameter ) ) (otherlv_72= ',' ( (lv_typeParameters_73_0= ruleJvmTypeParameter ) ) )* otherlv_74= '>' )?
                      int alt28=2;
                      int LA28_0 = input.LA(1);
  
                      if ( (LA28_0==40) ) {
                          alt28=1;
                      }
                      switch (alt28) {
                          case 1 :
                              // InternalSARL.g:1021:6: otherlv_70= '<' ( (lv_typeParameters_71_0= ruleJvmTypeParameter ) ) (otherlv_72= ',' ( (lv_typeParameters_73_0= ruleJvmTypeParameter ) ) )* otherlv_74= '>'
                              {
                              otherlv_70=(Token)match(input,40,FOLLOW_3); if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                						newLeafNode(otherlv_70, grammarAccess.getTypeAccess().getLessThanSignKeyword_2_7_4_0());
                                					
                              }
                              // InternalSARL.g:1025:6: ( (lv_typeParameters_71_0= ruleJvmTypeParameter ) )
                              // InternalSARL.g:1026:7: (lv_typeParameters_71_0= ruleJvmTypeParameter )
                              {
                              // InternalSARL.g:1026:7: (lv_typeParameters_71_0= ruleJvmTypeParameter )
                              // InternalSARL.g:1027:8: lv_typeParameters_71_0= ruleJvmTypeParameter
                              {
                              if ( state.backtracking==0 ) {
  
                                								newCompositeNode(grammarAccess.getTypeAccess().getTypeParametersJvmTypeParameterParserRuleCall_2_7_4_1_0());
                                							
                              }
                              pushFollow(FOLLOW_28);
                              lv_typeParameters_71_0=ruleJvmTypeParameter();
  
                              state._fsp--;
                              if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                								if (current==null) {
                                									current = createModelElementForParent(grammarAccess.getTypeRule());
                                								}
                                								add(
                                									current,
                                									"typeParameters",
                                									lv_typeParameters_71_0,
                                									"org.eclipse.xtext.xbase.Xtype.JvmTypeParameter");
                                								afterParserOrEnumRuleCall();
                                							
                              }
  
                              }
  
  
                              }
  
                              // InternalSARL.g:1044:6: (otherlv_72= ',' ( (lv_typeParameters_73_0= ruleJvmTypeParameter ) ) )*
                              loop27:
                              do {
                                  int alt27=2;
                                  int LA27_0 = input.LA(1);
  
                                  if ( (LA27_0==32) ) {
                                      alt27=1;
                                  }
  
  
                                  switch (alt27) {
                              	case 1 :
                              	    // InternalSARL.g:1045:7: otherlv_72= ',' ( (lv_typeParameters_73_0= ruleJvmTypeParameter ) )
                              	    {
                              	    otherlv_72=(Token)match(input,32,FOLLOW_3); if (state.failed) return current;
                              	    if ( state.backtracking==0 ) {
  
                              	      							newLeafNode(otherlv_72, grammarAccess.getTypeAccess().getCommaKeyword_2_7_4_2_0());
                              	      						
                              	    }
                              	    // InternalSARL.g:1049:7: ( (lv_typeParameters_73_0= ruleJvmTypeParameter ) )
                              	    // InternalSARL.g:1050:8: (lv_typeParameters_73_0= ruleJvmTypeParameter )
                              	    {
                              	    // InternalSARL.g:1050:8: (lv_typeParameters_73_0= ruleJvmTypeParameter )
                              	    // InternalSARL.g:1051:9: lv_typeParameters_73_0= ruleJvmTypeParameter
                              	    {
                              	    if ( state.backtracking==0 ) {
  
                              	      									newCompositeNode(grammarAccess.getTypeAccess().getTypeParametersJvmTypeParameterParserRuleCall_2_7_4_2_1_0());
                              	      								
                              	    }
                              	    pushFollow(FOLLOW_28);
                              	    lv_typeParameters_73_0=ruleJvmTypeParameter();
  
                              	    state._fsp--;
                              	    if (state.failed) return current;
                              	    if ( state.backtracking==0 ) {
  
                              	      									if (current==null) {
                              	      										current = createModelElementForParent(grammarAccess.getTypeRule());
                              	      									}
                              	      									add(
                              	      										current,
                              	      										"typeParameters",
                              	      										lv_typeParameters_73_0,
                              	      										"org.eclipse.xtext.xbase.Xtype.JvmTypeParameter");
                              	      									afterParserOrEnumRuleCall();
                              	      								
                              	    }
  
                              	    }
  
  
                              	    }
  
  
                              	    }
                              	    break;
  
                              	default :
                              	    break loop27;
                                  }
                              } while (true);
  
                              otherlv_74=(Token)match(input,41,FOLLOW_21); if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                						newLeafNode(otherlv_74, grammarAccess.getTypeAccess().getGreaterThanSignKeyword_2_7_4_3());
                                					
                              }
  
                              }
                              break;
  
                      }
  
                      // InternalSARL.g:1074:5: ( ( ( ( ({...}? => ( ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) ) )
                      // InternalSARL.g:1075:6: ( ( ( ({...}? => ( ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) )
                      {
                      // InternalSARL.g:1075:6: ( ( ( ({...}? => ( ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* ) )
                      // InternalSARL.g:1076:7: ( ( ({...}? => ( ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* )
                      {
                      getUnorderedGroupHelper().enter(grammarAccess.getTypeAccess().getUnorderedGroup_2_7_5());
                      // InternalSARL.g:1079:7: ( ( ({...}? => ( ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )* )
                      // InternalSARL.g:1080:8: ( ({...}? => ( ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )*
                      {
                      // InternalSARL.g:1080:8: ( ({...}? => ( ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) ) )*
                      loop30:
                      do {
                          int alt30=3;
                          int LA30_0 = input.LA(1);
  
                          if ( LA30_0 == 28 && getUnorderedGroupHelper().canSelect(grammarAccess.getTypeAccess().getUnorderedGroup_2_7_5(), 0) ) {
                              alt30=1;
                          }
                          else if ( LA30_0 == 36 && getUnorderedGroupHelper().canSelect(grammarAccess.getTypeAccess().getUnorderedGroup_2_7_5(), 1) ) {
                              alt30=2;
                          }
  
  
                          switch (alt30) {
                      	case 1 :
                      	    // InternalSARL.g:1081:6: ({...}? => ( ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) ) ) )
                      	    {
                      	    // InternalSARL.g:1081:6: ({...}? => ( ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) ) ) )
                      	    // InternalSARL.g:1082:7: {...}? => ( ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) ) )
                      	    {
                      	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getTypeAccess().getUnorderedGroup_2_7_5(), 0) ) {
                      	        if (state.backtracking>0) {state.failed=true; return current;}
                      	        throw new FailedPredicateException(input, "ruleType", "getUnorderedGroupHelper().canSelect(grammarAccess.getTypeAccess().getUnorderedGroup_2_7_5(), 0)");
                      	    }
                      	    // InternalSARL.g:1082:107: ( ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) ) )
                      	    // InternalSARL.g:1083:8: ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) )
                      	    {
                      	    getUnorderedGroupHelper().select(grammarAccess.getTypeAccess().getUnorderedGroup_2_7_5(), 0);
                      	    // InternalSARL.g:1086:11: ({...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) ) )
                      	    // InternalSARL.g:1086:12: {...}? => (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) )
                      	    {
                      	    if ( !((true)) ) {
                      	        if (state.backtracking>0) {state.failed=true; return current;}
                      	        throw new FailedPredicateException(input, "ruleType", "true");
                      	    }
                      	    // InternalSARL.g:1086:21: (otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) ) )
                      	    // InternalSARL.g:1086:22: otherlv_76= 'extends' ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) )
                      	    {
                      	    otherlv_76=(Token)match(input,28,FOLLOW_3); if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      											newLeafNode(otherlv_76, grammarAccess.getTypeAccess().getExtendsKeyword_2_7_5_0_0());
                      	      										
                      	    }
                      	    // InternalSARL.g:1090:11: ( (lv_extends_77_0= ruleJvmParameterizedTypeReference ) )
                      	    // InternalSARL.g:1091:12: (lv_extends_77_0= ruleJvmParameterizedTypeReference )
                      	    {
                      	    // InternalSARL.g:1091:12: (lv_extends_77_0= ruleJvmParameterizedTypeReference )
                      	    // InternalSARL.g:1092:13: lv_extends_77_0= ruleJvmParameterizedTypeReference
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      													newCompositeNode(grammarAccess.getTypeAccess().getExtendsJvmParameterizedTypeReferenceParserRuleCall_2_7_5_0_1_0());
                      	      												
                      	    }
                      	    pushFollow(FOLLOW_21);
                      	    lv_extends_77_0=ruleJvmParameterizedTypeReference();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      													if (current==null) {
                      	      														current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      													}
                      	      													set(
                      	      														current,
                      	      														"extends",
                      	      														lv_extends_77_0,
                      	      														"org.eclipse.xtext.xbase.Xtype.JvmParameterizedTypeReference");
                      	      													afterParserOrEnumRuleCall();
                      	      												
                      	    }
  
                      	    }
  
  
                      	    }
  
  
                      	    }
  
  
                      	    }
  
                      	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getTypeAccess().getUnorderedGroup_2_7_5());
  
                      	    }
  
  
                      	    }
  
  
                      	    }
                      	    break;
                      	case 2 :
                      	    // InternalSARL.g:1115:6: ({...}? => ( ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) )
                      	    {
                      	    // InternalSARL.g:1115:6: ({...}? => ( ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) ) ) )
                      	    // InternalSARL.g:1116:7: {...}? => ( ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) ) )
                      	    {
                      	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getTypeAccess().getUnorderedGroup_2_7_5(), 1) ) {
                      	        if (state.backtracking>0) {state.failed=true; return current;}
                      	        throw new FailedPredicateException(input, "ruleType", "getUnorderedGroupHelper().canSelect(grammarAccess.getTypeAccess().getUnorderedGroup_2_7_5(), 1)");
                      	    }
                      	    // InternalSARL.g:1116:107: ( ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) ) )
                      	    // InternalSARL.g:1117:8: ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) )
                      	    {
                      	    getUnorderedGroupHelper().select(grammarAccess.getTypeAccess().getUnorderedGroup_2_7_5(), 1);
                      	    // InternalSARL.g:1120:11: ({...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* ) )
                      	    // InternalSARL.g:1120:12: {...}? => (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* )
                      	    {
                      	    if ( !((true)) ) {
                      	        if (state.backtracking>0) {state.failed=true; return current;}
                      	        throw new FailedPredicateException(input, "ruleType", "true");
                      	    }
                      	    // InternalSARL.g:1120:21: (otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )* )
                      	    // InternalSARL.g:1120:22: otherlv_78= 'implements' ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) ) (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )*
                      	    {
                      	    otherlv_78=(Token)match(input,36,FOLLOW_3); if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      											newLeafNode(otherlv_78, grammarAccess.getTypeAccess().getImplementsKeyword_2_7_5_1_0());
                      	      										
                      	    }
                      	    // InternalSARL.g:1124:11: ( (lv_implements_79_0= ruleJvmParameterizedTypeReference ) )
                      	    // InternalSARL.g:1125:12: (lv_implements_79_0= ruleJvmParameterizedTypeReference )
                      	    {
                      	    // InternalSARL.g:1125:12: (lv_implements_79_0= ruleJvmParameterizedTypeReference )
                      	    // InternalSARL.g:1126:13: lv_implements_79_0= ruleJvmParameterizedTypeReference
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      													newCompositeNode(grammarAccess.getTypeAccess().getImplementsJvmParameterizedTypeReferenceParserRuleCall_2_7_5_1_1_0());
                      	      												
                      	    }
                      	    pushFollow(FOLLOW_22);
                      	    lv_implements_79_0=ruleJvmParameterizedTypeReference();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      													if (current==null) {
                      	      														current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      													}
                      	      													add(
                      	      														current,
                      	      														"implements",
                      	      														lv_implements_79_0,
                      	      														"org.eclipse.xtext.xbase.Xtype.JvmParameterizedTypeReference");
                      	      													afterParserOrEnumRuleCall();
                      	      												
                      	    }
  
                      	    }
  
  
                      	    }
  
                      	    // InternalSARL.g:1143:11: (otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) ) )*
                      	    loop29:
                      	    do {
                      	        int alt29=2;
                      	        int LA29_0 = input.LA(1);
  
                      	        if ( (LA29_0==32) ) {
                      	            alt29=1;
                      	        }
  
  
                      	        switch (alt29) {
                      	    	case 1 :
                      	    	    // InternalSARL.g:1144:12: otherlv_80= ',' ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) )
                      	    	    {
                      	    	    otherlv_80=(Token)match(input,32,FOLLOW_3); if (state.failed) return current;
                      	    	    if ( state.backtracking==0 ) {
  
                      	    	      												newLeafNode(otherlv_80, grammarAccess.getTypeAccess().getCommaKeyword_2_7_5_1_2_0());
                      	    	      											
                      	    	    }
                      	    	    // InternalSARL.g:1148:12: ( (lv_implements_81_0= ruleJvmParameterizedTypeReference ) )
                      	    	    // InternalSARL.g:1149:13: (lv_implements_81_0= ruleJvmParameterizedTypeReference )
                      	    	    {
                      	    	    // InternalSARL.g:1149:13: (lv_implements_81_0= ruleJvmParameterizedTypeReference )
                      	    	    // InternalSARL.g:1150:14: lv_implements_81_0= ruleJvmParameterizedTypeReference
                      	    	    {
                      	    	    if ( state.backtracking==0 ) {
  
                      	    	      														newCompositeNode(grammarAccess.getTypeAccess().getImplementsJvmParameterizedTypeReferenceParserRuleCall_2_7_5_1_2_1_0());
                      	    	      													
                      	    	    }
                      	    	    pushFollow(FOLLOW_22);
                      	    	    lv_implements_81_0=ruleJvmParameterizedTypeReference();
  
                      	    	    state._fsp--;
                      	    	    if (state.failed) return current;
                      	    	    if ( state.backtracking==0 ) {
  
                      	    	      														if (current==null) {
                      	    	      															current = createModelElementForParent(grammarAccess.getTypeRule());
                      	    	      														}
                      	    	      														add(
                      	    	      															current,
                      	    	      															"implements",
                      	    	      															lv_implements_81_0,
                      	    	      															"org.eclipse.xtext.xbase.Xtype.JvmParameterizedTypeReference");
                      	    	      														afterParserOrEnumRuleCall();
                      	    	      													
                      	    	    }
  
                      	    	    }
  
  
                      	    	    }
  
  
                      	    	    }
                      	    	    break;
  
                      	    	default :
                      	    	    break loop29;
                      	        }
                      	    } while (true);
  
  
                      	    }
  
  
                      	    }
  
                      	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getTypeAccess().getUnorderedGroup_2_7_5());
  
                      	    }
  
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop30;
                          }
                      } while (true);
  
  
                      }
  
  
                      }
  
                      getUnorderedGroupHelper().leave(grammarAccess.getTypeAccess().getUnorderedGroup_2_7_5());
  
                      }
  
                      otherlv_82=(Token)match(input,29,FOLLOW_29); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_82, grammarAccess.getTypeAccess().getLeftCurlyBracketKeyword_2_7_6());
                        				
                      }
                      // InternalSARL.g:1185:5: ( (lv_members_83_0= ruleMember ) )*
                      loop31:
                      do {
                          int alt31=2;
                          int LA31_0 = input.LA(1);
  
                          if ( (LA31_0==25||LA31_0==39||(LA31_0>=42 && LA31_0<=45)||LA31_0==48||(LA31_0>=65 && LA31_0<=66)||(LA31_0>=78 && LA31_0<=91)||LA31_0==105) ) {
                              alt31=1;
                          }
  
  
                          switch (alt31) {
                      	case 1 :
                      	    // InternalSARL.g:1186:6: (lv_members_83_0= ruleMember )
                      	    {
                      	    // InternalSARL.g:1186:6: (lv_members_83_0= ruleMember )
                      	    // InternalSARL.g:1187:7: lv_members_83_0= ruleMember
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getTypeAccess().getMembersMemberParserRuleCall_2_7_7_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_29);
                      	    lv_members_83_0=ruleMember();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"members",
                      	      								lv_members_83_0,
                      	      								"io.sarl.lang.SARL.Member");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop31;
                          }
                      } while (true);
  
                      otherlv_84=(Token)match(input,30,FOLLOW_2); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_84, grammarAccess.getTypeAccess().getRightCurlyBracketKeyword_2_7_8());
                        				
                      }
  
                      }
  
  
                      }
                      break;
                  case 9 :
                      // InternalSARL.g:1210:4: ( () ( (lv_modifiers_86_0= ruleCommonModifier ) )* otherlv_87= 'interface' ( (lv_name_88_0= ruleValidID ) ) (otherlv_89= '<' ( (lv_typeParameters_90_0= ruleJvmTypeParameter ) ) (otherlv_91= ',' ( (lv_typeParameters_92_0= ruleJvmTypeParameter ) ) )* otherlv_93= '>' )? (otherlv_94= 'extends' ( (lv_extends_95_0= ruleJvmParameterizedTypeReference ) ) (otherlv_96= ',' ( (lv_extends_97_0= ruleJvmParameterizedTypeReference ) ) )* )? otherlv_98= '{' ( (lv_members_99_0= ruleMember ) )* otherlv_100= '}' )
                      {
                      // InternalSARL.g:1210:4: ( () ( (lv_modifiers_86_0= ruleCommonModifier ) )* otherlv_87= 'interface' ( (lv_name_88_0= ruleValidID ) ) (otherlv_89= '<' ( (lv_typeParameters_90_0= ruleJvmTypeParameter ) ) (otherlv_91= ',' ( (lv_typeParameters_92_0= ruleJvmTypeParameter ) ) )* otherlv_93= '>' )? (otherlv_94= 'extends' ( (lv_extends_95_0= ruleJvmParameterizedTypeReference ) ) (otherlv_96= ',' ( (lv_extends_97_0= ruleJvmParameterizedTypeReference ) ) )* )? otherlv_98= '{' ( (lv_members_99_0= ruleMember ) )* otherlv_100= '}' )
                      // InternalSARL.g:1211:5: () ( (lv_modifiers_86_0= ruleCommonModifier ) )* otherlv_87= 'interface' ( (lv_name_88_0= ruleValidID ) ) (otherlv_89= '<' ( (lv_typeParameters_90_0= ruleJvmTypeParameter ) ) (otherlv_91= ',' ( (lv_typeParameters_92_0= ruleJvmTypeParameter ) ) )* otherlv_93= '>' )? (otherlv_94= 'extends' ( (lv_extends_95_0= ruleJvmParameterizedTypeReference ) ) (otherlv_96= ',' ( (lv_extends_97_0= ruleJvmParameterizedTypeReference ) ) )* )? otherlv_98= '{' ( (lv_members_99_0= ruleMember ) )* otherlv_100= '}'
                      {
                      // InternalSARL.g:1211:5: ()
                      // InternalSARL.g:1212:6: 
                      {
                      if ( state.backtracking==0 ) {
  
                        						current = forceCreateModelElementAndSet(
                        							grammarAccess.getTypeAccess().getSarlInterfaceAnnotationInfoAction_2_8_0(),
                        							current);
                        					
                      }
  
                      }
  
                      // InternalSARL.g:1218:5: ( (lv_modifiers_86_0= ruleCommonModifier ) )*
                      loop32:
                      do {
                          int alt32=2;
                          int LA32_0 = input.LA(1);
  
                          if ( (LA32_0==25||(LA32_0>=78 && LA32_0<=89)) ) {
                              alt32=1;
                          }
  
  
                          switch (alt32) {
                      	case 1 :
                      	    // InternalSARL.g:1219:6: (lv_modifiers_86_0= ruleCommonModifier )
                      	    {
                      	    // InternalSARL.g:1219:6: (lv_modifiers_86_0= ruleCommonModifier )
                      	    // InternalSARL.g:1220:7: lv_modifiers_86_0= ruleCommonModifier
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getTypeAccess().getModifiersCommonModifierParserRuleCall_2_8_1_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_30);
                      	    lv_modifiers_86_0=ruleCommonModifier();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"modifiers",
                      	      								lv_modifiers_86_0,
                      	      								"org.eclipse.xtend.core.Xtend.CommonModifier");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop32;
                          }
                      } while (true);
  
                      otherlv_87=(Token)match(input,42,FOLLOW_3); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_87, grammarAccess.getTypeAccess().getInterfaceKeyword_2_8_2());
                        				
                      }
                      // InternalSARL.g:1241:5: ( (lv_name_88_0= ruleValidID ) )
                      // InternalSARL.g:1242:6: (lv_name_88_0= ruleValidID )
                      {
                      // InternalSARL.g:1242:6: (lv_name_88_0= ruleValidID )
                      // InternalSARL.g:1243:7: lv_name_88_0= ruleValidID
                      {
                      if ( state.backtracking==0 ) {
  
                        							newCompositeNode(grammarAccess.getTypeAccess().getNameValidIDParserRuleCall_2_8_3_0());
                        						
                      }
                      pushFollow(FOLLOW_31);
                      lv_name_88_0=ruleValidID();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        							if (current==null) {
                        								current = createModelElementForParent(grammarAccess.getTypeRule());
                        							}
                        							set(
                        								current,
                        								"name",
                        								lv_name_88_0,
                        								"org.eclipse.xtend.core.Xtend.ValidID");
                        							afterParserOrEnumRuleCall();
                        						
                      }
  
                      }
  
  
                      }
  
                      // InternalSARL.g:1260:5: (otherlv_89= '<' ( (lv_typeParameters_90_0= ruleJvmTypeParameter ) ) (otherlv_91= ',' ( (lv_typeParameters_92_0= ruleJvmTypeParameter ) ) )* otherlv_93= '>' )?
                      int alt34=2;
                      int LA34_0 = input.LA(1);
  
                      if ( (LA34_0==40) ) {
                          alt34=1;
                      }
                      switch (alt34) {
                          case 1 :
                              // InternalSARL.g:1261:6: otherlv_89= '<' ( (lv_typeParameters_90_0= ruleJvmTypeParameter ) ) (otherlv_91= ',' ( (lv_typeParameters_92_0= ruleJvmTypeParameter ) ) )* otherlv_93= '>'
                              {
                              otherlv_89=(Token)match(input,40,FOLLOW_3); if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                						newLeafNode(otherlv_89, grammarAccess.getTypeAccess().getLessThanSignKeyword_2_8_4_0());
                                					
                              }
                              // InternalSARL.g:1265:6: ( (lv_typeParameters_90_0= ruleJvmTypeParameter ) )
                              // InternalSARL.g:1266:7: (lv_typeParameters_90_0= ruleJvmTypeParameter )
                              {
                              // InternalSARL.g:1266:7: (lv_typeParameters_90_0= ruleJvmTypeParameter )
                              // InternalSARL.g:1267:8: lv_typeParameters_90_0= ruleJvmTypeParameter
                              {
                              if ( state.backtracking==0 ) {
  
                                								newCompositeNode(grammarAccess.getTypeAccess().getTypeParametersJvmTypeParameterParserRuleCall_2_8_4_1_0());
                                							
                              }
                              pushFollow(FOLLOW_28);
                              lv_typeParameters_90_0=ruleJvmTypeParameter();
  
                              state._fsp--;
                              if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                								if (current==null) {
                                									current = createModelElementForParent(grammarAccess.getTypeRule());
                                								}
                                								add(
                                									current,
                                									"typeParameters",
                                									lv_typeParameters_90_0,
                                									"org.eclipse.xtext.xbase.Xtype.JvmTypeParameter");
                                								afterParserOrEnumRuleCall();
                                							
                              }
  
                              }
  
  
                              }
  
                              // InternalSARL.g:1284:6: (otherlv_91= ',' ( (lv_typeParameters_92_0= ruleJvmTypeParameter ) ) )*
                              loop33:
                              do {
                                  int alt33=2;
                                  int LA33_0 = input.LA(1);
  
                                  if ( (LA33_0==32) ) {
                                      alt33=1;
                                  }
  
  
                                  switch (alt33) {
                              	case 1 :
                              	    // InternalSARL.g:1285:7: otherlv_91= ',' ( (lv_typeParameters_92_0= ruleJvmTypeParameter ) )
                              	    {
                              	    otherlv_91=(Token)match(input,32,FOLLOW_3); if (state.failed) return current;
                              	    if ( state.backtracking==0 ) {
  
                              	      							newLeafNode(otherlv_91, grammarAccess.getTypeAccess().getCommaKeyword_2_8_4_2_0());
                              	      						
                              	    }
                              	    // InternalSARL.g:1289:7: ( (lv_typeParameters_92_0= ruleJvmTypeParameter ) )
                              	    // InternalSARL.g:1290:8: (lv_typeParameters_92_0= ruleJvmTypeParameter )
                              	    {
                              	    // InternalSARL.g:1290:8: (lv_typeParameters_92_0= ruleJvmTypeParameter )
                              	    // InternalSARL.g:1291:9: lv_typeParameters_92_0= ruleJvmTypeParameter
                              	    {
                              	    if ( state.backtracking==0 ) {
  
                              	      									newCompositeNode(grammarAccess.getTypeAccess().getTypeParametersJvmTypeParameterParserRuleCall_2_8_4_2_1_0());
                              	      								
                              	    }
                              	    pushFollow(FOLLOW_28);
                              	    lv_typeParameters_92_0=ruleJvmTypeParameter();
  
                              	    state._fsp--;
                              	    if (state.failed) return current;
                              	    if ( state.backtracking==0 ) {
  
                              	      									if (current==null) {
                              	      										current = createModelElementForParent(grammarAccess.getTypeRule());
                              	      									}
                              	      									add(
                              	      										current,
                              	      										"typeParameters",
                              	      										lv_typeParameters_92_0,
                              	      										"org.eclipse.xtext.xbase.Xtype.JvmTypeParameter");
                              	      									afterParserOrEnumRuleCall();
                              	      								
                              	    }
  
                              	    }
  
  
                              	    }
  
  
                              	    }
                              	    break;
  
                              	default :
                              	    break loop33;
                                  }
                              } while (true);
  
                              otherlv_93=(Token)match(input,41,FOLLOW_13); if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                						newLeafNode(otherlv_93, grammarAccess.getTypeAccess().getGreaterThanSignKeyword_2_8_4_3());
                                					
                              }
  
                              }
                              break;
  
                      }
  
                      // InternalSARL.g:1314:5: (otherlv_94= 'extends' ( (lv_extends_95_0= ruleJvmParameterizedTypeReference ) ) (otherlv_96= ',' ( (lv_extends_97_0= ruleJvmParameterizedTypeReference ) ) )* )?
                      int alt36=2;
                      int LA36_0 = input.LA(1);
  
                      if ( (LA36_0==28) ) {
                          alt36=1;
                      }
                      switch (alt36) {
                          case 1 :
                              // InternalSARL.g:1315:6: otherlv_94= 'extends' ( (lv_extends_95_0= ruleJvmParameterizedTypeReference ) ) (otherlv_96= ',' ( (lv_extends_97_0= ruleJvmParameterizedTypeReference ) ) )*
                              {
                              otherlv_94=(Token)match(input,28,FOLLOW_3); if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                						newLeafNode(otherlv_94, grammarAccess.getTypeAccess().getExtendsKeyword_2_8_5_0());
                                					
                              }
                              // InternalSARL.g:1319:6: ( (lv_extends_95_0= ruleJvmParameterizedTypeReference ) )
                              // InternalSARL.g:1320:7: (lv_extends_95_0= ruleJvmParameterizedTypeReference )
                              {
                              // InternalSARL.g:1320:7: (lv_extends_95_0= ruleJvmParameterizedTypeReference )
                              // InternalSARL.g:1321:8: lv_extends_95_0= ruleJvmParameterizedTypeReference
                              {
                              if ( state.backtracking==0 ) {
  
                                								newCompositeNode(grammarAccess.getTypeAccess().getExtendsJvmParameterizedTypeReferenceParserRuleCall_2_8_5_1_0());
                                							
                              }
                              pushFollow(FOLLOW_14);
                              lv_extends_95_0=ruleJvmParameterizedTypeReference();
  
                              state._fsp--;
                              if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                								if (current==null) {
                                									current = createModelElementForParent(grammarAccess.getTypeRule());
                                								}
                                								add(
                                									current,
                                									"extends",
                                									lv_extends_95_0,
                                									"org.eclipse.xtext.xbase.Xtype.JvmParameterizedTypeReference");
                                								afterParserOrEnumRuleCall();
                                							
                              }
  
                              }
  
  
                              }
  
                              // InternalSARL.g:1338:6: (otherlv_96= ',' ( (lv_extends_97_0= ruleJvmParameterizedTypeReference ) ) )*
                              loop35:
                              do {
                                  int alt35=2;
                                  int LA35_0 = input.LA(1);
  
                                  if ( (LA35_0==32) ) {
                                      alt35=1;
                                  }
  
  
                                  switch (alt35) {
                              	case 1 :
                              	    // InternalSARL.g:1339:7: otherlv_96= ',' ( (lv_extends_97_0= ruleJvmParameterizedTypeReference ) )
                              	    {
                              	    otherlv_96=(Token)match(input,32,FOLLOW_3); if (state.failed) return current;
                              	    if ( state.backtracking==0 ) {
  
                              	      							newLeafNode(otherlv_96, grammarAccess.getTypeAccess().getCommaKeyword_2_8_5_2_0());
                              	      						
                              	    }
                              	    // InternalSARL.g:1343:7: ( (lv_extends_97_0= ruleJvmParameterizedTypeReference ) )
                              	    // InternalSARL.g:1344:8: (lv_extends_97_0= ruleJvmParameterizedTypeReference )
                              	    {
                              	    // InternalSARL.g:1344:8: (lv_extends_97_0= ruleJvmParameterizedTypeReference )
                              	    // InternalSARL.g:1345:9: lv_extends_97_0= ruleJvmParameterizedTypeReference
                              	    {
                              	    if ( state.backtracking==0 ) {
  
                              	      									newCompositeNode(grammarAccess.getTypeAccess().getExtendsJvmParameterizedTypeReferenceParserRuleCall_2_8_5_2_1_0());
                              	      								
                              	    }
                              	    pushFollow(FOLLOW_14);
                              	    lv_extends_97_0=ruleJvmParameterizedTypeReference();
  
                              	    state._fsp--;
                              	    if (state.failed) return current;
                              	    if ( state.backtracking==0 ) {
  
                              	      									if (current==null) {
                              	      										current = createModelElementForParent(grammarAccess.getTypeRule());
                              	      									}
                              	      									add(
                              	      										current,
                              	      										"extends",
                              	      										lv_extends_97_0,
                              	      										"org.eclipse.xtext.xbase.Xtype.JvmParameterizedTypeReference");
                              	      									afterParserOrEnumRuleCall();
                              	      								
                              	    }
  
                              	    }
  
  
                              	    }
  
  
                              	    }
                              	    break;
  
                              	default :
                              	    break loop35;
                                  }
                              } while (true);
  
  
                              }
                              break;
  
                      }
  
                      otherlv_98=(Token)match(input,29,FOLLOW_29); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_98, grammarAccess.getTypeAccess().getLeftCurlyBracketKeyword_2_8_6());
                        				
                      }
                      // InternalSARL.g:1368:5: ( (lv_members_99_0= ruleMember ) )*
                      loop37:
                      do {
                          int alt37=2;
                          int LA37_0 = input.LA(1);
  
                          if ( (LA37_0==25||LA37_0==39||(LA37_0>=42 && LA37_0<=45)||LA37_0==48||(LA37_0>=65 && LA37_0<=66)||(LA37_0>=78 && LA37_0<=91)||LA37_0==105) ) {
                              alt37=1;
                          }
  
  
                          switch (alt37) {
                      	case 1 :
                      	    // InternalSARL.g:1369:6: (lv_members_99_0= ruleMember )
                      	    {
                      	    // InternalSARL.g:1369:6: (lv_members_99_0= ruleMember )
                      	    // InternalSARL.g:1370:7: lv_members_99_0= ruleMember
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getTypeAccess().getMembersMemberParserRuleCall_2_8_7_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_29);
                      	    lv_members_99_0=ruleMember();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"members",
                      	      								lv_members_99_0,
                      	      								"io.sarl.lang.SARL.Member");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop37;
                          }
                      } while (true);
  
                      otherlv_100=(Token)match(input,30,FOLLOW_2); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_100, grammarAccess.getTypeAccess().getRightCurlyBracketKeyword_2_8_8());
                        				
                      }
  
                      }
  
  
                      }
                      break;
                  case 10 :
                      // InternalSARL.g:1393:4: ( () ( (lv_modifiers_102_0= ruleCommonModifier ) )* otherlv_103= 'enum' ( (lv_name_104_0= ruleValidID ) ) otherlv_105= '{' ( ( (lv_members_106_0= ruleXtendEnumLiteral ) ) (otherlv_107= ',' ( (lv_members_108_0= ruleXtendEnumLiteral ) ) )* )? (otherlv_109= ';' )? otherlv_110= '}' )
                      {
                      // InternalSARL.g:1393:4: ( () ( (lv_modifiers_102_0= ruleCommonModifier ) )* otherlv_103= 'enum' ( (lv_name_104_0= ruleValidID ) ) otherlv_105= '{' ( ( (lv_members_106_0= ruleXtendEnumLiteral ) ) (otherlv_107= ',' ( (lv_members_108_0= ruleXtendEnumLiteral ) ) )* )? (otherlv_109= ';' )? otherlv_110= '}' )
                      // InternalSARL.g:1394:5: () ( (lv_modifiers_102_0= ruleCommonModifier ) )* otherlv_103= 'enum' ( (lv_name_104_0= ruleValidID ) ) otherlv_105= '{' ( ( (lv_members_106_0= ruleXtendEnumLiteral ) ) (otherlv_107= ',' ( (lv_members_108_0= ruleXtendEnumLiteral ) ) )* )? (otherlv_109= ';' )? otherlv_110= '}'
                      {
                      // InternalSARL.g:1394:5: ()
                      // InternalSARL.g:1395:6: 
                      {
                      if ( state.backtracking==0 ) {
  
                        						current = forceCreateModelElementAndSet(
                        							grammarAccess.getTypeAccess().getSarlEnumerationAnnotationInfoAction_2_9_0(),
                        							current);
                        					
                      }
  
                      }
  
                      // InternalSARL.g:1401:5: ( (lv_modifiers_102_0= ruleCommonModifier ) )*
                      loop38:
                      do {
                          int alt38=2;
                          int LA38_0 = input.LA(1);
  
                          if ( (LA38_0==25||(LA38_0>=78 && LA38_0<=89)) ) {
                              alt38=1;
                          }
  
  
                          switch (alt38) {
                      	case 1 :
                      	    // InternalSARL.g:1402:6: (lv_modifiers_102_0= ruleCommonModifier )
                      	    {
                      	    // InternalSARL.g:1402:6: (lv_modifiers_102_0= ruleCommonModifier )
                      	    // InternalSARL.g:1403:7: lv_modifiers_102_0= ruleCommonModifier
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getTypeAccess().getModifiersCommonModifierParserRuleCall_2_9_1_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_32);
                      	    lv_modifiers_102_0=ruleCommonModifier();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"modifiers",
                      	      								lv_modifiers_102_0,
                      	      								"org.eclipse.xtend.core.Xtend.CommonModifier");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop38;
                          }
                      } while (true);
  
                      otherlv_103=(Token)match(input,43,FOLLOW_3); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_103, grammarAccess.getTypeAccess().getEnumKeyword_2_9_2());
                        				
                      }
                      // InternalSARL.g:1424:5: ( (lv_name_104_0= ruleValidID ) )
                      // InternalSARL.g:1425:6: (lv_name_104_0= ruleValidID )
                      {
                      // InternalSARL.g:1425:6: (lv_name_104_0= ruleValidID )
                      // InternalSARL.g:1426:7: lv_name_104_0= ruleValidID
                      {
                      if ( state.backtracking==0 ) {
  
                        							newCompositeNode(grammarAccess.getTypeAccess().getNameValidIDParserRuleCall_2_9_3_0());
                        						
                      }
                      pushFollow(FOLLOW_17);
                      lv_name_104_0=ruleValidID();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        							if (current==null) {
                        								current = createModelElementForParent(grammarAccess.getTypeRule());
                        							}
                        							set(
                        								current,
                        								"name",
                        								lv_name_104_0,
                        								"org.eclipse.xtend.core.Xtend.ValidID");
                        							afterParserOrEnumRuleCall();
                        						
                      }
  
                      }
  
  
                      }
  
                      otherlv_105=(Token)match(input,29,FOLLOW_33); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_105, grammarAccess.getTypeAccess().getLeftCurlyBracketKeyword_2_9_4());
                        				
                      }
                      // InternalSARL.g:1447:5: ( ( (lv_members_106_0= ruleXtendEnumLiteral ) ) (otherlv_107= ',' ( (lv_members_108_0= ruleXtendEnumLiteral ) ) )* )?
                      int alt40=2;
                      int LA40_0 = input.LA(1);
  
                      if ( (LA40_0==RULE_ID||LA40_0==44||(LA40_0>=92 && LA40_0<=95)) ) {
                          alt40=1;
                      }
                      switch (alt40) {
                          case 1 :
                              // InternalSARL.g:1448:6: ( (lv_members_106_0= ruleXtendEnumLiteral ) ) (otherlv_107= ',' ( (lv_members_108_0= ruleXtendEnumLiteral ) ) )*
                              {
                              // InternalSARL.g:1448:6: ( (lv_members_106_0= ruleXtendEnumLiteral ) )
                              // InternalSARL.g:1449:7: (lv_members_106_0= ruleXtendEnumLiteral )
                              {
                              // InternalSARL.g:1449:7: (lv_members_106_0= ruleXtendEnumLiteral )
                              // InternalSARL.g:1450:8: lv_members_106_0= ruleXtendEnumLiteral
                              {
                              if ( state.backtracking==0 ) {
  
                                								newCompositeNode(grammarAccess.getTypeAccess().getMembersXtendEnumLiteralParserRuleCall_2_9_5_0_0());
                                							
                              }
                              pushFollow(FOLLOW_34);
                              lv_members_106_0=ruleXtendEnumLiteral();
  
                              state._fsp--;
                              if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                								if (current==null) {
                                									current = createModelElementForParent(grammarAccess.getTypeRule());
                                								}
                                								add(
                                									current,
                                									"members",
                                									lv_members_106_0,
                                									"io.sarl.lang.SARL.XtendEnumLiteral");
                                								afterParserOrEnumRuleCall();
                                							
                              }
  
                              }
  
  
                              }
  
                              // InternalSARL.g:1467:6: (otherlv_107= ',' ( (lv_members_108_0= ruleXtendEnumLiteral ) ) )*
                              loop39:
                              do {
                                  int alt39=2;
                                  int LA39_0 = input.LA(1);
  
                                  if ( (LA39_0==32) ) {
                                      alt39=1;
                                  }
  
  
                                  switch (alt39) {
                              	case 1 :
                              	    // InternalSARL.g:1468:7: otherlv_107= ',' ( (lv_members_108_0= ruleXtendEnumLiteral ) )
                              	    {
                              	    otherlv_107=(Token)match(input,32,FOLLOW_3); if (state.failed) return current;
                              	    if ( state.backtracking==0 ) {
  
                              	      							newLeafNode(otherlv_107, grammarAccess.getTypeAccess().getCommaKeyword_2_9_5_1_0());
                              	      						
                              	    }
                              	    // InternalSARL.g:1472:7: ( (lv_members_108_0= ruleXtendEnumLiteral ) )
                              	    // InternalSARL.g:1473:8: (lv_members_108_0= ruleXtendEnumLiteral )
                              	    {
                              	    // InternalSARL.g:1473:8: (lv_members_108_0= ruleXtendEnumLiteral )
                              	    // InternalSARL.g:1474:9: lv_members_108_0= ruleXtendEnumLiteral
                              	    {
                              	    if ( state.backtracking==0 ) {
  
                              	      									newCompositeNode(grammarAccess.getTypeAccess().getMembersXtendEnumLiteralParserRuleCall_2_9_5_1_1_0());
                              	      								
                              	    }
                              	    pushFollow(FOLLOW_34);
                              	    lv_members_108_0=ruleXtendEnumLiteral();
  
                              	    state._fsp--;
                              	    if (state.failed) return current;
                              	    if ( state.backtracking==0 ) {
  
                              	      									if (current==null) {
                              	      										current = createModelElementForParent(grammarAccess.getTypeRule());
                              	      									}
                              	      									add(
                              	      										current,
                              	      										"members",
                              	      										lv_members_108_0,
                              	      										"io.sarl.lang.SARL.XtendEnumLiteral");
                              	      									afterParserOrEnumRuleCall();
                              	      								
                              	    }
  
                              	    }
  
  
                              	    }
  
  
                              	    }
                              	    break;
  
                              	default :
                              	    break loop39;
                                  }
                              } while (true);
  
  
                              }
                              break;
  
                      }
  
                      // InternalSARL.g:1493:5: (otherlv_109= ';' )?
                      int alt41=2;
                      int LA41_0 = input.LA(1);
  
                      if ( (LA41_0==26) ) {
                          alt41=1;
                      }
                      switch (alt41) {
                          case 1 :
                              // InternalSARL.g:1494:6: otherlv_109= ';'
                              {
                              otherlv_109=(Token)match(input,26,FOLLOW_24); if (state.failed) return current;
                              if ( state.backtracking==0 ) {
  
                                						newLeafNode(otherlv_109, grammarAccess.getTypeAccess().getSemicolonKeyword_2_9_6());
                                					
                              }
  
                              }
                              break;
  
                      }
  
                      otherlv_110=(Token)match(input,30,FOLLOW_2); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_110, grammarAccess.getTypeAccess().getRightCurlyBracketKeyword_2_9_7());
                        				
                      }
  
                      }
  
  
                      }
                      break;
                  case 11 :
                      // InternalSARL.g:1505:4: ( () ( (lv_modifiers_112_0= ruleCommonModifier ) )* otherlv_113= 'annotation' ( (lv_name_114_0= ruleValidID ) ) otherlv_115= '{' ( (lv_members_116_0= ruleAnnotationField ) )* otherlv_117= '}' )
                      {
                      // InternalSARL.g:1505:4: ( () ( (lv_modifiers_112_0= ruleCommonModifier ) )* otherlv_113= 'annotation' ( (lv_name_114_0= ruleValidID ) ) otherlv_115= '{' ( (lv_members_116_0= ruleAnnotationField ) )* otherlv_117= '}' )
                      // InternalSARL.g:1506:5: () ( (lv_modifiers_112_0= ruleCommonModifier ) )* otherlv_113= 'annotation' ( (lv_name_114_0= ruleValidID ) ) otherlv_115= '{' ( (lv_members_116_0= ruleAnnotationField ) )* otherlv_117= '}'
                      {
                      // InternalSARL.g:1506:5: ()
                      // InternalSARL.g:1507:6: 
                      {
                      if ( state.backtracking==0 ) {
  
                        						current = forceCreateModelElementAndSet(
                        							grammarAccess.getTypeAccess().getSarlAnnotationTypeAnnotationInfoAction_2_10_0(),
                        							current);
                        					
                      }
  
                      }
  
                      // InternalSARL.g:1513:5: ( (lv_modifiers_112_0= ruleCommonModifier ) )*
                      loop42:
                      do {
                          int alt42=2;
                          int LA42_0 = input.LA(1);
  
                          if ( (LA42_0==25||(LA42_0>=78 && LA42_0<=89)) ) {
                              alt42=1;
                          }
  
  
                          switch (alt42) {
                      	case 1 :
                      	    // InternalSARL.g:1514:6: (lv_modifiers_112_0= ruleCommonModifier )
                      	    {
                      	    // InternalSARL.g:1514:6: (lv_modifiers_112_0= ruleCommonModifier )
                      	    // InternalSARL.g:1515:7: lv_modifiers_112_0= ruleCommonModifier
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getTypeAccess().getModifiersCommonModifierParserRuleCall_2_10_1_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_35);
                      	    lv_modifiers_112_0=ruleCommonModifier();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"modifiers",
                      	      								lv_modifiers_112_0,
                      	      								"org.eclipse.xtend.core.Xtend.CommonModifier");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop42;
                          }
                      } while (true);
  
                      otherlv_113=(Token)match(input,44,FOLLOW_3); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_113, grammarAccess.getTypeAccess().getAnnotationKeyword_2_10_2());
                        				
                      }
                      // InternalSARL.g:1536:5: ( (lv_name_114_0= ruleValidID ) )
                      // InternalSARL.g:1537:6: (lv_name_114_0= ruleValidID )
                      {
                      // InternalSARL.g:1537:6: (lv_name_114_0= ruleValidID )
                      // InternalSARL.g:1538:7: lv_name_114_0= ruleValidID
                      {
                      if ( state.backtracking==0 ) {
  
                        							newCompositeNode(grammarAccess.getTypeAccess().getNameValidIDParserRuleCall_2_10_3_0());
                        						
                      }
                      pushFollow(FOLLOW_17);
                      lv_name_114_0=ruleValidID();
  
                      state._fsp--;
                      if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        							if (current==null) {
                        								current = createModelElementForParent(grammarAccess.getTypeRule());
                        							}
                        							set(
                        								current,
                        								"name",
                        								lv_name_114_0,
                        								"org.eclipse.xtend.core.Xtend.ValidID");
                        							afterParserOrEnumRuleCall();
                        						
                      }
  
                      }
  
  
                      }
  
                      otherlv_115=(Token)match(input,29,FOLLOW_36); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_115, grammarAccess.getTypeAccess().getLeftCurlyBracketKeyword_2_10_4());
                        				
                      }
                      // InternalSARL.g:1559:5: ( (lv_members_116_0= ruleAnnotationField ) )*
                      loop43:
                      do {
                          int alt43=2;
                          int LA43_0 = input.LA(1);
  
                          if ( (LA43_0==25||LA43_0==39||(LA43_0>=42 && LA43_0<=44)||(LA43_0>=65 && LA43_0<=66)||(LA43_0>=78 && LA43_0<=89)||LA43_0==105) ) {
                              alt43=1;
                          }
  
  
                          switch (alt43) {
                      	case 1 :
                      	    // InternalSARL.g:1560:6: (lv_members_116_0= ruleAnnotationField )
                      	    {
                      	    // InternalSARL.g:1560:6: (lv_members_116_0= ruleAnnotationField )
                      	    // InternalSARL.g:1561:7: lv_members_116_0= ruleAnnotationField
                      	    {
                      	    if ( state.backtracking==0 ) {
  
                      	      							newCompositeNode(grammarAccess.getTypeAccess().getMembersAnnotationFieldParserRuleCall_2_10_5_0());
                      	      						
                      	    }
                      	    pushFollow(FOLLOW_36);
                      	    lv_members_116_0=ruleAnnotationField();
  
                      	    state._fsp--;
                      	    if (state.failed) return current;
                      	    if ( state.backtracking==0 ) {
  
                      	      							if (current==null) {
                      	      								current = createModelElementForParent(grammarAccess.getTypeRule());
                      	      							}
                      	      							add(
                      	      								current,
                      	      								"members",
                      	      								lv_members_116_0,
                      	      								"io.sarl.lang.SARL.AnnotationField");
                      	      							afterParserOrEnumRuleCall();
                      	      						
                      	    }
  
                      	    }
  
  
                      	    }
                      	    break;
  
                      	default :
                      	    break loop43;
                          }
                      } while (true);
  
                      otherlv_117=(Token)match(input,30,FOLLOW_2); if (state.failed) return current;
                      if ( state.backtracking==0 ) {
  
                        					newLeafNode(otherlv_117, grammarAccess.getTypeAccess().getRightCurlyBracketKeyword_2_10_6());
                        				
                      }
  
                      }
  
  
                      }
                      break;
  
              }
  
  
              }
  
  
              }
  
              if ( state.backtracking==0 ) {
  
                	leaveRule();
  
              }
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }