YACC(1) | User Commands | YACC(1) |
名称
Yacc - LALR(1) パーサジェネレータ書式
yacc [ -dgilrtv ] [ -b file_prefix ] [ -p symbol_prefix ] filename解説
yacc は、ファイル filename の文法仕様を読み込み、そのための LALR(1) パーサを生成します。パーサは、1 組の LALR(1) 解析テーブルと C プログラミング言語で書かれたドライバルーチンから構成されます。 yacc は、通常、ファイル y.tab.c に解析テーブルとドライバルーチンを書き込みます。次のオプションが利用可能です:
- -b file_prefix
- -b オプションは、出力ファイル名の先頭に追加される接頭辞を file_prefix によって示される文字列に変更します。デフォルトの接頭辞は、文字 y です。
- -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 ディレクティブは、保持されます。
- -o output_file
- パーザファイルのためのファイル名を指定します。このオプションが与えられないなら、出力ファイル名は、ファイル接尾辞と連結されたファイル接頭辞です、例えば、 y.tab.c。これは、 -p オプションを上書きします。
- -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 の他の実装との互換性のために、いくつかの拡張を提供しています:- %expect number
- 予期される shift/reduce conflict の数を yacc に伝えます。それが異なるなら、それは、数のみを報告します。
- %expect-rr number
- 予期される reduce/reduce conflict の数を yacc に伝えます。それが異なるなら、それは、数のみを報告します。これは、(bison と異なり) LALR パーサで許可されます。
- %lex-param { argument-declaration }
- デフォルトで、lexer は、パラメータを受け付けません、例えば、 yylex()。利用者のカスタマイズされた lexer のためのパラメータ宣言を追加するために、このディレクティブを使用します。
- %parse-param { argument-declaration }
- デフォルトで、パーサは、を受け付けません、例えば、 yyparse()。利用者のカスタマイズされたパーサのためのパラメータ宣言を追加するために、このディレクティブを使用します。
- %pure-parser
- ( yydebug と yynerrs 以外の) ほとんどの変数は、パーサを合理的にリエントラントにして、 yyparse 内のスタックで割り付けられます。
移植性
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 の不足に影響しません。
診断
決して還元 (reduce) されない規則があるなら、そのような規則の数は、標準エラーに報告されます。何らかの LALR(1) の衝突あるなら、衝突の数は、標準エラーに報告されます。September 7, 2011 | Berkeley Yacc |