第二章 flex輸入輸出

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;
}
相關文章
相關標籤/搜索