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

				TokenStream sub = new SubordinateTokenStream(stream);

				if (parser.accepts(sub)) {
					sub.commit();

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

					return true;

				} else {
					sub.restore();
				}

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

				return true;
			}
		};
	}