/* Copyright 2009-2016 David Hadka
*
* This file is part of the MOEA Framework.
*
* The MOEA Framework is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or (at your
* option) any later version.
*
* The MOEA Framework is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with the MOEA Framework. If not, see <http://www.gnu.org/licenses/>.
*/
package org.moeaframework.util.grammar;
import java.util.ArrayList;
import java.util.List;
/**
* A context-free grammar rule.
*
* @see ContextFreeGrammar
* @see Production
* @see Symbol
*/
public class Rule {
/**
* The non-terminal symbol of this rule.
*/
private final Symbol symbol;
/**
* The productions defined by this rule.
*/
private final List<Production> productions;
/**
* Constructs a rule with the specified symbol. At least one production must
* be provided through the {@link #add(Production)} method.
*
* @param symbol the non-terminal symbol of this rule
*/
public Rule(Symbol symbol) {
super();
this.symbol = symbol;
productions = new ArrayList<Production>();
}
/**
* Returns the non-terminal symbol of this rule.
*
* @return the non-terminal symbol of this rule
*/
public Symbol getSymbol() {
return symbol;
}
/**
* Adds a production to this rule.
*
* @param production the production to be added
*/
public void add(Production production) {
productions.add(production);
}
/**
* Removes a production from this rule.
*
* @param production the production to be removed
*/
public void remove(Production production) {
productions.remove(production);
}
/**
* Returns the number of productions contained in this rule.
*
* @return the number of productions contained in this rule
*/
public int size() {
return productions.size();
}
/**
* Returns the production at the specified index.
*
* @param index the index of the production to be returned
* @return the production at the specified index
* @throws IndexOutOfBoundsException if index is out of range {@code ((index
* < 0) || (index >= size())}
*/
public Production get(int index) {
return productions.get(index);
}
}