ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
![]() |
マニュアルページセクション 1: ユーザーコマンド Oracle Solaris 11 Information Library (日本語) |
- 構文解析プログラムの生成
yacc [-dltVv] [-b file_prefix] [-Q [y | n]] [-P parser] [-p sym_prefix] file
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 構造を含めないことを指定します。このオプションは、プログラムの文法および動作が 完全にデバッグされるまでは使用すべきではありません。
yacc が生成するすべての外部名の接頭辞として、 yy の代わりに sym_prefix を使用します。影響を受ける名前としては、関数 yyparse()、yylex()、yyerror()、および変数 yylval、yychar、yydebug が挙げられます。こでは、これらの 6 つのシンボルを便宜上デフォルト名を使って表しています。局所的な名前も -p オプションの影響を受けます。しかし、-p オプションは yacc が生成する #define シンボルには影響を及ぼしません。
/usr/share/lib/ccs/yaccpar の代わりに使用する構文解析プログラムを指定できます。たとえば、以下のように指定できます。
example% yacc -P ~/myparser parser.y
-Qy オプションは、バージョン情報を y.tab.c 中に書き出すことを表します。この情報により、どのバージョンの yacc によってファイルが生成されたかが分かります。-Qn オプションは、このバージョン情報を書き出さないことを表すもので、 これがデフォルトとなります。
実行時デバッグコードをコンパイルすることをデフォルトとします。このコードは条件付きコンパイル制御行とともに、常に y.tab.c ファイル中に置かれます。デフォルトでは、 この部分のコードを含まないよう y.tab.c はコンパイルされます。-t オプションを指定したか否かに関わらず、実行時デバッグコードは、 プリプロセッサシンボルである YYDEBUG により制御されます。YYDEBUG の値がゼロ以外のとき、実行時デバッグコードが含まれるようにコンパイルされます。値が 0 のときは含まれません。このコードなしで生成されたプログラムは、サイズが小さくなり、実行の速度も少し速くなります。
構文解析用テーブル群、および文法上のあいまいさにより発生した 矛盾点に関するレポートを記述した y.output ファイルを生成します。
yacc 用のバージョン情報を標準エラー出力に書き出します。
次のオペランドを指定できます。
構文解析プログラム生成の対象とする命令を 含んでいるファイルのパス名
例 1 yacc コマンドの使用
cc コマンドのライブラリ検索オペランドに指定することにより、 yacc ライブラリを使用することが可能です。main という yacc ライブラリを使用するには、以下のコマンドを実行します。
example% cc y.tab.c -ly
lex と yacc の両方のライブラリに main が含まれています。yacc ライブラリの main を使うには以下のコマンドを実行します。
example% cc y.tab.c lex.yy.c -ly -ll
これにより、最初に yacc ライブラリが検索されるので、 yacc ライブラリ中の main が用いられます。
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 の実行に影響を与える次の環境変数についての詳細は、environ(5) を参照してください。LANG、LC_ALL、LC_CTYPE、LC_MESSAGES、および NLSPATH。
yacc は EUC の主および補助コードセット中の文字を 1 文字トークン記号として扱う ことができます。この場合、EUC コードは引用符によって囲まれた 1 文字の終端記号でなければなりません。yacc は、 yylex() がこれらの 1 文字トークン記号に対して 1 つのワイド文字 (wchar_t) を返すものと想定しています。
次の終了値が返されます。
正常終了。
エラーが発生しました。
生成した構文解析プログラムの状態遷移
生成した構文解析プログラムのソースコード
生成した構文解析プログラムのヘッダファイル
一時ファイル
一時ファイル
一時ファイル
C プログラム用の構文解析プログラムのプロトタイプ
属性についての詳細は、attributes(5) を参照してください。
|
lex(1), attributes(5), environ(5), standards(5)
還元 - 還元衝突 および シフト - 還元衝突の矛盾の数が標準エラー出力に報告されます。詳細な情報は y.output ファイルに出力されます。また開始記号からたどることのできない 規則があれば、これについても報告されます。
出力するファイル名が固定されているので、1 つのディレクトリ内で同時に複数の yacc プロセスを動作させることはできません。
識別名にはドル記号 ($) を使用しないようにしてください。