}double Sqrt(x) double x;{ return errcheck(sqrt(x), "sqrt");}double Exp(x) double x;{ return errcheck(exp(x), "exp");}double Pow(x, y) double x, y;{ return errcheck(pow(x,y), "exponentiation");}double integer(x) double x;{ return (double)(long)x;}double errcheck(d, s) /* check result of library call */ double d; char *s;{ if (errno == EDOM) { errno = 0; execerror(s, "argument out of domain"); } else if (errno == ERANGE) { errno = 0; execerror(s, "result out of range"); } return d;}Любопытная, хотя грамматически неясная, диагностики появится при запуске yacc с новой грамматикой:
$ yacc hoc.yconflicts: 1 shift/reduce$Сообщение
shift/reducehoc3x=1может быть разобрана двумя способами.

Анализатор может решить, что присв сводится к выраж, а затем к список, как показано в левом дереве разбора, или что нужно применить заключающий символ
\nyaccyaccyacc-vy.outputУпражнение 8.5
В данной версии
hoc3PI=3Хорошо ли это? Как бы вы изменили
hoc3Упражнение: 8.6
Добавьте к грамматике встроенную функцию
atan2(x, y)x/yrand()Упражнение 8.7
Как ввести дополнительное средство для выполнения команд прямо в
hoc!Упражнение 8.8
Переработайте текст
math.cЕще одно замечание относительно
makeПоскольку теперь программа
hoc3makefile$ cat makefileYFLAGS = -d # force creation of y.tab.hOBJS = hoc.o init.o math.o symbol.o # abbreviationhoc3: $(OBJS) cc $(OBJS) -lm -o hoc3hoc.o: hoc.hinit.o symbol.o: hoc.h y.tab.hpr: @pr hoc.y hoc.h init.c math.c symbol.c makefileclean: rm -f $(OBJS) y.tab.[ch]$Строка
YFLAGS = -d-dmakey.tab.h#defineOBJS = ...-lmlibm.aТеперь программа
hoc3.о.hmakemake