code: public static CSLName[] parse(String names) {
  		ANTLRInputStream is = new ANTLRInputStream(names);
  		InternalNameLexer lexer = new InternalNameLexer(is);
  		lexer.removeErrorListeners(); //do not output errors to console
  		CommonTokenStream tokens = new CommonTokenStream(lexer);
  		InternalNameParser parser = new InternalNameParser(tokens);
  		parser.removeErrorListeners(); //do not output errors to console
  		NamesContext ctx = parser.names();
  		if (ctx.result.isEmpty() || ctx.exception != null) {
  			//unparsable fall back to literal string
  			return new CSLName[] { new CSLNameBuilder().literal(names).build() };
  		}
  		return ctx.result.toArray(new CSLName[ctx.result.size()]);
  	}
docs: Parses names to {@link CSLName} objects. Also handles strings
  containing multiple names separated by <code>and</code>. The
  method always returns at least one object, even if the given
  names cannot be parsed. In this case the returned object just
  contains a literal string.
  @param names the names to parse
  @return the {@link CSLName} objects (never null and never empty)