code: public ParsedOptions parse(Options options, String[] args, Properties properties, boolean skipParsingAtNonOption)
              throws OptionParserException {
          this.options = options;
          this.skipParsingAtNonOption = skipParsingAtNonOption;
          this.currentOption = null;
          this.expectedOpts = new ArrayList<>(options.getRequiredOptions());
  
          // clear the data from the groups
          for (OptionGroup group : options.getOptionGroups()) {
              group.setSelected(null);
          }
  
          this.parsedOptions = new ParsedOptions();
  
          if (args != null) {
              for (String argument : args) {
                  handleToken(argument);
              }
          }
  
          // check the arguments of the last option
          checkRequiredOptionValues();
  
          // add the default options
          handleProperties(properties);
  
          checkRequiredOptions();
  
          return this.parsedOptions;
      }
docs: Parse the arguments according to the specified options and properties.
  
  @param options the specified Options
  @param args the command line arguments
  @param properties command line option name-value pairs
  @param skipParsingAtNonOption if {@code true} an unrecognized argument stops
  the parsing and the remaining arguments are added to the
  {@link ParsedOptions}s args list. If {@code false} an unrecognized
  argument triggers a ParseException.
  @return the list of atomic option and value tokens
  @throws OptionParserException if there are any problems encountered
  while parsing the command line tokens