All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.vertigo.commons.parser.SequenceRule Maven / Gradle / Ivy

There is a newer version: 2.1.0
Show newest version
/**
 * vertigo - simple java starter
 *
 * Copyright (C) 2013, KleeGroup, [email protected] (http://www.kleegroup.com)
 * KleeGroup, Centre d'affaire la Boursidiere - BP 159 - 92357 Le Plessis Robinson Cedex - France
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.vertigo.commons.parser;

import io.vertigo.lang.Assertion;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * As wikipedia says
 * The sequence operator e1 e2 first invokes e1,
 * and if e1 succeeds, subsequently invokes e2 on the remainder of the input string left unconsumed by e1,
 * and returns the result.
 * If either e1 or e2 fails, then the sequence expression e1 e2 fails.
 *
 * @author pchretien
 */
public final class SequenceRule implements Rule> {
	private final List> rules;
	private final String expression;

	/**
	 * Constructor.
	 */
	public SequenceRule(final Rule... rules) {
		this(Arrays.asList(rules));
	}

	/**
	 * Constructeur.
	 */
	public SequenceRule(final List> rules) {
		Assertion.checkNotNull(rules);
		//-----
		this.rules = Collections.unmodifiableList(rules);
		expression = createExpression(rules);
	}

	/*A sequence of rules/expressions is like that : e1 e2 e3 */
	private static String createExpression(final List> rules) {
		final StringBuilder buffer = new StringBuilder();
		for (final Rule rule : rules) {
			if (buffer.length() > 0) {
				buffer.append(" ");
			}
			buffer.append(rule.getExpression());
		}
		return buffer.toString();
	}

	/** {@inheritDoc} */
	@Override
	public String getExpression() {
		return expression;
	}

	@Override
	public Parser> createParser() {
		return new Parser>() {
			private List results;

			/** {@inheritDoc} */
			@Override
			public int parse(final String text, final int start) throws NotFoundException {
				results = new ArrayList<>();
				int index = start;
				try {
					for (final Rule rule : rules) {
						final Parser parser = rule.createParser();
						index = parser.parse(text, index);
						results.add(parser.get());
					}
				} catch (final NotFoundException e) {
					throw new NotFoundException(text, e.getIndex(), e, getExpression());
				}
				return index;
			}

			@Override
			public List get() {
				return results;
			}
		};
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy