yacc の規則
文法ファイルの規則セクションには、1 つ以上の文法規則が入っています。 それぞれの規則は、 構造体を記述するとともにその名前を与えています。
A : BODY;ここでA非端末名、およびBODYオプションで優先順位規則に従うことができる、0 個以上の名前、リテラル、およびセマンティック・アクションのシーケンスです。 文法を構成するために必須なものは、名前とリテラルだけです。 意味構造アクションと優先度規則は、オプショナルです。 コロンとセミコロンは、yacc には必須の句読点です。
意味構造アクションを使用すると、 入力プロセスで規則が認識されるたびに実行するアクションを関連付けることができます。 アクションは任意の C ステートメントであり、C ステートメントとして、 入力または出力の実行、サブプログラムのコール、または外部変数の変更を行うことができます。 またアクションは、パーサーのアクション、 例えばシフトや縮小などのアクションを参照することもできます。
優先順位ルールは、以下によって定義されます。%prec キーワード。特定の文法規則に関連付けられた優先順位を変更します。 予約済みシンボル%prec は、文法規則の本体の直後に置くことができ、その後にトークン名またはリテラルを続けることができます。 この構成によって、文法規則の優先度がトークン名またはリテラルの優先度になります。
非終端名の繰り返し
A : B C D ;
A : E F ;
A : G ;A : B C D
| E F
| G
;文法ファイルでのリカージョンの使用
rule : EndCase
| rule EndCaseしたがって、以下の最も単純なケースは、ruleはEndCase であるがruleEndCaseの複数のオカレンスで構成することもできます。 以下を使用する 2 行目の項目rule定義におけるrule再帰です。 パーサーは、ストリームが縮小されて最終的な EndCase になるまで、入力を循環して解析します。
rule : EndCase
| EndCase rule以下の例では、line改行文字が後に続くストリングの 1 つ以上の組み合わせとしての規則 (\n):
lines : line
| lines line
;
line : string '\n'
;空文字列
empty : ;
| x;empty :
| x
;入力の終わりマーカー
字句解析プログラムは入力ストリームの終わりに達すると、 入力の終わりマーカーをパーサーに送ります。 このマーカーは エンド・マーカーと呼ばれる特殊なトークンであり、トークン値は 0です。 パーサーは、入力終了マーカーを受け取ると、定義済みの文法規則に対するすべての入力が割り当てられているかどうか、および処理された入力が ( yacc グラマー・ファイルで定義されている ) 完全な単位を形成しているかどうかを検査します。 入力が完全な単位である場合パーサーは停止します。 そうでない場合はエラーのシグナルを送って停止します。
字句解析プログラムは、ファイルの終わりやレコードの終わりなどの、 適切な時期に入力の終わりマーカーを送る必要があります。