yacc 文法ファイルの使用
yacc 文法ファイルは、次のセクションで構成されています。
- 宣言
- 規則
- プログラム
宣言
%%
規則
%%
プログラム%%
rulesyacc コマンドは、文法ファイルの中のブランク、タブ、および改行文字を無視します。 したがって、これらの文字を使用して、文法ファイルを読みやすくすることができます。 ただし、名前や予約記号では、ブランク、タブまたは改行を使用しないでください。
コメントの使用
プログラムが何をするかを説明するために、文法ファイルにコメントを書き込みます。 文法ファイルの名前を書き込める場所であれば、どこでもコメントを書き込めます。 ただし、ファイルを読みやすくするために、 規則の機能ブロックの先頭にコメントだけの行を置きます。 yacc 文法ファイル内のコメントは、C 言語プログラムのコメントと同じように見えます。 コメントは /* (スラッシュ、アスタリスク) と */ (アスタリスク、スラッシュ) の間に囲まれています。 次に例を示します。
/* This is a comment on a line by itself. */リテラル文字列の使用
リテラル文字列は、1 つまたは複数の文字を '' (単一引用符) の中に囲んだものです。 C 言語の場合と同様に、 ¥ (円記号) はリテラルの中ではエスケープ文字であり、C 言語のエスケープ・コードはすべて認識されます。 したがって、yacc コマンドは次の表にある記号を受け入れます。
| シンボル | 定義 |
|---|---|
| '¥a' | アラート |
| '¥¥b' | バックスペース |
| '¥¥f' | 用紙送り |
| '¥n' | 改行 |
| '¥r' | 戻り |
| '¥t' | タブ |
| '¥v' | 垂直タブ |
| '\'' | 単一引用符 (') |
| '\"' | 二重引用符 (") |
| '\?' | 疑問符 (?) |
| '\\' | 円記号 (¥) |
| '¥Digits' | エンコードされると、Digits 文字列で指定された 1 桁、2 桁、または 3 桁の 8 進整数で表される文字。 |
| '¥xDigits' | エンコードされると、Digits 文字列で指定された 16 進文字のシーケンスで表される文字。 |
その ASCII コードはゼロであるので、ヌル文字 (¥0 または 0) を文法規則で使用しないでください。 ヌル文字が使用される場合、yylex サブルーチンは、入力の終わりを示す 0 を戻します。
文法ファイルのフォーマット設定
- トークン名には英大文字を使用し、非終端記号名には小文字を使用する。
- 文法規則とアクションの行を分け、 どちらかに変更があった場合にもう一方を変えずにすむようにする。
- 左側が同じ規則すべてをまとめる。 左側を 1 回入力し、 そして垂直バーを使用して、その左側に対する残りの規則をそこから始めるようにします。
- 左側が同じ規則のセットごとに、 最後の規則の後にセミコロンが 1 個だけの行を入力します。 その後に、新しい規則を容易に追加することができます。
- 規則本文は 2 タブ・ストップ、 アクション本文は 3 タブ・ストップ字下げします。
文法ファイルのエラー
yacc コマンドは、 文法仕様のセットすべてのためのパーサーを作り出すことはできません。 文法規則が矛盾しているか、 または yacc コマンドとは異なる突き合わせ手法が必要な場合、yacc コマンドはパーサーを生成しません。 ほとんどの場合、yacc コマンドはエラーを示すメッセージを提供します。 これらのエラーを訂正するには、 文法ファイルの規則を設計し直すか、または yacc コマンドが認識できないパターンを認識するための字句解析プログラム (パーサーに対する入力プログラム) を提供します。