スキャナが頑張る構文解析
昨日の日記で見てたのが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をきれいにしようとするとスキャナにしわ寄せがくる。
状態使ってもっとひどいのを書いといて言えたアレじゃないけど。