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 @@
#include <tree/ranked/RankedPattern.h>
#include <tree/ranked/PrefixRankedTree.h>
#include <tree/ranked/PrefixRankedPattern.h>
#include <tree/ranked/PrefixRankedBarTree.h>
#include <tree/ranked/PrefixRankedBarPattern.h>
 
#include <automaton/PDA/InputDrivenNPDA.h>
#include <automaton/PDA/VisiblyPushdownNPDA.h>
#include <automaton/PDA/NPDA.h>
#include <automaton/TA/NFTA.h>
 
#include <alphabet/BottomOfTheStackSymbol.h>
#include <deque>
 
namespace arbology {
......@@ -62,6 +67,8 @@ automaton::NPDA ExactPatternMatchingAutomaton::construct ( const tree::PrefixRan
automaton::NPDA res ( automaton::State ( 0 ), alphabet::symbolFrom ( 'T' ) );
 
for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) {
if ( symbol == pattern.getSubtreeWildcard ( ) ) continue;
res.addInputSymbol ( alphabet::Symbol { symbol } );
}
 
......@@ -111,6 +118,79 @@ automaton::NPDA ExactPatternMatchingAutomaton::construct ( const tree::PrefixRan
 
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 ) {
return ExactSubtreeMatchingAutomaton::construct ( pattern );
}
......
......@@ -30,6 +30,8 @@ public:
 
static automaton::NPDA construct ( const tree::PrefixRankedPattern & 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::RankedPattern & pattern );
 
......
......@@ -7,12 +7,15 @@
 
#include "ExactSubtreeMatchingAutomaton.h"
#include <exception/AlibException.h>
#include <tree/ranked/PrefixRankedBarTree.h>
#include <tree/ranked/PrefixRankedTree.h>
#include <tree/ranked/RankedTree.h>
 
#include <automaton/PDA/InputDrivenNPDA.h>
#include <automaton/TA/NFTA.h>
 
#include <alphabet/BottomOfTheStackSymbol.h>
#include <deque>
 
namespace arbology {
......@@ -49,6 +52,38 @@ automaton::InputDrivenNPDA ExactSubtreeMatchingAutomaton::construct ( const tree
 
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 ) {
std::vector < automaton::State > states;
 
......
......@@ -29,6 +29,7 @@ public:
static automaton::Automaton construct ( const tree::Tree & 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 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