Hey,

I've bought the book Expert C++ and have tried to assemble one of the programs in Dev-C++, it comes up with loads of errors, I was wondering if anyone wouldnt mind looking over the code and helping me to fix it.

Thanks

Code:
//  GENERIC PARSER

#include <iostream.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

enum types { DELIMITER = 1, VARIABLE, NUMBER};

const int NUMVARS = 26;

template <class PType> class parser {
         char *exp_ptr; //points to the expression
         char token[80]; //holds current token
         char tok_type; //holds token's type
         PType vars[NUMVARS]; //holds variable's values
         
         void eval_exp1(PType &result);
         void eval_exp2(PType &result);
         void eval_exp3(PType &result);
         void eval_exp4(PType &result);
         void eval_exp5(PType &result);
         void eval_exp6(PType &result);
         void atom (PType &result);
         void get_token(), pushback();
         void serror(int error);
         PType find_var(char *s);
         int isdelim(char c);
         public:
                parser();
                PType eval_exp(char *exp);
};

//parser constructor
template <class Ptype> parser<PType>::parser() {
         int i;
         exp_ptr = NULL;
         for(i=0; i<NUMVARS; i++) vars[i] = (PType) 0;
}

//parser entry point
template <class PType> Ptype parser<Ptype>::eval_exp(char *exp) {
         PType result;
         exp_ptr = exp;
         
         get_token();
         if(!*token) {
                     serror(2); //No Expression present
                     return (PType) 0;
         }
         eval_exp1(result);
         if(*token) serror(0); //Last Token Must Be NULL
         return result;
}

//Process an assignment
template <class PType> void parser<PType>::eval_exp1(Ptype &result) {
         int slot;
         char ttok_type;
         char temp_token[80];
         if(tok_type==VARIABLE) {
                                strcpy(temp_token, token);
                                ttok_type = tok_type;
                                slot = toupper(*token) - 'A';
                                get_token();
                                if(*token != '=') {
                                          putback();
                                          strcpy(token, temp_token);
                                          tok_type = ttok_type;
                                }
                                else {
                                     get_token();
                                     eval_exp2(result);
                                     vars[slot] = result;
                                     return;
                                }
         }
         eval_exp2(result);
}

//Add Or Subtract Two Terms
template <class PType> void parser<PType>::eval_exp2(PType &result) {
         register char op;
         PType temp;
         eval_exp3(result);
         while((op = *token) == '+' || op == '-') {
                   get_token();
                   eval_exp3(temp);
                   switch(op) {
                              case '-':
                                   result = result - temp;
                                   break;
                              case '+':
                                   result = result + temp;
                                   break;
                   }
         }
}

//Multiply Or Divide Two Factors
template <class PType> void parser<PType>::eval_exp3(PType &result) {
         register char op;
         PType temp;
         eval_exp4(result);
         while((op = *token) == '*' || op == '/' || op == '%') {
                   get_token();
                   eval_exp4(temp);
                   switch(op) {
                              case '*':
                                   result = result * temp;
                                   break;
                              case '/':
                                   result = result / temp;
                                   break;
                              case '%':
                                   result = (int) result % (int) temp;
                                   break;
                   }
         }
}

//Process an exponent
template <class PType> void parser<PType>::eval_exp4(PType &result) {
         PType temp, ex;
         register int t;
         eval_exp5(result);
         if(*token == '^') {
                   get_token();
                   eval_exp4(temp);
                   ex = result;
                   if (temp == 0.0) {
                            result = (PType) 1;
                            return;
                   }
                   for (t=(int)temp-1; t>0; --t) result = result * ex;
         }
}

//Evaluate a unary + or -
template <class PType> void parser<PType>::eval_exp5(PType &result) {
         register char op;
         op = 0;
         if((tok_type == DELIMITER) && *token == '+' || *token == '-') {
                      op = *token;
                      get_token();
         }
         eval_exp6(result);
         if(op=='-') result = -result;
}

//Processed a parenthesized expression.
template <class PType> void parser<Ptype>::eval_exp6(PType &result) {
         if((*token == '(')) {
                    get_token();
                    eval_exp2(result);
                    if(*token != ')') serror(1);
                    get_token();
         }
         else atom(result);
}

//Get The Value Of A Number Or A Variable
template <class PType> void parser<PType>::atom(Ptype &result) {
         switch(tok_type) {
                          case VARIABLE:
                               result = find_var(token);
                               get_token();
                               return;
                          case NUMBER:
                               result = (PType) atof(token);
                               get_token();
                               return;
                          default:
                                  serror(0);
         }
}

//Return A Token To The Input Stream
template <class PType> void parser<PType>::putback() {
         char *t;
         t = token;
         for(; *; t++) exp_ptr--;
}

//Display Syntax Error
template <class PType> void parser<Ptype>::serror(int error) {
         static char *e[] = {
                "Syntax Error",
                "Unbalanced Parentheses",
                "No Expression Present"
         };
         cout << e[error] << endl;
}

//Obtain The Next Token
template <class PType> void parser<PType>::get_token() {
         register char *temp;
         tok_type = 0;
         temp = token;
         *temp = '\0';
         if(!*exp_pre) return; //end of expression
         while(isspace(*exp_ptr)) ++exp_ptr //skip over the blanks
         if (strchr("+-*/%^=()", *exp_ptr)) {
                                 tok_type = DELIMITER;
                                 //advance to next char
                                 *temp++ = *exp_ptr++;
         }
         else if (isalpha(*exp_ptr)) {
              while(!isdelim(*exp_ptr)) *temp++ = *exp_ptr++;
              tok_type = NUMBER;
         }
         else if (isdigit(*exp_ptr)) {
              while(!isdelim(*exp_ptr)) *temp++ = *exp_ptr++;
              tok+type = NUMBER;
         }
         *temp = '\0';
}

//Return True If c Is A Delimiter
template <class PType> PType parser<PType>::find_var(char *s) {
         if(!isalpha(*s)) {
                          serror(1);
                          return (PType) 0;
         }
         return var[touper(*token) - 'A'];
}

int main() {
    char expstr[80];
    parser<double> ob;
    cout << "Enter A period to stop\n";
    for(;;) {
            cout << "Enter expression: ";
            cin.getline(expstr, 79);
            if (*expstr=='.') break;
            cout << "Answer is: " << ob.eval_exp(expstr) << "\n\n";
    }
    cout << endl;
    return 0;
}