Listing 6a: Class SimpleFA

#ifndef _SIMPFA_H
#define _SIMPFA_H
     
#include "faquery.h"
#include "fabuild.h"
     
#define MAXTRANS  4096
     
class SimpleFA : public CFAQuery, public CFABuild 
{
public: 
  //Constructor
  SimpleFA();
     
  //overridden from CFAQuery 
  virtual bool 
  ToStatesForEvent(int i_from, char i_oninput, CIntSet& o_toset);
  virtual int GetAcceptState(); 
     
  //overridden from CFABuild
  virtual int NewState();
  virtual void 
  AddTransition(int sourceState, char event, int targetState);
  virtual void 
  AddEmptyTransition(int sourceState, int targetState);
  virtual void SetAcceptState(int a_acceptState);
     
private:
  //the tuple that defines a single transition. 
  struct STrans
  {
   int m_from; int m_to; char m_ch;
  };
     
  //the number of states in the FA.
  int m_nstates;
     
  //the array of transitions.
  STrans m_trans[MAXTRANS];
     
  //the number of transitions in the FA. 
  int m_ntrans;
     
  // the accepting state.
  int m_accState;
     
};
     
#endif //_SIMPFA_H
//End of File

Listing 6b: Example of providing user defined storage for FiniteAutomaton

#include "simpfa.h"
     
SimpleFA::SimpleFA()
  : m_ntrans(0), 
    m_accState(invalidState),
    m_nstates(1) // start state always present
{
}
     
int SimpleFA::NewState()
{
  return(m_nstates++);
}
     
// Add new transition for a particular event 
// between two state nodes
void SimpleFA::AddTransition(
   int sourceState, char event, int targetState)
{
  m_trans[m_ntrans].m_from = sourceState; 
  m_trans[m_ntrans].m_ch = event;
  m_trans[m_ntrans].m_to = targetState; 
  m_ntrans++;
}
     
// Add empty transition between two state nodes 
void 
SimpleFA::AddEmptyTransition(int sourceState, int targetState)
{
  AddTransition(sourceState, emptyEvent, targetState);
}
     
// Record what the accept state is.
void SimpleFA::SetAcceptState(int a_acceptState) 
{
  m_accState = a_acceptState;
}
     
// Searches for all state nodes reachable from the given from 
// state for the passed event. returns true if at least one 
// target state is found.
bool SimpleFA::ToStatesForEvent(
   int i_from, char i_oninput, CIntSet& o_toset)
{
  bool retval = false;
  // do a simple linear search of the transitions array.
  for(int i = 0;i < m_ntrans;i++)
  {
    if(m_trans[i].m_from == i_from && 
       m_trans[i].m_ch == i_oninput)
    {
      o_toset.Append(m_trans[i].m_to);
      retval = true;
    }
  }
  return retval;
}
     
int SimpleFA::GetAcceptState()
{
  return m_accState;
}
     
//End of File