/* * RegExpFromStringLexer.cpp * * Created on: Nov 23, 2013 * Author: Jan Travnicek */ #include "RegExpFromStringLexer.h" namespace regexp { RegExpFromStringLexer::Token RegExpFromStringLexer::next(std::istream& in) { RegExpFromStringLexer::Token token; token.type = TokenType::ERROR; token.value = ""; token.raw = ""; char character; L0: character = in.get(); if ( in.eof ( ) || character == 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::LPAR; token.value += character; token.raw += character; return token; } else if(character == ')') { token.type = TokenType::RPAR; token.value += character; token.raw += character; return token; } else if(character == '+') { token.type = TokenType::PLUS; token.value += character; token.raw += character; return token; } else if(character == '*') { token.type = TokenType::STAR; token.value += character; token.raw += character; return token; } else if(character == '#') { token.value += character; token.raw += character; goto L1; } else { in.clear ( ); in.unget ( ); putback(in, std::move(token)); 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::EPS; token.value += character; token.raw += character; return token; } else if(character == '0') { token.type = TokenType::EMPTY; 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 RegExpFromStringLexer::putback(std::istream& in, RegExpFromStringLexer::Token token) { in.clear(); while(!token.raw.empty()) { in.putback(token.raw.back()); token.raw.pop_back(); } } } /* namespace regexp */