スキャナが頑張る構文解析

昨日の日記で見てたのがANSI C grammar (Yacc)yacc
で、TYPE_NAMEを見つけて、アレ?。型名を終端記号にしちゃってるのかーと。
いったいどんなスキャナなんだろうとANSI C grammar (Lex)をのぞいて見た。

{L}({L}|{D})*		{ count(); return(check_type()); }

とか

int column = 0;

void count()
{
	int i;

	for (i = 0; yytext[i] != '\0'; i++)
		if (yytext[i] == '\n')
			column = 0;
		else if (yytext[i] == '\t')
			column += 8 - (column % 8);
		else
			column++;

	ECHO;
}
int check_type()
{
/*
 * pseudo code --- this is what it should check
 *
 *	if (yytext == type_name)
 *		return(TYPE_NAME);
 *
 *	return(IDENTIFIER);
 */

/*
 *	it actually will only return IDENTIFIER
 */

	return(IDENTIFIER);
}

しっかり読んでないけど、邪悪な匂いが。
字句解析と構文解析がきれいに分業するのをりそうとするなら、スキャナが頑張らなくても書けるのがいいんだろうけどねぇ。yaccをきれいにしようとするとスキャナにしわ寄せがくる。
状態使ってもっとひどいのを書いといて言えたアレじゃないけど。