Шрифт:
Еще раз отметим, что тип лексемы (т.е.
Продемонстрируем новые возможности
В самом деле, для PDP-11 требуются вполне конкретные меры, чтобы обнаружить переполнение вещественного, но на большинстве других машин
Обеспечьте возможность запоминания последнего вычисленного значения, чтобы его не приходилось вводить снова для последовательности связанных вычислений. Одним из решений может быть использование какой-либо переменной, например
Измените программу
8.3 Этап 3: переменные с произвольными именами; встроенные функции
В версию
Введена также дополнительно операция возведения в степень
Поскольку лексический анализатор должен справляться с встроенными именами длиной более чем в один символ, не так уж много усилий придется приложить, чтобы допустить переменные с именами произвольной длины. Для хранения информации об этих переменных нужна довольно сложная таблица имен, но если мы ее создаем, то можно заранее задать в ней вместе с именами значения некоторых полезных констант:
PI | 3.14159265358979323846 | Число |
E | 2.71828182845904523536 | Основание натурального логарифма |
GAMMA | 0.57721566490153286060 | Константа Эйлера-Маскерони |
DEG | 57.2957795130823208768 | Отношение градуса к радиану |
PHI | 1.61803398874989484820 | Золотое сечение |
В результате получим полезный калькулятор:
Несколько улучшилась и работа распознавателя. В
В программе
Получившаяся в результате всех этих изменений программа настолько велика (около 250 строк текста), что для простоты редактирования и ускорения компиляции лучше разбить ее на отдельные файлы. Итак, теперь мы имеем пять файлов вместо одного:
hoc.y | грамматика, main , yylex (как и прежде); |
hoc.h | глобальные структуры данных для включения в другие файлы; |
symbol.c | функции, работающие с таблицей имен: lookup , install ; |
unit.c | встроенные функции и константы; init ; |
math.c | функции для вызова стандартных математических функций: Sqrt , Log и т.д. |