diff --git a/alib2algo/src/arbology/exact/BadCharacterShiftTable.cpp b/alib2algo/src/arbology/exact/BadCharacterShiftTable.cpp index 9fa0b5aa779d4c4de6ab4528a4b1b11a9634a22f..08ceca90ae7a6543a59934a34331f584bfeb3a2e 100644 --- a/alib2algo/src/arbology/exact/BadCharacterShiftTable.cpp +++ b/alib2algo/src/arbology/exact/BadCharacterShiftTable.cpp @@ -24,7 +24,7 @@ std::map < alphabet::RankedSymbol, size_t > BadCharacterShiftTable::bcs ( const // initialisation of bcs table to the size of the pattern for ( const alphabet::RankedSymbol & symbol : alphabet ) { - if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) ) continue; + if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol == pattern.getVariablesBar ( ) ) ) continue; bcs.insert ( std::make_pair ( symbol, pattern.getContent ( ).size ( ) ) ); } @@ -40,11 +40,11 @@ std::map < alphabet::RankedSymbol, size_t > BadCharacterShiftTable::bcs ( const // limit the shift by occurrence of the last variable for ( const alphabet::RankedSymbol & symbol : alphabet ) { - if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) ) continue; + if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol == pattern.getVariablesBar ( ) ) ) continue; size_t tmp = lastSOffset; - if ( symbol.getSymbol ( ) != pattern.getBarSymbol ( ) ) + if ( ! pattern.getBars ( ).count ( symbol ) ) // size of the smallest subtree containing given terminal depend // on the arity of the terminal tmp += symbol.getRank ( ).getData ( ) * 2; @@ -59,13 +59,14 @@ std::map < alphabet::RankedSymbol, size_t > BadCharacterShiftTable::bcs ( const } // limit the shift by position of symbols within the pattern - for ( unsigned i = 0; i < pattern.getContent ( ).size ( ) - 1; i++ ) // last symbol is not concerned - if ( ( pattern.getContent ( )[i] != pattern.getSubtreeWildcard ( ) ) && ( pattern.getContent ( )[i].getSymbol ( ) != pattern.getVariablesBarSymbol ( ) ) ) { - size_t tmp = pattern.getContent ( ).size ( ) - i - 1; + for ( unsigned i = 0; i < pattern.getContent ( ).size ( ) - 1; i++ ) { // last symbol is not concerned + if ( ( pattern.getContent ( )[i] == pattern.getSubtreeWildcard ( ) ) || ( pattern.getContent ( )[i] == pattern.getVariablesBar ( ) ) ) continue; - if ( bcs[pattern.getContent ( )[i]] > tmp ) - bcs[pattern.getContent ( )[i]] = tmp; - } + size_t tmp = pattern.getContent ( ).size ( ) - i - 1; + + if ( bcs[pattern.getContent ( )[i]] > tmp ) + bcs[pattern.getContent ( )[i]] = tmp; + } return bcs; } diff --git a/alib2algo/src/arbology/exact/BoyerMooreHorspool.cpp b/alib2algo/src/arbology/exact/BoyerMooreHorspool.cpp index 92813d1fa4d99e0af43f9d8de2e25ea7e134c402..1d0905226c05a10110847c2070b5805e128cb403 100644 --- a/alib2algo/src/arbology/exact/BoyerMooreHorspool.cpp +++ b/alib2algo/src/arbology/exact/BoyerMooreHorspool.cpp @@ -52,7 +52,7 @@ std::set < unsigned > BoyerMooreHorspool::match ( const tree::PrefixRankedBarTre // match of symbol offset = offset - 1; j = j - 1; - } else if ( ( pattern.getContent ( )[j].getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) && ( subject.getContent ( )[offset].getSymbol ( ) == pattern.getBarSymbol ( ) ) ) { + } else if ( ( pattern.getContent ( )[j] == pattern.getVariablesBar ( ) ) && ( pattern.getBars ( ).count ( subject.getContent ( )[offset] )) ) { // match of variable with subtree offset = subjectSubtreeJumpTable[offset]; j = j - 2; @@ -64,7 +64,7 @@ std::set < unsigned > BoyerMooreHorspool::match ( const tree::PrefixRankedBarTre // match was found if ( j == 0 ) occ.insert ( offset ); - // shift heristics + // shift heuristics i += bcs[subject.getContent ( )[i + pattern.getContent ( ).size ( ) - 1]]; } diff --git a/alib2algo/src/arbology/exact/DeadZoneUsingBadCharacterShiftAndBorderArray.cpp b/alib2algo/src/arbology/exact/DeadZoneUsingBadCharacterShiftAndBorderArray.cpp index c0bb52488a644f26c9426a43786db589f126e14e..64d229e3d167cff9f33a89a1869fbff9fbb93641 100644 --- a/alib2algo/src/arbology/exact/DeadZoneUsingBadCharacterShiftAndBorderArray.cpp +++ b/alib2algo/src/arbology/exact/DeadZoneUsingBadCharacterShiftAndBorderArray.cpp @@ -59,7 +59,7 @@ void DeadZoneUsingBadCharacterShiftAndBorderArray::match_rec ( std::set < unsign // match of symbol offset++; j++; - } else if ( ( pattern.getContent ( )[j] == pattern.getSubtreeWildcard ( ) ) && ( subject.getContent ( )[offset].getSymbol ( ) != pattern.getBarSymbol ( ) ) ) { + } else if ( ( pattern.getContent ( )[j] == pattern.getSubtreeWildcard ( ) ) && ( ! pattern.getBars ( ).count ( subject.getContent ( )[offset] ) ) ) { // match of variable with subtree offset = subjectSubtreeJumpTable[offset]; j += 2; diff --git a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp index 2ec5ce847ffca6e873873c53f4d9331b7e6e6922..a0cb96c0bba3826816a462c8e745652d53283d7c 100644 --- a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp +++ b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp @@ -130,9 +130,9 @@ automaton::VisiblyPushdownNPDA ExactPatternMatchingAutomaton::construct ( const res.addInitialState ( automaton::State ( 0 ) ); for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) { - if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) ) continue; + if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol == pattern.getVariablesBar ( ) ) ) continue; - if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) ) + if ( pattern.getBars ( ).count ( symbol ) ) res.addReturnInputSymbol ( alphabet::Symbol { symbol } ); else res.addCallInputSymbol ( alphabet::Symbol { symbol } ); @@ -141,9 +141,9 @@ automaton::VisiblyPushdownNPDA ExactPatternMatchingAutomaton::construct ( const 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 == pattern.getSubtreeWildcard ( ) ) || ( symbol == pattern.getVariablesBar ( ) ) ) continue; - if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) ) + if ( pattern.getBars ( ).count ( symbol ) ) 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' ) ); @@ -156,26 +156,26 @@ automaton::VisiblyPushdownNPDA ExactPatternMatchingAutomaton::construct ( const if ( symbol == pattern.getSubtreeWildcard ( ) ) { for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) { - if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) || ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) ) ) continue; + if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol == pattern.getVariablesBar ( ) ) || ( pattern.getBars ( ).count ( symbol ) ) ) continue; res.addCallTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, automaton::State ( i ), alphabet::symbolFrom ( 'R' ) ); } - } else if ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) { + } else if ( symbol == pattern.getVariablesBar ( ) ) { for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) { - if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) ) continue; + if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol == pattern.getVariablesBar ( ) ) ) continue; - if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) ) + if ( pattern.getBars ( ).count ( symbol ) ) 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; + if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol == pattern.getVariablesBar ( ) ) || ( ! pattern.getBars ( ).count ( symbol ) ) ) continue; res.addReturnTransition ( automaton::State ( i - 1 ), alphabet::Symbol { symbol }, alphabet::symbolFrom ( 'R' ), automaton::State ( i ) ); } - } else if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) ) { + } else if ( pattern.getBars ( ).count ( symbol ) ) { 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' ) ); diff --git a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp index af9fc4a11db66e82603c63e72d83399e804cffa9..432f1c16386a9a04145f3f34cd3ddaec5d76736f 100644 --- a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp +++ b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp @@ -59,7 +59,7 @@ automaton::InputDrivenNPDA ExactSubtreeMatchingAutomaton::construct ( const tree for ( const alphabet::RankedSymbol & symbol : pattern.getAlphabet ( ) ) { res.addInputSymbol ( alphabet::Symbol { symbol } ); - if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) ) + if ( pattern.getBars ( ).count ( symbol ) ) 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' ) } ); diff --git a/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.cpp b/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.cpp index 32e1ee6caea3f9385bd7d05e411b6c874268933b..5a8fee56a45f5cabe8cb160ff60a07a0997abcdf 100644 --- a/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.cpp +++ b/alib2algo/src/arbology/exact/ExactSubtreeRepeatsNaive.cpp @@ -110,7 +110,7 @@ tree::PrefixRankedBarTree ExactSubtreeRepeatsNaive::repeats ( const tree::Prefix std::map < std::pair < alphabet::RankedSymbol, std::vector < alphabet::RankedSymbol > >, int > data; repeatsPrefixRankedBar ( tree.getContent ( ), res, data, minId, index ); - return tree::PrefixRankedBarTree ( tree.getBarSymbol ( ), res ); + return tree::PrefixRankedBarTree ( tree.getBars ( ), res ); } auto ExactRepeatsNaivePrefixRankedBarTree = ExactSubtreeRepeatsNaive::RegistratorWrapper < tree::PrefixRankedBarTree, tree::PrefixRankedBarTree > ( ExactSubtreeRepeatsNaive::repeats ); diff --git a/alib2algo/src/arbology/exact/KnuthMorrisPratt.cpp b/alib2algo/src/arbology/exact/KnuthMorrisPratt.cpp index 8e9f0b6aca0c041b4d4d2bdabffc65672a8896e7..795f324a131d7eb72f345e28d2b4480b4a6ca8ae 100644 --- a/alib2algo/src/arbology/exact/KnuthMorrisPratt.cpp +++ b/alib2algo/src/arbology/exact/KnuthMorrisPratt.cpp @@ -54,7 +54,7 @@ std::set < unsigned > KnuthMorrisPratt::match ( const tree::PrefixRankedBarTree // match of symbol offset++; j++; - } else if ( ( pattern.getContent ( )[j] == pattern.getSubtreeWildcard ( ) ) && ( subject.getContent ( )[offset].getSymbol ( ) != pattern.getBarSymbol ( ) ) ) { + } else if ( ( pattern.getContent ( )[j] == pattern.getSubtreeWildcard ( ) ) && ( ! pattern.getBars ( ).count ( subject.getContent ( )[offset] ) ) ) { // match of variable with subtree offset = subjectSubtreeJumpTable[offset]; j += 2; @@ -66,7 +66,7 @@ std::set < unsigned > KnuthMorrisPratt::match ( const tree::PrefixRankedBarTree // match was found if ( j >= pattern.getContent ( ).size ( ) ) occ.insert ( i ); - // shift heristics + // shift heuristics i += j - ba[j]; } diff --git a/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp b/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp index 810ed8417a5d60644c00eebced0137c57b5b99d8..e8e345eb76bbe0954b1f94b77705671bafe290fe 100644 --- a/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp +++ b/alib2algo/src/arbology/exact/ReversedBadCharacterShiftTable.cpp @@ -25,7 +25,7 @@ std::map < alphabet::RankedSymbol, size_t > ReversedBadCharacterShiftTable::bcs // initialisation of bcs table to the size of the pattern for ( const alphabet::RankedSymbol & symbol : alphabet ) { - if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) ) continue; + if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol == pattern.getVariablesBar ( ) ) ) continue; bcs.insert ( std::make_pair ( symbol, pattern.getContent ( ).size ( ) ) ); } @@ -35,17 +35,17 @@ std::map < alphabet::RankedSymbol, size_t > ReversedBadCharacterShiftTable::bcs unsigned firstSBarOffset = pattern.getContent ( ).size ( ) + 1; for ( int i = ( int ) pattern.getContent ( ).size ( ) - 1; i >= 0; i-- ) - if ( pattern.getContent ( )[i].getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) + if ( pattern.getContent ( )[i] == pattern.getVariablesBar ( ) ) firstSBarOffset = i; // limit the shift by occurrence of the last variable for ( const alphabet::RankedSymbol & symbol : alphabet ) { - if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol.getSymbol ( ) == pattern.getVariablesBarSymbol ( ) ) ) continue; + if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol == pattern.getVariablesBar ( ) ) ) continue; size_t tmp = firstSBarOffset; - if ( symbol.getSymbol ( ) == pattern.getBarSymbol ( ) ) + if ( pattern.getBars ( ).count ( symbol ) ) // size of the smallest subtree containing given terminal depend // on the arity of the terminal tmp += symbol.getRank ( ).getData ( ) * 2; @@ -60,13 +60,14 @@ std::map < alphabet::RankedSymbol, size_t > ReversedBadCharacterShiftTable::bcs } // limit the shift by position of symbols within the pattern - for ( unsigned i = pattern.getContent ( ).size ( ) - 1; i >= 1; i-- ) // first symbol is not concerned - if ( ( pattern.getContent ( )[i] != pattern.getSubtreeWildcard ( ) ) && ( pattern.getContent ( )[i].getSymbol ( ) != pattern.getVariablesBarSymbol ( ) ) ) { - size_t tmp = i; + for ( unsigned i = pattern.getContent ( ).size ( ) - 1; i >= 1; i-- ) { // first symbol is not concerned + if ( ( pattern.getContent ( )[i] == pattern.getSubtreeWildcard ( ) ) || ( pattern.getContent ( )[i] == pattern.getVariablesBar ( ) ) ) continue; - if ( bcs[pattern.getContent ( )[i]] > tmp ) - bcs[pattern.getContent ( )[i]] = tmp; - } + size_t tmp = i; + + if ( bcs[pattern.getContent ( )[i]] > tmp ) + bcs[pattern.getContent ( )[i]] = tmp; + } return bcs; } @@ -104,13 +105,13 @@ std::map < alphabet::RankedSymbol, size_t > ReversedBadCharacterShiftTable::bcs } // limit the shift by position of symbols within the pattern - for ( unsigned i = pattern.getContent ( ).size ( ) - 1; i >= 1; i-- ) // first symbol is not concerned - if ( pattern.getContent ( )[i] != pattern.getSubtreeWildcard ( ) ) { - size_t tmp = i; + for ( unsigned i = pattern.getContent ( ).size ( ) - 1; i >= 1; i-- ) { // first symbol is not concerned + if ( pattern.getContent ( )[i] == pattern.getSubtreeWildcard ( ) ) continue; + size_t tmp = i; - if ( bcs[pattern.getContent ( )[i]] > tmp ) - bcs[pattern.getContent ( )[i]] = tmp; - } + if ( bcs[pattern.getContent ( )[i]] > tmp ) + bcs[pattern.getContent ( )[i]] = tmp; + } return bcs; } diff --git a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp index 7698cf64a65fc45332c8fde1a38d5e9af2fc902d..c6ddbfb88e4f4dbcd1c3c0d9511208c2f4f80bf2 100644 --- a/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp +++ b/alib2algo/src/arbology/exact/ReversedBoyerMooreHorspool.cpp @@ -54,7 +54,7 @@ std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRank // match of symbol offset = offset + 1; j = j + 1; - } else if ( ( pattern.getContent ( )[j] == pattern.getSubtreeWildcard ( ) ) && ( subject.getContent ( )[offset].getSymbol ( ) != pattern.getBarSymbol ( ) ) ) { + } else if ( ( pattern.getContent ( )[j] == pattern.getSubtreeWildcard ( ) ) && ( ! pattern.getBars ( ).count ( subject.getContent ( )[offset] ) ) ) { // match of variable with subtree offset = subjectSubtreeJumpTable[offset]; j = j + 2; @@ -66,7 +66,7 @@ std::set < unsigned > ReversedBoyerMooreHorspool::match ( const tree::PrefixRank // match was found if ( j == pattern.getContent ( ).size ( ) ) occ.insert ( i ); - // shift heristics + // shift heuristics i -= bcs[subject.getContent ( )[i]]; } diff --git a/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp b/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp index 96eb18c220489dc2bf982a2dc9c7bee726de5686..b8b151d01fb13860779e675aadcd0e36981d6d85 100644 --- a/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp +++ b/alib2algo/src/arbology/exact/SubtreeJumpTable.cpp @@ -73,7 +73,7 @@ int SubtreeJumpTable::buildDataPointersBar ( std::vector < int > & res, const T res.push_back ( 0 ); int index = begin + 1; - if ( subject.getContent ( )[begin].getSymbol ( ) != subject.getBarSymbol ( ) ) + if ( ! subject.getBars ( ).count ( subject.getContent ( )[begin] ) ) for ( unsigned i = 0; i < subject.getContent ( )[begin].getRank ( ).getData ( ); i++ ) index = buildDataPointersBar ( res, subject, index ); diff --git a/alib2data/src/tree/common/TreeFromXMLParser.cpp b/alib2data/src/tree/common/TreeFromXMLParser.cpp index 11aa1a1c3f02dc77ee55027e14ce9e2121c5f9d5..2cebc7588f3752a47669dfb3ecbf31ad131d7350 100644 --- a/alib2data/src/tree/common/TreeFromXMLParser.cpp +++ b/alib2data/src/tree/common/TreeFromXMLParser.cpp @@ -20,6 +20,18 @@ alphabet::Symbol TreeFromXMLParser::parseBar ( std::deque < sax::Token >::iterat return bar; } +std::set < alphabet::RankedSymbol > TreeFromXMLParser::parseBars ( std::deque < sax::Token >::iterator & input ) { + std::set < alphabet::RankedSymbol > bars; + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "bars" ); + + while ( sax::FromXMLParserHelper::isTokenType ( input, sax::Token::TokenType::START_ELEMENT ) ) + bars.insert ( alib::xmlApi < alphabet::RankedSymbol >::parse ( input ) ); + + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "bars" ); + + return bars; +} + alphabet::Symbol TreeFromXMLParser::parseVariablesBar ( std::deque < sax::Token >::iterator & input ) { sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "variablesBar" ); alphabet::Symbol variablesBar ( alib::xmlApi < alphabet::Symbol >::parse ( input ) ); @@ -28,6 +40,14 @@ alphabet::Symbol TreeFromXMLParser::parseVariablesBar ( std::deque < sax::Token return variablesBar; } +alphabet::RankedSymbol TreeFromXMLParser::parseRankedVariablesBar ( std::deque < sax::Token >::iterator & input ) { + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "RankedVariablesBar" ); + alphabet::RankedSymbol rankedVariablesBar ( alib::xmlApi < alphabet::RankedSymbol >::parse ( input ) ); + sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, "RankedVariablesBar" ); + + return rankedVariablesBar; +} + alphabet::Symbol TreeFromXMLParser::parseSubtreeWildcardSymbol ( std::deque < sax::Token >::iterator & input ) { sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, "subtreeWildcard" ); alphabet::Symbol subtreeWildcard ( alib::xmlApi < alphabet::Symbol >::parse ( input ) ); diff --git a/alib2data/src/tree/common/TreeFromXMLParser.h b/alib2data/src/tree/common/TreeFromXMLParser.h index 292bf38d222c5f03fa39fbdd179532514e544f54..490ab1100a8ed779e11e37f538f802e1e016591e 100644 --- a/alib2data/src/tree/common/TreeFromXMLParser.h +++ b/alib2data/src/tree/common/TreeFromXMLParser.h @@ -34,7 +34,9 @@ public: static std::set < alphabet::Symbol > parseUnrankedAlphabet ( std::deque < sax::Token >::iterator & input ); static alphabet::Symbol parseBar ( std::deque < sax::Token >::iterator & input ); + static std::set < alphabet::RankedSymbol > parseBars ( std::deque < sax::Token >::iterator & input ); static alphabet::Symbol parseVariablesBar ( std::deque < sax::Token >::iterator & input ); + static alphabet::RankedSymbol parseRankedVariablesBar ( std::deque < sax::Token >::iterator & input ); static alphabet::Symbol parseSubtreeWildcardSymbol ( std::deque < sax::Token >::iterator & input ); static alphabet::RankedSymbol parseSubtreeWildcardRankedSymbol ( std::deque < sax::Token >::iterator & input ); diff --git a/alib2data/src/tree/common/TreeToXMLComposer.cpp b/alib2data/src/tree/common/TreeToXMLComposer.cpp index 89bee9d20fd43dc929b8a0b0f7f750f3f24a9b3b..2ebc5b3e402b4ed10212cbe3aa709b4e8140256f 100644 --- a/alib2data/src/tree/common/TreeToXMLComposer.cpp +++ b/alib2data/src/tree/common/TreeToXMLComposer.cpp @@ -16,12 +16,27 @@ void TreeToXMLComposer::composeBar ( std::deque < sax::Token > & out, const alph out.emplace_back ( sax::Token ( "bar", sax::Token::TokenType::END_ELEMENT ) ); } +void TreeToXMLComposer::composeBars ( std::deque < sax::Token > & out, const std::set < alphabet::RankedSymbol > & symbols ) { + out.emplace_back ( sax::Token ( "bars", sax::Token::TokenType::START_ELEMENT ) ); + + for ( const auto & symbol : symbols ) + alib::xmlApi < alphabet::RankedSymbol >::compose ( out, symbol ); + + out.emplace_back ( sax::Token ( "bars", sax::Token::TokenType::END_ELEMENT ) ); +} + void TreeToXMLComposer::composeVariablesBar ( std::deque < sax::Token > & out, const alphabet::Symbol & symbol ) { out.emplace_back ( sax::Token ( "variablesBar", sax::Token::TokenType::START_ELEMENT ) ); alib::xmlApi < alphabet::Symbol >::compose ( out, symbol ); out.emplace_back ( sax::Token ( "variablesBar", sax::Token::TokenType::END_ELEMENT ) ); } +void TreeToXMLComposer::composeVariablesBar ( std::deque < sax::Token > & out, const alphabet::RankedSymbol & symbol ) { + out.emplace_back ( sax::Token ( "RankedVariablesBar", sax::Token::TokenType::START_ELEMENT ) ); + alib::xmlApi < alphabet::RankedSymbol >::compose ( out, symbol ); + out.emplace_back ( sax::Token ( "RankedVariablesBar", sax::Token::TokenType::END_ELEMENT ) ); +} + void TreeToXMLComposer::composeSubtreeWildcard ( std::deque < sax::Token > & out, const alphabet::Symbol & symbol ) { out.emplace_back ( sax::Token ( "subtreeWildcard", sax::Token::TokenType::START_ELEMENT ) ); alib::xmlApi < alphabet::Symbol >::compose ( out, symbol ); diff --git a/alib2data/src/tree/common/TreeToXMLComposer.h b/alib2data/src/tree/common/TreeToXMLComposer.h index 67fbd8bc0309c0aa080e52e1a9e68acd17fd4e5f..d28c280b4b5521fe2ed9a31d463bc4a5e7919e0b 100644 --- a/alib2data/src/tree/common/TreeToXMLComposer.h +++ b/alib2data/src/tree/common/TreeToXMLComposer.h @@ -27,7 +27,9 @@ public: static void composeAlphabet ( std::deque < sax::Token > & out, const std::set < alphabet::Symbol > & symbols ); static void composeBar ( std::deque < sax::Token > & out, const alphabet::Symbol & symbol ); + static void composeBars ( std::deque < sax::Token > & out, const std::set < alphabet::RankedSymbol > & symbols ); static void composeVariablesBar ( std::deque < sax::Token > & out, const alphabet::Symbol & symbol ); + static void composeVariablesBar ( std::deque < sax::Token > & out, const alphabet::RankedSymbol & symbol ); static void composeSubtreeWildcard ( std::deque < sax::Token > & out, const alphabet::Symbol & symbol ); static void composeSubtreeWildcard ( std::deque < sax::Token > & out, const alphabet::RankedSymbol & symbol ); diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp index 495ad4e0132ef53c342cc02138e7831a3d0e46bd..bbdcc5dc1fc4b6b314df2e57f7efba980381238c 100644 --- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp +++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.cpp @@ -30,40 +30,45 @@ namespace tree { -PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedBarPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::move ( alphabet ) + std::set < alphabet::RankedSymbol > { subtreeWildcard } ), std::make_tuple ( subtreeWildcard ) ), bar ( std::move ( bar ) ), variablesBar ( std::move ( variablesBar ) ) { +PrefixRankedBarPattern::PrefixRankedBarPattern ( std::set < alphabet::RankedSymbol > bars, alphabet::RankedSymbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedBarPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, BarSymbols >, std::tuple < SubtreeWildcard, VariablesBarSymbol > > ( std::make_tuple ( std::move ( alphabet ), std::move ( bars ) ), std::make_tuple ( std::move ( subtreeWildcard ), std::move ( variablesBar ) ) ) { setContent ( std::move ( data ) ); } -PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ) : PrefixRankedBarPattern ( std::move ( bar ), std::move ( variablesBar ), std::move ( subtreeWildcard ), std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ), std::move ( data ) ) { +PrefixRankedBarPattern::PrefixRankedBarPattern ( std::set < alphabet::RankedSymbol > bars, alphabet::RankedSymbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ) : PrefixRankedBarPattern ( bars, variablesBar, subtreeWildcard, std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ) + bars + std::set < alphabet::RankedSymbol > { variablesBar, subtreeWildcard }, data ) { } -PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, const RankedPattern & tree ) : std::Components < PrefixRankedBarPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::set < alphabet::RankedSymbol > ( tree.getAlphabet ( ) ) ), std::make_tuple ( tree.getSubtreeWildcard ( ) ) ), bar ( std::move ( bar ) ), variablesBar ( std::move ( variablesBar ) ) { - toPrefixRankedBar ( tree.getRoot ( ) ); +PrefixRankedBarPattern::PrefixRankedBarPattern ( alphabet::Symbol barBase, alphabet::RankedSymbol variablesBar, const RankedPattern & tree ) : PrefixRankedBarPattern ( computeBars ( tree.getAlphabet ( ), barBase ) + std::set < alphabet::RankedSymbol > { variablesBar }, variablesBar, tree.getSubtreeWildcard ( ), tree.getAlphabet ( ) + computeBars ( tree.getAlphabet ( ), barBase ) + std::set < alphabet::RankedSymbol > { variablesBar, tree.getSubtreeWildcard ( ) }, toPrefixRankedBar ( tree.getRoot ( ), tree.getSubtreeWildcard ( ), barBase, variablesBar ) ) { +} - for ( const alphabet::RankedSymbol & symbol : tree.getAlphabet ( ) ) { - accessComponent < GeneralAlphabet > ( ).add ( alphabet::RankedSymbol ( this->bar, symbol.getRank ( ) ) ); - } +PrefixRankedBarPattern::PrefixRankedBarPattern ( const PrefixRankedBarTree & tree ) : PrefixRankedBarPattern ( tree.getBars() + std::set < alphabet::RankedSymbol > { alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL }, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, tree.getAlphabet ( ) + std::set < alphabet::RankedSymbol > { alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL }, tree.getContent ( ) ) { +} - accessComponent < GeneralAlphabet > ( ).add ( alphabet::RankedSymbol ( this->variablesBar, tree.getSubtreeWildcard ( ).getRank ( ) ) ); +PrefixRankedBarPattern::PrefixRankedBarPattern ( const RankedPattern & tree ) : PrefixRankedBarPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) { } -PrefixRankedBarPattern::PrefixRankedBarPattern ( const PrefixRankedBarTree & tree ) : PrefixRankedBarPattern ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), alphabet::Symbol ( alphabet::VariablesBarSymbol::BAR ), alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ), tree.getAlphabet ( ), tree.getContent ( ) ) { +std::set < alphabet::RankedSymbol > PrefixRankedBarPattern::computeBars ( const std::set < alphabet::RankedSymbol > & alphabet, const alphabet::Symbol & barBase ) { + return std::transform < alphabet::RankedSymbol > ( alphabet, [&] ( const alphabet::RankedSymbol & symbol) { + return alphabet::RankedSymbol ( barBase, symbol.getRank ( ) ); + } ); } -PrefixRankedBarPattern::PrefixRankedBarPattern ( const RankedPattern & tree ) : PrefixRankedBarPattern ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), alphabet::Symbol ( alphabet::VariablesBarSymbol::BAR ), tree ) { +std::vector < alphabet::RankedSymbol > PrefixRankedBarPattern::toPrefixRankedBar ( const RankedNode & node, const alphabet::RankedSymbol & subtreeWildcard, const alphabet::Symbol & barBase, const alphabet::RankedSymbol & variablesBar ) { + std::vector < alphabet::RankedSymbol > res; + toPrefixRankedBar ( node, subtreeWildcard, barBase, variablesBar, res ); + return res; } -void PrefixRankedBarPattern::toPrefixRankedBar ( const RankedNode & node ) { - if ( node.getSymbol ( ) == accessElement < tree::SubtreeWildcard > ( ).get ( ) ) { - m_Data.push_back ( node.getSymbol ( ) ); - m_Data.push_back ( alphabet::RankedSymbol ( variablesBar, node.getSymbol ( ).getRank ( ) ) ); +void PrefixRankedBarPattern::toPrefixRankedBar ( const RankedNode & node, const alphabet::RankedSymbol & subtreeWildcard, const alphabet::Symbol & barBase, const alphabet::RankedSymbol & variablesBar, std::vector < alphabet::RankedSymbol > & linearNotation ) { + if ( node.getSymbol ( ) == subtreeWildcard ) { + linearNotation.push_back ( node.getSymbol ( ) ); + linearNotation.push_back ( variablesBar ); } else { - m_Data.push_back ( node.getSymbol ( ) ); + linearNotation.push_back ( node.getSymbol ( ) ); for ( const std::smart_ptr < const RankedNode > & child : node.getChildren ( ) ) - toPrefixRankedBar ( * child ); + toPrefixRankedBar ( * child, subtreeWildcard, barBase, variablesBar, linearNotation ); - m_Data.push_back ( alphabet::RankedSymbol ( bar, node.getSymbol ( ).getRank ( ) ) ); + linearNotation.push_back ( alphabet::RankedSymbol ( barBase, node.getSymbol ( ).getRank ( ) ) ); } } @@ -92,35 +97,27 @@ void PrefixRankedBarPattern::setContent ( std::vector < alphabet::RankedSymbol > this->m_Data = std::move ( data ); } -const alphabet::Symbol & PrefixRankedBarPattern::getBarSymbol ( ) const { - return bar; -} - -const alphabet::Symbol & PrefixRankedBarPattern::getVariablesBarSymbol ( ) const { - return variablesBar; -} - void PrefixRankedBarPattern::arityChecksum ( const std::vector < alphabet::RankedSymbol > & data ) { int arityChecksumTerminals = 1; int arityChecksumBars = 1; int arityChecksumTypes = 0; for ( const alphabet::RankedSymbol & symbol : data ) { - if ( ( symbol.getSymbol ( ) != bar ) && ( symbol.getSymbol ( ) != variablesBar ) ) { + if ( getBars ( ).count ( symbol ) || symbol == getVariablesBar ( ) ) { + arityChecksumBars += symbol.getRank ( ).getData ( ); + arityChecksumBars -= 1; + arityChecksumTypes -= 1; + } else { arityChecksumTerminals += symbol.getRank ( ).getData ( ); arityChecksumTerminals -= 1; arityChecksumTypes += 1; - } else { - arityChecksumBars += symbol.getRank ( ).getData ( ); - arityChecksumBars -= 1; - arityChecksumTypes -= 1; } } if ( ( arityChecksumTerminals != 0 ) || ( arityChecksumBars != 0 ) || ( arityChecksumTypes != 0 ) ) throw TreeException ( "The string does not form a tree" ); - for ( unsigned i = 0; i < data.size ( ); ++i ) - if ( ( data[i] == accessElement < tree::SubtreeWildcard > ( ).get ( ) ) && ( ( ( i + 1 ) == data.size ( ) ) || ( data[i + 1].getSymbol ( ) != variablesBar ) ) ) + for ( unsigned i = 1; i < data.size ( ); ++i ) + if ( data[i - 1] == getSubtreeWildcard ( ) && data[i] != getVariablesBar ( ) ) throw TreeException ( "Inconsystency of SubtreeWildcard and variablesBar" ); } @@ -130,8 +127,8 @@ bool PrefixRankedBarPattern::isEmpty ( ) const { } int PrefixRankedBarPattern::compare ( const PrefixRankedBarPattern & other ) const { - auto first = std::tie ( m_Data, getAlphabet(), getSubtreeWildcard(), bar, variablesBar ); - auto second = std::tie ( other.m_Data, other.getAlphabet(), other.getSubtreeWildcard(), bar, variablesBar ); + auto first = std::tie ( m_Data, getAlphabet(), getSubtreeWildcard(), getBars(), getVariablesBar() ); + auto second = std::tie ( other.m_Data, other.getAlphabet(), other.getSubtreeWildcard(), other.getBars(), other.getVariablesBar() ); std::compare < decltype ( first ) > comp; @@ -162,20 +159,20 @@ const std::string PrefixRankedBarPattern::XML_TAG_NAME = "PrefixRankedBarPattern PrefixRankedBarPattern PrefixRankedBarPattern::parse ( std::deque < sax::Token >::iterator & input ) { sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, PrefixRankedBarPattern::XML_TAG_NAME ); - alphabet::Symbol bar = TreeFromXMLParser::parseBar ( input ); - alphabet::Symbol variablesBarSymbol = TreeFromXMLParser::parseVariablesBar ( input ); + std::set < alphabet::RankedSymbol > bars = TreeFromXMLParser::parseBars ( input ); + alphabet::RankedSymbol variablesBarSymbol = TreeFromXMLParser::parseRankedVariablesBar ( input ); alphabet::RankedSymbol subtreeWildcardSymbol = TreeFromXMLParser::parseSubtreeWildcardRankedSymbol ( input ); std::set < alphabet::RankedSymbol > rankedAlphabet = TreeFromXMLParser::parseRankedAlphabet ( input ); std::vector < alphabet::RankedSymbol > data = TreeFromXMLParser::parseRankedContent ( input ); sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, PrefixRankedBarPattern::XML_TAG_NAME ); - return PrefixRankedBarPattern ( std::move ( bar ), std::move ( variablesBarSymbol ), std::move ( subtreeWildcardSymbol ), std::move ( rankedAlphabet ), std::move ( data ) ); + return PrefixRankedBarPattern ( std::move ( bars ), std::move ( variablesBarSymbol ), std::move ( subtreeWildcardSymbol ), std::move ( rankedAlphabet ), std::move ( data ) ); } void PrefixRankedBarPattern::compose ( std::deque < sax::Token > & out ) const { out.emplace_back ( PrefixRankedBarPattern::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT ); - TreeToXMLComposer::composeBar ( out, bar ); - TreeToXMLComposer::composeVariablesBar ( out, variablesBar ); + TreeToXMLComposer::composeBars ( out, getBars() ); + TreeToXMLComposer::composeVariablesBar ( out, getVariablesBar() ); TreeToXMLComposer::composeSubtreeWildcard ( out, getSubtreeWildcard() ); TreeToXMLComposer::composeAlphabet ( out, getAlphabet() ); TreeToXMLComposer::composeContent ( out, m_Data ); @@ -191,7 +188,7 @@ bool tree::PrefixRankedBarPattern::Component < tree::PrefixRankedBarPattern, alp const tree::PrefixRankedBarPattern * pattern = static_cast < const tree::PrefixRankedBarPattern * > ( this ); const std::vector < alphabet::RankedSymbol > & content = pattern->getContent ( ); - return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern->accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol; + return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern->accessElement < tree::VariablesBarSymbol > ( ).get ( ) == symbol || pattern->accessComponent < tree::BarSymbols > ( ).get ( ).count ( symbol ) || pattern->accessElement < tree::SubtreeWildcard > ( ).get ( ) == symbol; } template < > @@ -203,13 +200,45 @@ template < > void tree::PrefixRankedBarPattern::Component < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::GeneralAlphabet >::valid ( const alphabet::RankedSymbol & ) const { } +template < > +bool tree::PrefixRankedBarPattern::Component < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::BarSymbols >::used ( const alphabet::RankedSymbol & symbol ) const { + const tree::PrefixRankedBarPattern * pattern = static_cast < const tree::PrefixRankedBarPattern * > ( this ); + const std::vector < alphabet::RankedSymbol > & content = pattern->getContent ( ); + + return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ) || pattern->accessElement < tree::VariablesBarSymbol > ( ).get ( ) == symbol; +} + +template < > +bool tree::PrefixRankedBarPattern::Component < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::BarSymbols >::available ( const alphabet::RankedSymbol & symbol ) const { + const tree::PrefixRankedBarPattern * pattern = static_cast < const tree::PrefixRankedBarPattern * > ( this ); + + return pattern->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol ); +} + +template < > +void tree::PrefixRankedBarPattern::Component < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::BarSymbols >::valid ( const alphabet::RankedSymbol & ) const { +} + template < > bool tree::PrefixRankedBarPattern::Element < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::available ( const alphabet::RankedSymbol & symbol ) const { return static_cast < const tree::PrefixRankedBarPattern * > ( this )->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol ); } template < > -void tree::PrefixRankedBarPattern::Element < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::valid ( const alphabet::RankedSymbol & ) const { +void tree::PrefixRankedBarPattern::Element < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::valid ( const alphabet::RankedSymbol & symbol ) const { + if( symbol.getRank().getData() != 0 ) + throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" ); +} + +template < > +bool tree::PrefixRankedBarPattern::Element < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::VariablesBarSymbol >::available ( const alphabet::RankedSymbol & symbol ) const { + return static_cast < const tree::PrefixRankedBarPattern * > ( this )->accessComponent < tree::BarSymbols > ( ).get ( ).count ( symbol ); +} + +template < > +void tree::PrefixRankedBarPattern::Element < tree::PrefixRankedBarPattern, alphabet::RankedSymbol, tree::VariablesBarSymbol >::valid ( const alphabet::RankedSymbol & symbol ) const { + if( symbol.getRank().getData() != 0 ) + throw tree::TreeException ( "VariablesBarSymbol has nonzero arity" ); } } /* namespace std */ diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h index 8f5311c6f6b003bed7dd2a25d9690d43e6a49c60..bb297428e3a96b51694a80b192640e71373213a8 100644 --- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h +++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h @@ -22,23 +22,24 @@ class RankedPattern; class PrefixRankedBarTree; class GeneralAlphabet; class SubtreeWildcard; +class BarSymbols; +class VariablesBarSymbol; /** * Represents regular expression parsed from the XML. Regular expression is stored * as a tree of LinearStringElement. */ -class PrefixRankedBarPattern : public RankedTreeBase, public std::Components < PrefixRankedBarPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > { +class PrefixRankedBarPattern : public RankedTreeBase, public std::Components < PrefixRankedBarPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, BarSymbols >, std::tuple < SubtreeWildcard, VariablesBarSymbol > > { std::vector < alphabet::RankedSymbol > m_Data; - alphabet::Symbol bar; - alphabet::Symbol variablesBar; - - void toPrefixRankedBar ( const RankedNode & node ); + static std::set < alphabet::RankedSymbol > computeBars ( const std::set < alphabet::RankedSymbol > & alphabet, const alphabet::Symbol & barBase ); + static void toPrefixRankedBar ( const RankedNode & node, const alphabet::RankedSymbol & subtreeWildcard, const alphabet::Symbol & barBase, const alphabet::RankedSymbol & variablesBar, std::vector < alphabet::RankedSymbol > & linearNotation ); + static std::vector < alphabet::RankedSymbol > toPrefixRankedBar ( const RankedNode & node, const alphabet::RankedSymbol & subtreeWildcard, const alphabet::Symbol & barBase, const alphabet::RankedSymbol & variablesBar ); public: - explicit PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ); - explicit PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ); - explicit PrefixRankedBarPattern ( alphabet::Symbol bar, alphabet::Symbol variablesBar, const RankedPattern & tree ); + explicit PrefixRankedBarPattern ( std::set < alphabet::RankedSymbol > bar, alphabet::RankedSymbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ); + explicit PrefixRankedBarPattern ( std::set < alphabet::RankedSymbol > bar, alphabet::RankedSymbol variablesBar, alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ); + explicit PrefixRankedBarPattern ( alphabet::Symbol barBase, alphabet::RankedSymbol variablesBar, const RankedPattern & tree ); explicit PrefixRankedBarPattern ( const PrefixRankedBarTree & tree ); explicit PrefixRankedBarPattern ( const RankedPattern & tree ); @@ -58,15 +59,19 @@ public: accessComponent < GeneralAlphabet > ( ).add ( symbols ); } + const std::set < alphabet::RankedSymbol > & getBars ( ) const { + return accessComponent < BarSymbols > ( ).get ( ); + } + const alphabet::RankedSymbol & getSubtreeWildcard ( ) const { return accessElement < SubtreeWildcard > ( ).get ( ); } - void setContent ( std::vector < alphabet::RankedSymbol > data ); - - const alphabet::Symbol & getBarSymbol ( ) const; + const alphabet::RankedSymbol & getVariablesBar ( ) const { + return accessElement < VariablesBarSymbol > ( ).get ( ); + } - const alphabet::Symbol & getVariablesBarSymbol ( ) const; + void setContent ( std::vector < alphabet::RankedSymbol > data ); void arityChecksum ( const std::vector < alphabet::RankedSymbol > & data ); diff --git a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp index ccb874c71ec83406e4fe1f9476f14a3abf4fc691..93ecf8c81f4d472895d6c51182deb9811be56da3 100644 --- a/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp +++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.cpp @@ -27,31 +27,38 @@ namespace tree { -PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedBarTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ), bar ( std::move ( bar ) ) { +PrefixRankedBarTree::PrefixRankedBarTree ( std::set < alphabet::RankedSymbol > bars, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ) : std::Components < PrefixRankedBarTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, BarSymbols >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ), std::move ( bars ) ), std::tuple < > ( ) ) { setContent ( std::move ( data ) ); } -PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, std::vector < alphabet::RankedSymbol > data ) : PrefixRankedBarTree ( std::move ( bar ), std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ), std::move ( data ) ) { +PrefixRankedBarTree::PrefixRankedBarTree ( std::set < alphabet::RankedSymbol > bars, std::vector < alphabet::RankedSymbol > data ) : PrefixRankedBarTree ( bars, bars + std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ), data ) { } -PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol bar, const RankedTree & tree ) : std::Components < PrefixRankedBarTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::set < alphabet::RankedSymbol > ( tree.getAlphabet ( ) ) ), std::tuple < > ( ) ), bar ( std::move ( bar ) ) { - toPrefixRankedBar ( tree.getRoot ( ) ); +PrefixRankedBarTree::PrefixRankedBarTree ( alphabet::Symbol barBase, const RankedTree & tree ) : PrefixRankedBarTree ( computeBars ( tree.getAlphabet ( ), barBase ), tree.getAlphabet ( ) + computeBars ( tree.getAlphabet ( ), barBase ), toPrefixRankedBar ( tree.getRoot ( ), barBase ) ) { +} - for ( const alphabet::RankedSymbol & symbol : tree.getAlphabet ( ) ) { - accessComponent < GeneralAlphabet > ( ).add ( alphabet::RankedSymbol ( this->bar, symbol.getRank ( ) ) ); - } +PrefixRankedBarTree::PrefixRankedBarTree ( const RankedTree & tree ) : PrefixRankedBarTree ( alphabet::BarSymbol::BAR_SYMBOL, tree ) { +} + +std::set < alphabet::RankedSymbol > PrefixRankedBarTree::computeBars ( const std::set < alphabet::RankedSymbol > & alphabet, const alphabet::Symbol & barBase ) { + return std::transform < alphabet::RankedSymbol > ( alphabet, [&] ( const alphabet::RankedSymbol & symbol) { + return alphabet::RankedSymbol ( barBase, symbol.getRank ( ) ); + } ); } -PrefixRankedBarTree::PrefixRankedBarTree ( const RankedTree & tree ) : PrefixRankedBarTree ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), tree ) { +std::vector < alphabet::RankedSymbol > PrefixRankedBarTree::toPrefixRankedBar ( const RankedNode & node, const alphabet::Symbol & barBase ) { + std::vector < alphabet::RankedSymbol > res; + toPrefixRankedBar ( node, barBase, res ); + return res; } -void PrefixRankedBarTree::toPrefixRankedBar ( const RankedNode & node ) { - m_Data.push_back ( node.getSymbol ( ) ); +void PrefixRankedBarTree::toPrefixRankedBar ( const RankedNode & node, const alphabet::Symbol & barBase, std::vector < alphabet::RankedSymbol > & linearNotation ) { + linearNotation.push_back ( node.getSymbol ( ) ); for ( const std::smart_ptr < const RankedNode > & child : node.getChildren ( ) ) - toPrefixRankedBar ( * child ); + toPrefixRankedBar ( * child, barBase, linearNotation ); - m_Data.push_back ( alphabet::RankedSymbol ( bar, node.getSymbol ( ).getRank ( ) ) ); + linearNotation.push_back ( alphabet::RankedSymbol ( barBase, node.getSymbol ( ).getRank ( ) ) ); } RankedTreeBase * PrefixRankedBarTree::clone ( ) const { @@ -66,10 +73,6 @@ const std::vector < alphabet::RankedSymbol > & PrefixRankedBarTree::getContent ( return this->m_Data; } -const alphabet::Symbol & PrefixRankedBarTree::getBarSymbol ( ) const { - return bar; -} - void PrefixRankedBarTree::setContent ( std::vector < alphabet::RankedSymbol > data ) { arityChecksum ( data ); @@ -89,14 +92,14 @@ void PrefixRankedBarTree::arityChecksum ( const std::vector < alphabet::RankedSy int arityChecksumTypes = 0; for ( const alphabet::RankedSymbol & symbol : data ) { - if ( symbol.getSymbol ( ) != bar ) { + if ( getBars ( ).count ( symbol ) ) { + arityChecksumBars += symbol.getRank ( ).getData ( ); + arityChecksumBars -= 1; + arityChecksumTypes -= 1; + } else { arityChecksumTerminals += symbol.getRank ( ).getData ( ); arityChecksumTerminals -= 1; arityChecksumTypes += 1; - } else { - arityChecksumBars += symbol.getRank ( ).getData ( ); - arityChecksumBars -= 1; - arityChecksumTypes -= 1; } } @@ -108,8 +111,8 @@ bool PrefixRankedBarTree::isEmpty ( ) const { } int PrefixRankedBarTree::compare ( const PrefixRankedBarTree & other ) const { - auto first = std::tie ( m_Data, getAlphabet(), bar ); - auto second = std::tie ( other.m_Data, other.getAlphabet(), bar ); + auto first = std::tie ( m_Data, getAlphabet(), getBars() ); + auto second = std::tie ( other.m_Data, other.getAlphabet(), other.getBars() ); std::compare < decltype ( first ) > comp; @@ -140,17 +143,17 @@ const std::string PrefixRankedBarTree::XML_TAG_NAME = "PrefixRankedBarTree"; PrefixRankedBarTree PrefixRankedBarTree::parse ( std::deque < sax::Token >::iterator & input ) { sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, PrefixRankedBarTree::XML_TAG_NAME ); - alphabet::Symbol bar = TreeFromXMLParser::parseBar ( input ); + std::set < alphabet::RankedSymbol > bars = TreeFromXMLParser::parseBars ( input ); std::set < alphabet::RankedSymbol > rankedAlphabet = TreeFromXMLParser::parseRankedAlphabet ( input ); std::vector < alphabet::RankedSymbol > data = TreeFromXMLParser::parseRankedContent ( input ); sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, PrefixRankedBarTree::XML_TAG_NAME ); - return PrefixRankedBarTree ( std::move ( bar ), std::move ( rankedAlphabet ), std::move ( data ) ); + return PrefixRankedBarTree ( std::move ( bars ), std::move ( rankedAlphabet ), std::move ( data ) ); } void PrefixRankedBarTree::compose ( std::deque < sax::Token > & out ) const { out.emplace_back ( PrefixRankedBarTree::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT ); - TreeToXMLComposer::composeBar ( out, bar ); + TreeToXMLComposer::composeBars ( out, getBars() ); TreeToXMLComposer::composeAlphabet ( out, getAlphabet() ); TreeToXMLComposer::composeContent ( out, m_Data ); out.emplace_back ( PrefixRankedBarTree::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT ); @@ -176,6 +179,24 @@ template < > void tree::PrefixRankedBarTree::Component < tree::PrefixRankedBarTree, alphabet::RankedSymbol, tree::GeneralAlphabet >::valid ( const alphabet::RankedSymbol & ) const { } +template < > +bool tree::PrefixRankedBarTree::Component < tree::PrefixRankedBarTree, alphabet::RankedSymbol, tree::BarSymbols >::used ( const alphabet::RankedSymbol & symbol ) const { + const std::vector < alphabet::RankedSymbol > & content = static_cast < const tree::PrefixRankedBarTree * > ( this )->getContent ( ); + + return std::find ( content.begin ( ), content.end ( ), symbol ) != content.end ( ); +} + +template < > +bool tree::PrefixRankedBarTree::Component < tree::PrefixRankedBarTree, alphabet::RankedSymbol, tree::BarSymbols >::available ( const alphabet::RankedSymbol & symbol ) const { + const tree::PrefixRankedBarTree * tree = static_cast < const tree::PrefixRankedBarTree * > ( this ); + + return tree->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol ); +} + +template < > +void tree::PrefixRankedBarTree::Component < tree::PrefixRankedBarTree, alphabet::RankedSymbol, tree::BarSymbols >::valid ( const alphabet::RankedSymbol & ) const { +} + } /* namespace std */ namespace alib { diff --git a/alib2data/src/tree/ranked/PrefixRankedBarTree.h b/alib2data/src/tree/ranked/PrefixRankedBarTree.h index dac39c2fe646be5921598e325fe5584df845a754..7f903197488a7e1a05436a9b6087cc107d05b463 100644 --- a/alib2data/src/tree/ranked/PrefixRankedBarTree.h +++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.h @@ -20,22 +20,23 @@ namespace tree { class RankedTree; class GeneralAlphabet; +class BarSymbols; /** * Represents regular expression parsed from the XML. Regular expression is stored * as a tree of LinearStringElement. */ -class PrefixRankedBarTree : public RankedTreeBase, public std::Components < PrefixRankedBarTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < > > { +class PrefixRankedBarTree : public RankedTreeBase, public std::Components < PrefixRankedBarTree, alphabet::RankedSymbol, std::tuple < GeneralAlphabet, BarSymbols >, std::tuple < > > { std::vector < alphabet::RankedSymbol > m_Data; - alphabet::Symbol bar; - - void toPrefixRankedBar ( const RankedNode & node ); + static std::set < alphabet::RankedSymbol > computeBars ( const std::set < alphabet::RankedSymbol > & alphabet, const alphabet::Symbol & barBase ); + static void toPrefixRankedBar ( const RankedNode & node, const alphabet::Symbol & barBase, std::vector < alphabet::RankedSymbol > & linearNotation ); + static std::vector < alphabet::RankedSymbol > toPrefixRankedBar ( const RankedNode & node, const alphabet::Symbol & barBase ); public: - explicit PrefixRankedBarTree ( alphabet::Symbol bar, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ); - explicit PrefixRankedBarTree ( alphabet::Symbol bar, std::vector < alphabet::RankedSymbol > data ); - explicit PrefixRankedBarTree ( alphabet::Symbol bar, const RankedTree & tree ); + explicit PrefixRankedBarTree ( std::set < alphabet::RankedSymbol > bars, std::set < alphabet::RankedSymbol > alphabet, std::vector < alphabet::RankedSymbol > data ); + explicit PrefixRankedBarTree ( std::set < alphabet::RankedSymbol > bars, std::vector < alphabet::RankedSymbol > data ); + explicit PrefixRankedBarTree ( alphabet::Symbol barBase, const RankedTree & tree ); explicit PrefixRankedBarTree ( const RankedTree & tree ); virtual RankedTreeBase * clone ( ) const; @@ -54,7 +55,9 @@ public: accessComponent < GeneralAlphabet > ( ).add ( symbols ); } - const alphabet::Symbol & getBarSymbol ( ) const; + const std::set < alphabet::RankedSymbol > & getBars ( ) const { + return accessComponent < BarSymbols > ( ).get ( ); + } void setContent ( std::vector < alphabet::RankedSymbol > data ); diff --git a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp index dcd4c392a8cc95257745cf80d6ddaea5adac4c2a..1ba063ce60113d98530671d7fd7b8089229575d8 100644 --- a/alib2data/src/tree/ranked/PrefixRankedPattern.cpp +++ b/alib2data/src/tree/ranked/PrefixRankedPattern.cpp @@ -35,7 +35,7 @@ PrefixRankedPattern::PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcar PrefixRankedPattern::PrefixRankedPattern ( alphabet::RankedSymbol subtreeWildcard, std::vector < alphabet::RankedSymbol > data ) : PrefixRankedPattern ( std::move ( subtreeWildcard ), std::set < alphabet::RankedSymbol > ( data.begin ( ), data.end ( ) ), std::move ( data ) ) { } -PrefixRankedPattern::PrefixRankedPattern ( const PrefixRankedTree & tree ) : PrefixRankedPattern ( alphabet::RankedSymbol ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ), tree.getAlphabet ( ), tree.getContent ( ) ) { +PrefixRankedPattern::PrefixRankedPattern ( const PrefixRankedTree & tree ) : PrefixRankedPattern ( alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, tree.getAlphabet ( ), tree.getContent ( ) ) { } PrefixRankedPattern::PrefixRankedPattern ( const RankedPattern & tree ) : std::Components < PrefixRankedPattern, alphabet::RankedSymbol, std::tuple < GeneralAlphabet >, std::tuple < SubtreeWildcard > > ( std::make_tuple ( std::set < alphabet::RankedSymbol > ( tree.getAlphabet ( ) ) ), std::make_tuple ( tree.getSubtreeWildcard ( ) ) ) { @@ -169,7 +169,9 @@ bool tree::PrefixRankedPattern::Element < tree::PrefixRankedPattern, alphabet::R } template < > -void tree::PrefixRankedPattern::Element < tree::PrefixRankedPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::valid ( const alphabet::RankedSymbol & ) const { +void tree::PrefixRankedPattern::Element < tree::PrefixRankedPattern, alphabet::RankedSymbol, tree::SubtreeWildcard >::valid ( const alphabet::RankedSymbol & symbol ) const { + if( symbol.getRank().getData() != 0 ) + throw tree::TreeException ( "SubtreeWildcard symbol has nonzero arity" ); } } /* namespace std */ diff --git a/alib2data/src/tree/unranked/PrefixBarTree.cpp b/alib2data/src/tree/unranked/PrefixBarTree.cpp index be0f5ed2e023a93e97e11b708e5dffadf7ff4f06..3165342c2ce73415fef4ca5afc9b40d9517b3536 100644 --- a/alib2data/src/tree/unranked/PrefixBarTree.cpp +++ b/alib2data/src/tree/unranked/PrefixBarTree.cpp @@ -27,27 +27,32 @@ namespace tree { -PrefixBarTree::PrefixBarTree ( alphabet::Symbol bar, std::set < alphabet::Symbol > alphabet, std::vector < alphabet::Symbol > data ) : std::Components < PrefixBarTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::move ( alphabet ) ), std::tuple < > ( ) ), bar ( std::move ( bar ) ) { +PrefixBarTree::PrefixBarTree ( alphabet::Symbol bar, std::set < alphabet::Symbol > alphabet, std::vector < alphabet::Symbol > data ) : std::Components < PrefixBarTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < BarSymbol > > ( std::make_tuple ( std::move ( alphabet ) ), std::make_tuple ( std::move ( bar ) ) ) { setContent ( std::move ( data ) ); } -PrefixBarTree::PrefixBarTree ( alphabet::Symbol bar, std::vector < alphabet::Symbol > data ) : PrefixBarTree ( std::move ( bar ), std::set < alphabet::Symbol > ( data.begin ( ), data.end ( ) ), std::move ( data ) ) { +PrefixBarTree::PrefixBarTree ( alphabet::Symbol bar, std::vector < alphabet::Symbol > data ) : PrefixBarTree ( std::move ( bar ), std::set < alphabet::Symbol > ( data.begin ( ), data.end ( ) ) + std::set < alphabet::Symbol > { bar }, std::move ( data ) ) { } -PrefixBarTree::PrefixBarTree ( alphabet::Symbol bar, const UnrankedTree & tree ) : std::Components < PrefixBarTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > ( std::make_tuple ( std::set < alphabet::Symbol > ( tree.getAlphabet ( ) ) + std::set < alphabet::Symbol > { bar } ), std::tuple < > ( ) ), bar ( bar ) { - toPrefixBar ( tree.getRoot ( ) ); +PrefixBarTree::PrefixBarTree ( alphabet::Symbol bar, const UnrankedTree & tree ) : PrefixBarTree ( bar, tree.getAlphabet ( ) + std::set < alphabet::Symbol > { bar }, toPrefixBar ( tree.getRoot ( ), bar ) ) { } -PrefixBarTree::PrefixBarTree ( const UnrankedTree & tree ) : PrefixBarTree ( alphabet::Symbol ( alphabet::BarSymbol::BAR ), tree ) { +PrefixBarTree::PrefixBarTree ( const UnrankedTree & tree ) : PrefixBarTree ( alphabet::BarSymbol::BAR_SYMBOL, tree ) { } -void PrefixBarTree::toPrefixBar ( const UnrankedNode & node ) { - m_Data.push_back ( node.getSymbol ( ) ); +std::vector < alphabet::Symbol > PrefixBarTree::toPrefixBar ( const UnrankedNode & node, const alphabet::Symbol & bar ) { + std::vector < alphabet::Symbol > res; + toPrefixBar ( node, bar, res ); + return res; +} + +void PrefixBarTree::toPrefixBar ( const UnrankedNode & node, const alphabet::Symbol & bar, std::vector < alphabet::Symbol > & linearNotation ) { + linearNotation.push_back ( node.getSymbol ( ) ); for ( const std::smart_ptr < const UnrankedNode > & child : node.getChildren ( ) ) - toPrefixBar ( * child ); + toPrefixBar ( * child, bar, linearNotation ); - m_Data.push_back ( bar ); + linearNotation.push_back ( bar ); } UnrankedTreeBase * PrefixBarTree::clone ( ) const { @@ -62,10 +67,6 @@ const std::vector < alphabet::Symbol > & PrefixBarTree::getContent ( ) const { return this->m_Data; } -const alphabet::Symbol & PrefixBarTree::getBarSymbol ( ) const { - return bar; -} - void PrefixBarTree::setContent ( std::vector < alphabet::Symbol > data ) { arityChecksum ( data ); @@ -83,10 +84,10 @@ void PrefixBarTree::arityChecksum ( const std::vector < alphabet::Symbol > & dat int arityChecksumTypes = 0; for ( const alphabet::Symbol & symbol : data ) { - if ( symbol != bar ) - arityChecksumTypes += 1; - else + if ( symbol == getBar ( ) ) arityChecksumTypes -= 1; + else + arityChecksumTypes += 1; } if ( arityChecksumTypes != 0 ) throw TreeException ( "The string does not form a tree" ); @@ -97,8 +98,8 @@ bool PrefixBarTree::isEmpty ( ) const { } int PrefixBarTree::compare ( const PrefixBarTree & other ) const { - auto first = std::tie ( m_Data, getAlphabet ( ) ); - auto second = std::tie ( other.m_Data, other.getAlphabet ( ) ); + auto first = std::tie ( m_Data, getAlphabet ( ), getBar ( ) ); + auto second = std::tie ( other.m_Data, other.getAlphabet ( ), other.getBar ( ) ); std::compare < decltype ( first ) > comp; @@ -139,7 +140,7 @@ PrefixBarTree PrefixBarTree::parse ( std::deque < sax::Token >::iterator & input void PrefixBarTree::compose ( std::deque < sax::Token > & out ) const { out.emplace_back ( PrefixBarTree::XML_TAG_NAME, sax::Token::TokenType::START_ELEMENT ); - TreeToXMLComposer::composeBar ( out, bar ); + TreeToXMLComposer::composeBar ( out, getBar ( ) ); TreeToXMLComposer::composeAlphabet ( out, getAlphabet ( ) ); TreeToXMLComposer::composeContent ( out, m_Data ); out.emplace_back ( PrefixBarTree::XML_TAG_NAME, sax::Token::TokenType::END_ELEMENT ); @@ -165,6 +166,15 @@ template < > void tree::PrefixBarTree::Component < tree::PrefixBarTree, alphabet::Symbol, tree::GeneralAlphabet >::valid ( const alphabet::Symbol & ) const { } +template < > +bool tree::PrefixBarTree::Element < tree::PrefixBarTree, alphabet::Symbol, tree::BarSymbol >::available ( const alphabet::Symbol & symbol ) const { + return static_cast < const tree::PrefixBarTree * > ( this )->accessComponent < tree::GeneralAlphabet > ( ).get ( ).count ( symbol ); +} + +template < > +void tree::PrefixBarTree::Element < tree::PrefixBarTree, alphabet::Symbol, tree::BarSymbol >::valid ( const alphabet::Symbol & ) const { +} + } /* namespace std */ namespace alib { diff --git a/alib2data/src/tree/unranked/PrefixBarTree.h b/alib2data/src/tree/unranked/PrefixBarTree.h index f1b3cf51c6d1ccd93f26c5f1ad96c624c0524a62..b0c45eb06e13a1ab95b44865c1bda415a2789243 100644 --- a/alib2data/src/tree/unranked/PrefixBarTree.h +++ b/alib2data/src/tree/unranked/PrefixBarTree.h @@ -20,17 +20,17 @@ namespace tree { class UnrankedTree; class GeneralAlphabet; +class BarSymbol; /** * Represents regular expression parsed from the XML. Regular expression is stored * as a tree of LinearStringElement. */ -class PrefixBarTree : public UnrankedTreeBase, public std::Components < PrefixBarTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < > > { +class PrefixBarTree : public UnrankedTreeBase, public std::Components < PrefixBarTree, alphabet::Symbol, std::tuple < GeneralAlphabet >, std::tuple < BarSymbol > > { std::vector < alphabet::Symbol > m_Data; - alphabet::Symbol bar; - - void toPrefixBar ( const UnrankedNode & node ); + static std::vector < alphabet::Symbol > toPrefixBar ( const UnrankedNode & node, const alphabet::Symbol & bar ); + static void toPrefixBar ( const UnrankedNode & node, const alphabet::Symbol & bar, std::vector < alphabet::Symbol > & linearNotation ); public: explicit PrefixBarTree ( alphabet::Symbol bar, std::set < alphabet::Symbol > alphabet, std::vector < alphabet::Symbol > data ); @@ -54,7 +54,9 @@ public: accessComponent < GeneralAlphabet > ( ).add ( symbols ); } - const alphabet::Symbol & getBarSymbol ( ) const; + const alphabet::Symbol & getBar ( ) const { + return accessElement < BarSymbol > ( ).get ( ); + } void setContent ( std::vector < alphabet::Symbol > data ); diff --git a/alib2data/test-src/automaton/AutomatonTest.cpp b/alib2data/test-src/automaton/AutomatonTest.cpp index bccaf25f0263f4d6507068e89979a5b81826ffc5..d0dc1297a2ea5e8e93296c160e842c30e4c05627 100644 --- a/alib2data/test-src/automaton/AutomatonTest.cpp +++ b/alib2data/test-src/automaton/AutomatonTest.cpp @@ -217,12 +217,12 @@ void AutomatonTest::testNPDATransitions() { } void AutomatonTest::testRHPDATransitions() { - automaton::RealTimeHeightDeterministicNPDA automaton{alphabet::Symbol(alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK)}; + automaton::RealTimeHeightDeterministicNPDA automaton{alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK_SYMBOL}; automaton.setStates({automaton::State(1), automaton::State(2), automaton::State(3)}); automaton.setInitialStates({automaton::State(1)}); automaton.setInputAlphabet({alphabet::symbolFrom("a"), alphabet::symbolFrom("b")}); - automaton.setStackAlphabet({alphabet::Symbol(alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK), alphabet::symbolFrom("X"), alphabet::symbolFrom("Y")}); + automaton.setStackAlphabet({alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK_SYMBOL, alphabet::symbolFrom("X"), alphabet::symbolFrom("Y")}); automaton.addCallTransition(automaton::State(1), alphabet::symbolFrom("a"), automaton::State(2), alphabet::symbolFrom("X")); automaton.addCallTransition(automaton::State(2), automaton::State(3), alphabet::symbolFrom("X")); diff --git a/alib2data/test-src/tree/PatternTest.cpp b/alib2data/test-src/tree/PatternTest.cpp index d1140fa74b4e94cfa2da4dc4c0f122a83a0c7887..4a50f37b7dcd43a67422cdef6b4369a25de87082 100644 --- a/alib2data/test-src/tree/PatternTest.cpp +++ b/alib2data/test-src/tree/PatternTest.cpp @@ -69,10 +69,10 @@ void PatternTest::testRankedPatternParser() { const alphabet::Symbol uS { alphabet::SubtreeWildcardSymbol {} }; const std::set<alphabet::Symbol> ualphabet {ua, ub, uc, uS}; - tree::UnrankedNode * unode3 = new tree::UnrankedNode(uc, {}); - tree::UnrankedNode * unode4 = new tree::UnrankedNode(uS, {}); - tree::UnrankedNode * unode2 = new tree::UnrankedNode(ub, {unode3}); - tree::UnrankedNode unode1(ua, {unode2, unode4}); + tree::UnrankedNode unode3(uc, {}); + tree::UnrankedNode unode4(uS, {}); + tree::UnrankedNode unode2(ub, {std::make_smart<tree::UnrankedNode>(std::move(unode3))}); + tree::UnrankedNode unode1(ua, {std::make_smart<tree::UnrankedNode>(std::move(unode2)), std::make_smart<tree::UnrankedNode>(std::move(unode4))}); tree::UnrankedPattern tree2(uS, ualphabet, std::move(unode1)); @@ -89,10 +89,10 @@ void PatternTest::testUnrankedPatternParser() { const alphabet::Symbol S { alphabet::SubtreeWildcardSymbol {} }; const std::set<alphabet::Symbol> alphabet {a, b, c, S}; - tree::UnrankedNode * node3 = new tree::UnrankedNode(c, {}); - tree::UnrankedNode * node4 = new tree::UnrankedNode(S, {}); - tree::UnrankedNode * node2 = new tree::UnrankedNode(b, {node3}); - tree::UnrankedNode node1(a, {node2, node4}); + tree::UnrankedNode node3(c, {}); + tree::UnrankedNode node4(S, {}); + tree::UnrankedNode node2(b, {std::make_smart<tree::UnrankedNode>(std::move(node3))}); + tree::UnrankedNode node1(a, {std::make_smart<tree::UnrankedNode>(std::move(node2)), std::make_smart<tree::UnrankedNode>(std::move(node4))}); tree::UnrankedPattern tree(S, alphabet, std::move(node1)); @@ -163,9 +163,6 @@ void PatternTest::testPrefixRankedPatternParser() { } void PatternTest::testPrefixRankedBarPatternParser() { - const alphabet::Symbol bar{alphabet::BarSymbol{}}; - const alphabet::Symbol variablesBar{alphabet::VariablesBarSymbol{}}; - const alphabet::RankedSymbol a ('a', 2); const alphabet::RankedSymbol b ('b', 1); const alphabet::RankedSymbol c ('c', 0); @@ -179,7 +176,7 @@ void PatternTest::testPrefixRankedBarPatternParser() { tree::RankedNode node1(a, {std::make_smart<tree::RankedNode>(std::move(node2)), std::make_smart<tree::RankedNode>(std::move(node4))}); tree::RankedPattern pattern(S, alphabet, std::move(node1)); - tree::PrefixRankedBarPattern pattern2(bar, variablesBar, pattern); + tree::PrefixRankedBarPattern pattern2(alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, pattern); CPPUNIT_ASSERT( pattern2 == pattern2 ); {