protected Parser choice(final Parser... parsers) {
		return new Parser() {
			protected boolean accepts(TokenStream stream) {
				// if (LOGGER.isTraceEnabled()) {
				// push("[choice>");
				// }

				TokenStream sub = new SubordinateTokenStream(stream);

				for (int i = 0; i < parsers.length; i++) {
					final Parser parser = parsers[i];

					if (parser.accepts(sub)) {
						return true;

					} else {
						if (LOGGER.isTraceEnabled() && i + 1 < parsers.length) {
							trace("or");
						}

						sub.restore();
					}
				}

				// if (LOGGER.isTraceEnabled()) {
				// pop("<choice]");
				// }

				return false;
			}
		};
	};