Next: Example-Pascal Lexical Scanner, Previous: More Examples, Up: More Examples [Contents][Index]
°Ê²¼¤ÎÄêµÁ¤Ï¡¢ Í¿¤¨¤é¤ì¤¿¥Õ¥¡¥¤¥ë¤ÎÃæ¤Îñ¸ì¿ô¡¢Ê¸»ú¿ô¡¢¹Ô¿ô¤ò¥«¥¦¥ó¥È¤¹¤ë¤Î¤ËFlex¤ò»È¤¦ÊýË¡¤ò¼¨¤¹¡¢ ´Êñ¤ÊÎã¤Ç¤¹¡£ ¼ÂºÝ¤ËFlex¤Ë´Ø·¸¤Î¤¢¤ëÉôʬ¤Ï¡¢ Èó¾ï¤Ë¾¯¤Ê¤¤¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ °Ê²¼¤Î¥³¡¼¥É¤Î¤Û¤È¤ó¤É¤Ï¡¢ ¥³¥Þ¥ó¥É¥é¥¤¥ó¡¦¥Ñ¥é¥á¡¼¥¿¤ò½èÍý¤·¤¿¤ê¡¢ ¥«¥¦¥ó¥È¤Î¹ç·×¤òÊÝ»ý¤·¤¿¤ê¤¹¤ë¤â¤Î¤Ç¤¹¡£
/* * wc.lex : wc¤Î¤è¤¦¤Ê¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò¡¢ * Flex¤ò»È¤Ã¤ÆºîÀ®¤¹¤ë´Êñ¤ÊÎã */
%{ int numchars = 0; int numwords = 0; int numlines = 0; int totchars = 0; int totwords = 0; int totlines = 0; %}
/* * ¥ë¡¼¥ë¤Ï¤³¤³¤«¤é»Ï¤Þ¤ë */ %% [\n] { numchars++; numlines++; } [^ \t\n]+ { numwords++; numchars += yyleng; } . { numchars++; }
%% /* * ÄɲÃŪ¤ÊC¥³¡¼¥É¤¬¤³¤³¤«¤é»Ï¤Þ¤ë¡£ * ¤³¤³¤Ç¡¢¤¹¤Ù¤Æ¤Î°ú¿ô½èÍýÅù¤ò¹Ô¤¦¥³¡¼¥É¤¬Ä󶡤µ¤ì¤ë */
void main(int argc, char **argv) { int loop; int lflag = 0; /* ¹Ô¿ô¤ò¥«¥¦¥ó¥È¤¹¤ë¾ì¹ç¤Ï1 */ int wflag = 0; /* ñ¸ì¿ô¤ò¥«¥¦¥ó¥È¤¹¤ë¾ì¹ç¤Ï1 */ int cflag = 0; /* ʸ»ú¿ô¤ò¥«¥¦¥ó¥È¤¹¤ë¾ì¹ç¤Ï1 */ int fflag = 0; /* ¥Õ¥¡¥¤¥ë̾¤¬»ØÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç¤Ï1 */
for(loop=1; loop<argc; loop++){ char *tmp = argv[loop]; if(tmp[0] == '-'){ switch(tmp[1]){ case 'l': lflag = 1; break; case 'w': wflag = 1; break; case 'c': cflag = 1; break; default: fprintf(stderr,"unknown option -%c\n",tmp[1]); }
} else { fflag = 1; numlines = numchars = numwords = 0;
if((yyin = fopen(tmp,"rb")) != 0){ (void) yylex(); fclose(yyin); totwords += numwords; totchars += numchars; totlines += numlines; printf("file : %25s :",tmp) ;
if(lflag){ fprintf(stdout,"lines %5d ",numlines); }
if(cflag){ fprintf(stdout,"characters %5d ",numchars); }
if(wflag){ fprintf(stdout,"words %5d ",numwords); } fprintf(stdout,"\n");
}else{ fprintf(stderr,"wc : file not found %s\n",tmp); } } }
if(!fflag){ fprintf(stderr,"usage : wc [-l -w -c] file [file...]\n"); fprintf(stderr,"-l = count lines\n"); fprintf(stderr,"-c = count characters\n"); fprintf(stderr,"-w = count words\n"); exit(1); }
for(loop=0;loop<79; loop++){ fprintf(stdout,"-"); } fprintf(stdout,"\n"); fprintf(stdout,"total : %25s ","") ; if(lflag){ fprintf(stdout,"lines %5d ",totlines); }
if(cflag){ fprintf(stdout,"characters %5d ",totchars); }
if(wflag){ fprintf(stdout,"words %5d ",totwords); } fprintf(stdout,"\n"); }