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¡£