yacc コマンド
目的
コンテキストのない文法仕様からなる入力データから、 LALR(1) 解析プログラムを生成します。
構文
yacc [ -b Prefix ] [ -C ] [ -d ] [ -l ] [ -NnNumber ] [ -NmNumber ] [ -NrNumber ] [ -p Prefix ] [ -s ] [ -t ] [ -v ] [ -y Path ] Grammar
説明
yacc コマンドは、コンテキストのない文法仕様を、LALR(1) 解析アルゴリズムを実行する単純なオートマトン用テーブル・セットに変換します。文法があいまいなので、そのために優先順位の規則を使用して、あいまいな問題点を解決します。
関数 yyparse を生成するには、C 言語コンパイラーを使って出力ファイル y.tab.c をコンパイルしなければなりません。この関数は字句解析プログラム yylex の他に main サブルーチンや、yyerror エラー処理サブルーチンと一緒にロードしなければなりません (これらのサブルーチンはユーザーが提供しなければなりません)。yyparse サブルーチンが使うことのできる字句解析プログラムの作成には lex コマンドが便利です。main および yyerror サブルーチンの簡略バージョンは、yacc ライブラリー、liby.a を通じて使用することができます。また、yacc を使用して C++ 出力も生成できます。
yacc で生成された C ファイル (y.tab.c) を -DYACC_MSG オプションでコンパイルすることで、メッセージ機能を使用するために必要なコードを含めることができます。コンパイル中にこのオプションを使用すると、yyparse サブルーチンおよび YYBACKUP マクロによって生成されたエラー・メッセージは、yacc_user.cat カタログから抽出されます。
これによって、ユーザーは、英語圏でない地域において、英語以外の言語でエラー・メッセージを受信することができます。カタログが見つからなかった場合、もしくはオープンできなかった場合には、yyparse および YYBACKUP サブルーチンは、デフォルトの英語メッセージを表示します。
yacc コマンドは、LANG、LC_ALL、LC_CTYPE、LC_MESSAGES 環境変数によって影響を受けます。
フラグ
項目 | 説明 |
---|---|
-b Prefix | すべての出力ファイル名の接頭部に y の代わりに Prefix を使用します。コード・ファイル y.tab.c、ヘッダー・ファイル y.tab.h (-d が指定されたときに作成されるファイル) および記述ファイル y.output (-v が指定されたときに作成されるファイル) は、それぞれ Prefix.tab.c、Prefix.tab.h、Prefix.output に変更されます。 |
-C | C++ コンパイラーで使用するために、y.tab.c ファイルの代わりに y.tab.C ファイルを生成します。入出力用の入出力ストリーム・ライブラリーを使用するには、マクロ _CPP_IOSTREAMS を定義します。 |
-d | ファイル y.tab.h を生成します。このファイルには、yacc 割り当てトークン・コードをユーザーのトークン名と関連付ける #define ステートメントが含まれます。これによって y.tab.c 以外のソース・ファイルが、このヘッダー・ファイルを含めることによってトークン・コードへアクセスできるようになります。 |
-l | y.tab.c の中に #line 構成を含めません。これは文法およびそれに対応する作業が完全にデバッグされてから使ってください。 |
-NnNumber | トークンと非端末名の配列のサイズを Number に変更します。デフォルト値は 8000 です。有効値は、8000 より大きいもののみです。 |
-NmNumber | メモリー状態の配列のサイズを Number に変更します。デフォルト値は 40000 です。有効値は、40000 より大きいもののみです。 |
-NrNumber | 大量の文法を処理するために、内部バッファーのサイズを変更します。デフォルト値は 2000 です。有効な値は、2000 よりも大きいもののみです。 |
-p Prefix | yacc コマンドで作成されるすべての外部名の接頭部として、yy の代わりに Prefix を使用します。 影響を受ける外部名は、yychar、yylval、yydebug、yyparse( )、yylex( )、yyerror( ) です (以前は、-p を使用して代替パーサーを指定していましたが、現在では -yPath を使用して代替パーサーを指定することができます)。 |
-s | yyparse 関数を複数の小さな関数に分割します。そのサイズは文法の大きさにある程度比例するため、yyparse 関数はコンパイル、最適化、あるいは効率的実行に支障をきたすほど大きくなってしまうことがあります。 |
-t | 実行時デバッグ・コードをコンパイルします。デフォルトでは、y.tab.c がコンパイルされるときこのコードは含まれません。ただし、実行時デバッグ・コードはプリプロセッサー・マクロ YYDEBUG に制御されます。YYDEBUG が 0 以外の値をとるとき、-t フラグが使われているかどうかに関係なく、C コンパイラー (cc) にはデバッグ・コードが含まれます。コンパイラーにデバッグ・コードを含めたくない場合には、YYDEBUG は 0 の値をとらなければなりません。このコードをコンパイルしなければ、yyparse サブルーチンは稼働速度が速くなります。
-t フラグを指定すると、デバッグ・コードがコンパイルされますが、実際にデバッグ・モードがオンになるわけではありません。デバッグ出力を表示するには、yacc 文法ファイルの宣言セクションに C 言語宣言 int yydebug=1 を追加するか、または dbx を通じて yydebug を設定して、yydebug 変数を設定しなければなりません。 |
-v | ファイル y.output を準備します。このファイルには読み取り可能な構文解析テーブルの記述と、あいまいな文法から生成された矛盾についての報告が含まれます。 |
-y Path | Path で指定したパーサーのプロトタイプを、デフォルトの /usr/lib/yaccpar ファイルの代わりに使用します。 (以前は、代替パーサーを指定するために -p を使用していました。) |
終了状況
このコマンドは、下記の終了値を戻します。
項目 | 説明 |
---|---|
0 | 正常終了。 |
>0 | エラーが発生しました。 |
例
- 下記のコマンドは、
ファイル grammar.y から yacc 規則を取り出し、出力を y.tab.c に入れます。yacc grammar.y
- 下記のコマンドは、yacc -d grammar.y例 1 と同様に機能しますが、y.tab.h ファイルも生成します。 このファイルには、grammar.y ファイル内で定義したトークンごとに、C スタイルの #define ステートメントが入っています。
ファイル
項目 | 説明 |
---|---|
y.output | 構文解析テーブルの読み取り可能な記述、およびあいまいな文法によって生成された矛盾の報告が入っています。 |
y.tab.c | 出力ファイルが入っています。 |
y.tab.h | トークン名の定義が入っています。 |
yacc.tmp | 一時ファイル。 |
yacc.debug | 一時ファイル。 |
yacc.acts | 一時ファイル。 |
/usr/ccs/lib/yaccpar | C プログラム用パーサーのプロトタイプが入っています。 |
/usr/ccs/lib/liby.a | 実行時ライブラリーが入っています。 |