yacc の規則

文法ファイルの規則セクションには、1 つ以上の文法規則が入っています。 それぞれの規則は、 構造体を記述するとともにその名前を与えています。

文法規則は、次の形式で記述されます。
A : BODY;

ここでA非端末名、およびBODYオプションで優先順位規則に従うことができる、0 個以上の名前、リテラル、およびセマンティック・アクションのシーケンスです。 文法を構成するために必須なものは、名前とリテラルだけです。 意味構造アクションと優先度規則は、オプショナルです。 コロンとセミコロンは、yacc には必須の句読点です。

意味構造アクションを使用すると、 入力プロセスで規則が認識されるたびに実行するアクションを関連付けることができます。 アクションは任意の C ステートメントであり、C ステートメントとして、 入力または出力の実行、サブプログラムのコール、または外部変数の変更を行うことができます。 またアクションは、パーサーのアクション、 例えばシフトや縮小などのアクションを参照することもできます。

優先順位ルールは、以下によって定義されます。%prec キーワード。特定の文法規則に関連付けられた優先順位を変更します。 予約済みシンボル%prec は、文法規則の本体の直後に置くことができ、その後にトークン名またはリテラルを続けることができます。 この構成によって、文法規則の優先度がトークン名またはリテラルの優先度になります。

非終端名の繰り返し

複数の文法規則に同じ非終端名がある場合は、以下を使用します。|(パイプ記号) 左側が書き直されないようにします。 さらに、以下を使用します。;(セミコロン) は、パイプ記号で結合されたすべての規則の末尾にのみ付きます。 例えば、次の文法規則があるとします。
A  :  B  C  D  ;
A  :  E  F  ;
A  :  G  ;
これは、次のようにパイプ記号を使用することによって、yacc コマンドに指定することができます。
A  :  B  C  D
   |  E  F
   |  G
   ;

文法ファイルでのリカージョンの使用

リカージョン とは、 関数を定義するためにそれ自体を使用する過程です。 言語定義では、これらの規則は、通常次のような形式を取ります。
rule    :        EndCase
        |        rule EndCase

したがって、以下の最も単純なケースは、ruleEndCase であるがruleEndCaseの複数のオカレンスで構成することもできます。 以下を使用する 2 行目の項目rule定義におけるrule再帰です。 パーサーは、ストリームが縮小されて最終的な EndCase になるまで、入力を循環して解析します。

規則の中でリカージョンを使用する場合、常にその規則内の左端の項目として、 規則の名前を書きます (前の例のように)。 規則の名前の呼び出しが、次の例のように行の後の方にあると、パーサーは、 内部スタック・スペースを使い尽くして、停止してしまう場合があります。
rule    :       EndCase
        |       EndCase rule

以下の例では、line改行文字が後に続くストリングの 1 つ以上の組み合わせとしての規則 (\n):

lines   :        line
        |        lines line
        ;

line    :        string '\n'
        ;

空文字列

空ストリングと一致する非終端記号を示すには、;(セミコロン) は、規則の本体内で単独で使用します。 シンボルを定義するにはempty一致するemptyストリングの場合は、以下のようなルールを使用します。
empty   :  ;
        | x;
または
empty   :
        | x
        ;

入力の終わりマーカー

字句解析プログラムは入力ストリームの終わりに達すると、 入力の終わりマーカーをパーサーに送ります。 このマーカーは エンド・マーカーと呼ばれる特殊なトークンであり、トークン値は 0です。 パーサーは、入力終了マーカーを受け取ると、定義済みの文法規則に対するすべての入力が割り当てられているかどうか、および処理された入力が ( yacc グラマー・ファイルで定義されている ) 完全な単位を形成しているかどうかを検査します。 入力が完全な単位である場合パーサーは停止します。 そうでない場合はエラーのシグナルを送って停止します。

字句解析プログラムは、ファイルの終わりやレコードの終わりなどの、 適切な時期に入力の終わりマーカーを送る必要があります。