次: Token Values, 上: Lexical
yylexを呼び出す方法yylexが返す値は、見つかったトークンの型に対する番号で、
入力ファイルの終わりに達した場合には0を返します。
トークンが文法規則の中で名前で参照される場合、
構文解析器ファイルの中でのその名前は、
トークン型に対する適切な番号にCのマクロとして定義されます。
したがって、yylexは型を示すためにその名前を使用できます。
See Symbols。
文法規則の中でトークンが1文字リテラルとして参照される場合には、
その文字の文字符号がトークン型に対する番号でもあります。
そこで、yylexは、単純に文字符号を返します。
しかし、戻り値0は入力ファイルの終わりを意味するので、
ヌル文字('\0')の文字符号を返してはいけません。
以下に例を示します。
yylex ()
{
...
if (c == EOF) /* ファイルの終わりか調べる。 */
return 0;
...
if (c == '+' || c == '-')
return c; /* `+' に対するトークン型が '+' であると仮定する。 */
...
return INT; /* トークン型を返す。 */
...
}
このようなインターフェイスは、
lexが生成した字句解析器を、
yylexの定義を変えずに使えるように設計されています。
文法規則が文字列リテラルトークンを使っている場合には、
yylexがそれに対するトークン型番号を使う、
2つの方法があります。
yylexはその記号名を他のトークンの記号名と
同様に使えます。この場合、文法ファイルの中での文字列リテラルトークンの
利用は、yylexにまったく影響しません。
yylexは、yytname表の中で、
複数文字トークンを見つけられます。
トークンに対する表の添え字は、そのトークン型の番号です。
複数文字トークンはyytnameの中にダブルクォート記号で囲まれて
記憶されます。
トークンに含まれる文字はエスケープされず、
表の中の文字列にそのまま書き込まれています。
トークンを構成する文字列がtoken_bufferに記憶されていると仮定して、
yytnameからトークンを探し出すプログラムを示します。
for (i = 0; i < YYNTOKENS; i++)
{
if (yytname[i] != 0
&& yytname[i][0] == '"'
&& strncmp (yytname[i] + 1, token_buffer,
strlen (token_buffer))
&& yytname[i][strlen (token_buffer) + 1] == '"'
&& yytname[i][strlen (token_buffer) + 2] == 0)
break;
}
yytname表は、%token_table宣言をした場合にのみ生成されます。
See Decl Summary。