次: C++ Support, 前: Program variables, 上: Programs
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)によって生成さる中間的なファイルは,作
成されるすべての配布物に含められます.そのためユーザがyaccや
lexを持っている必要がありません.
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_'接頭辞は好みのものに置き換えて下さい.
これらは,bison,byacc,そして伝統的なyaccに対す
る動作を定義します.パーサジェネレータが,ここでカバーされていないシン
ボルを使用していることが分かった場合,リストに加えることができるように,
新しい名前を報告してください.