Next: , Previous: Grammar Outline, Up: Grammar File


3.2 記号、終端と非終端

Bison文法の記号(symbols)は、 言語の文法的分類を表現します。

終端記号(terminal symbol)トークン型(tokens types)ともいいます)は、 構文的に等価なトークンのクラスを表します。 そのクラスのトークンが許されることを表すために、 文法規則の中で記号を使えます。 その記号は、Bison構文解析器の中で番号で表現され、 yylex関数は、どのような種類のトークンが読み込まれたかを示すために、 トークン番号を返します。 これを表す記号を知っていればよく、その番号を知っている必要はありません。

非終端記号(nonterminal symbol)は、 構文的に等価なグループを表現します。 記号名は文法規則の記述に使われます。 通常、非終端記号名を小文字で書きます。

記号名は、英字、先頭以外での数字、下線記号(‘_’)とピリオドからなります。 ピリオド記号(‘.’)は、非終端記号の名前には使えますが、 終端記号の名前には使えません。

文法中で終端記号を記述するには3種類の方法があります。

終端記号を書く方法は、終端記号の文法的意味に関係なく、 規則の中に現れる位置と、 構文解析器関数が記号を返す方法に関係します。

yylexが返す値は、終端記号のどれかを表し、 入力の終わりでは0です。 文法規則の中でどの方法でトークン型を書いても、 yylexを定義する書き方は同じです。 1文字トークン型に対する符号は、その文字のASCII符号なので、 yylexは必要な符号を生成するために同一の文字定数を使えます。 名前を付けられたトークン型はそれぞれ、 構文解析器ファイルの中でCのマクロになるので、 yylexは符号に対するマクロ名を使えます。 これが、終端記号の名前にピリオド記号を使えない理由です。 See Calling Convention for yylex

yylexが構文解析器と別のソースファイルの中に書かれる場合には、 そこでトークン型マクロ定義を使えるように準備する必要があります。 ‘-d’オプションを付けてBisonを実行してください。 すると、マクロ定義がname.tab.hというファイルに書かれ、 必要に応じて別のソースファイルからインクルードできます。 See Invoking Bison

記号errorは、エラー回復用に予約された終端記号(see Error Recovery) で、他の目的に使うべきではありません。 実際に、yylexがこの値を返すことは決してありません。


脚注

[1] 【訳注】英数字以外の文字。

[2] 【訳注】‘\’に続く表現。