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::Token RegExpFromStringLexer::next(std::istream& in) {
	RegExpFromStringLexer::Token token;
	token.type = TokenType::ERROR;
	token.value = "";
	token.raw = "";
	char character;
	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;
	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;
		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 */