/*******************************************************************************
 * 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;

/*****************************************************************************
*              NormalContextFreeGrammarProduction         
*
******************************************************************************/

/** 
 * A class for the context-free grammar (CFG) productions  on Normalized Form
 * @author Fr&eacute;d&eacute;ric Sarron
 * @version 1.0
 */

public abstract class NormalContextFreeGrammarProduction
{
		/** 
		 * Le numero du non-terminal qui est source de la production
		 */
		protected int lhs;

		/**
		 * Construit une instance de <code>NormalContextFreeGrammarProduction</code>, classe
		 * modelisant les règles des grammaires en forme Normale.
		 * @param source L'index du non-terminal partie gauche de la règle.
		 */
		NormalContextFreeGrammarProduction(int source)
		{ lhs = source; };

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

		/**
		 * Affectes un nouveau symbole à la partie gauche de la règle.
		 * @param source 
		 */
		
		public void setLHS(int source)
		{ lhs=source; };

		/**
		 * 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.
		 * @param assignement Ce tableau d'entier fait correspondre
		 * a chaque auxiliaire un nouvel index auquel il faut le substituer 
		 */
		abstract void modifyReferences(int[] assignement);	

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

		/**
		 * Renvoie une représentation littérale de cette instance de classe en mode "debug".
		 */
		abstract String toStringDebug();

		/**
		 * 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.
		 */
		abstract public String toString(NormalContextFreeGrammar ncfg);
}
