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

Здесь есть возможность читать онлайн «Брайан Керниган - UNIX — универсальная среда программирования» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 1992, ISBN: 1992, Издательство: Финансы и статистика, Жанр: ОС и Сети, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

UNIX — универсальная среда программирования: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «UNIX — универсальная среда программирования»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

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

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

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «UNIX — универсальная среда программирования», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

%left '*' '/'

%left UNARYMINUS NOT

%right '^'

%%

list: /* nothing */

| list '\n'

| list defn '\n'

| list asgn '\n' { code2(pop, STOP); return 1; }

| list stmt '\n' { code(STOP); return 1; }

| list expr '\n' { code2(print, STOP); return 1; }

| list error '\n' { yyerrok; }

;

asgn: VAR '=' expr { code3(varpush,(Inst)$1,assign); $$=$3; }

| ARG '=' expr

{ defnonly("$"); code2(argassign,(Inst)$1); $$=$3;}

;

stmt: expr { code(pop); }

| RETURN { defnonly("return"); code(procret); }

| RETURN expr

{ defnonly("return"); $$=$2; code(funcret); }

| PROCEDURE begin '(' arglist ')'

{ $$ = $2; code3(call, (Inst)$1, (Inst)$4); }

| PRINT prlist { $$ = $2; }

| while cond stmt end {

($1)[1] = (Inst)$3; /* body of loop */

($1)[2] = (Inst)$4;

} /* end, if cond fails */

| if cond stmt end { /* else-less if */

($1)[1] = (Inst)$3; /* thenpart */

($1)[3] = (Inst)$4;

} /* end, if cond fails */

| if cond stmt end ELSE stmt end { /* if with else */

($1)[1] = (Inst)$3; /* thenpart */

($1)[2] = (Inst)$6; /* elsepart */

($1)[3] = (Inst)$7;

} /* end, if cond fails */

| '{' stmtlist '}' { $$ = $2; }

;

cond: '(' expr ')' { code(STOP); $$ = $2; }

;

while: WHILE { $$ = code3(whilecode,STOP,STOP); }

;

if: IF { $$ = code(ifcode); code3(STOP, STOP, STOP); }

;

begin: /* nothing */ { $$ = progp; }

;

end: /* nothing */ { code(STOP); $$ = progp; }

;

stmtlist: /* nothing */ { $$ = progp; }

| stmtlist '\n'

| stmtlist stmt

;

expr: NUMBER { $$ = code2(constpush, (Inst)$1); }

| VAR { $$ = code3(varpush, (Inst)$1, eval); }

| ARG { defnonly("$"); $$ = code2(arg, (Inst)$1); }

| asgn

| FUNCTION begin '(' arglist ')'

{ $$ = $2; code3(call,(Inst)$1,(Inst)$4); }

| READ '(' VAR ')' { $$ = code2(varread, (Inst)$3); }

| BLTIN '(' expr ')' { $$=$3; code2(bltin, (Inst)$1->u.ptr); }

| '(' expr ')' { $$ = $2; }

| expr '+' expr { code(add); }

| expr '-' expr { code(sub); }

| expr '*' expr { code(mul); }

| expr '/' expr { code(div); }

| expr '^' expr { code (power); }

| '-' expr %prec UNARYMINUS { $$=$2; code(negate); }

| expr GT expr { code(gt); }

| expr GE expr { code(ge); }

| expr LT expr { code(lt); }

| expr LE expr { code(le); }

| expr EQ expr { code(eq); }

| expr NE expr { code(ne); }

| expr AND expr { code(and); }

| expr OR expr { code(or); }

| NOT expr { $$ = $2; code(not); }

;

prlist: expr { code(prexpr); }

| STRING { $$ = code2(prstr, (Inst)$1); }

| prlist ',' expr { code(prexpr); }

| prlist ',' STRING { code2(prstr, (Inst)$3); }

;

defn: FUNC procname { $2->type=FUNCTION; indef=1; }

'(' ')' stmt { code(procret); define($2); indef=0; }

| PROC procname { $2->type=PROCEDURE; indef=1; }

'(' ')' stmt { code(procret); define($2); indef=0; }

;

procname: VAR

| FUNCTION

| PROCEDURE

;

arglist: /* nothing */ { $$ = 0; }

| expr { $$ = 1; }

| arglist expr { $$ = $1 + 1; }

;

%%

/* end of grammar */

...

С помощью правила для аргсписок (список аргументов) подсчитывается число аргументов. На первый взгляд может показаться, что нужно каким-то образом собирать аргументы, но это не так, поскольку каждое выражение ( выраж ) из списка аргументов вырабатывает значение в стеке как раз там, где оно необходимо.

Правило для опред вводит новое свойство языка yacc: встроенное действие. Оказывается, можно поместить действие посредине правила, так, чтобы оно выполнялось в процессе распознавания последнего. Мы воспользовались этой возможностью, чтобы запомнить, что сейчас распознается: определение функции или процедуры. (В качестве альтернативного решения можно было бы ввести новый символ типа begin, который распознавался бы в соответствующее время.) Функция defnonlyпечатает предупреждающее сообщение, если вопреки синтаксису какая-либо конструкция окажется вне определения функции или процедуры. Обычно вам предоставляется выбор: обнаруживать ошибку синтаксически или семантически. Перед нами уже стояла такая задача ранее, при диагностике неопределенных переменных. Функция defnonlyхорошо иллюстрирует ситуацию, когда семантическая проверка легче синтаксической.

defnonly(s) /* warn if illegal definition */

char *s;

{

if (!indef)

execerror(s, "used outside definition");

}

Переменная indefопределена в hoc.yи принимает значения в действиях для опред .

К лексическому анализатору добавлены средства проверки аргументов: символ $, за которым следует чисто для строки в кавычках. Последовательности в строках, начинающиеся с обратной дробной черты, например \n, обрабатываются функцией backslash:

yylex() /* hoc6 */

...

if (c == '$') { /* argument? */

int n = 0;

while (isdigit(c=getc(fin)))

n = 10 * n + c — '0';

ungetc(с, fin);

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «UNIX — универсальная среда программирования»

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


Отзывы о книге «UNIX — универсальная среда программирования»

Обсуждение, отзывы о книге «UNIX — универсальная среда программирования» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x