lex プログラムでの yacc プログラムの使用

lex プログラムを、yacc コマンドなどの構文解析ルーチン生成プログラムと一緒に使用することもできます。 yacc コマンドは、 パーサー と呼ばれ、1 ワードを超える入力の構造を分析するプログラムを生成します。

このパーサー・プログラムは、 lex コマンドで生成される字句解析プログラムと組み合わせると、 適切な働きをします。 パーサー・プログラムは、 コンテキストに関係なく、多くのタイプの文法を認識します。 このようなパーサーは、lex コマンドで作成されるような、 入力トークンを認識するプリプロセッサーを必要とします。

lex プログラムは、拡張正規表現だけを認識し、 それを入力ファイルの指定に従って、トークンと呼ばれる文字パッケージにフォーマット設定します。 lex プログラムを使用してパーサー用の字句解析プログラムを作成する場合、 字句解析プログラム (lex コマンドで作成する) が入力ストリームを分割します。 パーサー (yacc コマンドの) は、 分割された断片に構造体を割り当てます。 lex コマンド、 または yacc コマンドのいずれかで生成されたプログラムと一緒に他のプログラムを使用することもできます。

トークンは、パーサーまたは字句解析プログラムによって定義された、 意味のある最小の独立単位です。 トークンにはデータ、言語キーワード、ID、またはその他の言語構文の単位を収容することができます。

yacc プログラムは、yylex という名前の字句解析サブルーチン (lex コマンドによって生成される) を探します。 通常、lex ライブラリー内のデフォルトのメインプログラムが yylex サブルーチンを呼び出します。 ただし、yacc コマンドがインストールされ、 そのメインプログラムが使用される場合、yacc プログラムが yylex サブルーチンを呼び出します。 この場合、適切な token 値を戻すときは、各 lex プログラム規則が次で終わるようにします。

return(token);
yacc コマンドは、yacc 文法ファイルに定義されている各トークンに、#define プリプロセッサー・ステートメントを介して整数値を割り当てます。 字句解析プログラムには、パーサーにトークンを戻すために、 これらのマクロに対してアクセスできなければなりません。 yacc -d オプションを使用して y.tab.h ファイルを作成し、lex 仕様ファイルの定義セクションに次に示す行を追加することによって、lex 仕様ファイルに y.tab.h ファイルを組み込みます。

%{
#include "y.tab.h"
%}
また、yacc 文法ファイルの 2 番目の区切り文字 %% (パーセント記号、パーセント記号) の後に次の行を加えることによって、lex.yy.c ファイルを yacc 出力ファイルに組みこむことができます。

#include "lex.yy.c"

yacc パーサーを起動するメインプログラムを取得するには、yacc ライブラリーを lex ライブラリーの前にロードする必要があります。 lex および yacc プログラムはどちらの順番でも生成できます。