Previous: Buffer Manipulation (Flex 2.5), Up: Multiple Input Buffers [Contents][Index]
Ê£¿ô¤Î¥Ð¥Ã¥Õ¥¡¤ò»È¤¦¤È¤¤¤¦¥¢¥¤¥Ç¥¢¤òÍý²ò¤¹¤ë¤¿¤á¤Î¼ê½õ¤±¤È¤·¤Æ¡¢
¥¤¥ó¥¯¥ë¡¼¥É¤¹¤Ù¤¥Õ¥¡¥¤¥ë¤òõ¤¹C¤Î¥¹¥¥ã¥Ê¤Î°ìÉô¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹¡£
¤³¤ì¤ÏC¤Î#include
¤Î¤¦¤Á¡¢
°úÍÑÉä¤Ç°Ï¤Þ¤ì¤¿Ê¸»úÎó¤Î¤ß¤ò¼õ¤±ÉÕ¤±¤Þ¤¹¡£
Î㤨¤Ð¡¢
#include"file1.c" #include "file2.c" #include " file3.c"
¤Ï¡¢ ºÇ¸å¤ÎÎã¤Î¥Õ¥¡¥¤¥ë̾¤¬¶õÇò¤ò´Þ¤à¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¤¬¡¢ ¤¤¤º¤ì¤âÀµÅö¤ÊÆþÎϤǤ¹¡£ ¤³¤³¤Ç¤ÎÎã¤Ï¤Þ¤¿¡¢ EOF¥ë¡¼¥ë¤È¥¹¥¿¡¼¥È¾õÂ֤λÈÍÑË¡¤ò¼Â±é¤¹¤ëÎɤ¤Îã¤Ç¤â¤¢¤ê¤Þ¤¹¡£
/* * eof_rules.lex : Ê£¿ô¥Ð¥Ã¥Õ¥¡¡¢EOF¥ë¡¼¥ë¡¢¥¹¥¿¡¼¥È¾õÂÖ * ¤Î»È¤¤Êý¤ÎÎã */ %{ #define MAX_NEST 10
YY_BUFFER_STATE include_stack[MAX_NEST]; int include_count = -1; %} %x INCLUDE
%% ^"#include"[ \t]*\" BEGIN(INCLUDE); <INCLUDE>\" BEGIN(INITIAL); <INCLUDE>[^\"]+ { /* ¥¤¥ó¥¯¥ë¡¼¥É¡¦¥Õ¥¡¥¤¥ë¤Î̾Á°¤ò³ÍÆÀ¤¹¤ë */ if ( include_count >= MAX_NEST){ fprintf( stderr, "Too many include files" ); exit( 1 ); } include_stack[++include_count] = YY_CURRENT_BUFFER; yyin = fopen( yytext, "r" ); if ( ! yyin ){ fprintf(stderr,"Unable to open \"%s\"\n",yytext); exit( 1 ); } yy_switch_to_buffer( yy_create_buffer(yyin,YY_BUF_SIZE));
BEGIN(INITIAL); } <INCLUDE><<EOF>> { fprintf( stderr, "EOF in include" ); yyterminate(); }
<<EOF>> { if ( include_count <= 0 ){ yyterminate();
} else { yy_delete_buffer(include_stack[include_count--] ); yy_switch_to_buffer(include_stack[include_count] ); BEGIN(INCLUDE); } } [a-z]+ ECHO; .|\n ECHO;
¥¹¥¿¡¼¥È¾õÂÖ¤ò»È¤Ã¤Æ¥Õ¥¡¥¤¥ë̾¤Î¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ëÊýË¡¤ä¡¢
¥Ð¥Ã¥Õ¥¡¤ÎÀÚ¤êÂØ¤¨¤òȯÀ¸¤µ¤»¤ëÊýË¡¤ËÃíÌܤ·¤Æ¤¯¤À¤µ¤¤¡£
¤Û¤«¤ËÃíÌܤ¹¤Ù¤½ÅÍפÊÅÀ¤Ï¡¢
<<EOF>>
¤ò¼è¤ê°·¤¦¥»¥¯¥·¥ç¥ó¡¢
¤ª¤è¤Ó¡¢
¸Å¤¤¥Ð¥Ã¥Õ¥¡¤ËÉüµ¢¤¹¤ëºÝ¤ËBEGIN
¤ò»È¤Ã¤Æ³Î¼Â¤ËÀµ¤·¤¤¾õÂÖ¤ËÁ«°Ü¤¹¤ë¤è¤¦¤Ë¤¹¤ëÅÀ¤Ç¤¹¡£
¤³¤ì¤òÂÕ¤ë¤È¡¢
¾õÂÖ¤ÏINITIAL
¤Ë¥ê¥»¥Ã¥È¤µ¤ì¡¢
#include
¤ÎºÇ¸å¤Î‘"’¤¬ECHO
¤µ¤ì¤Æ¤·¤Þ¤¤¤Þ¤¹¡£
Ãí¡§<<EOF>>µ¡Ç½¤Ï¼¡¤ÎÀá¤ÇÀâÌÀ¤·¤Þ¤¹¡£ <<EOF>>¤¬²¿¤Ç¤¢¤ê¡¢ ²¿¤ò¹Ô¤¦¤â¤Î¤«¤È¤¤¤¦ÅÀ¤Ë´Ø¤¹¤ë¾ÜºÙ¤ÊµÄÏÀ¤Ë¤Ä¤¤¤Æ¤Ï¡¢ See Start States¡£