package de.unisiegen.gtitool.ui.convert;
import java.util.ArrayList;
import de.unisiegen.gtitool.core.entities.DefaultAlphabet;
import de.unisiegen.gtitool.core.entities.DefaultSymbol;
import de.unisiegen.gtitool.core.entities.DefaultWord;
import de.unisiegen.gtitool.core.entities.NonterminalSymbol;
import de.unisiegen.gtitool.core.entities.Production;
import de.unisiegen.gtitool.core.entities.ProductionWordMember;
import de.unisiegen.gtitool.core.entities.Symbol;
import de.unisiegen.gtitool.core.entities.TerminalSymbol;
import de.unisiegen.gtitool.core.entities.Transition;
import de.unisiegen.gtitool.core.entities.Word;
import de.unisiegen.gtitool.core.exceptions.alphabet.AlphabetException;
import de.unisiegen.gtitool.core.grammars.Grammar;
import de.unisiegen.gtitool.core.grammars.cfg.CFG;
import de.unisiegen.gtitool.core.machines.Machine;
import de.unisiegen.gtitool.core.machines.pda.DefaultPDA;
import de.unisiegen.gtitool.core.machines.pda.PDA;
import de.unisiegen.gtitool.ui.jgraph.DefaultStateView;
import de.unisiegen.gtitool.ui.netbeans.MainWindowForm;
/**
* Convert a {@link CFG} to a {@link PDA}.
*
* @author Benjamin Mies
* @version $Id: ConvertContextFreeGrammar.java 910 2008-05-16 00:31:21Z fehler
* $
*/
public class ConvertContextFreeGrammar extends AbstractConvertGrammar
{
/**
* Allocate a new {@link ConvertContextFreeGrammar}.
*
* @param mainWindowForm The {@link MainWindowForm}.
* @param grammar The {@link Grammar}.
*/
public ConvertContextFreeGrammar ( MainWindowForm mainWindowForm,
Grammar grammar )
{
super ( mainWindowForm, grammar );
ArrayList < Symbol > symbols = new ArrayList < Symbol > ();
for ( TerminalSymbol current : grammar.getTerminalSymbolSet () )
{
symbols.add ( new DefaultSymbol ( current.getName () ) );
}
for ( NonterminalSymbol current : grammar.getNonterminalSymbolSet () )
{
symbols.add ( new DefaultSymbol ( current.getName () ) );
}
try
{
setPushDownAlphabet ( new DefaultAlphabet ( symbols ) );
}
catch ( AlphabetException exc )
{
exc.printStackTrace ();
System.exit ( 1 );
}
}
/**
* {@inheritDoc}
*
* @see de.unisiegen.gtitool.ui.convert.AbstractConvertGrammar#createMachine()
*/
@Override
protected void createMachine ()
{
Machine machine = new DefaultPDA ( getAlphabet (), getPushDownAlphabet (),
true );
createMachinePanel ( machine );
}
/**
* Create a new {@link Transition}.
*
* @param read The word to read from stack.
* @param write The word to write to stack.
* @param source The source {@link DefaultStateView}.
* @param target The target {@link DefaultStateView}.
* @param symbol The {@link Symbol}
*/
private void createTransition ( Word read, Word write,
DefaultStateView source, DefaultStateView target, Symbol symbol )
{
ArrayList < Symbol > symbols = new ArrayList < Symbol > ();
symbols.add ( symbol );
createTransition ( read, write, source, target, symbols );
}
/**
* {@inheritDoc}
*
* @see de.unisiegen.gtitool.ui.convert.AbstractConvertGrammar#performProductions()
*/
@Override
protected void performProductions ()
{
DefaultStateView start = createStateView ( "s" ); //$NON-NLS-1$
start.getState ().setStartState ( true );
DefaultStateView stateView = createStateView ( "f" ); //$NON-NLS-1$
stateView.getState ().setFinalState ( true );
Symbol symbol = new DefaultSymbol ( getGrammar ().getStartSymbol ()
.getName () );
DefaultWord word = new DefaultWord ( symbol );
createTransition ( new DefaultWord (), word, start, stateView,
new ArrayList < Symbol > () );
for ( TerminalSymbol current : getGrammar ().getTerminalSymbolSet () )
{
symbol = new DefaultSymbol ( current.getName () );
word = new DefaultWord ( symbol );
createTransition ( word, new DefaultWord (), stateView, stateView, symbol );
}
for ( Production currentProduction : getGrammar ().getProduction () )
{
Word read = new DefaultWord ( new DefaultSymbol ( currentProduction
.getNonterminalSymbol ().getName () ) );
Word write = new DefaultWord ();
for ( ProductionWordMember currentMember : currentProduction
.getProductionWord () )
{
write.add ( new DefaultSymbol ( currentMember.getName () ) );
}
createTransition ( read, write, stateView, stateView,
new ArrayList < Symbol > () );
}
}
}