diff --git a/alib2/src/alphabet/SymbolFromStringLexer.cpp b/alib2/src/alphabet/SymbolFromStringLexer.cpp index d95336efb64de16bb2120f273c4b90f347a88605..281064ae2ad4222ab813858b95ed40afc066c67c 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 7ee00a3d7d1d7c9c44fa3592e3b13034c4d3787e..f4e25929eec912b5a4789caef5b37c71794a41be 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 79874cd89be15123abe05ecd97d18e018c3444c4..2e1a32a806182014b02e99987641b87e8e362b86 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 3c6b195ae23e1188d76c1781ac870fc4719fbdcc..ef501e38bde693d152f23ffe5d835d717dfd7b4c 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 22916c3320660e3a92828d454812c5072426a100..086d95c757e3b2444dcab48fd65e8c32941d8aea 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 6952e9ee9213f1e6a60a5962eb8577fba1409ddf..e8fffe4e7d004afb18c47aedda0a0b8abd627c6c 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 401255b08809290f52d80a47adac1623f812225a..04258fcb9cc6fe6716024954806ffc0a695e9fc7 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() {