-->

UNIX — универсальная среда программирования

На нашем литературном портале можно бесплатно читать книгу UNIX — универсальная среда программирования, Керниган Брайан Уилсон-- . Жанр: ОС и Сети / Интернет. Онлайн библиотека дает возможность прочитать весь текст и даже без регистрации и СМС подтверждения на нашем литературном портале bazaknig.info.
UNIX — универсальная среда программирования
Название: UNIX — универсальная среда программирования
Дата добавления: 16 январь 2020
Количество просмотров: 434
Читать онлайн

UNIX — универсальная среда программирования читать книгу онлайн

UNIX — универсальная среда программирования - читать бесплатно онлайн , автор Керниган Брайан Уилсон

В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями

shell.

 

Для программистов-пользователей операционной системы UNIX.

Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала

Перейти на страницу:

...

#include <stdio.h>

#include <ctype.h>

char *progname;

int lineno = 1;

#include <signal.h>

#include <setjmp.h>

jmp_buf begin;

main(argc, argv) /* hoc2 */

 char *argv[];

{

 int fpecatch();

 progname = argv[0];

 setjmp(begin);

 signal(SIGFPE, fpecatch);

 yyparse();

}

execerror(s, t) /* recover from run-time error */

 char *s, *t;

{

 warning(s, t);

 longjmp(begin, 0);

}

fpecatch() /* catch floating point exceptions */

{

 execerror("floating point exception", (char*)0);

}

В целях отладки мы сочли удобным, чтобы функция

execerror
вызывала
abort
(см. справочное руководство по
abort(3)
), что приведет к распечатке содержимого памяти, которую затем смогут использовать программы
adb
и
sdb
. Когда разработка программы полностью завершится, обращение к
abort
будет заменено на
longjmp
.

В программе

hoc2
лексический анализатор несколько иной. В нем учтено различие строчных и прописных букв, а поскольку теперь
yyval
является объединением, нужно выбрать подходящий элемент перед выходом из
yylex
. Ниже показаны измененные фрагменты:

yylex() /* hoc2 */

{

 ...

 if (с == '.' || isdigit(c)) { /* number */

  ungetc(c, stdin);

  scanf("%lf", &yylval.val);

  return NUMBER;

 }

 if (islower(c)) {

  yylval.index = с - 'a'; /* ASCII only */

  return VAR;

 }

...

Еще раз отметим, что тип лексемы (т.е.

NUMBER
) не совпадает с ее значением (например, 3.1416).

Продемонстрируем новые возможности

hoc2
переменные и способность восстановления после ошибки:

$ hoc2

x = 355

355

y = 113

113

p = x/z                           
z не определено, а значит, равно 0

hoc2: division by zero near line 4
Восстановление после ошибки

x/y

3.1415929

1е30 * 1е30                        
Переполнение

hoc2: floating point exception near line 5

...

В самом деле, для PDP-11 требуются вполне конкретные меры, чтобы обнаружить переполнение вещественного, но на большинстве других машин

hoc2
действует так, как показано выше.

Упражнение 8.3

Обеспечьте возможность запоминания последнего вычисленного значения, чтобы его не приходилось вводить снова для последовательности связанных вычислений. Одним из решений может быть использование какой-либо переменной, например

'p'
, в качестве "предыдущего" (previous) значения.

Упражнение 8.4

Измените программу

hoc
так, чтобы можно было использовать символ
';'
как разделитель выражений наравне с символом перевода строки.

8.3 Этап 3: переменные с произвольными именами; встроенные функции

В версию

hoc3
добавлено несколько новых средств, из-за чего увеличился текст программы. Основное нововведение возможность обращения к встроенным функциям:

sin cos atan exp log log10 sqrt int abs

Введена также дополнительно операция возведения в степень

'^'
(право ассоциативная с наивысшим приоритетом).

Поскольку лексический анализатор должен справляться с встроенными именами длиной более чем в один символ, не так уж много усилий придется приложить, чтобы допустить переменные с именами произвольной длины. Для хранения информации об этих переменных нужна довольно сложная таблица имен, но если мы ее создаем, то можно заранее задать в ней вместе с именами значения некоторых полезных констант:

PI
3.14159265358979323846 Число π
E
2.71828182845904523536 Основание натурального логарифма
GAMMA
0.57721566490153286060 Константа Эйлера-Маскерони
DEG
57.2957795130823208768 Отношение градуса к радиану
PHI
1.61803398874989484820 Золотое сечение

В результате получим полезный калькулятор:

$ hoc3

1.5^2.3

Перейти на страницу:
Комментариев (0)
название