Skip to content
Snippets Groups Projects
RegExpFromStringLexer.cpp 1.71 KiB
Newer Older
#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_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_Current.type = TokenType::ERROR;
		return *this;
	}
L1:
	character = m_In.get();
	if(m_In.eof()) {
		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_Current.type = TokenType::ERROR;
}

RegExpFromStringLexer::Token RegExpFromStringLexer::token() {
	return m_Current;
} /* namespace regexp */