/* * ContainerFromStringLexer.cpp * * Created on: Nov 23, 2013 * Author: Jan Travnicek */ #include "ContainerFromStringLexer.h" namespace container { ContainerFromStringLexer::Token ContainerFromStringLexer::next(std::istream& in) { ContainerFromStringLexer::Token token; token.type = TokenType::ERROR; token.value = ""; token.raw = ""; char character; L0: character = in.get(); if(in.eof()) { token.type = TokenType::TEOF; return token; } else if(character == ' ' || character == '\n' || character == '\t') { token.raw += character; goto L0; } else if(character == '{') { token.type = TokenType::SET_BEGIN; token.value += character; token.raw += character; return token; } else if(character == '}') { token.type = TokenType::SET_END; token.value += character; token.raw += character; return token; } else if(character == '[') { token.type = TokenType::VECTOR_BEGIN; token.value += character; token.raw += character; return token; } else if(character == ']') { token.type = TokenType::VECTOR_END; token.value += character; token.raw += character; return token; } else if(character == '<') { token.type = TokenType::PAIR_BEGIN; token.value += character; token.raw += character; return token; } else if(character == '>') { token.type = TokenType::PAIR_END; token.value += character; token.raw += character; return token; } else if(character == ',') { token.type = TokenType::COMMA; token.value += character; token.raw += character; return token; } else { in.clear ( ); in.unget ( ); putback(in, std::move(token)); token.type = TokenType::ERROR; return token; } } void ContainerFromStringLexer::putback(std::istream& in, ContainerFromStringLexer::Token token) { in.clear(); while(!token.raw.empty()) { in.putback(token.raw.back()); token.raw.pop_back(); } } } /* namespace container */