UNIX — универсальная среда программирования
UNIX — универсальная среда программирования читать книгу онлайн
В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями
shell.
Для программистов-пользователей операционной системы UNIX.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
'hoc1' is up to date make понимает, что это не нужно$8.2 Этап 2: переменные и восстановление после ошибки
Следующий шаг переход от
hoc1hoc2аzhoc1hoc1$ hoc11/0Floating exception - core dump$Для реализации новых возможностей требуются лишь небольшие изменения: приблизительно 35 строк текста. Лексический анализатор
yylexexpr: VAR | VAR '=' exprВыражение может содержать операцию присваивания; разрешены также многократные присваивания типа
x = y = z = 0Простейший способ хранения значений переменных создать массив из 26 элементов; однобуквенную переменную можно использовать в качестве индекса массива. Однако если анализатору предстоит обрабатывать и имена переменных, и значения в одном стеке, необходимо сообщить
yaccdoubleintdouble%union#definetypedefdouble%unionyacc$$ = $2Ниже приведена часть определения грамматики
hoc.yhoc2$ cat hoc.y%{double mem[26]; /* memory for variables 'a'..'z' */%}%union { /* stack type */ double val; /* actual value */ int index; /* index into mem[] */}%token <val> NUMBER%token <index> VAR%type <val> expr%right '='%left '+'%left '*' '/'%left UNARYMINUS%%list: /* nothing */ | list 'n' | list expr 'n' { printf ("t%.8gn", $2); } | list error 'n' { yyerrok; } ;expr: NUMBER | VAR { $$ = mem[$1]; } | VAR '=' expr { $$ = mem[$1] = $3; } | expr '+' expr { $$ = $1 + $3; } | expr '-' expr { $$ = $1 - $3; } | expr '*' expr { $$ = $1 * $3; } | expr '/' expr { if ($3 == 0.0) execerror("division by zero", ""); $$ = $1 / $3; } | '(' expr ')' { $$ = $2; } | '-' expr %prec UNARYMINUS { $$ = -$2; } ;%%/* end of grammar */...Из описания
%unionmem%token%type<val>doubleyacc"="Обработка ошибок происходит в несколько этапов. Прежде всего производится проверка на нулевой делитель: если делитель равен нулю, вызывается процедура обработки ошибок
execerrormainyaccerroryaccyyerrokyaccВ грамматике
hoс2mainsetjmpexecerrorlongjmpsetjmplongjmp
