anchor.diff:      Char: array [0..3] of AnsiChar;
     end;
   
  +const
  +  CONVERTABLE_TOKENS_TO_STR = [tkLess..tkClosingBracket, tkComma];
  +
     procedure GetChar(APos: PAnsiChar; out AChar: TUTF8Char);
     begin
       AChar.Length := UTF8CharacterLength(APos);
  
positive.code:         if AExpressionKind in [ekSet, ekNum] then
            raise Exception.Create('Unexpected string literal in expression');
        tkClosingBracket:
          if AExpressionRecord.SetKind<>skNumericBetweenInclusive then
            raise Exception.Create('Badly closed "between" expression');
        tkClosingParenthesis:
          if AExpressionRecord.SetKind<>skNumericBetweenExclusive then
            raise Exception.Create('Badly closed "between" expression');
        tkComma:
          begin
            NextValue;
          end;
        tkPercent:
          case LPrevToken of
            tkText:
              if (AExpressionRecord.TextMatchKind = tmkUnknown) then
  
negative.code:       end;
    end;
  
    if (LValueIdx = 0) and (LValue^='') then
      raise Exception.Create('Expression error (no value)');
  
    SetLength(AExpressionRecord.Values, LValueIdx + 1);
    for i := 0 to LValueIdx do
  