/* * StringFromStringLexer.cpp * * Created on: Nov 23, 2013 * Author: Jan Travnicek */ #include "StringFromStringLexer.h" namespace string { StringFromStringLexer::Token StringFromStringLexer::next(std::istream& in) const { StringFromStringLexer::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::LESS; token.value += character; token.raw += character; return token; } else if(character == '>') { token.type = TokenType::GREATER; token.value += character; token.raw += character; return token; } else if(character == '"') { token.type = TokenType::QUOTE; token.value += character; token.raw += character; return token; } else if(character == '#') { token.value += character; token.raw += character; goto L1; } else { in.putback(character); putback(in, std::move(token)); in.clear(); token.type = TokenType::ERROR; return token; } L1: character = in.get(); if(in.eof()) { token.type = TokenType::TEOF; return token; } else if(character == 'E') { token.type = TokenType::EPSILON; token.value += character; token.raw += character; return token; } else { in.putback(character); putback(in, std::move(token)); token.type = TokenType::ERROR; return token; } } void StringFromStringLexer::putback(std::istream& in, StringFromStringLexer::Token token) const { while(!token.raw.empty()) { in.putback(token.raw.back()); token.raw.pop_back(); } in.clear(); } } /* namespace string */