Next: , Previous: Program variables, Up: Programs


7.8 YaccとLexのサポート

AutomakeはYaccとLexに対して幾分特異なサポートを行ないます.

Automakeは,yacc(あるいはlex)によって生成された.c ファイルが,入力ファイルのベース名を使用して命名されていると仮定します. すなわち,yaccソースファイルfoo.yに対して,Automakeは中間ファイ ルを(より伝統的なy.tab.cではなく)foo.cと命名します.

yaccソースファイルの拡張子は,結果として生じる‘C’あるいは ‘C++’ ファイルの拡張子を決定するために使用されます.ファイルの拡 張子が‘.y’の場合は‘.c’になります.同様に‘.yy’は ‘.cc’に,‘.y++’は‘c++’に,そして‘.yxx’は ‘.cxx’になります.

同様に,lexソースファイルは,‘C’や‘C++’を生成するために使用 することが可能です.拡張子の‘.l’,‘.ll’,‘.l++’,そして ‘.lxx’が認識されます.

あらゆる‘SOURCES’変数に,(‘C’や‘C++’の)中間的なファイル を明示的に書いてはいけません.ソースファイルだけをリストアップします.

yacc(あるいはlex)によって生成さる中間的なファイルは,作 成されるすべての配布物に含められます.そのためユーザがyacclexを持っている必要がありません.

yaccソースファイルが見つかった場合,configure.acで変数 ‘YACC’を定義する必要があります.これは,マクロ‘AC_PROG_YACC’ を呼び出すことで最も容易に行なえます(see Particular Program Checks).

yaccが呼び出された時,‘YFLAGS’と‘AM_YFLAGS’フラグが渡 されます.前者はユーザ変数で,後者はMakefile.amの著者のためのも のです.

AM_YFLAGS’は通常,-dオプションをyaccに渡すとき使用 されます.Automakeはこれが意味するところを知っていて,yacc -dで ビルドされるヘッダファイルの更新と配布のルールを,自動的に調整します. しかし,Automakeが分からないものは,このヘッダが使用される場所です.ヘッ ダが最初に使用される前にヘッダをビルドしておくことはあなたの責任です. 通常これは,ヘッダが他のファイルからインクルードされているとき,依存性 の追跡が動作するために必要となります.一般的な解決策は,ヘッダファイル を以下のようにBUILT_SOURCES (see Sources)にリストアップする ことです.

     BUILT_SOURCES = parser.h
     AM_YFLAGS = -d
     bin_PROGRAMS = foo
     foo_SOURCES = ... parser.y ...

同様に,lexソースファイルがある場合,configure.acで変数 ‘LEX’を定義する必要があります.こうするために‘AC_PROG_LEX’を 使用することが可能ですが(see Particular Program Checks),AM_PROG_LEXマ クロ(see Macros)の使用を推奨します.

lexが呼び出されたとき,‘LFLAGS’と‘AM_LFLAGS’フラグが 渡されます.前者はユーザ変数で,後者はMakefile.amの著者のための ものです.

Automakeで,一つのプログラムに複数のyacc(またはlex)ソー スファイルを含めることが可能になります.ディレクトリに一つ以上の異なる yacc(またはlex)のソースファイルがあるとき,Automakeは, サブディレクトリでyacc(またはlex)を実行するために, ylwrapと呼ばれる小さいプログラムを使用します.これが必要になる のは,yaccの出力ファイル名が固定されていて,並列的なmakeでyacc の一つ以上のインスタンスを同時に呼び出す可能性があるためです. ylwrapプログラムは,Automakeと一緒に配布されます.それは ‘AC_CONFIG_AUX_DIR’が指定するディレクトリ (see Finding `configure' Input),または,そ のマクロがconfigure.acで使用されていない場合はカレントディレク トリにあります.

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

それぞれの定義に対して,‘c_’接頭辞は好みのものに置き換えて下さい. これらは,bisonbyacc,そして伝統的なyaccに対す る動作を定義します.パーサジェネレータが,ここでカバーされていないシン ボルを使用していることが分かった場合,リストに加えることができるように, 新しい名前を報告してください.