anchor.diff:      ;
   
   fragment
  +TdqStringQuotationMark
  +    :   '"""'
  +    ;
  +
  +fragment
  +TsqStringQuotationMark
  +    :   '\'\'\''
  +    ;
  +
  +fragment
  +DollarSlashyGStringQuotationMarkBegin
  +    :   '$/'
  +    ;
  +
  +fragment
  +DollarSlashyGStringQuotationMarkEnd
  +    :   '/$'
  +    ;
  +
  +fragment
   DollarSlashEscape
  -    :   Dollar Slash Dollar
  +    :   '$/$'
       ;
   
   fragment
   DollarDollarEscape
  -    :   Dollar Dollar
  -    ;
  +    :   '$$'
  +    ;
  +
   // §3.10.7 The Null Literal
  -
   NullLiteral
       :   'null'
       ;
  
positive.code:     :   '"' DqStringCharacter*? Dollar -> pushMode(DQ_GSTRING_MODE), pushMode(GSTRING_TYPE_SELECTOR_MODE)
      ;
  TdqGStringBegin
      :   '"""'   TdqStringCharacter*? Dollar -> type(GStringBegin), pushMode(TDQ_GSTRING_MODE), pushMode(GSTRING_TYPE_SELECTOR_MODE)
      ;
  SlashyGStringBegin
      :   Slash { this.isRegexAllowed() && _input.LA(1) != '*' }? SlashyStringCharacter*? Dollar { isFollowedByJavaLetterInGString(_input) }? -> type(GStringBegin), pushMode(SLASHY_GSTRING_MODE), pushMode(GSTRING_TYPE_SELECTOR_MODE)
      ;
  DollarSlashyGStringBegin
      :   '$/' DollarSlashyStringCharacter*? Dollar { isFollowedByJavaLetterInGString(_input) }? -> type(GStringBegin), pushMode(DOLLAR_SLASHY_GSTRING_MODE), pushMode(GSTRING_TYPE_SELECTOR_MODE)
      ;
  
  mode DQ_GSTRING_MODE;
  
negative.code: 
  mode TDQ_GSTRING_MODE;
  TdqGStringEnd
      :   TdqStringQuotationMark    -> type(GStringEnd), popMode
      ;
  TdqGStringPart
      :   Dollar   -> type(GStringPart), pushMode(GSTRING_TYPE_SELECTOR_MODE)
  