日本語 man コマンド類 (ja-man-1.1j_5) と日本語 man ドキュメント (ja-man-doc-5.4 (5.4-RELEASE 用) など) をインストールすると、以下のような man コマンド閲覧、キーワード検索が コンソールからできるようになります。
4.11-RELEASE-K, 5.4-RELEASE-K, 5.5-RELEASE-K, 6.0-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K, 12.1-RELEASE-K は、 プライベート版 (小金丸が編集してまとめたもの) ですが、 より多くの翻訳したファイルが含まれています。 (5.4-RELEASE-K から 6.4-RELEASE-K, 7.0-RELEASE-K から 7.4-RELEASE-K, 8.0-RELEASE-K から 8.4-RELEASE-K, 9.0-RELEASE-K から 9.3-RELEASE-K, 10.0-RELEASE-K から 10.3-RELEASE-K, 11.0-RELEASE-K から 11.4-RELEASE-K, 12.0-RELEASE-K から 12.4-RELEASE-K, 13.0-RELEASE-K から 13.3-RELEASE-K, 14.0-RELEASE-K から 14.1-RELEASE-K は、全翻訳済み)
13.3-STABLE-K, 15.0-CURRENT-K は現在、作成中で日々更新されています。
Table of Contents
YACC(1) User Commands YACC(1) 名称 Yacc - LALR(1) パーサジェネレータ 書式 yacc [ -BdgilLPrtvVy ] [ -b file_prefix ] [ -o output_file ] [ -p sym- bol_prefix ] filename 解説 yacc は、ファイル filename の文法仕様を読み込み、そのための LALR(1) パーサを生成します。パーサは、1 組の LALR(1) 解析テーブルと C プログラ ミング言語で書かれたドライバルーチンから構成されます。yacc は、通常、 ファイル y.tab.c に解析テーブルとドライバルーチンを書き込みます。 次のオプションが利用可能です: -b file_prefix -b オプションは、出力ファイル名の先頭に追加される接頭辞を file_prefix によって示される文字列に変更します。デフォルトの接頭辞 は、文字 y です。 -B (btyacc のためのコンパイルタイプの設定) バックトラッキング (backtracking) パーサを作成します。 -d -d オプションによって、ヘッダファイル y.tab.h を書き込むます。それ は、トークン識別子のための #define を含んでいます。 -g -g オプションによって、生成された LALR(1) パーサのグラフィカルな記 述は、dot(1) によって処理できる、graphviz 形式のファイル y.dot に 書き込まれます。 -i -i オプションによって、補足のヘッダファイル y.tab.i が書き込まれま す。-p オプションが指定するものはすべてに従来の yacc の yy の前に 付けられた名前をマップする必要に応じて extern 宣言と補足の #define を含んでいます。コードファイル、例えば、y.tab.c は、それらのファイ ルに定義されたシンボルの一貫性のある使用法を強制する、y.tab.h ファ イルと同様に、このファイル #include に修正されます、 補足のヘッダファイルは、lex- と yacc- ファイルの分離されたコンパイ ルに単純化します。 -l -l オプションが指定されなければ、yacc は、生成されたコードに #line ディレクティブを挿入します。#line ディレクティブによって、C コンパ イラの生成されたコードのエラーをユーザのオリジナルのコードに関連づ けます。-l オプションが指定されるなら、yacc は、#line ディレクティ ブを挿入しません。ユーザによって指定された #line ディレクティブ は、保持されます。 -L 位置処理を有効にします、例えば、"%locations" (btyacc のためのコン パイルタイプの設定)。 -o output_file パーサファイルのためのファイル名を指定します。このオプションが与え られないなら、出力ファイル名は、ファイル接尾辞と連結されたファイル 接頭辞です、例えば、y.tab.c。これは、-b オプションに優先します。 -p symbol_prefix -p オプションは、yacc によって生成されたシンボルの先頭に追加された 接頭辞を symbol_prefix によって示された文字列に変更します。デフォ ルト接頭辞は、文字列 yy です。 -P リエントラントなパーサを作成します、例えば、"%pure-parser"。 -r -r オプションによって、yacc は、コードとテーブルのための個別のファ イルを生成します。コードファイルは、y.code.c と名前が付けられ、 テーブルファイルは、y.tab.c と名前が付けられます。-b オプションを 使用して、接頭辞 "y." を上書きすることができます。 -s オリジナルの yacc 振る舞いにより厳密に適合するために、"%token" 文 の文字列リテラルのために生成された "#define" 文を抑制します。 通常、yacc が次のような行を見るとき、 %token OP_ADD "ADD" 引用された "ADD" が有効な C 識別子であり、OP_ADD のためだけでなく 同様に ADD のために #define を生成することに注意していください、例 えば、 #define OP_ADD 257 #define ADD 258 オリジナルの yacc は、2 番目の "#define" を生成しません。-s オプ ションは、この "#define" を抑制します。 POSIX (IEEE 1003.1 2004) は、"%token" のための名前と数値だけを文書 化していますが、オリジナルの yacc と bison も文字列リテラルを受け 付けます。 -t -t オプションは、デバッグ文がコンパイルされたコードに組み込まれる ように、yacc によって生成されたプリプロセッサのディレクティブを変 更します。 -v -v オプションによって、生成されたパーサの人間に読み込み可能な記述 が、ファイル y.output に書き込まれます。 -V 標準出力にバージョン番号を印刷します。 -y yacc は、bison が、表向きの POSIX 互換性のためにサポートする、この オプションを無視します。 拡張機能 yacc は、bison と yacc の他の実装との互換性のために、いくつかの拡張を提 供しています。%destructor と %locations 機能は、yacc がバックトラッキン グ (btyacc) 機能をサポートするために設定され、コンパイルされた場合の み、利用可能です。残りの機能は、常に利用可能です: %destructor { code } symbol+ シンボルがエラーリカバリの間に、自動的に廃棄されるとき、呼び出さ れるコードを定義します。ユーザのアクションがメモリを明示的に管理 することができない場合に、対応する意味的な値に関連する動的に割り 付けられたメモリを取り戻すために、このコードを使用することができ ます。 解析エラーに遭遇すると、生成されたパーサは、解析が継続することを 可能にする状態に到達するまで、スタックと入力トークンのシンボルを 廃棄します。このエラーリカバリのアプローチは、YYSTYPE 値が動的に 割り付けられたメモリへのポインタであるか、または含まれるなら、メ モリリークの結果となります。 角括弧で括られた code は、パーサがシンボルの 1 つを廃棄するとき はいつでも、呼び出されます。code 内で、"$$" または "$<tag>$" は、廃棄されたシンボルに関連した意味的な値を指定し、"@$" は、そ の位置を指定します (%locations 指令を参照)。 シンボルごとのデストラクタは、symbol+ の文法のシンボルをリストす ることによって定義されます。タイプごとにデストラクタは、symbol+ の意味的なタイプタグ (例えば、"<some_tag>") をリストすることに よって定義されます。この場合に、パーサは、そのシンボルに、それ自 体のシンボルごとのデストラクタがないなら、意味的なタイプタグがあ る、あらゆる文法のシンボルを廃棄するときはいつでも、code を呼び 出します。 デフォルトのデストラクタの 2 つのカテゴリは、シンボルごとでな く、タイプごとのデストラクタがない、あらゆる文法のシンボルを廃棄 するとき、呼び出されることをサポートされます: • "<*>" のためのコードは、("%type" によって) 明示的に宣言され た意味的なタイプタグがある文法のシンボルのために使用されま す。 • "<>" のためのコードは、宣言された意味的なタイプタグがない文 法のシンボルのために使用されます。 %expect number 予期される shift/reduce conflict の数を yacc に伝えます。それが 異なるなら、それは、数のみを報告します。 %expect-rr number 予期される reduce/reduce conflict の数を yacc に伝えます。それが 異なるなら、それは、数のみを報告します。これは、(bison と異なり) LALR パーサで許可されます。 %locations yylval で提供される意味的な値の情報の管理に似ている、グローバル 変数 yylloc の lex プログラムによって提供される、各トークンに関 連した位置情報の管理を有効にするように yacc に伝えます。 意味的な値に関して、左側シンボルの位置を参照するための @$ と @N (N は、整数) を使用するアクションと右側シンボルの 1 つの位置を参 照することができます。また、意味的な値に関して、規則が一致すると き、デフォルトのアクションは、規則の最初のシンボルの始め、と右側 の最後のシンボルの終わりとして @$ によって表わされる計算された位 置で使用されます。規則のアクションで @$ に明示的な割り当てによっ て、このデフォルトの計算を無視することができます。 yylloc のタイプは、デフォルトによって次のように定義される、 YYLTYPE です: typedef struct YYLTYPE { int first_line; int first_column; int last_line; int last_column; } YYLTYPE; 仕様ファイルの宣言セクションで (YYLTYPE_IS_DEFINED は、デフォル トを抑制するために、定義されなければなりません) ユーザによって、 YYLTYPE を再定義することができます。bison でのように、関連するア クションが実行される前に、規則の左側の位置を計算するために規則が 一致するごとに、マクロ YYLLOC_DEFAULT は、呼び出されます。ユーザ によってこのマクロを再定義することができます。 この指示は、YYLTYPE パラメータを yyerror() に追加します。%pure- parser 指示が存在するなら、YYLTYPE パラメータは、yylex() 呼び出 しに追加されます。 %lex-param { argument-declaration } デフォルトで、lexer は、パラメータを受け付けません、例えば、 yylex()。利用者のカスタマイズされた lexer のためのパラメータ宣言 を追加するために、このディレクティブを使用します。 %parse-param { argument-declaration } デフォルトで、パーサは、を受け付けません、例えば、yyparse()。利 用者のカスタマイズされたパーサのためのパラメータ宣言を追加するた めに、このディレクティブを使用します。 %pure-parser (yydebug と yynerrs 以外の) ほとんどの変数は、パーサを合理的にリ エントラントにして、yyparse 内のスタックで割り付けられます。 %token-table yytname 配列で利用可能なトークンのためのパーサの名前とします。し かしながら、yacc は、この配列の "$end", "$error" または "$undefined" を前もって定義しません。 移植性 Robert Corbett によれば、 Berkeley Yacc は、LALR(1) パーサジェネレータです。 Berkeley Yacc は、AT&T Yacc とできるだけ互換性があるように作られました。 Berkeley Yacc は、AT&T Yacc の文書に準拠するあらゆる入力仕様書を 受け付けることができます。 AT&T Yacc の文書化されていない機能を利用する仕様書は、恐らく拒否されます。 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/yacc.html の論理的根拠は、もはや POSIX 準拠を要求されない、AT&T yacc のいくつかの 機能を文書化しています。 とは言っても、AT&T yacc と厳密に互換性をもたないいくつかの他の実装で文 法ファイルの再使用に興味があるかもしれません。例えば、bison がありま す。ここに、少数の違いがあります: • yacc は、(オリジナルの文法ファイル ftp.y でのように) 動作の左の中括 弧に先行する等号を受け付けます: | STAT CRLF = { statcmd(); } • yacc と bison は、異なる順序でコードを発行し、特に、bison は、プロ トタイプを提供しない yylex、yyparse と yyerror のような共通関数への 前方参照を行います。 • "%expect" のための bison のサポートは、2 つ以上のリリースで壊れてい ます。最良の結果については、bison を使用して、そのディレクティブを 削除します。 • bison には、文法ファイルに組み込まれているディレクティブに依存し て、yacc のコマンド行のオプションのうちのいくつかと同等なものはあり ません。 • bison の "-y" オプションは、古いと見なされた AT&T yacc の機能のため のサポートの bison の不足に影響しません。 • yacc は、次の 2 つの形式の %lex-param と %parse-param を付けた複数 のパラメータを受け付けます。 {type1 name1} {type2 name2} ... {type1 name1, type2 name2 ...} bison は、後者 (文書化されていません) を受け付けますが、リリースに よっては、悪いコードを生成するかもしれません。 • bison のように、yacc は、yyparse、yyerror と (バックトラッキングの ために設定されているなら) %destructor を使用して宣言されたされたデ ストラクタへの %parse-param によって指定されたパラメータを追加しま す。bison は、デストラクタのための最後を除いて yyparse と yyerror のために追加のパラメータを最初に置きます。yacc は、この振る舞いと一 致します。 診断 決して還元 (reduce) されない規則があるなら、そのような規則の数は、標準 エラーに報告されます。何らかの LALR(1) の衝突あるなら、衝突の数は、標準 エラーに報告されます。 Berkeley Yacc October 5, 2014 YACC(1)