マニュアルページセク ション 1: ユーザーコマンド

印刷ビューの終了

更新: 2014 年 7 月
 
 

yacc(1)

名前

yacc - 構文解析プログラムの生成

形式

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) コマンドを使うと便利です。

オプション

サポートしているオプションは、次のとおりです。

–b file_prefix

すべての出力ファイルに対して、接頭辞として y の代わりに file_prefix を使用します。コードファイルの y.tab.c、ヘッダーファイルの y.tab.h (–d が指定されたとき)、記述ファイルの y.output (–v が指定されたとき) は、それぞれ file_prefix.tab.cfile_prefix.tab.h、および file_prefix.output に変更されます。

–d

yacc またはユーザーが割り当てたトークン番号を、 ユーザーが宣言したトークン名に対応させる #define 文を含んだ y.tab.h ファイルを生成します。この対応付けにより、 y.tab.c 以外のソースファイルから トークン番号を参照することが可能となります。

–l

y.tab.c 中に生成するコードには #line 構造を含めないことを指定します。このオプションは、プログラムの文法および動作が 完全にデバッグされるまでは使用すべきではありません。

–p sym_prefix

yacc が生成するすべての外部名の接頭辞として、 yy の代わりに sym_prefix を使用します。影響を受ける名前としては、関数 yyparse()yylex()yyerror()、および変数 yylvalyycharyydebug が挙げられます。こでは、これらの 6 つのシンボルを便宜上デフォルト名を使って表しています。局所的な名前も –p オプションの影響を受けます。しかし、–p オプションは yacc が生成する #define シンボルには影響を及ぼしません。

–P parser

/usr/share/lib/ccs/yaccpar の代わりに使用する構文解析プログラムを指定できます。たとえば、以下のように指定できます。

example% yacc -P ~/myparser parser.y
–Q[y|n]

–Qy オプションは、バージョン情報を y.tab.c 中に書き出すことを表します。この情報により、どのバージョンの yacc によってファイルが生成されたかが分かります。–Qn オプションは、このバージョン情報を書き出さないことを表すもので、 これがデフォルトとなります。

–t

実行時デバッグコードをコンパイルすることをデフォルトとします。このコードは条件付きコンパイル制御行とともに、常に y.tab.c ファイル中に置かれます。デフォルトでは、 この部分のコードを含まないよう y.tab.c はコンパイルされます。–t オプションを指定したか否かに関わらず、実行時デバッグコードは、 プリプロセッサシンボルである YYDEBUG により制御されます。YYDEBUG の値がゼロ以外のとき、実行時デバッグコードが含まれるようにコンパイルされます。値が 0 のときは含まれません。このコードなしで生成されたプログラムは、サイズが小さくなり、実行の速度も少し速くなります。

–v

構文解析用テーブル群、および文法上のあいまいさにより発生した 矛盾点に関するレポートを記述した y.output ファイルを生成します。

–V

yacc 用のバージョン情報を標準エラー出力に書き出します。

オペランド

次のオペランドを指定できます。

file

構文解析プログラム生成の対象とする命令を 含んでいるファイルのパス名

使用例 1 yacc コマンドの使用

cc コマンドのライブラリ検索オペランドに指定することにより、 yacc ライブラリを使用することが可能です。main という yacc ライブラリを使用するには、以下のコマンドを実行します。

example% cc y.tab.c -ly

lexyacc の両方のライブラリに 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) を返すものと想定しています。

終了ステータス

次の終了ステータスが返されます。

0

正常終了。

>0

エラーが発生した。

ファイル

y.output

生成した構文解析プログラムの状態遷移

y.tab.c

生成した構文解析プログラムのソースコード

y.tab.h

生成した構文解析プログラムのヘッダファイル

yacc.acts

一時ファイル

yacc.debug

一時ファイル

yacc.tmp

一時ファイル

yaccpar

C プログラム用の構文解析プログラムのプロトタイプ

属性

属性についての詳細は、マニュアルページの attributes(5) を参照してください。

属性タイプ
属性値
使用条件
developer/base-developer-utilities
インタフェースの安定性
確実
標準
standards(5) を参照してください。

関連項目

lex(1), attributes(5), environ(5), standards(5)

診断

還元 - 還元衝突 および シフト - 還元衝突の矛盾の数が標準エラー出力に報告されます。詳細な情報は y.output ファイルに出力されます。また開始記号からたどることのできない 規則があれば、これについても報告されます。

出力するファイル名が固定されているので、1 つのディレクトリ内で同時に複数の yacc プロセスを動作させることはできません。

識別名にはドル記号 ($) を使用しないようにしてください。