обозначает серьезную проблему и чаще всего является симптомом не неоднозначности, а явной ошибки в грамматике.
Упражнение 8.5
В данной версии
hoc3
допустимо присваивание:
PI=3
Хорошо ли это? Как бы вы изменили
hoc3
, чтобы запретить присваивание "констант"?
Упражнение: 8.6
Добавьте к грамматике встроенную функцию
atan2(x, y)
для вычисления величины угла, тангенс которого равен
x/y
. Добавьте встроенную функцию
rand
, вырабатывающую случайные вещественные числа, равномерно распределенные на интервале [0,1). Как бы вам пришлось изменить грамматику, чтобы разрешить встроенные функции с разным числом аргументов?
Упражнение 8.7
Как ввести дополнительное средство для выполнения команд прямо в
hoc
, подобно операции
!
в программах UNIX?
Упражнение 8.8
Переработайте текст
math.c
так, чтобы можно было использовать таблицу, а не предложенное выше множество идентичных функций.
вводит сокращение для записи конструкции, используемой последовательно несколько раз. Синтаксис здесь не такой, как для переменных интерпретатора, скобки обязательны. Флаг
– lm
указывает, что математические функции нужно искать в библиотеке
libm.a
.
Теперь программа
hoc3
образуется из четырех файлов
.о
, причем некоторые из них в свою очередь зависят от файлов
.h
. "Зная" эти зависимости,
make
может рассчитать, какая требуется перетрансляция в случае изменения любого из указанных файлов. Если вы хотите выяснить действия
make
, не запуская процесс, то попробуйте ввести команду
$ make -n
С другой стороны, если необходимо установить временную согласованность файлов, с помощью флага
– t
(touch исправить) вы можете как бы модифицировать файлы, не производя перетрансляции.
Обратите внимание на то, что мы ввели не только множество зависимостей между исходными файлами, но и несколько полезных процедур, сконцентрировав их в одном файле. По умолчанию программа
make
выполняет первое действие, указанное в файле
makefile
. Однако если на первом месте окажется элемент, помечающий правило зависимости, такой, как
symbol.o
или
pr
, то выполняться будет он. Считается, что в случае "пустой" зависимости элемент всегда берется не из последней версии, поэтому при запросе он обязательно должен изменяться. Итак,
$ make pr | lpr
инициирует распечатку зависимостей файлов на принтере. (Появление символа
@
в
"@pr"
подавляет эхо выполняемой команды, запущенной с помощью
make
.) Команда же
make clean
удаляет выходные файлы
yacc
, а также файлы
.o
.
Такой механизм пустых зависимостей в файле
makefile
часто оказывается более предпочтительным по сравнению с командным файлом как средство для концентрации в одном файле всех связанных операций. Область применения команды
make
не ограничивается только разработкой программ, она позволяет сгруппировать в единый набор все операции, имеющие временные зависимости.
Несколько замечаний относительно
lex
Программа
lex
порождает лексические анализаторы аналогично тому, как
yacc
генерирует программы грамматического разбора: вы создаете описание лексических правил вашего языка с помощью регулярных выражений и фрагментов Си программ, которые будут выполняться при обнаружении строки, соответствующей шаблону. Программа
lex
строит по этой информации распознаватель. Программы
lex
и
yacc
взаимодействуют таким же образом, как и описанные выше лексические анализаторы. Мы не собираемся здесь детально рассматривать
lex
; наша цель — заинтересовать вас, а подробности вы найдете в справочном руководстве по UNIX (том 2B).
Вначале приведем
lex
– программу из файла
lex.l
, которая заменяет применявшуюся до сих пор функцию