docs: public final AntlrDatatypeRuleToken ruleValidID() throws RecognitionException {
          AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
  
          Token this_ID_0=null;
          Token kw=null;
  
  
          	enterRule();
  
          try {
              // InternalXtext.g:2138:2: ( (this_ID_0= RULE_ID | kw= 'true' | kw= 'false' ) )
              // InternalXtext.g:2139:2: (this_ID_0= RULE_ID | kw= 'true' | kw= 'false' )
              {
              // InternalXtext.g:2139:2: (this_ID_0= RULE_ID | kw= 'true' | kw= 'false' )
              int alt49=3;
              switch ( input.LA(1) ) {
              case RULE_ID:
                  {
                  alt49=1;
                  }
                  break;
              case 39:
                  {
                  alt49=2;
                  }
                  break;
              case 40:
                  {
                  alt49=3;
                  }
                  break;
              default:
                  NoViableAltException nvae =
                      new NoViableAltException("", 49, 0, input);
  
                  throw nvae;
              }
  
              switch (alt49) {
                  case 1 :
                      // InternalXtext.g:2140:3: this_ID_0= RULE_ID
                      {
                      this_ID_0=(Token)match(input,RULE_ID,FollowSets000.FOLLOW_2); 
  
                      			current.merge(this_ID_0);
                      		
  
                      			newLeafNode(this_ID_0, grammarAccess.getValidIDAccess().getIDTerminalRuleCall_0());
                      		
  
                      }
                      break;
                  case 2 :
                      // InternalXtext.g:2148:3: kw= 'true'
                      {
                      kw=(Token)match(input,39,FollowSets000.FOLLOW_2); 
  
                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDAccess().getTrueKeyword_1());
                      		
  
                      }
                      break;
                  case 3 :
                      // InternalXtext.g:2154:3: kw= 'false'
                      {
                      kw=(Token)match(input,40,FollowSets000.FOLLOW_2); 
  
                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getValidIDAccess().getFalseKeyword_2());
                      		
  
                      }
                      break;
  
              }
  
  
              }
  
  
              	leaveRule();
  
          }
  
              catch (RecognitionException re) {
                  recover(input,re);
                  appendSkippedTokens();
              }
          finally {
          }
          return current;
      }