Алексей Махоткин

домашняя страница

Automake

Go to the first, previous, next, last section, table of contents.


Поддержка Yacc и Lex

В Automake есть некоторая поддержка Yacc и Lex.

Automake предполагает, что файлы с расширением `.c’, которые создаются yacc (или lex) должны называться точно так же, как и входной файл. Это значит, что при использовании исходного yacc-файла `foo.y’ Automake будет считать, что промежуточный файл будет называться `foo.c’ (а не более традиционно, `y.tab.c’).

Расширение имени yacc-файла используется для определения расширения имени готового файла на языках `C’ или `C++’. Файлы с расширением `.y’ будут превращены в файлы с расширением `.c’; аналогично `.yy’ станут `.cc’; `.y++’ станут `c++’; и `.yxx’ станут `.cxx’.

Подобным образом исходные тексты на lex могут быть использованы для создания файлов на `C’ или `C++’; распознаются файлы с расширениями `.l’, `.ll’, `.l++’ и `.lxx’.

Вы не должны явно упоминать промежуточные файлы (на `C’ или `C++’) в переменных `SOURCES’; вы должны указывать только список исходных файлов.

Промежуточные файлы, созданные yacc (или lex), будут включены в созданный дистрибутив. Таким образом, пользователю не обязательно иметь у себя yacc или lex.

Если был обнаружен исходный текст на yacc, то ваш файл `configure.in’ должен определить переменную `YACC’. Это легко делается макросом `AC_PROG_YACC’ (see section `Проверка отдельных программ’ in Руководство Autoconf).

Аналогичным образом, если есть исходный текст lex, то в `configure.in’ должна быть определена переменная `LEX’. Вы можете использовать для этого макрос `AC_PROG_LEX’ (see section `Проверка отдельных программ’ in Руководство Autoconf). Поддержка lex в Automake также требует использования макроса `AC_DECL_YYTEXT’ – automake необходимо знать значение `LEX_OUTPUT_ROOT’. Все эти тонкости обрабатываются при использовании макроса AM_PROG_LEX (see section Макросы Autoconf, поставляемые с Automake).

Automake делает возможным включение в одну программу нескольких исходных файлов yacc (или lex). Для запуска yacc (или lex) в подкаталогах Automake использует небольшую программу, ylwrap. Это необходимо, поскольку имя выходного файла yacc является фиксированным, а параллельное выполнение make может одновременно запустить несколько экземпляров yacc. Программа ylwrap распространяется вместе с Automake. Она должна быть в каталоге, указанном переменной `AC_CONFIG_AUX_DIR’ (see section `Нахождение ввода `configure” in Руководство Autoconf) или в текущем каталоге, если данный макрос не используется в `configure.in’.

Для yacc, недостаточно просто управлять блокировками. Результирующий файл yacc всегда использует внутри одни и те же имена символов, так что невозможно скомпоновать два парсера yacc в одну и ту же программу.

Мы рекомендуем использование следующего приема с переименованием объектов, который используется в gdb:

#define yymaxdepth c_maxdepth
#define yyparse c_parse
#define yylex   c_lex
#define yyerror c_error
#define yylval  c_lval
#define yychar  c_char
#define yydebug c_debug
#define yypact  c_pact  
#define yyr1    c_r1            
#define yyr2    c_r2            
#define yydef   c_def       
#define yychk   c_chk       
#define yypgo   c_pgo       
#define yyact   c_act       
#define yyexca  c_exca
#define yyerrflag c_errflag
#define yynerrs c_nerrs
#define yyps    c_ps
#define yypv    c_pv
#define yys c_s
#define yy_yys  c_yys
#define yystate c_state
#define yytmp   c_tmp
#define yyv c_v
#define yy_yyv  c_yyv
#define yyval   c_val
#define yylloc  c_lloc
#define yyreds  c_reds
#define yytoks  c_toks
#define yylhs   c_yylhs
#define yylen   c_yylen
#define yydefred c_yydefred
#define yydgoto c_yydgoto
#define yysindex c_yysindex
#define yyrindex c_yyrindex
#define yygindex c_yygindex
#define yytable  c_yytable
#define yycheck  c_yycheck
#define yyname   c_yyname
#define yyrule   c_yyrule

Для каждого `#define’ замените префикс `c_’ на то, что вы хотите использовать. Эти определения работают для программ bison, byacc и традиционных yacc. Если вы обнаружили, что какой-нибудь генератор парсеров использует символы, не указанные в этом списке, то сообщите нам новое имя, чтобы мы добавили его.


Go to the first, previous, next, last section, table of contents.

Comments