anchor.diff:            
   DomainName: ( DomainLabel '.' )* TopLabel ( '.' )?;
             
  -fragment DomainLabel: ALPHA_NUM 
  -                    | ALPHA_NUM ( ALPHA_NUM | '-' )* ALPHA_NUM
  +fragment DomainLabel: (ALPHA | DIGIT ) 
  +                    | (ALPHA | DIGIT ) ( (ALPHA | DIGIT ) | '-' )* (ALPHA | DIGIT )
                       ;
              
   fragment TopLabel: ALPHA 
  -                 | ALPHA ( ALPHA_NUM | '-' )* ALPHA_NUM
  +                 | ALPHA ( (ALPHA | DIGIT ) | '-' )* (ALPHA | DIGIT )
                    ;
           
  -parameter: ';' pName=( ALPHA_NUM | '-' )+ ('=' pValue=(ParamUnreserved | ALPHA_NUM | Mark | PctEncoded)+ )?;
  +parameter: ';' pName=( ALPHA | DIGIT | '-' )+ ('=' pValue=(ParamUnreserved | ALPHA | DIGIT | Mark | PctEncoded)+ )?;
                  
   Mark: '-' 
       | '_' 
  
positive.code:         | '$' 
          | ','
          ;
          
  Uric: Reserved 
      | ALPHA_NUM 
      | Mark 
      | PctEncoded
      ;
negative.code:             
  localNumber: localDigits=LocalNumberDigits (extension | isdnSubaddress)? phoneContext parameter*;
  
  isdnSubaddress: ';isub=' isub=(Reserved | ALPHA | DIGIT | Mark | PctEncoded)+;
  
  extension: ';ext=' ext=PhoneDigit+;
  
  