Skip to content
Snippets Groups Projects
RegExpFromStringLexer.cpp 2 KiB
Newer Older
Jan Trávníček's avatar
Jan Trávníček committed
/*
 * 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;
	char character;
	m_Current.value = "";

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_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()) {
		m_Current.type = TokenType::TEOF;
		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.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() {
	return m_Current;
} /* namespace regexp */