diff --git a/alib2str/src/automaton/AutomatonFromStringLexer.cpp b/alib2str/src/automaton/AutomatonFromStringLexer.cpp index 839fe6ec8f0c50a1fea5644119d289d2cc8bb752..8e1401147ebc72904dfc8fbda057c91f26e769ce 100644 --- a/alib2str/src/automaton/AutomatonFromStringLexer.cpp +++ b/alib2str/src/automaton/AutomatonFromStringLexer.cpp @@ -6,6 +6,8 @@ */ #include "AutomatonFromStringLexer.h" +#include <exception/CommonException.h> +#include <iterator> namespace automaton { @@ -75,7 +77,7 @@ L0: return token; } else { in.clear(); - putback(in, std::move(token)); + putback(in, token); token.type = TokenType::ERROR; return token; } @@ -92,19 +94,46 @@ L1: } else { in.clear ( ); in.unget ( ); - putback(in, std::move(token)); + putback(in, token); token.type = TokenType::ERROR; return token; } } -void AutomatonFromStringLexer::putback(std::istream& in, AutomatonFromStringLexer::Token token) { +AutomatonFromStringLexer::Token AutomatonFromStringLexer::peek ( std::istream & in ) { + Token token = next ( in ); + putback ( in, token ); + return token; +} + +void AutomatonFromStringLexer::putback ( std::istream& in, const std::string & data ) { in.clear(); - while(!token.raw.empty()) { - in.putback(token.raw.back()); - token.raw.pop_back(); + for ( char character : ext::make_reverse ( data ) ) + in.putback ( character ); +} + +void AutomatonFromStringLexer::putback ( std::istream& in, const Token & token ) { + putback ( in, token.raw ); +} + +bool AutomatonFromStringLexer::test ( std::istream & in, const std::string & value ) { + if ( testAndConsume ( in, value ) ) { + in.clear ( ); + putback ( in, value ); + return true; + } else { + return false; } } +bool AutomatonFromStringLexer::testAndConsume ( std::istream & in, const std::string & value ) { + return ( bool ) ( in >> ext::string ( value ) ); +} + +void AutomatonFromStringLexer::consume ( std::istream & in, const std::string & value ) { + if ( ! testAndConsume ( in, value ) ) + throw exception::CommonException ( "Can't consume " + value + " from input stream." ); +} + } /* namespace automaton */ diff --git a/alib2str/src/automaton/AutomatonFromStringLexer.h b/alib2str/src/automaton/AutomatonFromStringLexer.h index cca67001b485573fba355fb6c66a4e2785bee0cc..077480a67a50ebc75864871b29139da93b7e1f6c 100644 --- a/alib2str/src/automaton/AutomatonFromStringLexer.h +++ b/alib2str/src/automaton/AutomatonFromStringLexer.h @@ -36,8 +36,14 @@ public: std::string raw; }; - static Token next(std::istream& input); - static void putback(std::istream&, Token token); + static Token next(std::istream & input); + static Token peek(std::istream & input); + static void putback ( std::istream&, const std::string & token); + static void putback ( std::istream&, const Token & token); + + static bool test ( std::istream & input, const std::string & value ); + static void consume ( std::istream & input, const std::string & value ); + static bool testAndConsume ( std::istream & input, const std::string & value ); }; } /* namepsace automaton */ diff --git a/alib2str/src/automaton/string/FSM/DFA.h b/alib2str/src/automaton/string/FSM/DFA.h index 145846aa13adc4facb184aa8e13a8157e89da5df..3bfae51c1d8e44d3ab0135485cbe0b4f67734b82 100644 --- a/alib2str/src/automaton/string/FSM/DFA.h +++ b/alib2str/src/automaton/string/FSM/DFA.h @@ -123,10 +123,7 @@ void stringApi < automaton::DFA < SymbolType, StateType > >::parseTransition(std template<class SymbolType, class StateType > bool stringApi < automaton::DFA < SymbolType, StateType > >::first ( std::istream & input ) { - automaton::AutomatonFromStringLexer::Token token = automaton::AutomatonFromStringLexer::next ( input ); - bool res = token.type == automaton::AutomatonFromStringLexer::TokenType::DFA; - automaton::AutomatonFromStringLexer::putback ( input, token ); - return res; + return automaton::AutomatonFromStringLexer::peek ( input ).type == automaton::AutomatonFromStringLexer::TokenType::DFA; } template<class SymbolType, class StateType > diff --git a/alib2str/src/automaton/string/FSM/EpsilonNFA.h b/alib2str/src/automaton/string/FSM/EpsilonNFA.h index 71e93d520ace8b39e777dc24a65bde6416ef5e8e..ae651b06258273e28ea30d19358c099ca69364fd 100644 --- a/alib2str/src/automaton/string/FSM/EpsilonNFA.h +++ b/alib2str/src/automaton/string/FSM/EpsilonNFA.h @@ -132,10 +132,7 @@ void stringApi < automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > >: template<class SymbolType, class EpsilonType, class StateType > bool stringApi < automaton::EpsilonNFA < SymbolType, EpsilonType, StateType > >::first ( std::istream & input ) { - automaton::AutomatonFromStringLexer::Token token = automaton::AutomatonFromStringLexer::next ( input ); - bool res = token.type == automaton::AutomatonFromStringLexer::TokenType::EPSILON_NFA; - automaton::AutomatonFromStringLexer::putback ( input, token ); - return res; + return automaton::AutomatonFromStringLexer::peek ( input ).type == automaton::AutomatonFromStringLexer::TokenType::EPSILON_NFA; } template<class SymbolType, class EpsilonType, class StateType > diff --git a/alib2str/src/automaton/string/FSM/MultiInitialStateNFA.h b/alib2str/src/automaton/string/FSM/MultiInitialStateNFA.h index f1e6c1d895faa430a454d05fec7637ee2677aa78..d680cbf1f297695a1f8a1b581904e97780f6d9eb 100644 --- a/alib2str/src/automaton/string/FSM/MultiInitialStateNFA.h +++ b/alib2str/src/automaton/string/FSM/MultiInitialStateNFA.h @@ -104,10 +104,7 @@ void stringApi < automaton::MultiInitialStateNFA < SymbolType, StateType > >::pa template<class SymbolType, class StateType > bool stringApi < automaton::MultiInitialStateNFA < SymbolType, StateType > >::first ( std::istream & input ) { - automaton::AutomatonFromStringLexer::Token token = automaton::AutomatonFromStringLexer::next ( input ); - bool res = token.type == automaton::AutomatonFromStringLexer::TokenType::MULTI_INITIAL_STATE_NFA; - automaton::AutomatonFromStringLexer::putback ( input, token ); - return res; + return automaton::AutomatonFromStringLexer::peek ( input ).type == automaton::AutomatonFromStringLexer::TokenType::MULTI_INITIAL_STATE_NFA; } template<class SymbolType, class StateType > diff --git a/alib2str/src/automaton/string/FSM/NFA.h b/alib2str/src/automaton/string/FSM/NFA.h index f490f74fb0ae962947b57602b2433e7c9c0db36f..1934aae330619af1a6f0a6c261a2c7ac902ef42b 100644 --- a/alib2str/src/automaton/string/FSM/NFA.h +++ b/alib2str/src/automaton/string/FSM/NFA.h @@ -124,10 +124,7 @@ void stringApi < automaton::NFA < SymbolType, StateType > >::parseTransition(std template<class SymbolType, class StateType > bool stringApi < automaton::NFA < SymbolType, StateType > >::first ( std::istream & input ) { - automaton::AutomatonFromStringLexer::Token token = automaton::AutomatonFromStringLexer::next ( input ); - bool res = token.type == automaton::AutomatonFromStringLexer::TokenType::NFA; - automaton::AutomatonFromStringLexer::putback ( input, token ); - return res; + return automaton::AutomatonFromStringLexer::peek ( input ).type == automaton::AutomatonFromStringLexer::TokenType::NFA; } template<class SymbolType, class StateType >