Skip to content
Snippets Groups Projects
RegExpFromStringLexer.cpp 1.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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 = "";
    
    
    	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 */