www.pudn.com > calc5.zip > Scan.cpp
//------------------------------------ // scan.cpp // (c) Bartosz Milewski, 1994 //------------------------------------ #include "scan.h" #include "symtab.h" #include "params.h" #include#include #include #include #include using std::cerr; Scanner::Scanner (char const * buf) : _buf (buf), _iLook (0), _iSymbol (0), _lenSymbol (0) { Accept (); } void Scanner::EatWhite () { while (isspace (_buf[_iLook])) ++_iLook; } int Scanner::GetSymbolName (char * strOut, int lenBuf) { assert (lenBuf > maxSymLen); assert (_lenSymbol < lenBuf); strncpy (strOut, &_buf [_iSymbol], _lenSymbol); strOut [_lenSymbol] = 0; return _lenSymbol; } EToken Scanner::Accept () { EatWhite (); switch (_buf[_iLook]) { case '+': _token = tPlus; ++_iLook; break; case '-': _token = tMinus; ++_iLook; break; case '*': _token = tMult; ++_iLook; break; case '/': _token = tDivide; ++_iLook; break; case '(': _token = tLParen; ++_iLook; break; case ')': _token = tRParen; ++_iLook; break; case '=': _token = tAssign; ++_iLook; break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.': { _token = tNumber; char * p; _number = strtod (&_buf [_iLook], &p); _iLook = p - _buf; break; } case 0: // end of input _token = tEnd; break; default: if (isalpha (_buf [_iLook]) || _buf [_iLook] == '_') { _token = tIdent; _iSymbol = _iLook; do { ++_iLook; } while (isalnum (_buf [_iLook])); _lenSymbol = _iLook - _iSymbol; if (_lenSymbol > maxSymLen) { cerr << "Warning: Variable name truncated\n"; _lenSymbol = maxSymLen; } } else _token = tError; break; } return Token (); }