From 4b3a76d15c3aa13236d9111585000406069624c2 Mon Sep 17 00:00:00 2001 From: Jan Travnicek <Jan.Travnicek@fit.cvut.cz> Date: Sun, 15 Jun 2014 21:42:34 +0200 Subject: [PATCH] string representation of epsilon --- alib2/src/alphabet/SymbolFromStringLexer.cpp | 2 +- alib2/src/label/LabelFromStringLexer.cpp | 2 +- alib2/src/string/StringFromStringLexer.cpp | 20 +++++- alib2/src/string/StringFromStringLexer.h | 1 + alib2/src/string/StringFromStringParser.cpp | 2 +- alib2/src/string/StringToStringComposer.cpp | 2 +- alib2/test-src/string/StringTest.cpp | 66 +++++++++++++++----- 7 files changed, 76 insertions(+), 19 deletions(-) diff --git a/alib2/src/alphabet/SymbolFromStringLexer.cpp b/alib2/src/alphabet/SymbolFromStringLexer.cpp index d95336efb6..281064ae2a 100644 --- a/alib2/src/alphabet/SymbolFromStringLexer.cpp +++ b/alib2/src/alphabet/SymbolFromStringLexer.cpp @@ -12,8 +12,8 @@ SymbolFromStringLexer& SymbolFromStringLexer::next() { char character; m_Current.value = ""; -L0: std::streampos pos = m_In.tellg(); +L0: character = m_In.get(); if(m_In.eof()) { m_In.seekg(pos); diff --git a/alib2/src/label/LabelFromStringLexer.cpp b/alib2/src/label/LabelFromStringLexer.cpp index 7ee00a3d7d..f4e25929ee 100644 --- a/alib2/src/label/LabelFromStringLexer.cpp +++ b/alib2/src/label/LabelFromStringLexer.cpp @@ -11,8 +11,8 @@ LabelFromStringLexer& LabelFromStringLexer::next() { char character; m_Current.value = ""; -L0: std::streampos pos = m_In.tellg(); +L0: character = m_In.get(); if(m_In.eof()) { m_In.seekg(pos); diff --git a/alib2/src/string/StringFromStringLexer.cpp b/alib2/src/string/StringFromStringLexer.cpp index 79874cd89b..2e1a32a806 100644 --- a/alib2/src/string/StringFromStringLexer.cpp +++ b/alib2/src/string/StringFromStringLexer.cpp @@ -11,9 +11,11 @@ StringFromStringLexer& StringFromStringLexer::next() { char character; m_Current.value = ""; + std::streampos pos = m_In.tellg(); L0: character = m_In.get(); if(m_In.eof()) { + m_In.seekg(pos); m_Current.type = TokenType::TEOF; return *this; } else if(character == ' ' || character == '\n' || character == '\t') { @@ -30,8 +32,24 @@ L0: m_Current.type = TokenType::QUOTE; m_Current.value += character; return *this; + } else if(character == '#') { + goto L1; } else { - m_In.unget(); + m_In.seekg(pos); + m_Current.type = TokenType::ERROR; + return *this; + } +L1: + character = m_In.get(); + if(m_In.eof()) { + m_In.seekg(pos); + m_Current.type = TokenType::ERROR; + return *this; + } else if(character == 'E') { + m_Current.type = TokenType::EPSILON; + return *this; + } else { + m_In.seekg(pos); m_Current.type = TokenType::ERROR; return *this; } diff --git a/alib2/src/string/StringFromStringLexer.h b/alib2/src/string/StringFromStringLexer.h index 3c6b195ae2..ef501e38bd 100644 --- a/alib2/src/string/StringFromStringLexer.h +++ b/alib2/src/string/StringFromStringLexer.h @@ -13,6 +13,7 @@ public: LESS, GREATER, QUOTE, + EPSILON, TEOF, ERROR }; diff --git a/alib2/src/string/StringFromStringParser.cpp b/alib2/src/string/StringFromStringParser.cpp index 22916c3320..086d95c757 100644 --- a/alib2/src/string/StringFromStringParser.cpp +++ b/alib2/src/string/StringFromStringParser.cpp @@ -15,7 +15,7 @@ StringFromStringParser::StringFromStringParser(std::stringstream& input) : m_Str String* StringFromStringParser::parse() { StringFromStringLexer::Token token = m_StringLexer.next().token(); - if(token.type == StringFromStringLexer::TokenType::TEOF) { + if(token.type == StringFromStringLexer::TokenType::EPSILON) { return new String(Epsilon()); } else if(token.type == StringFromStringLexer::TokenType::LESS) { std::vector<alphabet::Symbol> data = parseContent(); diff --git a/alib2/src/string/StringToStringComposer.cpp b/alib2/src/string/StringToStringComposer.cpp index 6952e9ee92..e8fffe4e7d 100644 --- a/alib2/src/string/StringToStringComposer.cpp +++ b/alib2/src/string/StringToStringComposer.cpp @@ -39,7 +39,7 @@ void StringToStringComposer::Visit(void* userData, const LinearString& string) { void StringToStringComposer::Visit(void* userData, const Epsilon&) { std::stringstream &out = *((std::stringstream*) userData); - out << "\"\""; + out << "#E"; } void StringToStringComposer::Visit(void* userData, const String& string) { diff --git a/alib2/test-src/string/StringTest.cpp b/alib2/test-src/string/StringTest.cpp index 401255b088..04258fcb9c 100644 --- a/alib2/test-src/string/StringTest.cpp +++ b/alib2/test-src/string/StringTest.cpp @@ -48,22 +48,60 @@ void StringTest::testCopyConstruct() { } void StringTest::testEqual() { - std::string input = "\"aa\""; - std::stringstream inputs(input); + { + std::string input = "\"aa\""; + std::stringstream inputs(input); - string::StringFromStringParser parser(inputs); - string::String string = parser.parseString(); + string::StringFromStringParser parser(inputs); + string::String string = parser.parseString(); - string::StringToStringComposer composer; - std::string output = composer.compose(string); - std::stringstream outputs(output); - - CPPUNIT_ASSERT( input == output ); - - string::StringFromStringParser parser2(outputs); - string::String string2 = parser2.parseString(); - - CPPUNIT_ASSERT( string == string2 ); + string::StringToStringComposer composer; + std::string output = composer.compose(string); + std::stringstream outputs(output); + + CPPUNIT_ASSERT( input == output ); + + string::StringFromStringParser parser2(outputs); + string::String string2 = parser2.parseString(); + + CPPUNIT_ASSERT( string == string2 ); + } + { + std::string input = "\"'aaaa''aaa'\""; + std::stringstream inputs(input); + + string::StringFromStringParser parser(inputs); + string::String string = parser.parseString(); + + string::StringToStringComposer composer; + std::string output = composer.compose(string); + std::stringstream outputs(output); + + CPPUNIT_ASSERT( input == output ); + + string::StringFromStringParser parser2(outputs); + string::String string2 = parser2.parseString(); + + CPPUNIT_ASSERT( string == string2 ); + } + { + std::string input = "#E"; + std::stringstream inputs(input); + + string::StringFromStringParser parser(inputs); + string::String string = parser.parseString(); + + string::StringToStringComposer composer; + std::string output = composer.compose(string); + std::stringstream outputs(output); + + CPPUNIT_ASSERT( input == output ); + + string::StringFromStringParser parser2(outputs); + string::String string2 = parser2.parseString(); + + CPPUNIT_ASSERT( string == string2 ); + } } void StringTest::testXMLParser() { -- GitLab