入出力と処理
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/02/16 05:20 UTC 版)
ユーザは変換仕様をYacc文法ファイルとしてのテキストファイルを作っておく。 yaccコマンド yacc [-dlrtv ] [-b prefix] fileName は、fileName で与えたYacc文法ファイル(たとえば"wiki_samp1.y")(伝統的に拡張子は.yがつけられることが多かった)から構文規則を入力し、それに基づくLALR構文解析器になるC言語のソースプログラム(通常"y.tab.c")を出力する。-rオプションでコード部分だけ"y.code.c"ファイルに独立させることもできる。 このC言語ソースプログラムにはLALR解析テーブルおよびドライバルーチンが含まれる。特に、構文解析全体を行う関数にはyyparse()という名前がついている。よってこのプログラムにあらかじめ適宜yyparse()を呼び出すmain()関数を加えておくなどして(それはYacc文法ファイル中の「追加Cプログラム部」での記述でも可能)、ほしい変換プログラムを完成することができる。 -dオプションで生成するヘッダファイル"y.tab.h"は、Lexがトークン処理を行うときに、Yaccが割り当てたトークン値(256~)を正しく使うよう、Lex実行時に与える。 -vオプションにより、生成パーサの文法、終端記号、非終端記号、状態の種類とそれぞれの判定パターンおよびそのシフト、還元等の措置や状態遷移先といった解析テーブル情報が、人に分かりやすい形でテキストファイル"y.output"に出力される。(この"y.output"リストの見方が分かりにくい。ピリオド「.」(Yaccの種類によっては下線「_」)は現在のカーソル位置であることなどは知らないと分からないであろう。説明は日本語文書では良書「Cコンパイラ設計(yacc・lexの応用)」のほかに見つけにくいが、英語ではいくつかある) -tオプションを指定すると、生成パーサが実行されるときに、状態番号、スタック状態、読んだトークン、意味値の演算の様子、変化した状態番号などが、逐一標準エラー出力に表示されるのでデバッグに役立つ(コンパイルオプションも関連)。 次に、Yaccで生成し構文解析器ソースプログラム("y.tab.c")をccコマンドやgccコマンドなどでコンパイルする。このとき、Lexも利用したのであればその出力("lex.yy.c")も並べて指定する。これらに対応するライブラリもコンパイルオプションによってリンクさせる。 コンパイルで作成された変換プログラムを実行すると、標準入力(FILEポインタyyinで変更可能)(yywrap関数で複数ファイルの連結が可能)から変換するファイルを読み込む。これを字句解析器関数yylex()によってトークンにして構文解析が実行される。変換結果やエラーは、Yaccのアクション部や呼ばれる関数で書いた処理によりそれぞれ出力される。syntaxエラーなどは通常標準エラー出力に出るが、形式や出力先をエラー報告関数yyerror()でカスタマイズできる。Yaccのオリジナルなエラーメッセージでは情報が貧弱である。開発・運用で頭を抱えないようにするためには、特に発生場所のファイル名、行番号およびトークン番号などをエラーメッセージに追加するようにyyerror()を作っておくことが望ましい。
※この「入出力と処理」の解説は、「Yacc」の解説の一部です。
「入出力と処理」を含む「Yacc」の記事については、「Yacc」の概要を参照ください。
- 入出力と処理のページへのリンク