UNIX — универсальная среда программирования
Шрифт:
($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); }
;
end: /* nothing */ { code(STOP); $$ = progp; }
;
stmtlist: /* nothing */ { $$ = progp; }
| stmtlist '\n'
| stmtlist stmt
;
expr: NUMBER { $$ = code2(constpush, (Inst)$1); }
| VAR { $$ = code3(varpush, (Inst)$1, eval); }
| asgn
| 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); }
%%
/* end of grammar */
В
hoc3
. Обратите внимание на то, что команды
STOP
, завершающие последовательность операторов, теперь порождаются в нескольких местах. Как и прежде, progp
здесь представляет собой адрес очередной создаваемой команды. При выполнении все команды STOP
служат для завершения цикла в функции execute
. Правило для понятия все по сути является подпрограммой, вызываемой из нескольких мест, именно оно порождает команду STOP
и возвращает адрес следующей за ней команды. Команды, создаваемые для операторов
if
и while
, требуют особого рассмотрения. Когда встречается ключевое слово while
, порождается операция whilecode
, и адрес этой команды возвращается в качестве значения правила
пока: WHILE
Но
while
. Значение, возвращаемое правилом cond
, является адресом начала команд для условия. После распознавания всего оператора while
в два зарезервированных слова, вводимых за командой whilecode
, заносится адрес начала тела цикла и адрес оператора, следующего за циклом. (Команда по этому адресу будет создана позднее.)
| пока усл опер все {
($1)[1] = (Inst) $3 /* тело цикла */
($1)[2] = (Inst) $4 /* все, если условие неверно */
}
Здесь
$1
обозначает адрес команды whilecode
, таким образом, ($1)[1]
и ($1)[2]
обозначают два следующих слова. Рисунок, приведенный ниже, может прояснить ситуацию:
С оператором
if
дело обстоит аналогично, но резервируются три слова: для частей then
и else
, а также для оператора, следующего за if
. Мы вскоре рассмотрим этот случай. Лексический анализ теперь несколько удлиняется в основном из-за необходимости распознавания дополнительных операций:
yylex /* hoc5 */
{
...
switch (с) {
case '>': return follow('=', GE, GT);
case '<': return follow('=', LE, LT);
case '=': return follow('=', EQ, '=');
case '!': return follow('=', NE, NOT);
case '|': return follow('|', OR, '|');
case '&': return follow('&', AND, '&');
case '\n': lineno++; return '\n';
default: return c;
}
}
Функция
follow
"смотрит" на один символ вперед и возвращает символ назад во входной поток с помощью ungetc
, если он оказался не тем, который требовался:
follow(expect, ifyes, ifno) /* look ahead for >=, etc. */
{
int с = getchar;
if (c == expect)
return ifyes;
ungetc(c, stdin);
return ifno;
}
В файле
hoc.h
стало больше описаний функций, например всех отношений, но в общем его структура такая же, как и в hoc4
. Ниже приведено несколько последних строк грамматики:
$ cat hoc.h
...
Поделиться:
Популярные книги
Отмороженный 8.0
8. Отмороженный
Фантастика:
постапокалипсис
рпг
аниме
5.00
рейтинг книги
Газлайтер. Том 14
14. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Ермак. Телохранитель
2. Ермак
Фантастика:
альтернативная история
7.00
рейтинг книги
Матабар IV
4. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Сборник коротких эротических рассказов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Идеальный мир для Лекаря 19
19. Лекарь
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Дочь моего друга
2. Айдаровы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Свет Черной Звезды
6. Катриона
Любовные романы:
любовно-фантастические романы
5.50
рейтинг книги
Кодекс Крови. Книга IV
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 22
22. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Попаданка в академии драконов 4
4. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
7.47
рейтинг книги
Сердце Дракона. Том 12
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Лолита
Проза:
классическая проза
современная проза
8.05
рейтинг книги
Сводный гад
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00