#include "RegExpFromStringLexer.h" namespace regexp { RegExpFromStringLexer::RegExpFromStringLexer(std::stringstream& in) : m_In(in) { m_Current.type = TokenType::ERROR; m_Current.value = ""; } RegExpFromStringLexer& RegExpFromStringLexer::next() { if(m_Current.type == TokenType::TEOF) return *this; 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') { goto L0; } else if(character == '(') { m_Current.type = TokenType::LPAR; m_Current.value += character; return *this; } else if(character == ')') { m_Current.type = TokenType::RPAR; m_Current.value += character; return *this; } else if(character == '+') { m_Current.type = TokenType::PLUS; m_Current.value += character; return *this; } else if(character == '*') { m_Current.type = TokenType::STAR; m_Current.value += character; return *this; } else if(character == '#') { m_Current.value += character; goto L1; } else { 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.value += character; m_Current.type = TokenType::EPS; return *this; } else if(character == '0') { m_Current.value += character; m_Current.type = TokenType::EMPTY; return *this; } else { m_In.seekg(pos); m_Current.type = TokenType::ERROR; return *this; } } RegExpFromStringLexer::Token RegExpFromStringLexer::token() { return m_Current; } } /* namespace regexp */