Справочное руководство по C++
Шрифт:
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;
case '*':
case '/':
case '+':
case '-':
case '(':
case ')':
case '=':
return curr_tok=ch;
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
case '.':
cin.putback(ch);
cin ›› number_value;
return curr_tok=NUMBER;
default:
if (isalpha(ch)) {
char* p = name_string;
*p++ = ch;
while (cin.get(ch) && isalnum(ch)) *p++ = ch;
cin.putback(ch);
*p = 0;
return curr_tok=NAME;
}
error ("bad token");
return curr_tok=PRINT;
}
}
int main(int argc, char* argv[])
{
Поделиться:
Популярные книги
Черный Маг Императора 8
8. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
На границе империй. Том 9. Часть 3
16. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Искра Силы
1. Мир Бессмертных
Фантастика:
городское фэнтези
историческое фэнтези
сказочная фантастика
фэнтези
эпическая фантастика
5.00
рейтинг книги
Купеческая дочь замуж не желает
Фантастика:
фэнтези
6.89
рейтинг книги
Санек 3
3. Санек
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кодекс Крови. Книга ХIII
13. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Единственная для невольника
Любовные романы:
любовно-фантастические романы
5.67
рейтинг книги
Черный Баламут. Трилогия
Черный Баламут
Фантастика:
героическая фантастика
5.00
рейтинг книги
Муассанитовая вдова
Федерация Объединённых Миров
Фантастика:
космическая фантастика
7.50
рейтинг книги
Страж Кодекса. Книга IV
4. КО: Страж Кодекса
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Советник 2
7. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Золушка по имени Грейс
Фантастика:
фэнтези
8.63
рейтинг книги
Чехов. Книга 3
3. Адвокат Чехов
Фантастика:
альтернативная история
5.00
рейтинг книги
Третье правило дворянина
3. Истинный дворянин
Фантастика:
фэнтези
попаданцы
аниме
5.00