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.