Интерпретатор
Категория реферата: Рефераты по информатике, программированию
Теги реферата: греция реферат, шпаргалки скачать
Добавил(а) на сайт: Мокасеев.
Предыдущая страница реферата | 1 2 3 4 5 6 | Следующая страница реферата
}
Преобразование операции в значение лексемы для нее тривиально, поскольку в перечислении token_value лексема операции была определена как целое (код символа операции).
4 Таблица имен.
Есть функция поиска в таблице имен:
name* look(char* p, int ins =0);
Второй ее параметр показывает, была ли символьная строка, обозначающая имя, ранее занесена в таблицу. Инициализатор =0 задает стандартное значение параметра, которое используется, если функция look() вызывается только с одним параметром. Это удобно, так как можно писать look("sqrt2"), что означает look("sqrt2",0), т.е. поиск, а не занесение в таблицу. Чтобы было так же удобно задавать операцию занесения в таблицу, определяется вторая функция:
inline name* insert(const char* s) { return look(s,1); }
Как ранее упоминалось, записи в этой таблице имеют такой тип:
struct name { char* string; name* next; double value;
};
Член next используется для связи записей в таблице. Собственно таблица
- это просто массив указателей на объекты типа name:
const TBLSZ = 23; name* table[TBLSZ];
Поскольку по умолчанию все статические объекты инициализируются нулем, такое тривиальное описание таблицы table обеспечивает также и нужную инициализацию.
Для поиска имени в таблице функция look() использует простой хэш- код (записи, в которых имена имеют одинаковый хэш-код, связываются вместе):
int ii = 0; // хэш-код const char* pp = p; while (*pp) ii = iinext = table[ii]; table[ii] = nn; return nn;
}
После вычисления хэш-кода ii идет простой поиск имени по членам next.
Имена сравниваются с помощью стандартной функции сравнения строк strcmp().
Если имя найдено, то возвращается указатель на содержащую его запись, а в
противном случае заводится новая запись с этим именем.
Добавление нового имени означает создание нового объекта name в
свободной памяти с помощью операции new, его инициализацию и включение в
список имен. Последнее выполняется как занесение нового имени в начало
списка, поскольку это можно сделать даже без проверки того, есть ли список
вообще. Символьная строка имени также размещается в свободной памяти. Функция strlen() указывает, сколько памяти нужно для строки, операция new отводит нужную память, а
функция strcpy() копирует в нее строку. Все строковые функции описаны в
:
extern int strlen(const char*); extern int strcmp(const char*, const char*); extern char* strcpy(char*, const char*);
5. Обработка ошибок
Поскольку программа достаточно проста, не надо особо беспокоиться об обработке ошибок. Функция error просто подсчитывает число ошибок, выдает сообщение о них и возвращает управление обратно:
int no_of_errors;
double error(const char* s)
{ cerr > 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);
Рекомендуем скачать другие рефераты по теме: доклад на тему, механизм реферат.
Предыдущая страница реферата | 1 2 3 4 5 6 | Следующая страница реферата