名前 | 形式 | 機能説明 | オプション | オペランド | 使用例 | 環境 | 終了ステータス | ファイル | 属性 | 関連項目 | 診断 | 注意事項
yacc コマンドは、文脈自由文法を、LALR(1) 構文解析アルゴリズムを実行する簡易オートマトン用のテーブル群に 変換します。文法はあいまいであっても構いません。 指定された優先順位規則に従ってあいまいな記述を処理します。
出力ファイル y.tab.c は、yyparse() 関数を生成するために C コンパイラを使ってコンパイルする必要があります。 この関数は、字句解析プログラム yylex()、main()、およびエラー処理ルーチン yyerror() とともにロードすることが必要です。 これらのルーチンはユーザーが用意しなければなりませんが、yacc が使用できる字句解析プログラムを生成するには、lex(1) コマンドを使うと便利です。
以下のオプションを指定できます。
すべての出力ファイルに対して、接頭辞として y の代わりに file_prefix を使用します。コードファイルの y.tab.c、ヘッダーファイルの y.tab.h (-d が指定されたとき)、記述ファイルの y.output (-v が指定されたとき) は、それぞれ file_prefix.tab.c, file_prefix.tab.h、 file_prefix.output に変更されます。
yacc またはユーザーが割り当てたトークン番号を、 ユーザーが宣言したトークン名に対応させる #define 文を含んだ y.tab.h ファイルを生成します。この対応付けにより、 y.tab.c 以外のソースファイルから トークン番号を参照することが可能となります。
y.tab.c 中に生成するコードには #line 構造を含めないことを指定します。 このオプションは、プログラムの文法および動作が 完全にデバッグされるまでは使用すべきではありません。
/usr/ccs/bin/yaccpar の代わりに 使用する構文解析プログラムの指定をすることができます。 たとえば、以下のように指定できます。
example% yacc -P ~/myparser parser.y |
yacc が生成するすべての外部名の接頭辞として、 yy の代わりに sym_prefix を使用します。 影響を受ける名前としては、関数 yyparse()、yylex()、yyerror()、および変数 yylval、yychar、yydebug が挙げられます。このマニュアルページでは、これらの 6 つのシンボルを便宜上デフォルト名を使って表しています。 局所的な名前も -p オプションの影響を受けますが、 -p オプションは yacc が生成する #define シンボルには影響を及ぼしません。
-Qy オプションは、バージョン情報を y.tab.c 中に書き出すことを表します。この情報により、どのバージョンの yacc によってファイルが生成されたかが分かります。-Qn オプションは、このバージョン情報を書き出さないことを表すもので、 これがデフォルトとなります。
実行時デバッグコードをコンパイルすることをデフォルトとします。 このコードは条件付きコンパイル制御行とともに、常に y.tab.c ファイル中に置かれます。デフォルトでは、 この部分のコードを含まないよう y.tab.c はコンパイルされます。 -t オプションを指定したか否かに関わらず、実行時デバッグコードは、 プリプロセッサシンボルである YYDEBUG により制御されます。 YYDEBUG の値がゼロ以外のとき、実行時デバッグコードが含まれるようにコンパイルされます。 値がゼロのときは含まれません。 このコードなしで生成されたプログラムは、サイズが小さくなり、 実行の速度も少し速くなります。
yacc 用のバージョン情報を標準エラー出力に書き出します。
構文解析用テーブル群、および文法上のあいまいさにより発生した 矛盾点に関するレポートを記述した y.output ファイルを生成します。
cc コマンドのライブラリ検索オペランドに指定することにより、 yacc ライブラリを使用することが可能です。 main という yacc ライブラリを使用するには、以下のコマンドを実行します。
example% cc y.tab.c -ly |
main が lex と yacc の両方のライブラリに存在しているとき、yacc ライブラリの main を使うには以下のコマンドを実行します。
example% cc y.tab.c lex.yy.c -ly -ll |
yacc ライブラリには、通常はアプリケーションプログラマが作成する 2 つの簡単な関数が定義されています。これらの関数は 以下のようなコードです。
#include <locale.h> int main(void) { extern int yyparse(); setlocale(LC_ALL, ""); /* If the following parser is one created by lex, the application must be careful to ensure that LC_CTYPE and LC_COLLATE are set to the POSIX locale. */ (void) yyparse(); return (0); } #include <stdio.h> int yyerror(const char *msg) { (void) fprintf(stderr, "%s\n", msg); return (0); } |
yacc の実行に影響を与える環境変数 LC_CTYPE、 LC_MESSAGES、 NLSPATH についての詳細は、 environ(5) を参照してください。
yacc は EUC の主および補助コードセット中の文字を 1 文字トークン記号として扱う ことができます。 この場合は、 引用符によって囲まれた 1 文字の終端記号でなければなりません。 yacc は、 yylex() がこれらの 1 文字トークン記号に対して 1 つのワイド文字 (wchar_t) を返すものと想定しています。
生成した構文解析プログラムの状態遷移
生成した構文解析プログラムのソースコード
生成した構文解析プログラムのヘッダファイル
一時ファイル
一時ファイル
一時ファイル
C プログラム用の構文解析プログラムのプロトタイプ
次の属性については attributes(5) のマニュアルページを参照してください。
属性タイプ | 属性値 |
---|---|
使用条件 | SUNWbtool |
還元 - 還元衝突 および シフト - 還元衝突の矛盾の数が標準エラー出力に報告されます。詳細な情報は y.output ファイルに出力されます。また開始記号からたどることのできない 規則があれば、これについても報告されます。
出力するファイル名が固定されているので、1 つのディレクトリ内で同時に複数の yacc プロセスを動作させることはできません。
識別名にはドル記号 ($) を使用しないようにしてください。
名前 | 形式 | 機能説明 | オプション | オペランド | 使用例 | 環境 | 終了ステータス | ファイル | 属性 | 関連項目 | 診断 | 注意事項