private void tokenizeValue( char[] array, int start, int end, int startOffset ) {
		int newStartOffset = startOffset - start;

		int currentTokenStart = start;
		int currentTokenType = Token.NULL;
		int parenthesisLevel = 0;

		for( int i = start; i <= end; i++ ) {
			int newTokenType;
			char ch = array[i];
			if( ch <= ' ' )
				newTokenType = Token.WHITESPACE;
			else if( ch == '#' || (currentTokenType == TOKEN_COLOR && RSyntaxUtilities.isHexCharacter( ch )) )
				newTokenType = TOKEN_COLOR;
			else if( ch == '$' || (currentTokenType == TOKEN_PROPERTY && isPropertyChar( ch )) )
				newTokenType = TOKEN_PROPERTY;
			else if( ch == '@' || (currentTokenType == TOKEN_VARIABLE && isPropertyChar( ch )) )
				newTokenType = TOKEN_VARIABLE;
			else if( currentTokenType != TOKEN_STRING && (RSyntaxUtilities.isDigit( ch ) || (currentTokenType == TOKEN_NUMBER && ch == '.')) )
				newTokenType = TOKEN_NUMBER;
			else if( ch == ',' || ch == '"' || ch == '%' )
				newTokenType = TokenTypes.OPERATOR;
			else if( ch == '(' || ch == ')' )
				newTokenType = TokenTypes.SEPARATOR; // necessary for bracket matching
			else
				newTokenType = TOKEN_STRING;

			if( currentTokenType == Token.NULL )
				currentTokenType = newTokenType;
			else if( newTokenType != currentTokenType ) {
				addTokenImpl( array, currentTokenStart, i - 1, currentTokenType, newStartOffset + currentTokenStart, parenthesisLevel );
				currentTokenType = newTokenType;
				currentTokenStart = i;
			}

			if( ch == '(' )
				parenthesisLevel++;
			else if( ch == ')' )
				parenthesisLevel--;
		}

		if( currentTokenType != Token.NULL )
			addTokenImpl( array, currentTokenStart, end, currentTokenType, newStartOffset + currentTokenStart, parenthesisLevel );
	}
This method is only invoked from the super class.
flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeTokenMaker.java