/*******************************************************************************
 * GenRGenS v.1.0, Generation of Random Genomic Sequences                      *
 * Copyright (C) 2001  Alain Denise/Yann Ponty                                 *
 *                                                                             *
 * This program is free software; you can redistribute it and/or               *
 * modify it under the terms of the GNU General Public License                 *
 * as published by the Free Software Foundation; either version 2              *
 * of the License, or (at your option) any later version.                      *
 *                                                                             *
 * This program 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 General Public License for more details.                                *
 *                                                                             *
 * You should have received a copy of the GNU General Public License           *
 * along with this program; if not, write to the Free Software                 *
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. *
 *******************************************************************************/

package GenRGenS.grammar;

/*****************************************************************************
*              NormalContextFreeGrammarProductionTerminal         
*
******************************************************************************/

/** 
 * A class for the context-free grammar terminals-productions
 * @author Fr&eacute;d&eacute;ric Sarron
 * @version 1.0
 */

public class NormalContextFreeGrammarProductionTerminal
		extends NormalContextFreeGrammarProduction
{	
		/** 
		 * numero du terminal produit
		 * 0=epsilon , cet entier doit etre negatif
		 */
		protected int terminal;
		
		
		/**
		 * Construit une instance de <code>NormalContextFreeGrammarProductionTerminal</code>, classe
		 * modelisant les règles des la grammaire de type Terminal (N -> T).
		 * @param lhs L'index du non-terminal partie gauche de la règle.
		 * @param rhs L'index du terminal partie droite de la règle.
		 */

		NormalContextFreeGrammarProductionTerminal(int lhs, int rhs)
		{ 
				super(lhs);
				setRHS(rhs);
		};

		/**
		 * Renvoie la partie droite de la règle.
		 * @return L'index du non-terminal partie droite de la règle.
		 */
		public int getRHS()
		{	return(terminal); };

		// si rhs n'est pas une instance de la classe Integer
		// ou si l'entier represente est strictement positif
		// il y aura levee d'une exception
		// l'exception n'est pas declaree pour ne pas obliger
		// l'utilisateur de la classe a utiliser de capture d'exception
		/**
		 * Affecte à la règle une nouvelle partie droite
		 * @param rhs L'index du nouveau terminal partie droite de la règle.
		 * @throws IllegalArgumentException Quand l'index est celui d'un non-terminal.
		 */
		public void setRHS(int rhs)
		{
				if (rhs<=0)
						terminal=rhs;
				else throw(new IllegalArgumentException("NormalContextFreeGrammarProductionTerminal : setRHS(int) need positive integer"));
		};

		/**
		 * Cette methode a pour but de rereferencer les nonTerminaux
		 * dans les LHS et RHS, suite a suppression de certains
		 * auxiliaires dans des algorithmes au niveau grammaire.
		 * En l'occurence, elle n'est susceptible de réassigner que 
		 * la partie gauche de la règle
		 * @param assignement Ce tableau d'entier fait correspondre
		 * a chaque auxiliaire un nouvel index auquel il faut le substituer 
		 */

		void modifyReferences(int[] assignement)
		{	
				if (assignement[lhs]>=0)
						lhs=assignement[lhs];
		};

		/**
		 * Cette règle ne dérive-t-elle que le mot epsilon ?
		 * @return true sir la règle ne dérive qu'epsilon, false sinon.
		 */
		public boolean isEpsilonProduction()
		{ return(terminal==0); };

		/**
		 * Renvoie une représentation littérale de cette instance de classe en mode "debug".
		 */
		String toStringDebug()
		{	return(lhs+" -> "+((terminal==0)?"e":String.valueOf(terminal)));	};

		/**
		 * Renvoie une représentation littérale de cette instance de classe en mode "debug".
		 * @param ncfg La grammaire dans laquelle seront cherchées les représentations littérales 
		 * des symboles.
		 * @return Renvoie une instance de <code>String</code> décrivant cette règle.
		 */
		public String toString(NormalContextFreeGrammar ncfg)
		{
				return(
							 ncfg.CFGsymbolName(lhs)+" -> "+
							 (terminal==0?"-epsilon-":ncfg.CFGsymbolName(terminal)));
		};

}
