flex程序默認老是從標準輸入讀取, 實際上,詞法分析程序都從文件讀取輸入flex
flex老是經過名爲yyin的文件句柄讀取輸入, 下面的例子,咱們修改單詞計數程序,使得它能從文件讀取輸入命令行
/* even more like Unix wc */ %option noyywrap %{ int chars = 0; int words = 0; int lines = 0; %} %% [a-zA-Z]+ { words++; chars += strlen(yytext); } \n { chars++; lines++; } . { chars++; } %% main(argc, argv) int argc; char **argv; { if(argc > 1) { if(!(yyin = fopen(argv[1], "r"))) { perror(argv[1]); return (1); } } yylex(); printf("%8d%8d%8d\n", lines, words, chars); }
程序中,若是在命令行中提供的文件參數, 那麼程序會打開它,修改yyinrest
yywrapblog
-lfl庫,提供了默認的main主程序和早期lex遺留至今的雞肋-yywrapio
yywarp做用class
單lex讀取到文件末尾時,會調用yywrap(), 目的是,當有另一個輸入文件時,yywrap能夠調整yyin的值而且返回0來從新開始詞法分析。若是是真正的文件末尾,那麼就返回1來完成分析。file
flex默認main程序gc
int main()
{
while (yylex() != 0) ;
return 0;
}程序
如今大多flex程序使用「%option noyywrap」 來禁用yywrap,而後寫出本身的主程序,因此它們不須要-lfl庫文件讀取
讀取多個文件,yyrestart(fp); 若是yylex, yyparse()出現錯誤, 調用yyrestart()重置調整yyin,從新開始yylex(), 因此開始lex以前,都要調用yyrestart()
main(argc, argv) int argc; char **argv; { int i; if(argc < 2) { /* just read stdin */ yylex(); printf("%8d%8d%8d\n", lines, words, chars); return 0; } for(i = 1; i < argc; i++) { FILE *f = fopen(argv[i], "r"); if(!f) { perror(argv[i]); return (1); } yyrestart(f); yylex(); fclose(f); printf("%8d%8d%8d %s\n", lines, words, chars, argv[i]); totchars += chars; chars = 0; totwords += words; words = 0; totlines += lines; lines = 0; } if(argc > 1) /* print total if more than one file */ printf("%8d%8d%8d total\n", totlines, totwords, totchars); return 0; }