UNIX — универсальная среда программирования
UNIX — универсальная среда программирования читать книгу онлайн
В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями
shell.
Для программистов-пользователей операционной системы UNIX.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Третий этап — создание лексического анализатора, который должен читать разбираемый входной поток и разбивать его для анализатора на осмысленные единицы. Примером лексической единицы длиной в несколько символов может служить
NUMBER
+
*
На следующем этапе разрабатывается управляющая процедура, которая вызывает анализатор, созданный
yacc
Программа
yacc
yyparse
yacc
Действие
yacc
yylex
yyparse
yacc
y
Чтобы быть более точными, укажем, что входной поток для
yacc
%{
Операторы Си типа #include, описания и т. д.
Эта часть необязательна.
%}
yacc-описания: лексемы, грамматические переменные,
информация о приоритетах и ассоциативности
%%
грамматические правила и действия
%%
еще операторы Си (необязательно):
main() {
...; yyparse(); ...
}
yylex() {
...
}
...
Этот поток поступает на вход
yacc
y.tab.c
Операторы на Си между %{ и %}, если есть
Операторы на Си из части после второй комбинации %%, если есть:
main() {
...; yyparse(); ...
}
yylex() {
...
}
...
yyparse() {
анализатор, который вызывает yylex()
}
Такой подход типичен для системы UNIX:
yacc
.o
Генератор
yacc
yacc
Исходный текст
hoc1
yylex
main
hoc.y
yacc
.y
сс
yacc
hoc.y
$ cat hoc.y
%{
#define YYSTYPE double /* data type of yacc stack */
%}
%token NUMBER
%left '+' /* left associative, same precedence */
%left '*' '/' /* left assoc., higher precedence */
%%
list: /* nothing */
| list 'n'
| list expr 'n' { printf("t%.8gn", $2); }
;
expr: NUMBER { $$ = $1; }
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { $$ = $1 / $3; }
| '(' expr ')' { $$ = $2; }
;
%%
/* end of grammar */
...
Вы видите, как много информации заключено в этих нескольких строках. Поскольку мы не можем вам здесь все объяснить, в частности, как работает синтаксический анализатор, обратитесь к справочному руководству по
yacc
Альтернативные правила разделены символом
'|'
$n
$1
$2
n
$$