Читать «Справочное руководство по C++» онлайн - страница 107
Бьярн Страустрап
char* string;
name* next;
double value;
};
const TBLSZ = 23;
name* table[TBLSZ];
int no_of_errors;
double error(char* s) {
cerr ‹‹ "error: " ‹‹ s ‹‹ "\n";
no_of_errors++;
return 1;
}
extern int strlen(const char*);
extern int strcmp(const char*, const char*);
extern char* strcpy(char*, const char*);
name* look(char* p, int ins = 0)
{
int ii= 0;
char *pp = p;
while (*pp) ii = ii‹‹1 ^ *pp++;
if (ii ‹ 0) ii = -ii;
ii %= TBLSZ;
for (name* n=table [ii]; n; n=n-›next)
if (strcmp(p,n-›string) == 0) return n;
if (ins == 0) error("name not found");
name* nn = new name;
nn-›string = new char[strlen(p) + 1];
strcpy(nn-›string,p);
nn-›value = 1;
nn-›next = table[ii];
table[ii] = nn;
return nn;
}
inline name* insert(char* s) { return look (s,1); }
token_value get_token();
double term();
double expr()
{
double left = term();
for (;;)
switch (curr_tok) {
case PLUS:
get_token();
left += term();
break;
case MINUS:
get_token();
left -= term();
break;
default:
return left;
}
}
double prim();
double term()
{
double left = prim();
for (;;)
switch (curr_tok) {
case MUL:
get_token();
left *= prim();
break;
case DIV:
get_token();
double d = prim();
if (d == 0) return error("divide by 0");
left /= d;
break;
default:
return left;
}
}
int number_value;
char name_string[80];
double prim()
{
switch (curr_tok) {
case NUMBER:
get_token();
return number_value;
case NAME:
if (get_token() == ASSIGN) {
name* n = insert(name_string);
get_token();
n-›value = expr();
return n-›value;
}
return look(name_string)-›value;
case MINUS:
get_token();
return -prim();
case LP:
get_token();
double e = expr();
if (curr_tok != RP) return error(") expected");
get_token();
return e;
case END:
return 1;
default:
return error ("primary expected");
}
}
token_value get_token()
{
char ch = 0;
do {
if (!cin.get(ch)) return curr_tok = END;
} while (ch !='\n' && isspace(ch));
switch (ch) {
case ';':
case '\n':
cin ›› WS;
return curr_tok=PRINT;