Newer
Older
/*
* RegularEquationSolver.h
*
* Created on: 4. 3. 2014
*/
#ifndef REGULAREQUATIONSOLVER_H_
#define REGULAREQUATIONSOLVER_H_
#include <regexp/unbounded/UnboundedRegExp.h>
#include <regexp/unbounded/UnboundedRegExpElement.h>
#include <map>
#include <deque>
#include <queue>
namespace equations {
/**
* Base class for regular equations solvers.
*/
public:
/**
* Adds nonterminal symbol into system.
*
* @param symb given symbol
* @
*/
void addSymbol(const alphabet::Symbol& symbol);
/**
* Removes nonterminal symbol from equation system.
*
* @param symb given symbol
* @throws AlibException when symbol is in use
*/
void removeSymbol(const alphabet::Symbol& symbol);
/**
* Sets nonterminal symbols of the equation system.
* @param symbol Symbols to set
* @throws AlibException
void setSymbols(const std::set<alphabet::Symbol>& symbols);
/**
* Adds equation in form FROM = eq TO
*
* @param from symbol
* @param to symbol
* @param eq equation
*/
void addEquation(const alphabet::Symbol& from, const alphabet::Symbol& to, const regexp::UnboundedRegExpElement& eq);
/**
* Adds equation in form: FROM = eq
*
* @param from
* @param eq
*/
void addEquation(const alphabet::Symbol& from, const regexp::UnboundedRegExpElement& eq);
/**
* Solve expression system
*
* @param solveFor will solve equation system for given symbol
* @return regexp
*/
regexp::UnboundedRegExp solve(const alphabet::Symbol& solveFor);
protected:
/**
* actual equations elimination
* @return pointer to solutions RegExp tree root
*/
virtual regexp::UnboundedRegExp eliminate(void) = 0;
* Runs BFS to determine depth of symbols in equation system and stores it in nonterminalSymbolsByDepth;
* @see nonterminalSymbolsByDepth
void sortSymbolsByDepth(const alphabet::Symbol& solveFor);
/**
* @see symbolsByDepth
*/
std::deque<alphabet::Symbol> nonterminalSymbolsByDepth;
/**
* Stores transitions from nonterminal to nonterminal, eg A = 2A + 2B + 1C
*/
std::map<std::pair<alphabet::Symbol, alphabet::Symbol>, regexp::UnboundedRegExpAlternation> equationTransition;
/**
* Stores equation not going to particular nonterminal, eg A = 01*
*/
std::map<alphabet::Symbol, regexp::UnboundedRegExpAlternation> equationFinal;
/**
* Set of symbols
*/
std::set<alphabet::Symbol> nonterminalSymbols;
};
} /* namespace equations */
#endif /* REGULAREQUATIONSOLVER_H_ */