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

aPrefixRankedBarTree/Pattern -> matching automaton

parent ed864e2b
No related branches found
No related tags found
No related merge requests found
...@@ -14,11 +14,16 @@ ...@@ -14,11 +14,16 @@
#include <tree/ranked/RankedPattern.h> #include <tree/ranked/RankedPattern.h>
#include <tree/ranked/PrefixRankedTree.h> #include <tree/ranked/PrefixRankedTree.h>
#include <tree/ranked/PrefixRankedPattern.h> #include <tree/ranked/PrefixRankedPattern.h>
#include <tree/ranked/PrefixRankedBarTree.h>
#include <tree/ranked/PrefixRankedBarPattern.h>
   
#include <automaton/PDA/InputDrivenNPDA.h> #include <automaton/PDA/InputDrivenNPDA.h>
#include <automaton/PDA/VisiblyPushdownNPDA.h>
#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 <deque> #include <deque>
   
namespace arbology { namespace arbology {
...@@ -62,6 +67,8 @@ automaton::NPDA ExactPatternMatchingAutomaton::construct ( const tree::PrefixRan ...@@ -62,6 +67,8 @@ automaton::NPDA ExactPatternMatchingAutomaton::construct ( const tree::PrefixRan
automaton::NPDA res ( automaton::State ( 0 ), alphabet::symbolFrom ( 'T' ) ); automaton::NPDA res ( automaton::State ( 0 ), alphabet::symbolFrom ( 'T' ) );
   
for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) { for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) {
if ( symbol == pattern.getSubtreeWildcard ( ) ) continue;
res.addInputSymbol ( alphabet::Symbol { symbol } ); res.addInputSymbol ( alphabet::Symbol { symbol } );
} }
   
...@@ -111,6 +118,79 @@ automaton::NPDA ExactPatternMatchingAutomaton::construct ( const tree::PrefixRan ...@@ -111,6 +118,79 @@ automaton::NPDA ExactPatternMatchingAutomaton::construct ( const tree::PrefixRan
   
auto ExactPatternMatchingAutomatonPrefixRankedPattern = ExactPatternMatchingAutomaton::RegistratorWrapper < automaton::NPDA, tree::PrefixRankedPattern > ( ExactPatternMatchingAutomaton::getInstance ( ), ExactPatternMatchingAutomaton::construct ); auto ExactPatternMatchingAutomatonPrefixRankedPattern = ExactPatternMatchingAutomaton::RegistratorWrapper < automaton::NPDA, tree::PrefixRankedPattern > ( ExactPatternMatchingAutomaton::getInstance ( ), ExactPatternMatchingAutomaton::construct );
   
automaton::InputDrivenNPDA ExactPatternMatchingAutomaton::construct ( const tree::PrefixRankedBarTree & pattern ) {
return ExactSubtreeMatchingAutomaton::construct ( pattern );
}
auto ExactPatternMatchingAutomatonPrefixRankedBarTree = ExactPatternMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA, tree::PrefixRankedBarTree > ( ExactPatternMatchingAutomaton::getInstance ( ), ExactPatternMatchingAutomaton::construct );
automaton::VisiblyPushdownNPDA ExactPatternMatchingAutomaton::construct ( const tree::PrefixRankedBarPattern & pattern ) {
automaton::VisiblyPushdownNPDA res ( alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } );
res.addState ( automaton::State ( 0 ) );
res.addInitialState ( automaton::State ( 0 ) );
for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) {
if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) ) continue;
if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) )
res.addReturnInputSymbol ( alphabet::Symbol { symbol } );
else
res.addCallInputSymbol ( alphabet::Symbol { symbol } );
}
res.setStackAlphabet ( { alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK }, alphabet::symbolFrom ( 'T' ), alphabet::symbolFrom ( 'R' ) } );
for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) {
if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) ) continue;
if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) )
res.addReturnTransition ( automaton::State ( 0 ), alphabet::Symbol { symbol }, alphabet::symbolFrom ( 'T' ), automaton::State ( 0 ) );
else
res.addCallTransition ( automaton::State ( 0 ), alphabet::Symbol { symbol }, automaton::State ( 0 ), alphabet::symbolFrom ( 'T' ) );
}
int i = 1;
for ( const alphabet::RankedSymbol & symbol : pattern.getContent ( ) ) {
res.addState ( automaton::State ( i ) );
if ( symbol == pattern.getSubtreeWildcard ( ) ) {
for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) {
if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) || ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) ) ) continue;
res.addCallTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, automaton::State ( i ), alphabet::symbolFrom ( 'R' ) );
}
} else if ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) {
for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) {
if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) ) continue;
if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) )
res.addReturnTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, alphabet::symbolFrom ( 'T' ), automaton::State ( i - 1 ) );
else
res.addCallTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, automaton::State ( i - 1 ), alphabet::symbolFrom ( 'T' ) );
}
for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) {
if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) || ( symbol.getSymbol ( ) != pattern.getBarSymbol ( ) ) ) continue;
res.addReturnTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, alphabet::symbolFrom ( 'R' ), automaton::State ( i ) );
}
} else if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) ) {
res.addReturnTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, alphabet::symbolFrom ( 'T' ), automaton::State ( i ) );
} else {
res.addCallTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, automaton::State ( i ), alphabet::symbolFrom ( 'T' ) );
}
i++;
}
res.addFinalState ( automaton::State ( i - 1 ) );
return res;
}
auto ExactPatternMatchingAutomatonPrefixRankedBarPattern = ExactPatternMatchingAutomaton::RegistratorWrapper < automaton::VisiblyPushdownNPDA, tree::PrefixRankedBarPattern > ( ExactPatternMatchingAutomaton::getInstance ( ), 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 );
} }
......
...@@ -30,6 +30,8 @@ public: ...@@ -30,6 +30,8 @@ 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 );
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 );
   
......
...@@ -7,12 +7,15 @@ ...@@ -7,12 +7,15 @@
   
#include "ExactSubtreeMatchingAutomaton.h" #include "ExactSubtreeMatchingAutomaton.h"
#include <exception/AlibException.h> #include <exception/AlibException.h>
#include <tree/ranked/PrefixRankedBarTree.h>
#include <tree/ranked/PrefixRankedTree.h> #include <tree/ranked/PrefixRankedTree.h>
#include <tree/ranked/RankedTree.h> #include <tree/ranked/RankedTree.h>
   
#include <automaton/PDA/InputDrivenNPDA.h> #include <automaton/PDA/InputDrivenNPDA.h>
#include <automaton/TA/NFTA.h> #include <automaton/TA/NFTA.h>
   
#include <alphabet/BottomOfTheStackSymbol.h>
#include <deque> #include <deque>
   
namespace arbology { namespace arbology {
...@@ -49,6 +52,38 @@ automaton::InputDrivenNPDA ExactSubtreeMatchingAutomaton::construct ( const tree ...@@ -49,6 +52,38 @@ automaton::InputDrivenNPDA ExactSubtreeMatchingAutomaton::construct ( const tree
   
auto ExactSubtreeMatchingAutomatonPrefixRankedTree = ExactSubtreeMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA, tree::PrefixRankedTree > ( ExactSubtreeMatchingAutomaton::getInstance ( ), ExactSubtreeMatchingAutomaton::construct ); auto ExactSubtreeMatchingAutomatonPrefixRankedTree = ExactSubtreeMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA, tree::PrefixRankedTree > ( ExactSubtreeMatchingAutomaton::getInstance ( ), ExactSubtreeMatchingAutomaton::construct );
   
automaton::InputDrivenNPDA ExactSubtreeMatchingAutomaton::construct ( const tree::PrefixRankedBarTree & pattern ) {
automaton::InputDrivenNPDA res ( automaton::State ( 0 ), alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } );
res.setStackAlphabet ( { alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK }, alphabet::symbolFrom ( 'S' ) } );
for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) {
res.addInputSymbol ( alphabet::Symbol { symbol } );
if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) )
res.setPushdownStoreOperation ( alphabet::Symbol { symbol }, std::vector < alphabet::Symbol > { 1, alphabet::symbolFrom ( 'S' ) }, std::vector < alphabet::Symbol > { } );
else
res.setPushdownStoreOperation ( alphabet::Symbol { symbol }, std::vector < alphabet::Symbol > { }, std::vector < alphabet::Symbol > { 1, alphabet::symbolFrom ( 'S' ) } );
}
for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) {
res.addTransition ( automaton::State ( 0 ), alphabet::Symbol { symbol }, automaton::State ( 0 ) );
}
int i = 1;
for ( const alphabet::RankedSymbol & symbol : pattern.getContent ( ) ) {
res.addState ( automaton::State ( i ) );
res.addTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, automaton::State ( i ) );
i++;
}
res.addFinalState ( automaton::State ( i - 1 ) );
return res;
}
auto ExactSubtreeMatchingAutomatonPrefixRankedBarTree = ExactSubtreeMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA, tree::PrefixRankedBarTree > ( ExactSubtreeMatchingAutomaton::getInstance ( ), ExactSubtreeMatchingAutomaton::construct );
automaton::State constructRecursive ( const tree::RankedNode & node, automaton::NFTA & res, int & nextState ) { automaton::State constructRecursive ( const tree::RankedNode & node, automaton::NFTA & res, int & nextState ) {
std::vector < automaton::State > states; std::vector < automaton::State > states;
   
......
...@@ -29,6 +29,7 @@ public: ...@@ -29,6 +29,7 @@ public:
static automaton::Automaton construct ( const tree::Tree & pattern ); static automaton::Automaton construct ( const tree::Tree & pattern );
   
static automaton::InputDrivenNPDA construct ( const tree::PrefixRankedTree & pattern ); static automaton::InputDrivenNPDA construct ( const tree::PrefixRankedTree & 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 ExactSubtreeMatchingAutomaton & getInstance ( ) { static ExactSubtreeMatchingAutomaton & getInstance ( ) {
......
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