Newer
Older
#pragma once
#include <rte/formal/FormalRTE.h>
#include <rte/formal/FormalRTEElements.h>
namespace rte {
class GlushkovIndexate {
public:
/**
* @return FormalRTE with indexed elements
*/
template < class SymbolType >
static FormalRTE < ext::pair < SymbolType, unsigned > > index ( const rte::FormalRTE < SymbolType > & rte ) {
return FormalRTE < ext::pair < SymbolType, unsigned > > ( FormalRTEStructure < ext::pair < SymbolType, unsigned > > ( rte.getRTE ( ).getStructure ( ).template accept < ext::ptr_value < rte::FormalRTEElement < ext::pair < SymbolType, unsigned > > >, GlushkovIndexate::Formal < SymbolType > > ( i ) ) );
template < class SymbolType >
class Formal {
public:
static ext::ptr_value < FormalRTEElement < ext::pair < SymbolType, unsigned > > > visit ( const rte::FormalRTEAlternation < SymbolType > & node, unsigned & i );
static ext::ptr_value < FormalRTEElement < ext::pair < SymbolType, unsigned > > > visit ( const rte::FormalRTESubstitution < SymbolType > & node, unsigned & i );
static ext::ptr_value < FormalRTEElement < ext::pair < SymbolType, unsigned > > > visit ( const rte::FormalRTEIteration < SymbolType > & node, unsigned & i );
static ext::ptr_value < FormalRTEElement < ext::pair < SymbolType, unsigned > > > visit ( const rte::FormalRTESymbolAlphabet < SymbolType > & node, unsigned & i );
static ext::ptr_value < FormalRTEElement < ext::pair < SymbolType, unsigned > > > visit ( const rte::FormalRTESymbolSubst < SymbolType > & node, unsigned & i );
static ext::ptr_value < FormalRTEElement < ext::pair < SymbolType, unsigned > > > visit ( const rte::FormalRTEEmpty < SymbolType > & node, unsigned & i );
template < class SymbolType >
ext::ptr_value < FormalRTEElement < ext::pair < SymbolType, unsigned > > > GlushkovIndexate::Formal < SymbolType >::visit ( const rte::FormalRTESymbolAlphabet < SymbolType > & node, unsigned & i ) {
ext::pair < SymbolType, unsigned > sps = ext::make_pair ( node.getSymbol ( ).getSymbol ( ), i ++ );
ext::ptr_vector < rte::FormalRTEElement < ext::pair < SymbolType, unsigned > > > children;
for ( const rte::FormalRTEElement < SymbolType > & e : node.getElements ( ) ) {
children.push_back ( static_cast < FormalRTEElement < ext::pair < SymbolType, unsigned > > && > ( e.template accept < ext::ptr_value < rte::FormalRTEElement < ext::pair < SymbolType, unsigned > > >, GlushkovIndexate::Formal < SymbolType > > ( i ) ) );
return ext::ptr_value < FormalRTESymbolAlphabet < ext::pair < SymbolType, unsigned > > > ( FormalRTESymbolAlphabet < ext::pair < SymbolType, unsigned > > ( common::ranked_symbol < ext::pair < SymbolType, unsigned > > ( sps , node.getSymbol ( ).getRank ( ) ), std::move ( children ) ) );
template < class SymbolType >
ext::ptr_value < FormalRTEElement < ext::pair < SymbolType, unsigned > > > GlushkovIndexate::Formal < SymbolType >::visit ( const rte::FormalRTESymbolSubst < SymbolType > & node, unsigned & ) {
return ext::ptr_value < FormalRTEElement < ext::pair < SymbolType, unsigned > > > ( FormalRTESymbolSubst < ext::pair < SymbolType, unsigned > > ( common::ranked_symbol < ext::pair < SymbolType, unsigned > > ( ext::make_pair ( node.getSymbol ( ).getSymbol ( ), 0u ), node.getSymbol ( ).getRank ( ) ) ) );
template < class SymbolType >
ext::ptr_value < FormalRTEElement < ext::pair < SymbolType, unsigned > > > GlushkovIndexate::Formal < SymbolType >::visit ( const rte::FormalRTEAlternation < SymbolType > & node, unsigned & i ) {
ext::ptr_value < rte::FormalRTEElement < ext::pair < SymbolType, unsigned > > > left = node.getLeftElement ( ).template accept < ext::ptr_value < rte::FormalRTEElement < ext::pair < SymbolType, unsigned > > >, GlushkovIndexate::Formal < SymbolType > > ( i );
ext::ptr_value < rte::FormalRTEElement < ext::pair < SymbolType, unsigned > > > right = node.getRightElement ( ).template accept < ext::ptr_value < rte::FormalRTEElement < ext::pair < SymbolType, unsigned > > >, GlushkovIndexate::Formal < SymbolType > > ( i );
return ext::ptr_value < FormalRTEElement < ext::pair < SymbolType, unsigned > > > ( FormalRTEAlternation < ext::pair < SymbolType, unsigned > > ( std::move ( left ), std::move ( right ) ) );
template < class SymbolType >
ext::ptr_value < FormalRTEElement < ext::pair < SymbolType, unsigned > > > GlushkovIndexate::Formal < SymbolType >::visit ( const rte::FormalRTESubstitution < SymbolType > & node, unsigned & i ) {
ext::ptr_value < rte::FormalRTEElement < ext::pair < SymbolType, unsigned > > > left = node.getLeftElement ( ).template accept < ext::ptr_value < rte::FormalRTEElement < ext::pair < SymbolType, unsigned > > >, GlushkovIndexate::Formal < SymbolType > > ( i );
ext::ptr_value < rte::FormalRTEElement < ext::pair < SymbolType, unsigned > > > right = node.getRightElement ( ).template accept < ext::ptr_value < rte::FormalRTEElement < ext::pair < SymbolType, unsigned > > >, GlushkovIndexate::Formal < SymbolType > > ( i );
FormalRTESymbolSubst < ext::pair < SymbolType, unsigned > > substSymbol ( common::ranked_symbol < ext::pair < SymbolType, unsigned > > ( ext::make_pair ( node.getSubstitutionSymbol ( ).getSymbol ( ).getSymbol ( ), 0u ), node.getSubstitutionSymbol ( ).getSymbol ( ).getRank ( ) ) );
return ext::ptr_value < FormalRTEElement < ext::pair < SymbolType, unsigned > > > ( FormalRTESubstitution < ext::pair < SymbolType, unsigned > > ( std::move ( left ), std::move ( right ), std::move ( substSymbol ) ) );
template < class SymbolType >
ext::ptr_value < FormalRTEElement < ext::pair < SymbolType, unsigned > > > GlushkovIndexate::Formal < SymbolType >::visit ( const rte::FormalRTEIteration < SymbolType > & node, unsigned & i ) {
ext::ptr_value < rte::FormalRTEElement < ext::pair < SymbolType, unsigned > > > element = node.getElement ( ).template accept < ext::ptr_value < rte::FormalRTEElement < ext::pair < SymbolType, unsigned > > >, GlushkovIndexate::Formal < SymbolType > > ( i );
FormalRTESymbolSubst < ext::pair < SymbolType, unsigned > > substSymbol ( common::ranked_symbol < ext::pair < SymbolType, unsigned > > ( ext::make_pair ( node.getSubstitutionSymbol ( ).getSymbol ( ).getSymbol ( ), 0u ), node.getSubstitutionSymbol ( ).getSymbol ( ).getRank ( ) ) );
return ext::ptr_value < FormalRTEElement < ext::pair < SymbolType, unsigned > > > ( FormalRTEIteration < ext::pair < SymbolType, unsigned > > ( std::move ( element ), std::move ( substSymbol ) ) );
template < class SymbolType >
ext::ptr_value < FormalRTEElement < ext::pair < SymbolType, unsigned > > > GlushkovIndexate::Formal < SymbolType >::visit ( const rte::FormalRTEEmpty < SymbolType > &, unsigned & ) {
return ext::ptr_value < FormalRTEElement < ext::pair < SymbolType, unsigned > > > ( FormalRTEEmpty < ext::pair < SymbolType, unsigned > > ( ) );