Skip to content
Snippets Groups Projects
Commit cd445640 authored by Jan Trávníček's avatar Jan Trávníček
Browse files

partial template tree pattern matching automata construction

parent 3df74417
No related branches found
No related tags found
No related merge requests found
...@@ -21,8 +21,6 @@ ...@@ -21,8 +21,6 @@
#include <automaton/PDA/NPDA.h> #include <automaton/PDA/NPDA.h>
#include <automaton/TA/NFTA.h> #include <automaton/TA/NFTA.h>
   
#include <alphabet/BottomOfTheStackSymbol.h>
#include <alib/deque> #include <alib/deque>
#include <alphabet/RankedSymbol.h> #include <alphabet/RankedSymbol.h>
#include <registration/AlgoRegistration.hpp> #include <registration/AlgoRegistration.hpp>
...@@ -119,72 +117,7 @@ automaton::InputDrivenNPDA < > ExactPatternMatchingAutomaton::construct ( const ...@@ -119,72 +117,7 @@ automaton::InputDrivenNPDA < > ExactPatternMatchingAutomaton::construct ( const
   
auto ExactPatternMatchingAutomatonPrefixRankedBarTree = registration::AbstractRegister < ExactPatternMatchingAutomaton, automaton::InputDrivenNPDA < >, const tree::PrefixRankedBarTree < > & > ( ExactPatternMatchingAutomaton::construct ); auto ExactPatternMatchingAutomatonPrefixRankedBarTree = registration::AbstractRegister < ExactPatternMatchingAutomaton, automaton::InputDrivenNPDA < >, const tree::PrefixRankedBarTree < > & > ( ExactPatternMatchingAutomaton::construct );
   
automaton::VisiblyPushdownNPDA < > ExactPatternMatchingAutomaton::construct ( const tree::PrefixRankedBarPattern < > & pattern ) { auto ExactPatternMatchingAutomatonPrefixRankedBarPattern = registration::AbstractRegister < ExactPatternMatchingAutomaton, automaton::VisiblyPushdownNPDA < common::ranked_symbol < DefaultSymbolType, DefaultRankType >, char, unsigned >, const tree::PrefixRankedBarPattern < > & > ( ExactPatternMatchingAutomaton::construct );
automaton::VisiblyPushdownNPDA < > res ( alphabet::BottomOfTheStackSymbol::instance < DefaultSymbolType > ( ) );
res.addState ( DefaultStateType ( 0 ) );
res.addInitialState ( DefaultStateType ( 0 ) );
for ( const common::ranked_symbol < > & symbol : pattern.getAlphabet ( ) ) {
if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol == pattern.getVariablesBar ( ) ) ) continue;
if ( pattern.getBars ( ).count ( symbol ) )
res.addReturnInputSymbol ( DefaultSymbolType ( alphabet::RankedSymbol < > { symbol } ) );
else
res.addCallInputSymbol ( DefaultSymbolType ( alphabet::RankedSymbol < > { symbol } ) );
}
res.setPushdownStoreAlphabet ( { alphabet::BottomOfTheStackSymbol::instance < DefaultSymbolType > ( ) , DefaultSymbolType ( 'T' ), DefaultSymbolType ( 'R' ) } );
for ( const common::ranked_symbol < > & symbol : pattern.getAlphabet ( ) ) {
if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol == pattern.getVariablesBar ( ) ) ) continue;
if ( pattern.getBars ( ).count ( symbol ) )
res.addReturnTransition ( DefaultStateType ( 0 ), DefaultSymbolType ( alphabet::RankedSymbol < > { symbol } ), DefaultSymbolType ( 'T' ), DefaultStateType ( 0 ) );
else
res.addCallTransition ( DefaultStateType ( 0 ), DefaultSymbolType ( alphabet::RankedSymbol < > { symbol } ), DefaultStateType ( 0 ), DefaultSymbolType ( 'T' ) );
}
int i = 1;
for ( const common::ranked_symbol < > & symbol : pattern.getContent ( ) ) {
res.addState ( DefaultStateType ( i ) );
if ( symbol == pattern.getSubtreeWildcard ( ) ) {
for ( const common::ranked_symbol < > & alphabetSymbol : pattern.getAlphabet ( ) ) {
if ( ( alphabetSymbol == pattern.getSubtreeWildcard ( ) ) || ( alphabetSymbol == pattern.getVariablesBar ( ) ) || ( pattern.getBars ( ).count ( alphabetSymbol ) ) ) continue;
res.addCallTransition ( DefaultStateType ( i - 1 ), DefaultSymbolType ( alphabet::RankedSymbol < > { alphabetSymbol } ), DefaultStateType ( i ), DefaultSymbolType ( 'R' ) );
}
} else if ( symbol == pattern.getVariablesBar ( ) ) {
for ( const common::ranked_symbol < > & alphabetSymbol : pattern.getAlphabet ( ) ) {
if ( ( alphabetSymbol == pattern.getSubtreeWildcard ( ) ) || ( alphabetSymbol == pattern.getVariablesBar ( ) ) ) continue;
if ( pattern.getBars ( ).count ( alphabetSymbol ) )
res.addReturnTransition ( DefaultStateType ( i - 1 ), DefaultSymbolType ( alphabet::RankedSymbol < > { alphabetSymbol } ), DefaultSymbolType ( 'T' ), DefaultStateType ( i - 1 ) );
else
res.addCallTransition ( DefaultStateType ( i - 1 ), DefaultSymbolType ( alphabet::RankedSymbol < > { alphabetSymbol } ), DefaultStateType ( i - 1 ), DefaultSymbolType ( 'T' ) );
}
for ( const common::ranked_symbol < > & alphabetSymbol : pattern.getAlphabet ( ) ) {
if ( ( alphabetSymbol == pattern.getSubtreeWildcard ( ) ) || ( alphabetSymbol == pattern.getVariablesBar ( ) ) || ( ! pattern.getBars ( ).count ( alphabetSymbol ) ) ) continue;
res.addReturnTransition ( DefaultStateType ( i - 1 ), DefaultSymbolType ( alphabet::RankedSymbol < > { alphabetSymbol } ), DefaultSymbolType ( 'R' ), DefaultStateType ( i ) );
}
} else if ( pattern.getBars ( ).count ( symbol ) ) {
res.addReturnTransition ( DefaultStateType ( i - 1 ), DefaultSymbolType ( alphabet::RankedSymbol < > { symbol } ), DefaultSymbolType ( 'T' ), DefaultStateType ( i ) );
} else {
res.addCallTransition ( DefaultStateType ( i - 1 ), DefaultSymbolType ( alphabet::RankedSymbol < > { symbol } ), DefaultStateType ( i ), DefaultSymbolType ( 'T' ) );
}
i++;
}
res.addFinalState ( DefaultStateType ( i - 1 ) );
return res;
}
auto ExactPatternMatchingAutomatonPrefixRankedBarPattern = registration::AbstractRegister < ExactPatternMatchingAutomaton, automaton::VisiblyPushdownNPDA < >, const tree::PrefixRankedBarPattern < > & > ( ExactPatternMatchingAutomaton::construct );
   
automaton::NFTA < > ExactPatternMatchingAutomaton::construct ( const tree::RankedTree < > & pattern ) { automaton::NFTA < > ExactPatternMatchingAutomaton::construct ( const tree::RankedTree < > & pattern ) {
return ExactSubtreeMatchingAutomaton::construct ( pattern ); return ExactSubtreeMatchingAutomaton::construct ( pattern );
......
...@@ -11,6 +11,8 @@ ...@@ -11,6 +11,8 @@
#include <automaton/AutomatonFeatures.h> #include <automaton/AutomatonFeatures.h>
#include <tree/TreeFeatures.h> #include <tree/TreeFeatures.h>
   
#include <alphabet/BottomOfTheStackSymbol.h>
namespace arbology { namespace arbology {
   
namespace exact { namespace exact {
...@@ -23,13 +25,80 @@ public: ...@@ -23,13 +25,80 @@ public:
*/ */
static automaton::NPDA < > construct ( const tree::PrefixRankedPattern < > & pattern ); static automaton::NPDA < > construct ( const tree::PrefixRankedPattern < > & pattern );
static automaton::InputDrivenNPDA < > construct ( const tree::PrefixRankedTree < > & pattern ); static automaton::InputDrivenNPDA < > construct ( const tree::PrefixRankedTree < > & pattern );
static automaton::VisiblyPushdownNPDA < > construct ( const tree::PrefixRankedBarPattern < > & pattern ); template < class SymbolType, class RankType >
static automaton::VisiblyPushdownNPDA < common::ranked_symbol < SymbolType, RankType >, char, unsigned > construct ( const tree::PrefixRankedBarPattern < SymbolType, RankType > & pattern );
static automaton::InputDrivenNPDA < > construct ( const tree::PrefixRankedBarTree < > & pattern ); static automaton::InputDrivenNPDA < > construct ( const tree::PrefixRankedBarTree < > & pattern );
static automaton::NFTA < > construct ( const tree::RankedTree < > & pattern ); static automaton::NFTA < > construct ( const tree::RankedTree < > & pattern );
static automaton::NFTA < > construct ( const tree::RankedPattern < > & pattern ); static automaton::NFTA < > construct ( const tree::RankedPattern < > & pattern );
   
}; };
   
template < class SymbolType, class RankType >
automaton::VisiblyPushdownNPDA < common::ranked_symbol < SymbolType, RankType >, char, unsigned > ExactPatternMatchingAutomaton::construct ( const tree::PrefixRankedBarPattern < SymbolType, RankType > & pattern ) {
automaton::VisiblyPushdownNPDA < common::ranked_symbol < SymbolType, RankType >, char, unsigned > res ( alphabet::BottomOfTheStackSymbol::instance < char > ( ) );
res.addState ( 0 );
res.addInitialState ( 0 );
for ( const common::ranked_symbol < SymbolType, RankType > & symbol : pattern.getAlphabet ( ) ) {
if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol == pattern.getVariablesBar ( ) ) ) continue;
if ( pattern.getBars ( ).count ( symbol ) )
res.addReturnInputSymbol ( symbol );
else
res.addCallInputSymbol ( symbol );
}
res.setPushdownStoreAlphabet ( { alphabet::BottomOfTheStackSymbol::instance < char > ( ) , 'T', 'R' } );
for ( const common::ranked_symbol < SymbolType, RankType > & symbol : pattern.getAlphabet ( ) ) {
if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol == pattern.getVariablesBar ( ) ) ) continue;
if ( pattern.getBars ( ).count ( symbol ) )
res.addReturnTransition ( 0, symbol, 'T', 0 );
else
res.addCallTransition ( 0, symbol, 0, 'T' );
}
unsigned i = 1;
for ( const common::ranked_symbol < SymbolType, RankType > & symbol : pattern.getContent ( ) ) {
res.addState ( i );
if ( symbol == pattern.getSubtreeWildcard ( ) ) {
for ( const common::ranked_symbol < SymbolType, RankType > & alphabetSymbol : pattern.getAlphabet ( ) ) {
if ( ( alphabetSymbol == pattern.getSubtreeWildcard ( ) ) || ( alphabetSymbol == pattern.getVariablesBar ( ) ) || ( pattern.getBars ( ).count ( alphabetSymbol ) ) ) continue;
res.addCallTransition ( i - 1, alphabetSymbol, i, 'R' );
}
} else if ( symbol == pattern.getVariablesBar ( ) ) {
for ( const common::ranked_symbol < SymbolType, RankType > & alphabetSymbol : pattern.getAlphabet ( ) ) {
if ( ( alphabetSymbol == pattern.getSubtreeWildcard ( ) ) || ( alphabetSymbol == pattern.getVariablesBar ( ) ) ) continue;
if ( pattern.getBars ( ).count ( alphabetSymbol ) )
res.addReturnTransition ( i - 1, alphabetSymbol, 'T', i - 1 );
else
res.addCallTransition ( i - 1, alphabetSymbol, i - 1, 'T' );
}
for ( const common::ranked_symbol < SymbolType, RankType > & alphabetSymbol : pattern.getAlphabet ( ) ) {
if ( ( alphabetSymbol == pattern.getSubtreeWildcard ( ) ) || ( alphabetSymbol == pattern.getVariablesBar ( ) ) || ( ! pattern.getBars ( ).count ( alphabetSymbol ) ) ) continue;
res.addReturnTransition ( i - 1, alphabetSymbol, 'R', i );
}
} else if ( pattern.getBars ( ).count ( symbol ) ) {
res.addReturnTransition ( i - 1, symbol, 'T', i );
} else {
res.addCallTransition ( i - 1, symbol, i, 'T' );
}
i++;
}
res.addFinalState ( i - 1 );
return res;
}
} /* namespace exact */ } /* namespace exact */
   
} /* namespace arbology */ } /* namespace arbology */
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment