В 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.