Skip to content
Snippets Groups Projects
StringFromStringLexer.cpp 1.73 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jan Trávníček's avatar
    Jan Trávníček committed
    /*
     * StringFromStringLexer.cpp
     *
     *  Created on: Nov 23, 2013
     *      Author: Jan Travnicek
     */
    
    
    #include "StringFromStringLexer.h"
    
    namespace string {
    
    
    StringFromStringLexer::Token StringFromStringLexer::next(std::istream& in) const {
    	StringFromStringLexer::Token token;
    	token.type = TokenType::ERROR;
    	token.value = "";
    	token.raw = "";
    
    	char character;
    
    L0:
    
    	character = in.get();
    	if(in.eof()) {
    		token.type = TokenType::TEOF;
    		return token;
    
    	} else if(character == ' ' || character == '\n' || character == '\t') {
    
    		token.raw += character;
    
    		goto L0;
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    	} else if(character == '<') {
    
    		token.type = TokenType::LESS;
    		token.value += character;
    		token.raw += character;
    		return token;
    
    Jan Trávníček's avatar
    Jan Trávníček committed
    	} else if(character == '>') {
    
    		token.type = TokenType::GREATER;
    		token.value += character;
    		token.raw += character;
    		return token;
    
    	} else if(character == '"') {
    
    		token.type = TokenType::QUOTE;
    		token.value += character;
    		token.raw += character;
    		return token;
    
    	} else if(character == '#') {
    
    		token.value += character;
    		token.raw += character;
    
    	} else {
    
    		in.putback(character);
    		putback(in, std::move(token));
    		in.clear();
    		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::EPSILON;
    		token.value += character;
    		token.raw += character;
    		return token;
    
    		in.putback(character);
    		putback(in, std::move(token));
    		token.type = TokenType::ERROR;
    		return token;
    
    void StringFromStringLexer::putback(std::istream& in, StringFromStringLexer::Token token) const {
    	while(!token.raw.empty()) {
    		in.putback(token.raw.back());
    		token.raw.pop_back();
    	}
    	in.clear();
    
    } /* namespace string */