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; } }
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; }