Token
getToken(istream *br, string& lexeme)
{
	if( pushedBack ) {
		pushedBack = false;
		lexeme = pushedLexeme;
		return pushedToken;
	}

    LexState state = START;
    lexeme.clear();
    
    int inchar;
    
    while ( (inchar = br->get()) ) {
    	if( inchar == '\n' ) currLine++;
        switch (state) {
            case START:
                if (isspace(inchar)) {
                    continue;
                }
                
                lexeme += inchar;
                
                if (inchar == '+') {
                    return PLUS;
                }
                if (inchar == '-') {
                    return MINUS;
                }
                if (inchar == '*') {
                    return STAR;
                }
                if (inchar == ';') {
                    return SC;
                }
                
                if (inchar == '/') {
                    state = ONESLASH;
                }
                else if (inchar == '"') {
                    state = INSTRING;
                }
                else if (isdigit(inchar)) {
                    state = ININT;
                }
                else if (isalpha(inchar)) {
                    state = INID;
                }
                else
                    return DONE;
                
                break;
                
            case INID:
                if (isalpha(inchar)) {
                    lexeme += inchar;
                    continue;
                }
                
                br->putback(inchar);
                return keywordCheck(lexeme);
                break;
                
            case ININT:
                if (isdigit(inchar)) {
                    lexeme += inchar;
                    continue;
                }
                
                br->putback(inchar);
                return INT;
                break;
                
            case INSTRING:
                lexeme += inchar;
                if (inchar == '\n') {
                    return DONE;
                }
                if (inchar != '"') {
                    continue;
                }
                
                return STRING;
                break;
                
            case INCOMMENT:
                if (inchar != '\n') {
                    continue;
                }
                state = START;
                break;
                
            case ONESLASH:
                if (inchar != '/') {
                    br->putback(inchar);
                    return SLASH;
                }
                lexeme.clear();
                state = INCOMMENT;
                break;
                
            default:
                cerr << "This should never happen!" << endl;
                exit(1);
                break;
        }
    }
    
    // I reached an end of file... perhaps it happened in the middle of something...
    if (state == INID) {
        return keywordCheck(lexeme);
    }
    else if (state == ININT) {
        return INT;
    }
    else if (state == ONESLASH) {
        return SLASH;
    }
    else {
        return DONE;
    }
}
示例#2
0
static Token
getActualToken(istream *br, string& lexeme)
{
    LexState state = START;
    lexeme.clear();
    
    int inchar;
    
    while ( (inchar = br->get()) != EOF && br->good() ) {
        if( inchar == '\n' )
            linenum++;
        
        switch (state) {
            case START:
                if (isspace(inchar)) {
                    continue;
                }
                
                lexeme += inchar;
                if (inchar == '+') {
                    return UNION;
                }
                else if (inchar == '^') {
                    return INTERSECT;
                }
                else if (inchar == '(') {
                    return LPAREN;
                }
                else if (inchar == ')') {
                    return RPAREN;
                }
                else if (inchar == ';') {
                    return SC;
                }
                
                else if (inchar == '/') {
                    state = ONESLASH;
                }
                else if (inchar == '"') {
                    state = INSTRING;
                }
                else if (isalpha(inchar)) {
                    state = INID;
                }
                else
                    return ERR;
                
                break;
                
            case INID:
                if (isalpha(inchar)) {
                    lexeme += inchar;
                    continue;
                }
                
                br->putback(inchar);
                return keywordCheck(lexeme);
                break;
                
            case INSTRING:
                lexeme += inchar;
                if (inchar == '\n') {
                    return ERR;
                }
                if (inchar != '"') {
                    continue;
                }
                
                return STRING;
                break;
                
            case INCOMMENT:
                if (inchar != '\n') {
                    continue;
                }
                state = START;
                break;
                
            case ONESLASH:
                if (inchar != '/') {
                    br->putback(inchar);
                    return ERR;
                }
                lexeme.clear();
                state = INCOMMENT;
                break;
                
            default:
                cerr << "This should never happen!" << endl;
                exit(1);
                break;
        }
    }
    
    // I reached an end of file... perhaps it happened in the middle of something...
    if (state == INID) {
        return keywordCheck(lexeme);
    }
    else if (state == ONESLASH || state == INSTRING) {
        return ERR;
    }
    return DONE;
}