次: Precedence Decl, 上: Declarations
トークン型名、すなわち終端記号を、基本的には次のように宣言します。
%token name
Bisonは、これを、構文解析器の中の#defineディレクティブに変換します。
したがって、関数yylexが構文解析器ファイルの中にあれば、
そこで名前nameをこのトークン型を表すために使えます。
優先順位を指定したければ、%tokenの代わりに、
%left、%right、%nonassocのどれかを使います。
See Operator Precedence。
トークンの名前の直後に整数値を書くことで、 そのトークン型に対応する数値符号を明示的に指定できます。
%token NUM 300
しかし、Bisonにすべてのトークン型に対する数値符号の割り当てをまかせる ことがいちばんです。Bisonは、トークン型どうしやASCII文字符号と 衝突が起きないように、自動的に数値符号を割り当てます。
スタック型が共用体である場合には、
%tokenあるいは他のトークン宣言に、
小なり記号と大なり記号で区切った型名を追加する必要があります
(see More Than One Value Type)。
例を示します。
%union { /* スタックのデータ型を定義する */
double val;
symrec *tptr;
}
%token <val> NUM /* トークン「NUM」とその型を定義する */
トークン型名を宣言する%token宣言の末尾に
リテラル文字列を書くことで、リテラル文字列トークンと
トークン型名を関連づけできます。
%token arrow "=>"
C言語に対する文法では、次の例のように、 等価なリテラル文字列トークンに名前を指定しています。
%token <operator> OR "||"
%token <operator> LE 134 "<="
%left OR "<="
リテラル文字列とトークン名を等価にすれば、それ以降の文法規則の
宣言の中で、両者を同様に使えます。
yylex関数は、トークン型の数値符号を得るために、
トークン名とリテラル文字列の両方を使えます
(see Calling Convention)。