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

				TokenStream sub = new SubordinateTokenStream(stream);

				WaterMarker water = null;
				while (!parser.accepts(sub)) {
					sub.restore();

					if (water == null) {
						water = KoopaMarkers.water();
						sub.mark(water);
					}

					final Token skipped = sub.nextToken();

					sub.commit();

					if (skipped == null) {
						return false;
					}
				}

				sub.restore();
				if (water != null) {
					sub.mark(KoopaMarkers.land());
				}

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

				return true;
			}
		};
	}