Newer
Older
/*
* RegExpFromStringLexer.cpp
*
* Created on: Nov 23, 2013
* Author: Jan Travnicek
*/
#include "RegExpFromStringLexer.h"
namespace regexp {
RegExpFromStringLexer::RegExpFromStringLexer(std::istream& in) : m_In(in) {
m_Current.type = TokenType::ERROR;
m_Current.value = "";
}
RegExpFromStringLexer& RegExpFromStringLexer::next() {
if(m_Current.type == TokenType::TEOF) return *this;
L0:
character = m_In.get();
if(m_In.eof()) {
m_Current.type = TokenType::TEOF;
return *this;
} else if(character == ' ' || character == '\n' || character == '\t') {
goto L0;
} else if(character == '(') {
m_Current.type = TokenType::LPAR;
m_Current.value += character;
m_Current.type = TokenType::RPAR;
m_Current.value += character;
m_Current.type = TokenType::PLUS;
m_Current.value += character;
m_Current.type = TokenType::STAR;
m_Current.value += character;
} else if(character == '#') {
m_Current.value += character;
m_In.putback(character);
while(!m_Current.value.empty()) {
m_In.putback(m_Current.value.back());
m_Current.value.pop_back();
}
m_In.clear();
m_Current.type = TokenType::ERROR;
return *this;
}
L1:
character = m_In.get();
if(m_In.eof()) {
} else if(character == 'E') {
m_Current.value += character;
m_Current.type = TokenType::EPS;
m_Current.value += character;
m_Current.type = TokenType::EMPTY;
m_In.putback(character);
while(!m_Current.value.empty()) {
m_In.putback(m_Current.value.back());
m_Current.value.pop_back();
}
m_In.clear();
m_Current.type = TokenType::ERROR;
}
RegExpFromStringLexer::Token RegExpFromStringLexer::token() {
} /* namespace regexp */