次: 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。