From f4861fbab56a3297fe8c40f56060bce8a92c06ee Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Thu, 17 Nov 2016 19:02:24 +0100 Subject: [PATCH] new approach to specify constant symbols --- .../exact/ExactPatternMatchingAutomaton.cpp | 4 +- .../exact/ExactSubtreeMatchingAutomaton.cpp | 4 +- .../src/automaton/transform/PDAToRHPDA.cpp | 8 ++-- .../src/automaton/transform/RHPDAToPDA.cpp | 4 +- .../grammar/convert/ToAutomatonBottomUp.cpp | 4 +- .../ToPostfixPushdownAutomatonGlushkov.cpp | 8 ++-- .../src/tree/generate/RandomTreeFactory.cpp | 10 ++--- .../grammar/convert/GrammarCFGtoPDATest.cpp | 2 +- alib2data/src/alphabet/BarSymbol.cpp | 5 +-- alib2data/src/alphabet/BarSymbol.h | 32 +++++++++++++- alib2data/src/alphabet/BlankSymbol.cpp | 5 +-- alib2data/src/alphabet/BlankSymbol.h | 32 +++++++++++++- .../src/alphabet/BottomOfTheStackSymbol.cpp | 6 +-- .../src/alphabet/BottomOfTheStackSymbol.h | 32 +++++++++++++- alib2data/src/alphabet/EndSymbol.cpp | 5 +-- alib2data/src/alphabet/EndSymbol.h | 32 +++++++++++++- alib2data/src/alphabet/RankedSymbol.h | 4 ++ alib2data/src/alphabet/StartSymbol.cpp | 5 +-- alib2data/src/alphabet/StartSymbol.h | 32 +++++++++++++- .../src/alphabet/SubtreeWildcardSymbol.cpp | 6 +-- .../src/alphabet/SubtreeWildcardSymbol.h | 44 +++++++++++++++++-- alib2data/src/alphabet/VariablesBarSymbol.cpp | 6 +-- alib2data/src/alphabet/VariablesBarSymbol.h | 44 +++++++++++++++++-- .../ranked/PrefixRankedBarNonlinearPattern.h | 10 ++--- .../src/tree/ranked/PrefixRankedBarPattern.h | 4 +- .../src/tree/ranked/PrefixRankedBarTree.h | 2 +- .../ranked/PrefixRankedNonlinearPattern.h | 4 +- .../src/tree/ranked/PrefixRankedPattern.h | 2 +- alib2data/src/tree/unranked/PrefixBarTree.h | 2 +- alib2data/test-src/alphabet/SymbolTest.cpp | 20 +++++++++ alib2data/test-src/alphabet/SymbolTest.h | 2 + .../test-src/automaton/AutomatonTest.cpp | 4 +- alib2data/test-src/tree/PatternTest.cpp | 2 +- alib2str/src/tree/TreeFromStringParser.cpp | 28 +++++------- 34 files changed, 313 insertions(+), 101 deletions(-) diff --git a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp index 7b634dab3e..36cd8e05a3 100644 --- a/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp +++ b/alib2algo/src/arbology/exact/ExactPatternMatchingAutomaton.cpp @@ -123,7 +123,7 @@ automaton::InputDrivenNPDA < > ExactPatternMatchingAutomaton::construct ( const auto ExactPatternMatchingAutomatonPrefixRankedBarTree = ExactPatternMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA < >, tree::PrefixRankedBarTree < > > ( ExactPatternMatchingAutomaton::construct ); automaton::VisiblyPushdownNPDA < > ExactPatternMatchingAutomaton::construct ( const tree::PrefixRankedBarPattern < > & pattern ) { - automaton::VisiblyPushdownNPDA < > res ( alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } ); + automaton::VisiblyPushdownNPDA < > res ( alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) ); res.addState ( label::labelFrom ( 0 ) ); res.addInitialState ( label::labelFrom ( 0 ) ); @@ -137,7 +137,7 @@ automaton::VisiblyPushdownNPDA < > ExactPatternMatchingAutomaton::construct ( co res.addCallInputSymbol ( alphabet::Symbol ( alphabet::RankedSymbol < > { symbol } ) ); } - res.setPushdownStoreAlphabet ( { alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK }, alphabet::symbolFrom ( 'T' ), alphabet::symbolFrom ( 'R' ) } ); + res.setPushdownStoreAlphabet ( { alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) , alphabet::symbolFrom ( 'T' ), alphabet::symbolFrom ( 'R' ) } ); for ( const std::ranked_symbol < > & symbol : pattern.getAlphabet ( ) ) { if ( ( symbol == pattern.getSubtreeWildcard ( ) ) || ( symbol == pattern.getVariablesBar ( ) ) ) continue; diff --git a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp index 18d04e7fae..2f3e997d99 100644 --- a/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp +++ b/alib2algo/src/arbology/exact/ExactSubtreeMatchingAutomaton.cpp @@ -52,9 +52,9 @@ automaton::InputDrivenNPDA < > ExactSubtreeMatchingAutomaton::construct ( const auto ExactSubtreeMatchingAutomatonPrefixRankedTree = ExactSubtreeMatchingAutomaton::RegistratorWrapper < automaton::InputDrivenNPDA < >, tree::PrefixRankedTree < > > ( ExactSubtreeMatchingAutomaton::construct ); automaton::InputDrivenNPDA < > ExactSubtreeMatchingAutomaton::construct ( const tree::PrefixRankedBarTree < > & pattern ) { - automaton::InputDrivenNPDA < > res ( label::labelFrom ( 0 ), alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } ); + automaton::InputDrivenNPDA < > res ( label::labelFrom ( 0 ), alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) ); - res.setPushdownStoreAlphabet ( { alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK }, alphabet::symbolFrom ( 'S' ) } ); + res.setPushdownStoreAlphabet ( { alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ), alphabet::symbolFrom ( 'S' ) } ); for ( const std::ranked_symbol < > & symbol : pattern.getAlphabet ( ) ) { res.addInputSymbol ( alphabet::Symbol ( alphabet::RankedSymbol < > { symbol } ) ); diff --git a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp index 008e876c99..3ac0e4571c 100644 --- a/alib2algo/src/automaton/transform/PDAToRHPDA.cpp +++ b/alib2algo/src/automaton/transform/PDAToRHPDA.cpp @@ -38,7 +38,7 @@ auto PDAToRHPDARealTimeHeightDeterministicNPDA = PDAToRHPDA::RegistratorWrapper automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const automaton::DPDA < > & pda ) { label::Label q0 = common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, pda.getStates ( ) ); - RealTimeHeightDeterministicDPDA < > res ( q0, alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } ); + RealTimeHeightDeterministicDPDA < > res ( q0, alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) ); res.setInputAlphabet ( pda.getInputAlphabet ( ) ); @@ -47,7 +47,7 @@ automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const autom res.setFinalStates ( pda.getFinalStates ( ) ); std::set < alphabet::Symbol > pushdownStoreAlphabet = pda.getPushdownStoreAlphabet ( ); - pushdownStoreAlphabet.insert ( alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } ); + pushdownStoreAlphabet.insert ( alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) ); res.setPushdownStoreAlphabet ( pushdownStoreAlphabet ); res.addCallTransition ( q0, pda.getInitialState ( ), pda.getInitialSymbol ( ) ); @@ -112,13 +112,13 @@ automaton::RealTimeHeightDeterministicDPDA < > PDAToRHPDA::convert ( const autom auto PDAToRHPDADPDA = PDAToRHPDA::RegistratorWrapper < automaton::RealTimeHeightDeterministicDPDA < >, automaton::DPDA < > > ( PDAToRHPDA::convert ); automaton::RealTimeHeightDeterministicNPDA < > PDAToRHPDA::convert ( const automaton::NPDA < > & pda ) { - RealTimeHeightDeterministicNPDA < > res ( alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } ); + RealTimeHeightDeterministicNPDA < > res ( alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) ); res.setInputAlphabet ( pda.getInputAlphabet ( ) ); res.setStates ( pda.getStates ( ) ); res.setFinalStates ( pda.getFinalStates ( ) ); std::set < alphabet::Symbol > pushdownStoreAlphabet = pda.getPushdownStoreAlphabet ( ); - pushdownStoreAlphabet.insert ( alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } ); + pushdownStoreAlphabet.insert ( alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) ); res.setPushdownStoreAlphabet ( pushdownStoreAlphabet ); label::Label q0 = common::createUnique ( label::InitialStateLabel::INITIAL_STATE_LABEL, res.getStates ( ) ); diff --git a/alib2algo/src/automaton/transform/RHPDAToPDA.cpp b/alib2algo/src/automaton/transform/RHPDAToPDA.cpp index 7906b2088c..aaa663cf71 100644 --- a/alib2algo/src/automaton/transform/RHPDAToPDA.cpp +++ b/alib2algo/src/automaton/transform/RHPDAToPDA.cpp @@ -82,7 +82,7 @@ automaton::DPDA < > RHPDAToPDA::convert ( const automaton::RealTimeHeightDetermi } for ( const auto & transition : pda.getReturnTransitions ( ) ) { - if ( std::get < 2 > ( transition.first ).getData ( ) == alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK ) continue; + if ( std::get < 2 > ( transition.first ) == alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) ) continue; if ( std::get < 1 > ( transition.first ).is < string::Epsilon < > > ( ) ) { auto & epsT = epsilonTransitions[std::get < 0 > ( transition.first )]; @@ -193,7 +193,7 @@ automaton::NPDA < > RHPDAToPDA::convert ( const automaton::RealTimeHeightDetermi } for ( const auto & transition : pda.getReturnTransitions ( ) ) { - if ( std::get < 2 > ( transition.first ).getData ( ) == alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK ) continue; + if ( std::get < 2 > ( transition.first ) == alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) ) continue; if ( std::get < 1 > ( transition.first ).is < string::Epsilon < > > ( ) ) { auto & epsT = epsilonTransitions[std::get < 0 > ( transition.first )]; diff --git a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp index fab2d6e156..6bd1e388d9 100644 --- a/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp +++ b/alib2algo/src/grammar/convert/ToAutomatonBottomUp.cpp @@ -24,7 +24,7 @@ automaton::NPDA < > ToAutomatonBottomUp::convert(const T& grammar) { label::Label q = label::InitialStateLabel::INITIAL_STATE_LABEL; label::Label r = label::FinalStateLabel::FINAL_STATE_LABEL; - automaton::NPDA < > automaton(q, alphabet::Symbol(alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK)); + automaton::NPDA < > automaton(q, alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) ); automaton.addState(r); automaton.addFinalState(r); @@ -43,7 +43,7 @@ automaton::NPDA < > ToAutomatonBottomUp::convert(const T& grammar) { for(const std::vector<alphabet::Symbol>& rhs : kv.second) automaton.addTransition(automaton.getInitialState(), rhs, automaton.getInitialState(), std::vector<alphabet::Symbol>{kv.first}); - automaton.addTransition(automaton.getInitialState(), std::vector<alphabet::Symbol>{alphabet::Symbol(alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK), grammar.getInitialSymbol()}, r, std::vector<alphabet::Symbol>{}); + automaton.addTransition(automaton.getInitialState(), std::vector<alphabet::Symbol>{ alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ), grammar.getInitialSymbol()}, r, std::vector<alphabet::Symbol>{}); return automaton; } diff --git a/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.cpp b/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.cpp index a82cd27825..984a7cd0f3 100644 --- a/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.cpp +++ b/alib2algo/src/rte/convert/ToPostfixPushdownAutomatonGlushkov.cpp @@ -69,7 +69,7 @@ automaton::NPDA < > ToPostfixPushdownAutomatonGlushkov::convert ( const rte::For // step 3; create PDA (w/o transitions yet) and initialize input alphabet = (non-indexed) RTE alphabet and END symbol label::Label q = label::labelFrom ( 'q' ); label::Label f = label::labelFrom ( 'f' ); - automaton::NPDA < > automaton ( q, alphabet::Symbol { alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK } ); + automaton::NPDA < > automaton ( q, alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) ); automaton.addState ( f ); automaton.addFinalState ( f ); @@ -77,7 +77,7 @@ automaton::NPDA < > ToPostfixPushdownAutomatonGlushkov::convert ( const rte::For for ( const std::ranked_symbol < > & symbol : rte.getAlphabet ( ) ) automaton.addInputSymbol ( symbol.getSymbol ( ) ); - automaton.addInputSymbol ( alphabet::Symbol { alphabet::EndSymbol::END } ); + automaton.addInputSymbol ( alphabet::EndSymbol::instance < alphabet::Symbol > ( ) ); // step 4; create pushdown store alphabet; it consists of elements of indexed RTE alphabet and BotS symbol for ( const std::ranked_symbol < > & symb : indexedRTE.getAlphabet ( ) ) @@ -132,8 +132,8 @@ automaton::NPDA < > ToPostfixPushdownAutomatonGlushkov::convert ( const rte::For for ( const std::ranked_symbol < > & symb : firstSet ) { std::vector < alphabet::Symbol > pop; pop.push_back ( alphabet::Symbol ( alphabet::RankedSymbol < > ( symb ) ) ); - pop.push_back ( alphabet::Symbol ( alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK ) ); - automaton.addTransition ( q, alphabet::Symbol { alphabet::EndSymbol::END }, pop, f, { } ); + pop.push_back ( alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) ); + automaton.addTransition ( q, alphabet::EndSymbol::instance < alphabet::Symbol > ( ), pop, f, { } ); } return automaton; diff --git a/alib2algo/src/tree/generate/RandomTreeFactory.cpp b/alib2algo/src/tree/generate/RandomTreeFactory.cpp index b227061de2..26f1a4c1f0 100644 --- a/alib2algo/src/tree/generate/RandomTreeFactory.cpp +++ b/alib2algo/src/tree/generate/RandomTreeFactory.cpp @@ -120,7 +120,7 @@ struct Node { std::tree < alphabet::Symbol > createUnrankedPatternNode ( ) { if ( rank == 0 ) { - return std::tree < alphabet::Symbol > ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), { } ); + return std::tree < alphabet::Symbol > ( alphabet::SubtreeWildcardSymbol::instance < alphabet::Symbol > ( ), { } ); } else { std::vector < std::tree < alphabet::Symbol > > children; Node * nextChild = child; @@ -148,7 +148,7 @@ struct Node { std::tree < std::ranked_symbol < > > createRankedPatternNode ( ) { if ( rank == 0 ) { - return std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ), { } ); + return std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( alphabet::SubtreeWildcardSymbol::instance < alphabet::Symbol > ( ), 0 ), { } ); } else { std::vector < std::tree < std::ranked_symbol < > > > children; Node * nextChild = child; @@ -310,7 +310,7 @@ UnrankedPattern < > RandomTreeFactory::generateUnrankedPattern ( int depth, int for ( std::vector < char >::const_iterator it = alphabet.begin ( ); it != alphabet.end ( ); ++it ) treeAlphabet.insert ( alphabet::symbolFrom ( * it ) ); - alphabet::Symbol subtreeWildcard ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ); + alphabet::Symbol subtreeWildcard = alphabet::SubtreeWildcardSymbol::instance < alphabet::Symbol > ( ); treeAlphabet.insert ( subtreeWildcard ); UnrankedPattern < > tree ( std::move ( subtreeWildcard ), treeAlphabet, root->createUnrankedPatternNode ( ) ); delete root; @@ -350,7 +350,7 @@ RankedPattern < > RandomTreeFactory::generateRankedPattern ( int depth, int node for ( char i : it.second ) treeRankedAlphabet.insert ( std::ranked_symbol < > ( i, it.first ) ); - std::ranked_symbol < > subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ); + std::ranked_symbol < > subtreeWildcard = alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( ); treeRankedAlphabet.insert ( subtreeWildcard ); RankedPattern < > tree ( std::move ( subtreeWildcard ), treeRankedAlphabet, root->createRankedPatternNode ( ) ); delete root; @@ -378,7 +378,7 @@ RankedNonlinearPattern < > RandomTreeFactory::generateRankedNonlinearPattern ( i for ( char i : rankedAlphabet [ 0 ] ) nonlinearVariables.insert ( std::ranked_symbol < > ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol < > ( i ) ), 0 ) ); - std::ranked_symbol < > subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ); + std::ranked_symbol < > subtreeWildcard = alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( ); treeRankedAlphabet.insert ( subtreeWildcard ); treeRankedAlphabet.insert ( nonlinearVariables.begin ( ), nonlinearVariables.end ( ) ); RankedNonlinearPattern < > tree ( std::move ( subtreeWildcard ), nonlinearVariables, treeRankedAlphabet, root->createRankedNonlinearPatternNode ( singleNonlinearVariable ) ); diff --git a/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp b/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp index 14086a6310..b755827c35 100644 --- a/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp +++ b/alib2algo/test-src/grammar/convert/GrammarCFGtoPDATest.cpp @@ -91,7 +91,7 @@ void GrammarCFGtoPDATest::testBottomUp() label::Label q = label::InitialStateLabel::INITIAL_STATE_LABEL; label::Label r = label::FinalStateLabel::FINAL_STATE_LABEL; - alphabet::Symbol bots(alphabet::Symbol{alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK}); + alphabet::Symbol bots( alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) ); automaton::NPDA < > pda(q, bots); pda.addState(r); diff --git a/alib2data/src/alphabet/BarSymbol.cpp b/alib2data/src/alphabet/BarSymbol.cpp index f9d267a094..d18bfb07b5 100644 --- a/alib2data/src/alphabet/BarSymbol.cpp +++ b/alib2data/src/alphabet/BarSymbol.cpp @@ -35,12 +35,9 @@ void BarSymbol::operator>>(std::ostream& out) const { } BarSymbol::operator std::string () const { - return "|"; + return BarSymbol::instance < std::string > ( ); } -BarSymbol BarSymbol::BAR = BarSymbol ( ); -Symbol BarSymbol::BAR_SYMBOL = Symbol ( BarSymbol ( ) ); - BarSymbol BarSymbol::parse(std::deque<sax::Token>::iterator& input) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, BarSymbol::getXmlTagName()); sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, BarSymbol::getXmlTagName()); diff --git a/alib2data/src/alphabet/BarSymbol.h b/alib2data/src/alphabet/BarSymbol.h index f01113bc6e..5b2b5a5021 100644 --- a/alib2data/src/alphabet/BarSymbol.h +++ b/alib2data/src/alphabet/BarSymbol.h @@ -10,6 +10,7 @@ #include "SymbolBase.h" #include "Symbol.h" +#include <object/Object.h> namespace alphabet { @@ -39,8 +40,10 @@ public: virtual explicit operator std::string ( ) const; - static BarSymbol BAR; - static Symbol BAR_SYMBOL; + template < typename Base > + static inline typename std::enable_if < std::is_integral < Base >::value, Base >::type instance ( ); + template < typename Base > + static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( ); static const std::string & getXmlTagName() { static std::string xmlTagName = "BarSymbol"; @@ -55,6 +58,31 @@ public: virtual SymbolBase * inc ( ) &&; }; +template < typename Base > +inline typename std::enable_if < std::is_integral < Base >::value, Base >::type BarSymbol::instance ( ) { + return '|'; +} + +template < > +inline std::string BarSymbol::instance < std::string > ( ) { + return std::string ( 1, BarSymbol::instance < char > ( ) ); +} + +template < > +inline BarSymbol BarSymbol::instance < BarSymbol > ( ) { + return BarSymbol ( ); +} + +template < > +inline Symbol BarSymbol::instance < Symbol > ( ) { + return Symbol ( BarSymbol ( ) ); +} + +template < > +inline alib::Object BarSymbol::instance < alib::Object > ( ) { + return alib::Object ( BarSymbol ( ) ); +} + } /* namespace alphabet */ #endif /* BAR_SYMBOL_H_ */ diff --git a/alib2data/src/alphabet/BlankSymbol.cpp b/alib2data/src/alphabet/BlankSymbol.cpp index e250d84a12..2551a6b65e 100644 --- a/alib2data/src/alphabet/BlankSymbol.cpp +++ b/alib2data/src/alphabet/BlankSymbol.cpp @@ -35,12 +35,9 @@ void BlankSymbol::operator>>(std::ostream& out) const { } BlankSymbol::operator std::string () const { - return "B"; + return BlankSymbol::instance < std::string > ( ); } -BlankSymbol BlankSymbol::BLANK = BlankSymbol ( ); -Symbol BlankSymbol::BLANK_SYMBOL = Symbol ( BlankSymbol ( ) ); - BlankSymbol BlankSymbol::parse(std::deque<sax::Token>::iterator& input) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, BlankSymbol::getXmlTagName()); sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, BlankSymbol::getXmlTagName()); diff --git a/alib2data/src/alphabet/BlankSymbol.h b/alib2data/src/alphabet/BlankSymbol.h index d3e9540b47..0d45eca1e8 100644 --- a/alib2data/src/alphabet/BlankSymbol.h +++ b/alib2data/src/alphabet/BlankSymbol.h @@ -10,6 +10,7 @@ #include "SymbolBase.h" #include "Symbol.h" +#include <object/Object.h> namespace alphabet { @@ -39,8 +40,10 @@ public: virtual explicit operator std::string ( ) const; - static BlankSymbol BLANK; - static Symbol BLANK_SYMBOL; + template < typename Base > + static inline typename std::enable_if < std::is_integral < Base >::value, Base >::type instance ( ); + template < typename Base > + static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( ); static const std::string & getXmlTagName() { static std::string xmlTagName = "BlankSymbol"; @@ -55,6 +58,31 @@ public: virtual SymbolBase * inc ( ) &&; }; +template < typename Base > +inline typename std::enable_if < std::is_integral < Base >::value, Base >::type BlankSymbol::instance ( ) { + return ' '; +} + +template < > +inline std::string BlankSymbol::instance < std::string > ( ) { + return std::string ( 1, BlankSymbol::instance < char > ( ) ); +} + +template < > +inline BlankSymbol BlankSymbol::instance < BlankSymbol > ( ) { + return BlankSymbol ( ); +} + +template < > +inline Symbol BlankSymbol::instance < Symbol > ( ) { + return Symbol ( BlankSymbol ( ) ); +} + +template < > +inline alib::Object BlankSymbol::instance < alib::Object > ( ) { + return alib::Object ( BlankSymbol ( ) ); +} + } /* namespace alphabet */ #endif /* BLANK_SYMBOL_H_ */ diff --git a/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp b/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp index 8b54944099..ec403cd907 100644 --- a/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp +++ b/alib2data/src/alphabet/BottomOfTheStackSymbol.cpp @@ -35,12 +35,10 @@ void BottomOfTheStackSymbol::operator>>(std::ostream& out) const { } BottomOfTheStackSymbol::operator std::string () const { - return "T"; + return BottomOfTheStackSymbol::instance < std::string > ( ); +; } -BottomOfTheStackSymbol BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK = BottomOfTheStackSymbol ( ); -Symbol BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK_SYMBOL = Symbol ( BottomOfTheStackSymbol ( ) ); - BottomOfTheStackSymbol BottomOfTheStackSymbol::parse(std::deque<sax::Token>::iterator& input) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, BottomOfTheStackSymbol::getXmlTagName()); sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, BottomOfTheStackSymbol::getXmlTagName()); diff --git a/alib2data/src/alphabet/BottomOfTheStackSymbol.h b/alib2data/src/alphabet/BottomOfTheStackSymbol.h index 9eda130ede..9bbef82703 100644 --- a/alib2data/src/alphabet/BottomOfTheStackSymbol.h +++ b/alib2data/src/alphabet/BottomOfTheStackSymbol.h @@ -10,6 +10,7 @@ #include "SymbolBase.h" #include "Symbol.h" +#include <object/Object.h> namespace alphabet { @@ -39,8 +40,10 @@ public: virtual explicit operator std::string ( ) const; - static BottomOfTheStackSymbol BOTTOM_OF_THE_STACK; - static Symbol BOTTOM_OF_THE_STACK_SYMBOL; + template < typename Base > + static inline typename std::enable_if < std::is_integral < Base >::value, Base >::type instance ( ); + template < typename Base > + static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( ); static const std::string & getXmlTagName() { static std::string xmlTagName = "BottomOfTheStackSymbol"; @@ -55,6 +58,31 @@ public: virtual SymbolBase * inc ( ) &&; }; +template < typename Base > +inline typename std::enable_if < std::is_integral < Base >::value, Base >::type BottomOfTheStackSymbol::instance ( ) { + return '_'; +} + +template < > +inline std::string BottomOfTheStackSymbol::instance < std::string > ( ) { + return std::string ( 1, BottomOfTheStackSymbol::instance < char > ( ) ); +} + +template < > +inline BottomOfTheStackSymbol BottomOfTheStackSymbol::instance < BottomOfTheStackSymbol > ( ) { + return BottomOfTheStackSymbol ( ); +} + +template < > +inline Symbol BottomOfTheStackSymbol::instance < Symbol > ( ) { + return Symbol ( BottomOfTheStackSymbol ( ) ); +} + +template < > +inline alib::Object BottomOfTheStackSymbol::instance < alib::Object > ( ) { + return alib::Object ( BottomOfTheStackSymbol ( ) ); +} + } /* namespace alphabet */ #endif /* BOTTOM_OF_THE_STACK_SYMBOL_H_ */ diff --git a/alib2data/src/alphabet/EndSymbol.cpp b/alib2data/src/alphabet/EndSymbol.cpp index 9879d7cd59..74fab90d2f 100644 --- a/alib2data/src/alphabet/EndSymbol.cpp +++ b/alib2data/src/alphabet/EndSymbol.cpp @@ -35,12 +35,9 @@ void EndSymbol::operator>>(std::ostream& out) const { } EndSymbol::operator std::string () const { - return "$"; + return EndSymbol::instance < std::string > ( ); } -EndSymbol EndSymbol::END = EndSymbol ( ); -Symbol EndSymbol::END_SYMBOL = Symbol ( EndSymbol ( ) ); - EndSymbol EndSymbol::parse(std::deque<sax::Token>::iterator& input) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, EndSymbol::getXmlTagName()); sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, EndSymbol::getXmlTagName()); diff --git a/alib2data/src/alphabet/EndSymbol.h b/alib2data/src/alphabet/EndSymbol.h index d2b77c40ff..a5f9fca8f8 100644 --- a/alib2data/src/alphabet/EndSymbol.h +++ b/alib2data/src/alphabet/EndSymbol.h @@ -10,6 +10,7 @@ #include "SymbolBase.h" #include "Symbol.h" +#include <object/Object.h> namespace alphabet { @@ -39,8 +40,10 @@ public: virtual explicit operator std::string ( ) const; - static EndSymbol END; - static Symbol END_SYMBOL; + template < typename Base > + static inline typename std::enable_if < std::is_integral < Base >::value, Base >::type instance ( ); + template < typename Base > + static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( ); static const std::string & getXmlTagName() { static std::string xmlTagName = "EndSymbol"; @@ -55,6 +58,31 @@ public: virtual SymbolBase * inc ( ) &&; }; +template < typename Base > +inline typename std::enable_if < std::is_integral < Base >::value, Base >::type EndSymbol::instance ( ) { + return '$'; +} + +template < > +inline std::string EndSymbol::instance < std::string > ( ) { + return std::string ( 1, EndSymbol::instance < char > ( ) ); +} + +template < > +inline EndSymbol EndSymbol::instance < EndSymbol > ( ) { + return EndSymbol ( ); +} + +template < > +inline Symbol EndSymbol::instance < Symbol > ( ) { + return Symbol ( EndSymbol ( ) ); +} + +template < > +inline alib::Object EndSymbol::instance < alib::Object > ( ) { + return alib::Object ( EndSymbol ( ) ); +} + } /* namespace alphabet */ #endif /* END_SYMBOL_H_ */ diff --git a/alib2data/src/alphabet/RankedSymbol.h b/alib2data/src/alphabet/RankedSymbol.h index dae75a6675..4abc6797fe 100644 --- a/alib2data/src/alphabet/RankedSymbol.h +++ b/alib2data/src/alphabet/RankedSymbol.h @@ -42,7 +42,11 @@ public: virtual explicit operator std::string ( ) const; using SymbolBase::operator ==; + using SymbolBase::operator !=; using SymbolBase::operator <; + using SymbolBase::operator <=; + using SymbolBase::operator >; + using SymbolBase::operator >=; static const std::string & getXmlTagName() { static std::string xmlTagName = "RankedSymbol"; diff --git a/alib2data/src/alphabet/StartSymbol.cpp b/alib2data/src/alphabet/StartSymbol.cpp index 28668e3a3f..64c3525af8 100644 --- a/alib2data/src/alphabet/StartSymbol.cpp +++ b/alib2data/src/alphabet/StartSymbol.cpp @@ -35,12 +35,9 @@ void StartSymbol::operator>>(std::ostream& out) const { } StartSymbol::operator std::string () const { - return "$"; + return StartSymbol::instance < std::string > ( ); } -StartSymbol StartSymbol::START = StartSymbol ( ); -Symbol StartSymbol::START_SYMBOL = Symbol ( StartSymbol ( ) ); - StartSymbol StartSymbol::parse(std::deque<sax::Token>::iterator& input) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, StartSymbol::getXmlTagName()); sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, StartSymbol::getXmlTagName()); diff --git a/alib2data/src/alphabet/StartSymbol.h b/alib2data/src/alphabet/StartSymbol.h index 3a322d3c8e..b3ab08c130 100644 --- a/alib2data/src/alphabet/StartSymbol.h +++ b/alib2data/src/alphabet/StartSymbol.h @@ -10,6 +10,7 @@ #include "SymbolBase.h" #include "Symbol.h" +#include <object/Object.h> namespace alphabet { @@ -39,8 +40,10 @@ public: virtual explicit operator std::string ( ) const; - static StartSymbol START; - static Symbol START_SYMBOL; + template < typename Base > + static inline typename std::enable_if < std::is_integral < Base >::value, Base >::type instance ( ); + template < typename Base > + static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( ); static const std::string & getXmlTagName() { static std::string xmlTagName = "StartSymbol"; @@ -55,6 +58,31 @@ public: virtual SymbolBase * inc ( ) &&; }; +template < typename Base > +inline typename std::enable_if < std::is_integral < Base >::value, Base >::type StartSymbol::instance ( ) { + return '^'; +} + +template < > +inline std::string StartSymbol::instance < std::string > ( ) { + return std::string ( 1, StartSymbol::instance < char > ( ) ); +} + +template < > +inline StartSymbol StartSymbol::instance < StartSymbol > ( ) { + return StartSymbol ( ); +} + +template < > +inline Symbol StartSymbol::instance < Symbol > ( ) { + return Symbol ( StartSymbol ( ) ); +} + +template < > +inline alib::Object StartSymbol::instance < alib::Object > ( ) { + return alib::Object ( StartSymbol ( ) ); +} + } /* namespace alphabet */ #endif /* START_SYMBOL_H_ */ diff --git a/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp b/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp index b374d47678..bc7e63b7cc 100644 --- a/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp +++ b/alib2data/src/alphabet/SubtreeWildcardSymbol.cpp @@ -35,13 +35,9 @@ void SubtreeWildcardSymbol::operator>>(std::ostream& out) const { } SubtreeWildcardSymbol::operator std::string () const { - return "#S"; + return SubtreeWildcardSymbol::instance < std::string > ( ); } -SubtreeWildcardSymbol SubtreeWildcardSymbol::SUBTREE_WILDCARD = SubtreeWildcardSymbol ( ); -Symbol SubtreeWildcardSymbol::SUBTREE_WILDCARD_SYMBOL = Symbol ( SubtreeWildcardSymbol ( ) ); -RankedSymbol < > SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL = RankedSymbol < > ( Symbol ( SubtreeWildcardSymbol ( ) ), 0); - SubtreeWildcardSymbol SubtreeWildcardSymbol::parse(std::deque<sax::Token>::iterator& input) { sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::START_ELEMENT, SubtreeWildcardSymbol::getXmlTagName()); sax::FromXMLParserHelper::popToken(input, sax::Token::TokenType::END_ELEMENT, SubtreeWildcardSymbol::getXmlTagName()); diff --git a/alib2data/src/alphabet/SubtreeWildcardSymbol.h b/alib2data/src/alphabet/SubtreeWildcardSymbol.h index e820c63341..01d24677bd 100644 --- a/alib2data/src/alphabet/SubtreeWildcardSymbol.h +++ b/alib2data/src/alphabet/SubtreeWildcardSymbol.h @@ -11,6 +11,7 @@ #include "SymbolBase.h" #include "Symbol.h" #include "RankedSymbol.h" +#include <object/Object.h> namespace alphabet { @@ -40,9 +41,10 @@ public: virtual explicit operator std::string ( ) const; - static SubtreeWildcardSymbol SUBTREE_WILDCARD; - static Symbol SUBTREE_WILDCARD_SYMBOL; - static RankedSymbol < > RANKED_SUBTREE_WILDCARD_SYMBOL; + template < typename Base > + static inline typename std::enable_if < std::is_integral < Base >::value, Base >::type instance ( ); + template < typename Base > + static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( ); static const std::string & getXmlTagName() { static std::string xmlTagName = "SubtreeWildcardSymbol"; @@ -57,6 +59,42 @@ public: virtual SymbolBase * inc ( ) &&; }; +template < typename Base > +inline typename std::enable_if < std::is_integral < Base >::value, Base >::type SubtreeWildcardSymbol::instance ( ) { + return 'S'; +} + +template < > +inline std::string SubtreeWildcardSymbol::instance < std::string > ( ) { + return std::string ( 1, SubtreeWildcardSymbol::instance < char > ( ) ); +} + +template < > +inline SubtreeWildcardSymbol SubtreeWildcardSymbol::instance < SubtreeWildcardSymbol > ( ) { + return SubtreeWildcardSymbol ( ); +} + +template < > +inline Symbol SubtreeWildcardSymbol::instance < Symbol > ( ) { + return Symbol ( SubtreeWildcardSymbol ( ) ); +} + +// TODO make partially specialised when needed by classes or variables, functions can be partially specialsed +template < > +inline std::ranked_symbol < > SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( ) { + return std::ranked_symbol < > ( Symbol ( SubtreeWildcardSymbol ( ) ), 0); +} + +template < > +inline RankedSymbol < > SubtreeWildcardSymbol::instance < RankedSymbol < > > ( ) { + return RankedSymbol < > ( SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( ) ); +} + +template < > +inline alib::Object SubtreeWildcardSymbol::instance < alib::Object > ( ) { + return alib::Object ( SubtreeWildcardSymbol ( ) ); +} + } /* namespace alphabet */ #endif /* SUBTREE_WILDCARD_SYMBOL_H_ */ diff --git a/alib2data/src/alphabet/VariablesBarSymbol.cpp b/alib2data/src/alphabet/VariablesBarSymbol.cpp index f24a092285..97f583978e 100644 --- a/alib2data/src/alphabet/VariablesBarSymbol.cpp +++ b/alib2data/src/alphabet/VariablesBarSymbol.cpp @@ -34,13 +34,9 @@ void VariablesBarSymbol::operator >>( std::ostream & out ) const { } VariablesBarSymbol::operator std::string ( ) const { - return "|"; + return VariablesBarSymbol::instance < std::string > ( ); } -VariablesBarSymbol VariablesBarSymbol::BAR = VariablesBarSymbol ( ); -Symbol VariablesBarSymbol::BAR_SYMBOL = Symbol ( VariablesBarSymbol ( ) ); -RankedSymbol < > VariablesBarSymbol::RANKED_BAR_SYMBOL = RankedSymbol < > ( Symbol ( VariablesBarSymbol ( ) ), 0); - VariablesBarSymbol VariablesBarSymbol::parse ( std::deque < sax::Token >::iterator & input ) { sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::START_ELEMENT, VariablesBarSymbol::getXmlTagName() ); sax::FromXMLParserHelper::popToken ( input, sax::Token::TokenType::END_ELEMENT, VariablesBarSymbol::getXmlTagName() ); diff --git a/alib2data/src/alphabet/VariablesBarSymbol.h b/alib2data/src/alphabet/VariablesBarSymbol.h index 5f3d3671a2..585b50c76c 100644 --- a/alib2data/src/alphabet/VariablesBarSymbol.h +++ b/alib2data/src/alphabet/VariablesBarSymbol.h @@ -11,6 +11,7 @@ #include "SymbolBase.h" #include "Symbol.h" #include "RankedSymbol.h" +#include <object/Object.h> namespace alphabet { @@ -40,9 +41,10 @@ public: virtual explicit operator std::string ( ) const; - static VariablesBarSymbol BAR; - static Symbol BAR_SYMBOL; - static RankedSymbol < > RANKED_BAR_SYMBOL; + template < typename Base > + static inline typename std::enable_if < std::is_integral < Base >::value, Base >::type instance ( ); + template < typename Base > + static inline typename std::enable_if < ! std::is_integral < Base >::value, Base >::type instance ( ); static const std::string & getXmlTagName() { static std::string xmlTagName = "VariablesBarSymbol"; @@ -57,6 +59,42 @@ public: virtual SymbolBase * inc ( ) &&; }; +template < typename Base > +inline typename std::enable_if < std::is_integral < Base >::value, Base >::type VariablesBarSymbol::instance ( ) { + return '!'; +} + +template < > +inline std::string VariablesBarSymbol::instance < std::string > ( ) { + return std::string ( 1, VariablesBarSymbol::instance < char > ( ) ); +} + +template < > +inline VariablesBarSymbol VariablesBarSymbol::instance < VariablesBarSymbol > ( ) { + return VariablesBarSymbol ( ); +} + +template < > +inline Symbol VariablesBarSymbol::instance < Symbol > ( ) { + return Symbol ( VariablesBarSymbol ( ) ); +} + +// TODO make partially specialised when needed by classes or variables, functions can be partially specialsed +template < > +inline std::ranked_symbol < > VariablesBarSymbol::instance < std::ranked_symbol < > > ( ) { + return std::ranked_symbol < > ( Symbol ( VariablesBarSymbol ( ) ), 0); +} + +template < > +inline RankedSymbol < > VariablesBarSymbol::instance < RankedSymbol < > > ( ) { + return RankedSymbol < > ( VariablesBarSymbol::instance < std::ranked_symbol < > > ( ) ); +} + +template < > +inline alib::Object VariablesBarSymbol::instance < alib::Object > ( ) { + return alib::Object ( VariablesBarSymbol ( ) ); +} + } /* namespace alphabet */ #endif /* VARIABLES_BAR_SYMBOL_H_ */ diff --git a/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h b/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h index 855b370849..1a5cd708d3 100644 --- a/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h +++ b/alib2data/src/tree/ranked/PrefixRankedBarNonlinearPattern.h @@ -145,7 +145,7 @@ PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonline } template < class SymbolType, class RankType > -PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < SymbolType, RankType > variablesBar, const RankedTree < > & tree ) : PrefixRankedBarNonlinearPattern ( TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar }, variablesBar, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ) + TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL }, toPrefixRankedBar ( tree.getContent ( ), alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, barBase, variablesBar ) ) { +PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( alphabet::Symbol barBase, std::ranked_symbol < SymbolType, RankType > variablesBar, const RankedTree < > & tree ) : PrefixRankedBarNonlinearPattern ( TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar }, variablesBar, alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), { }, tree.getAlphabet ( ) + TreeAuxiliary::computeBars ( tree.getAlphabet ( ), barBase ) + std::set < std::ranked_symbol < SymbolType, RankType > > { variablesBar, alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ) }, toPrefixRankedBar ( tree.getContent ( ), alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), { }, barBase, variablesBar ) ) { } template < class SymbolType, class RankType > @@ -157,7 +157,7 @@ PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonline } template < class SymbolType, class RankType > -PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const PrefixRankedBarTree < > & tree ) : PrefixRankedBarNonlinearPattern ( tree.getBars ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL }, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL }, tree.getContent ( ) ) { +PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const PrefixRankedBarTree < > & tree ) : PrefixRankedBarNonlinearPattern ( tree.getBars ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ) }, alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), { }, tree.getAlphabet ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ) }, tree.getContent ( ) ) { } template < class SymbolType, class RankType > @@ -165,15 +165,15 @@ PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonline } template < class SymbolType, class RankType > -PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const RankedTree < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) { +PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const RankedTree < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::instance < SymbolType > ( ), alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), tree ) { } template < class SymbolType, class RankType > -PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const RankedPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) { +PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const RankedPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::instance < SymbolType > ( ), alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), tree ) { } template < class SymbolType, class RankType > -PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const RankedNonlinearPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) { +PrefixRankedBarNonlinearPattern < SymbolType, RankType >::PrefixRankedBarNonlinearPattern ( const RankedNonlinearPattern < > & tree ) : PrefixRankedBarNonlinearPattern ( alphabet::BarSymbol::instance < SymbolType > ( ), alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), tree ) { } template < class SymbolType, class RankType > diff --git a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h index 772bda0ca7..8ba7b4a313 100644 --- a/alib2data/src/tree/ranked/PrefixRankedBarPattern.h +++ b/alib2data/src/tree/ranked/PrefixRankedBarPattern.h @@ -135,11 +135,11 @@ PrefixRankedBarPattern < SymbolType, RankType >::PrefixRankedBarPattern ( alphab } template < class SymbolType, class RankType > -PrefixRankedBarPattern < SymbolType, RankType >::PrefixRankedBarPattern ( const PrefixRankedBarTree < > & tree ) : PrefixRankedBarPattern ( tree.getBars() + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL }, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, tree.getAlphabet ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL }, tree.getContent ( ) ) { +PrefixRankedBarPattern < SymbolType, RankType >::PrefixRankedBarPattern ( const PrefixRankedBarTree < > & tree ) : PrefixRankedBarPattern ( tree.getBars() + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ) }, alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), tree.getAlphabet ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ) }, tree.getContent ( ) ) { } template < class SymbolType, class RankType > -PrefixRankedBarPattern < SymbolType, RankType >::PrefixRankedBarPattern ( const RankedPattern < > & tree ) : PrefixRankedBarPattern ( alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, tree ) { +PrefixRankedBarPattern < SymbolType, RankType >::PrefixRankedBarPattern ( const RankedPattern < > & tree ) : PrefixRankedBarPattern ( alphabet::BarSymbol::instance < SymbolType > ( ), alphabet::VariablesBarSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), tree ) { } template < class SymbolType, class RankType > diff --git a/alib2data/src/tree/ranked/PrefixRankedBarTree.h b/alib2data/src/tree/ranked/PrefixRankedBarTree.h index f07086a877..4106f31398 100644 --- a/alib2data/src/tree/ranked/PrefixRankedBarTree.h +++ b/alib2data/src/tree/ranked/PrefixRankedBarTree.h @@ -121,7 +121,7 @@ PrefixRankedBarTree < SymbolType, RankType >::PrefixRankedBarTree ( alphabet::Sy } template < class SymbolType, class RankType > -PrefixRankedBarTree < SymbolType, RankType >::PrefixRankedBarTree ( const RankedTree < > & tree ) : PrefixRankedBarTree ( alphabet::BarSymbol::BAR_SYMBOL, tree ) { +PrefixRankedBarTree < SymbolType, RankType >::PrefixRankedBarTree ( const RankedTree < > & tree ) : PrefixRankedBarTree ( alphabet::BarSymbol::instance < SymbolType > ( ), tree ) { } template < class SymbolType, class RankType > diff --git a/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h b/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h index 643564a0c9..e843e58a22 100644 --- a/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h +++ b/alib2data/src/tree/ranked/PrefixRankedNonlinearPattern.h @@ -133,7 +133,7 @@ PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPatt } template < class SymbolType, class RankType > -PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( const PrefixRankedTree < > & tree ) : PrefixRankedNonlinearPattern ( alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ), tree.getContent ( ) ) { +PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( const PrefixRankedTree < > & tree ) : PrefixRankedNonlinearPattern ( alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), { }, tree.getAlphabet ( ), tree.getContent ( ) ) { } template < class SymbolType, class RankType > @@ -141,7 +141,7 @@ PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPatt } template < class SymbolType, class RankType > -PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( const RankedTree < > & tree ) : PrefixRankedNonlinearPattern ( alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, { }, tree.getAlphabet ( ), toPrefixRanked ( tree.getContent ( ) ) ) { +PrefixRankedNonlinearPattern < SymbolType, RankType >::PrefixRankedNonlinearPattern ( const RankedTree < > & tree ) : PrefixRankedNonlinearPattern ( alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), { }, tree.getAlphabet ( ), toPrefixRanked ( tree.getContent ( ) ) ) { } template < class SymbolType, class RankType > diff --git a/alib2data/src/tree/ranked/PrefixRankedPattern.h b/alib2data/src/tree/ranked/PrefixRankedPattern.h index 988cc22b8c..0b98089902 100644 --- a/alib2data/src/tree/ranked/PrefixRankedPattern.h +++ b/alib2data/src/tree/ranked/PrefixRankedPattern.h @@ -117,7 +117,7 @@ PrefixRankedPattern < SymbolType, RankType >::PrefixRankedPattern ( std::ranked_ } template < class SymbolType, class RankType > -PrefixRankedPattern < SymbolType, RankType >::PrefixRankedPattern ( const PrefixRankedTree < > & tree ) : PrefixRankedPattern ( alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL, tree.getAlphabet ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::SubtreeWildcardSymbol::RANKED_SUBTREE_WILDCARD_SYMBOL }, tree.getContent ( ) ) { +PrefixRankedPattern < SymbolType, RankType >::PrefixRankedPattern ( const PrefixRankedTree < > & tree ) : PrefixRankedPattern ( alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ), tree.getAlphabet ( ) + std::set < std::ranked_symbol < SymbolType, RankType > > { alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < SymbolType, RankType > > ( ) }, tree.getContent ( ) ) { } template < class SymbolType, class RankType > diff --git a/alib2data/src/tree/unranked/PrefixBarTree.h b/alib2data/src/tree/unranked/PrefixBarTree.h index 98e7c5b341..874093c6f7 100644 --- a/alib2data/src/tree/unranked/PrefixBarTree.h +++ b/alib2data/src/tree/unranked/PrefixBarTree.h @@ -118,7 +118,7 @@ PrefixBarTree < SymbolType >::PrefixBarTree ( SymbolType bar, const UnrankedTree } template < class SymbolType > -PrefixBarTree < SymbolType >::PrefixBarTree ( const UnrankedTree < SymbolType > & tree ) : PrefixBarTree ( alphabet::BarSymbol::BAR_SYMBOL, tree ) { +PrefixBarTree < SymbolType >::PrefixBarTree ( const UnrankedTree < SymbolType > & tree ) : PrefixBarTree ( alphabet::BarSymbol::instance < SymbolType > ( ), tree ) { } template < class SymbolType > diff --git a/alib2data/test-src/alphabet/SymbolTest.cpp b/alib2data/test-src/alphabet/SymbolTest.cpp index 1a80a11f4c..8ceaec1194 100644 --- a/alib2data/test-src/alphabet/SymbolTest.cpp +++ b/alib2data/test-src/alphabet/SymbolTest.cpp @@ -77,3 +77,23 @@ void SymbolTest::testOrder ( ) { // CPPUNIT_ASSERT(es < ls); //End symbol typically denoted by '$' is lexicographically smaller than any other symbol // CPPUNIT_ASSERT(ls < ss); //Start symbol typically denoted by '^' is lexicographically bigger than any other symbol } + +namespace alphabet { + +template < > +inline int BarSymbol::instance < int > ( ) { + return -1; +} + +} /* namespace alphabet */ + +void SymbolTest::testDefaultValues ( ) { + CPPUNIT_ASSERT ( alphabet::BarSymbol::instance < int > ( ) == -1 ); + CPPUNIT_ASSERT ( alphabet::BarSymbol::instance < char > ( ) == '|'); + std::cout << alphabet::BarSymbol::instance < std::string > ( ) << std::endl; + CPPUNIT_ASSERT ( alphabet::BarSymbol::instance < std::string > ( ) == "|"); + CPPUNIT_ASSERT ( alphabet::BarSymbol::instance < alphabet::BarSymbol > ( ) == alphabet::BarSymbol ( ) ); + CPPUNIT_ASSERT ( alphabet::BarSymbol::instance < alphabet::Symbol > ( ) == alphabet::Symbol ( alphabet::BarSymbol ( ) ) ); + CPPUNIT_ASSERT ( alphabet::BarSymbol::instance < alib::Object > ( ) == alib::Object ( alphabet::BarSymbol ( ) ) ); + +} diff --git a/alib2data/test-src/alphabet/SymbolTest.h b/alib2data/test-src/alphabet/SymbolTest.h index f9599c1c70..3b7070b978 100644 --- a/alib2data/test-src/alphabet/SymbolTest.h +++ b/alib2data/test-src/alphabet/SymbolTest.h @@ -9,6 +9,7 @@ class SymbolTest : public CppUnit::TestFixture CPPUNIT_TEST( testCopyConstruct ); CPPUNIT_TEST( testXMLParser ); CPPUNIT_TEST( testOrder ); + CPPUNIT_TEST( testDefaultValues ); CPPUNIT_TEST_SUITE_END(); public: @@ -18,6 +19,7 @@ public: void testCopyConstruct(); void testXMLParser(); void testOrder(); + void testDefaultValues(); }; #endif // SYMBOL_TEST_H_ diff --git a/alib2data/test-src/automaton/AutomatonTest.cpp b/alib2data/test-src/automaton/AutomatonTest.cpp index 837d74bd24..b198c3354d 100644 --- a/alib2data/test-src/automaton/AutomatonTest.cpp +++ b/alib2data/test-src/automaton/AutomatonTest.cpp @@ -216,12 +216,12 @@ void AutomatonTest::testNPDATransitions() { } void AutomatonTest::testRHPDATransitions() { - automaton::RealTimeHeightDeterministicNPDA < > automaton{alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK_SYMBOL}; + automaton::RealTimeHeightDeterministicNPDA < > automaton{alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ) }; automaton.setStates({label::labelFrom(1), label::labelFrom(2), label::labelFrom(3)}); automaton.setInitialStates({label::labelFrom(1)}); automaton.setInputAlphabet({alphabet::symbolFrom("a"), alphabet::symbolFrom("b")}); - automaton.setPushdownStoreAlphabet({alphabet::BottomOfTheStackSymbol::BOTTOM_OF_THE_STACK_SYMBOL, alphabet::symbolFrom("X"), alphabet::symbolFrom("Y")}); + automaton.setPushdownStoreAlphabet({alphabet::BottomOfTheStackSymbol::instance < alphabet::Symbol > ( ), alphabet::symbolFrom("X"), alphabet::symbolFrom("Y")}); automaton.addCallTransition(label::labelFrom(1), alphabet::symbolFrom("a"), label::labelFrom(2), alphabet::symbolFrom("X")); automaton.addCallTransition(label::labelFrom(2), label::labelFrom(3), alphabet::symbolFrom("X")); diff --git a/alib2data/test-src/tree/PatternTest.cpp b/alib2data/test-src/tree/PatternTest.cpp index 3d8e7fe7d1..bae444f177 100644 --- a/alib2data/test-src/tree/PatternTest.cpp +++ b/alib2data/test-src/tree/PatternTest.cpp @@ -173,7 +173,7 @@ void PatternTest::testPrefixRankedBarPatternParser() { std::tree < std::ranked_symbol < > > node1(a, {std::move(node2), std::move(node4)}); tree::RankedPattern < > pattern(S, alphabet, std::move(node1)); - tree::PrefixRankedBarPattern < > pattern2(alphabet::BarSymbol::BAR_SYMBOL, alphabet::VariablesBarSymbol::RANKED_BAR_SYMBOL, pattern); + tree::PrefixRankedBarPattern < > pattern2(alphabet::BarSymbol::instance < alphabet::Symbol > ( ), alphabet::VariablesBarSymbol::instance < std::ranked_symbol < alphabet::Symbol, primitive::Unsigned > > ( ), pattern); CPPUNIT_ASSERT( pattern2 == pattern2 ); { diff --git a/alib2str/src/tree/TreeFromStringParser.cpp b/alib2str/src/tree/TreeFromStringParser.cpp index 2f19e1d38b..bd26d73857 100644 --- a/alib2str/src/tree/TreeFromStringParser.cpp +++ b/alib2str/src/tree/TreeFromStringParser.cpp @@ -27,21 +27,19 @@ Tree TreeFromStringParser::parseTree ( std::istream & input, const std::set < FE token = TreeFromStringLexer::next ( input ); if ( token.type == TreeFromStringLexer::TokenType::BAR ) { - alphabet::Symbol subtreeWildcard ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ); - return Tree ( UnrankedPattern < > ( subtreeWildcard, std::tree < alphabet::Symbol > ( subtreeWildcard, { } ) ) ); + return Tree ( UnrankedPattern < > ( alphabet::SubtreeWildcardSymbol::instance < alphabet::Symbol > ( ), std::tree < alphabet::Symbol > ( alphabet::SubtreeWildcardSymbol::instance < alphabet::Symbol > ( ), { } ) ) ); } else { - std::ranked_symbol < > subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ); - return Tree ( RankedPattern < > ( subtreeWildcard, std::tree < std::ranked_symbol < > > ( subtreeWildcard, { } ) ) ); + return Tree ( RankedPattern < > ( alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( ), std::tree < std::ranked_symbol < > > ( alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( ), { } ) ) ); } } else if ( token.type == TreeFromStringLexer::TokenType::NONLINEAR_VARIABLE ) { token = TreeFromStringLexer::next ( input ); if ( token.type == TreeFromStringLexer::TokenType::BAR ) { - alphabet::Symbol subtreeWildcard ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ); + alphabet::Symbol subtreeWildcard = alphabet::SubtreeWildcardSymbol::instance < alphabet::Symbol > ( ); alphabet::Symbol nonlinearVariable ( alphabet::NonlinearVariableSymbol < > ( alphabet::symbolFrom ( token.value ) ) ); return Tree ( UnrankedNonlinearPattern < > ( subtreeWildcard, { nonlinearVariable }, std::tree < alphabet::Symbol > ( subtreeWildcard, { } ) ) ); } else { - std::ranked_symbol < > subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ); + std::ranked_symbol < > subtreeWildcard = alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( ); std::ranked_symbol < > nonlinearVariable ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol < > ( alphabet::symbolFrom ( token.value ) ) ), 0 ); return Tree ( RankedNonlinearPattern < > ( subtreeWildcard, { nonlinearVariable }, std::tree < std::ranked_symbol < > > ( nonlinearVariable, { } ) ) ); } @@ -65,13 +63,11 @@ Tree TreeFromStringParser::parseTree ( std::istream & input, const std::set < FE childs.emplace_back ( parseRankedContent ( input, isPattern, nonlinearVariables ) ); if ( isPattern && nonlinearVariables.size ( ) ) { - std::ranked_symbol < > subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ); - RankedNonlinearPattern < > tree ( std::move ( subtreeWildcard ), std::move ( nonlinearVariables ), std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( std::move ( symbol ), rank ), std::move ( childs ) ) ); + RankedNonlinearPattern < > tree ( alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( ), std::move ( nonlinearVariables ), std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( std::move ( symbol ), rank ), std::move ( childs ) ) ); if ( features.count ( FEATURES::RANKED_NONLINEAR_PATTERN ) ) return Tree ( std::move ( tree ) ); } else if ( isPattern ) { - std::ranked_symbol < > subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ); - RankedPattern < > tree ( std::move ( subtreeWildcard ), std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( std::move ( symbol ), rank ), std::move ( childs ) ) ); + RankedPattern < > tree ( alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( ), std::tree < std::ranked_symbol < > > ( std::ranked_symbol < > ( std::move ( symbol ), rank ), std::move ( childs ) ) ); if ( features.count ( FEATURES::RANKED_PATTERN ) ) return Tree ( std::move ( tree ) ); } else { @@ -95,13 +91,11 @@ Tree TreeFromStringParser::parseTree ( std::istream & input, const std::set < FE throw exception::CommonException ( "Missing bar" ); if ( isPattern && nonlinearVariables.size ( ) ) { - alphabet::Symbol subtreeWildcard ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ); - UnrankedNonlinearPattern < > tree ( std::move ( subtreeWildcard ), std::move ( nonlinearVariables ), std::tree < alphabet::Symbol > ( std::move ( symbol ), std::move ( childs ) ) ); + UnrankedNonlinearPattern < > tree ( alphabet::SubtreeWildcardSymbol::instance < alphabet::Symbol > ( ), std::move ( nonlinearVariables ), std::tree < alphabet::Symbol > ( std::move ( symbol ), std::move ( childs ) ) ); if ( features.count ( FEATURES::UNRANKED_NONLINEAR_PATTERN ) ) return Tree ( std::move ( tree ) ); } else if ( isPattern ) { - alphabet::Symbol subtreeWildcard ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ); - UnrankedPattern < > tree ( std::move ( subtreeWildcard ), std::tree < alphabet::Symbol > ( std::move ( symbol ), std::move ( childs ) ) ); + UnrankedPattern < > tree ( alphabet::SubtreeWildcardSymbol::instance < alphabet::Symbol > ( ), std::tree < alphabet::Symbol > ( std::move ( symbol ), std::move ( childs ) ) ); if ( features.count ( FEATURES::UNRANKED_PATTERN ) ) return Tree ( std::move ( tree ) ); } else { @@ -120,8 +114,7 @@ std::tree < std::ranked_symbol < > > TreeFromStringParser::parseRankedContent ( if ( token.type == TreeFromStringLexer::TokenType::SUBTREE_WILDCARD ) { isPattern = true; - std::ranked_symbol < > subtreeWildcard ( alphabet::Symbol ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ), 0 ); - return std::tree < std::ranked_symbol < > > ( std::move ( subtreeWildcard ), { } ); + return std::tree < std::ranked_symbol < > > ( alphabet::SubtreeWildcardSymbol::instance < std::ranked_symbol < > > ( ), { } ); } else if ( token.type == TreeFromStringLexer::TokenType::NONLINEAR_VARIABLE ) { isPattern = true; std::ranked_symbol < > nonlinearVariable ( alphabet::Symbol ( alphabet::NonlinearVariableSymbol < > ( alphabet::symbolFrom ( token.value ) ) ), 0 ); @@ -158,8 +151,7 @@ std::tree < alphabet::Symbol > TreeFromStringParser::parseUnrankedContent ( std: throw exception::CommonException ( "Missing bar" ); isPattern = true; - alphabet::Symbol subtreeWildcard ( alphabet::SubtreeWildcardSymbol::SUBTREE_WILDCARD ); - return std::tree < alphabet::Symbol > ( std::move ( subtreeWildcard ), { } ); + return std::tree < alphabet::Symbol > ( alphabet::SubtreeWildcardSymbol::instance < alphabet::Symbol > ( ), { } ); } else if ( token.type == TreeFromStringLexer::TokenType::NONLINEAR_VARIABLE ) { token = TreeFromStringLexer::next ( input ); -- GitLab