Next: Flex and C (Flex 2.5), Previous: Interfacing to Flex, Up: Interfacing to Flex [Contents][Index]
Flex¤ËÂФ¹¤ëC¤Î¼çÍפʥ¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤Ï¡¢ °Ê²¼¤Ëµó¤²¤ë¥ë¡¼¥Á¥ó¤ÈÊÑ¿ô¤Ë¤è¤ë¤â¤Î¤Ç¤¹¡£ °Ê²¼¤ÎÀá¤òÆÉ¤àºÝ¤Ë¤Ï¡¢ ¤¤¤¯¤Ä¤«¤ÎºÙ¤«¤ÊÉôʬ¤ÇFlex¤ÈLex¤È¤Î´Ö¤ËÁê°ãÅÀ¤¬¤¢¤ë¤È¤¤¤¦¤³¤È¤ò°Õ¼±¤·¤Æ¤ª¤¤¤Æ¤¯¤À¤µ¤¤¡£ Lex¤¬Ä󶡤·¤Æ¤¤¤Ê¤¤´Ø¿ô¤¬¤¤¤¯¤Ä¤«¤¢¤ê¤Þ¤¹¤·¡¢ Àë¸À¤ÎÆâÍÆ¤¬°ã¤¦¤â¤Î¤â¤¢¤ê¤Þ¤¹¡£ ¤³¤¦¤·¤¿Áê°ãÅÀ¤Ï¡¢ Ä̾ïÂ礤ÊÌäÂê¤Ë¤Ï¤Ê¤ê¤Þ¤»¤ó¡£ ¤È¤¤¤¦¤Î¤Ï¡¢ Áê°ã¤Î¤¢¤ë´Ø¿ô¤Ï°ìÈÌŪ¤Ë¤Ï¤¢¤Þ¤ê»È¤ï¤ì¤Æ¤¤¤Ê¤¤¤«¤é¤Ç¤¹¡£ Áê°ãÅÀ¤Ë´Ø¤¹¤ë¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢ Flex and Lex¤ª¤è¤ÓFlex and POSIX¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£
´Ø¿ô
ÀâÌÀ¤È¼ÂÎã
yylex()
yylex()
¤Ï¼ÂºÝ¤Î¥¹¥¥ã¥ó½èÍý¤ò¹Ô¤¦´Ø¿ô¤Ç¤¹¡£
¥Õ¥¡¥¤¥ë¡Ê¥Ç¥Õ¥©¥ë¥È¤Ïstdin
¡Ë¤òÆÉ¤ß¹þ¤ß¡¢
¥Ñ¥¿¡¼¥ó¡¦¥Þ¥Ã¥Á¥ó¥°¤ò¹Ô¤¤¡¢
¥Ñ¥¿¡¼¥ó¤Ë´ØÏ¢ÉÕ¤±¤µ¤ì¤¿¥¢¥¯¥·¥ç¥ó¤ò¼Â¹Ô¤·¤Þ¤¹¡£
¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢
ÆþÎϤνªÃ¼¤Ë㤹¤ë¤Þ¤Ç¥Þ¥Ã¥Á¥ó¥°¤ò¹Ô¤¤¡¢
½ªÃ¼¤Ë㤷¤¿¤È¤³¤í¤Ç¥¼¥í¤òÊÖ¤·¤Þ¤¹¡£
¡Êreturn
¤ò»È¤Ã¤Æ¡¢
¸Æ¤Ó½Ð¤·Â¦¤Î¥×¥í¥°¥é¥à¤Ë¤Û¤«¤ÎÃͤòÊÖ¤¹¤³¤È¤Ï²Äǽ¤Ç¤¹¡£
¤³¤ì¤Ï¡¢
Flex and Bison¤ÇÀâÌÀ¤·¤Æ¤¤¤Þ¤¹¡£¡Ë
¤·¤¿¤¬¤Ã¤Æ¡¢
¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤òÄ󶡤¹¤ë´Êñ¤ÊÊýË¡¤Î£±¤Ä¤Ï¡¢
¥ª¥×¥·¥ç¥ó¤ÎC¥³¡¼¥ÉÎΰè¤Î£±¤Ä¤Ë°Ê²¼¤Î¤è¤¦¤Ê¥³¡¼¥É¤òÄɲ乤뤳¤È¤Ç¤¹¡£
#include <stdio.h> int main(argc,argv) int argc; char *argv; { yylex(); }
¤·¤«¤·¤³¤Î¤è¤¦¤Ê¾ì¹ç¤Ë¤Ï¡¢
Flex¥é¥¤¥Ö¥é¥ê¡Ê‘-lfl’¡Ë¤â¤·¤¯¤ÏLex¥é¥¤¥Ö¥é¥ê¡Ê‘-ll’¡Ë¤Î¤¤¤º¤ì¤«¤ò¥ê¥ó¥¯¤·¤Æ¡¢
¤½¤³¤«¤é¤³¤ì¤ÈƱ¤¸¤è¤¦¤Êmain()
´Ø¿ô¤ò¼è¤ê¹þ¤à¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤³¤Î¾ì¹ç¤Ï¡¢
¥¹¥¥ã¥Ê¤Ïñ¤Ë¥Õ¥¡¥¤¥ë¤ò¥¹¥¥ã¥ó¤·¤Æ¡¢
¥ë¡¼¥ë¤Ë´ØÏ¢ÉÕ¤±¤µ¤ì¤¿¥¢¥¯¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë¤À¤±¤Ç¤¢¤ë¤È¤¤¤¦ÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
yylex()
¤Î»È¤¤Êý¤È¤·¤Æ¤â¤¦£±¤Ä¤è¤¯¸«¤é¤ì¤ë¤Î¤¬¡¢
¥Þ¥Ã¥Á¤µ¤ì¤¿¤â¤Î¤¬²¿¤Ç¤¢¤ë¤«¤ò¼¨¤¹ÃͤòÊÖ¤µ¤»¤ë¤³¤È¤Ç¤¹¡£
¤³¤ì¤Ï¡¢
¥¢¥¯¥·¥ç¥ó¤Ëreturn
ʸ¤òÄɲ乤뤳¤È¤Ç¹Ô¤ï¤ì¤Þ¤¹¡£
return
ʸ¤ò¸«¤Ä¤±¤ë¤È¡¢
yylex()
¤Ï»ØÄꤵ¤ì¤¿ÃͤòÊÖ¤·¤Þ¤¹¡£
¤³¤ì¤¬¡¢
Bison¤Ë¤è¤ë¥Ñ¡¼¥µ¤¬Flex¤Ë¤è¤ë¥¹¥¥ã¥Ê¤«¤é¾ðÊó¤ò³ÍÆÀ¤¹¤ëÊýË¡¤Ç¤¹¡£
¥ë¡¼¥ë¤ÎÃæ¤Ë¡¢
¥Þ¥Ã¥Á¤µ¤ì¤¿¥Æ¥¥¹¥È¤¬²¿¤òɽ¤·¤Æ¤¤¤ë¤«¤ò¼¨¤¹¥³¡¼¥É¤òÊÖ¤¹return
ʸ¤¬¤¢¤ì¤Ð¡¢
°Ê²¼¤Î¤è¤¦¤Ê¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹¤ò»È¤¦¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
#include <stdio.h> int main(argc,argv) int argc; char *argv; { int return_code;
while((return_code = yylex()) != 0){ switch(return_code){ case KEYWORD1: /* ²¿¤«¤ò¹Ô¤¦ */ break;
case KEYWORD2: /* ²¿¤«Ê̤Τ³¤È¤ò¹Ô¤¦ */ break; … case KEYWORDn: } } }
yylex
¤Î¥Ç¥Õ¥©¥ë¥È¤ÎÄêµÁ¤Ï‘int yylex(void)’¤Ç¤¹¤¬¡¢
¤³¤ì¤ÏYY_DECL
¥Þ¥¯¥í¤ò»È¤¦¤³¤È¤Ë¤è¤Ã¤ÆÊѹ¹¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
Îã¤ò¼¨¤¹¤È¡¢
°Ê²¼¤Î¥³¡¼¥É¤Ïyylex()
¤Î̾Á°¤ògettok()
¤Ë¡¢
·¿¤òchar¤ËÂФ¹¤ë¥Ý¥¤¥ó¥¿·¿¤ËÊѹ¹¤·¡¢
¥Ñ¥é¥á¡¼¥¿buffer
¤ò¼õ¤±¼è¤ë¤è¤¦¤Ë»ØÄꤷ¤Þ¤¹¡£
#undef YY_DECL #define YY_DECL char *gettok(char *buffer)
Ãí¡§ANSIÂбþ¤Ç¤Ê¤¤C¤ò»È¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ï°Ê²¼¤Î¤è¤¦¤ËÄêµÁ¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
#define YY_DECL char *gettok(buffer) \ char *buffer;
¸ÀÍÕ¤òÊѤ¨¤ë¤È¡¢ ºÆÀë¸À¤Ï¥¿¡¼¥²¥Ã¥È¤È¤Ê¤ëC¥³¥ó¥Ñ¥¤¥é¤Ë¤È¤Ã¤ÆÀµÅö¤Ê´Ø¿ôÀë¸À¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£ ¤µ¤é¤Ë¡¢ ¤³¤ÎºÆÀë¸À¤Ï¡¢ ¥Õ¥¡¥¤¥ë¤ÎÀèÆ¬¤Ë¤¢¤ë¥ª¥×¥·¥ç¥ó¤ÎC¥³¡¼¥ÉÎΰè¤Ë¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤¤¦ÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£
yyin
yyin
¤Ï¡¢
yylex()
¤¬Ê¸»ú¤òÆÉ¤ß¹þ¤à¸µ¤È¤Ê¤ë¥Õ¥¡¥¤¥ë¤Ç¤¹¡£
¥Ç¥Õ¥©¥ë¥È¤Ïstdin
¤Ç¤¹¤¬¡¢
fopen()
¤ò»È¤Ã¤ÆÊѹ¹¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
yyin
¤òÆÉ¤ß¹þ¤à¥Ç¥Õ¥©¥ë¥È¤ÎÊýË¡¤Ï¡¢
Ê£¿ôʸ»ú¤«¤éÀ®¤ë¥Ö¥í¥Ã¥¯¤ò°ìÅÙ¤ËÆÉ¤à¤È¤¤¤¦¤â¤Î¤Ç¤¹¡£
¤³¤ì¤Ï¡¢
YY_INPUT
¥Þ¥¯¥í¤Ë¤è¤Ã¤ÆÊѹ¹¤Ç¤¤Þ¤¹¡£
YY_INPUT
¥Þ¥¯¥í¤Ï¡¢
¥Õ¥¡¥¤¥ë¤Ç¤Ï¤Ê¤¯Ê¸»úÎó¤ò¥¹¥¥ã¥ó¤¹¤ë¤¿¤á¤Î¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤Î¤ËÊØÍø¤Ç¤¹¡£
YY_INPUT
¤òÄêµÁ¤¹¤ëÊýË¡¤Ï°Ê²¼¤Î¤È¤ª¤ê¤Ç¤¹¡£
YY_INPUT(buffer,result,max_size)
¤³¤³¤Ç¡¢
buffer
¤ÏÆþÎϥХåե¡¡¢
result
¤ÏÆÉ¤ß¹þ¤Þ¤ì¤¿Ê¸»ú¿ô¤¬¥»¥Ã¥È¤µ¤ì¤ëÊÑ¿ô¡¢
max_size
¤Ïbuffer
¤Î¥µ¥¤¥º¤Ç¤¹¡£
°Ê²¼¤Ë¡¢
°ìÅ٤ˣ±Ê¸»ú¤º¤ÄÆÉ¤ß¹þ¤à¤È¤¤¤¦ÆþÎÏÊýË¡¤ËÊѹ¹¤¹¤ëºÆÄêµÁ¤ÎÎã¤ò¼¨¤·¤Þ¤¹¡£
¤³¤ÎÊýË¡¤ò»È¤¦¤È¤«¤Ê¤êÃÙ¤¯¤Ê¤ë¤Î¤Ç¡¢
¤ª´«¤á¤Ï¤Ç¤¤Þ¤»¤ó¡£
#undef YY_INPUT #define YY_INPUT(buffer,result,max_size) \ {\ buffer[0] = getchar();\ if(buffer[0] == EOF)\ result = YY_NULL;\ else\ result = 1;\ }
Ãí¡§¤³¤ÎºÆÀë¸À¤Ï¡¢ ¥Õ¥¡¥¤¥ë¤ÎÀèÆ¬¤Ë¤¢¤ë¥ª¥×¥·¥ç¥ó¤ÎC¥³¡¼¥ÉÎΰè¤Ë¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
yyout
yyout
¤Ï¥¹¥¥ã¥Ê¤¬ECHO
¤Î½ÐÎϤò½ñ¤¹þ¤à¥Õ¥¡¥¤¥ë¤Ç¤¹¡£
¥Ç¥Õ¥©¥ë¥È¤Ïstdout
¤Ç¤¹¤¬¡¢
¤³¤ì¤âfopen()
¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤ÇÊѹ¹¤Ç¤¤Þ¤¹¡£
yytext
yytext
¤ÏºÇ¸å¤Ë¥Þ¥Ã¥Á¤µ¤ì¤¿Ê¸»úÎó¡¢
¤Ä¤Þ¤êºÇ¸å¤Ëǧ¼±¤µ¤ì¤¿¥È¡¼¥¯¥ó¤ò´Þ¤àÂç°èÊÑ¿ô¤Ç¤¹¡£
yytext
¤ÎÀµ¤·¤¤³°ÉôÄêµÁ¤Ï¡¢
Lex¤Î¾ì¹ç¤Îchar¤ÎÇÛÎó¤È¤Ï°Û¤Ê¤ê¡¢
char¤ËÂФ¹¤ë¥Ý¥¤¥ó¥¿·¿¤Ç¤¢¤ëÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£7
¤Ä¤Þ¤ê¡¢
yytext
¤Ï
extern char yytext[];
¤Ç¤Ï¤Ê¤¯¡¢¾ï¤Ë
extern char *yytext;
¤Î¤è¤¦¤ËÀë¸À¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ç¤¹¡£
¤³¤Î¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ëÍýͳ¤ÏÀǽ¤Ç¤¹¡£
yytext
¤¬ÇÛÎó¤Ç¤¢¤ë¤È¡¢
¥¹¥¥ã¥ÊÃæ¤Ç¤½¤ì¤òÁàºî¤¹¤ë¥³¡¼¥É¤Ï¡¢
¥³¥Ô¡¼½èÍý¤ò¤¿¤¯¤µ¤ó¹Ô¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£
¤³¤ì¤ËÂФ·¤Æyytext
¤¬¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢
¤³¤Î¤è¤¦¤Ê¤³¤È¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¡£
Ä̾ï¤Ï¡¢
yytext
¤ÏÊѹ¹¤¹¤Ù¤¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£
yytext
¤ÎÆâÍÆ¤¬Êѹ¹¤µ¤ì¤ëɬÍפ¬¤¢¤ë¾ì¹ç¤Ë¤Ï¡¢
Âå¤ï¤ê¤Î¥Ð¥Ã¥Õ¥¡¤¬»È¤ï¤ì¤ë¤Ù¤¤Ç¤¹¡£
¡Êexamples¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Îyymore2.lex
¥Õ¥¡¥¤¥ë¤Ç¤Ï¡¢
yytext
¤òľÀÜÁàºî¤¹¤ëµ»Ë¡¤¬¼Â±é¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
¤¿¤À¤·¡¢
¤³¤Î¤è¤¦¤Ê¤ä¤êÊý¤Ï¤ª´«¤á¤Ç¤¤Þ¤»¤ó¡£¡Ë
yyleng
yyleng
¤Ï¡¢
ºÇ¸å¤Ëǧ¼±¤µ¤ì¤¿¥È¡¼¥¯¥ó¤ÎŤµ¤òÊÝ»ý¤¹¤ëÂç°èÊÑ¿ô¤Ç¤¹¡£
yywrap()
yywrap
¤Ï¡¢
yyin
¤Î½ªÃ¼¤Ë㤷¤¿»þ¤Ë¸Æ¤Ó½Ð¤µ¤ì¤ë´Ø¿ô¤Ç¤¹¡£
¤³¤Î´Ø¿ô¤¬TRUE
¡Ê¥¼¥í°Ê³°¡Ë¤òÊÖ¤¹¤È¥¹¥¥ã¥Ê¤Ï½ªÎ»¤·¡¢
FALSE
¡Ê¥¼¥í¡Ë¤òÊÖ¤¹¤È¡¢
yyin
¤¬¼¡¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤ò»Ø¤¹¤è¤¦¤ËÀßÄꤵ¤ì¤¿¤â¤Î¤È²¾Äꤷ¤Æ¡¢
¥¹¥¥ã¥ó½èÍý¤¬Â³¹Ô¤µ¤ì¤Þ¤¹¡£
¸½ºß¤Î¤È¤³¤íyywrap()
¤Ï¡¢
¾ï¤Ë£±¤òÊÖ¤¹¤è¤¦ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥Þ¥¯¥í¤Ç¤¹¡£
¤³¤Î¤¿¤á¡¢
ºÆÄêµÁ¤¹¤ë¤Ë¤Ï¡¢
¤Þ¤ººÇ½é¤Ë#undef
¤ÇÄêµÁ²ò½ü¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
Lex¤Ç¤Ï¡¢
yywrap()
¤Ï´Ø¿ô¤Ç¤¹¡£
Flex¤â¾Íè¤Î¤¢¤ë»þÅÀ¤Ç¡¢
¤³¤ì¤ò´Ø¿ô¤È¤·¤ÆÄêµÁ¤¹¤ë¤³¤È¤Ë¤Ê¤ë¤Ç¤·¤ç¤¦¡£8
yymore()
yymore()
¤Ï¡¢
¼¡¤Ëǧ¼±¤µ¤ì¤ë¥È¡¼¥¯¥ó¤Çyytext
¤ÎÆâÍÆ¤ò¹¹¿·¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢
¤½¤Î»þÅÀ¤Îyytext
¤ÎÆâÍÆ¤Î¸å¤í¤Ë¤½¤Î¥È¡¼¥¯¥ó¤òÄɲ乤ë¤è¤¦Flex¤ËÄÌÃΤ¹¤ë´Ø¿ô¤Ç¤¹¡£
¤·¤¿¤¬¤Ã¤Æ¡¢
°Ê²¼¤ÎÎã¤ËÂФ·¤Æ‘foobar’¤È¤¤¤¦Ê¸»ú¤ÎʤӤòÆþÎϤȤ·¤ÆÍ¿¤¨¤ë¤È¡¢
stdout
¤Ë‘foofoobar’¤È¤¤¤¦Ê¸»ú¤ÎʤӤ¬½ñ¤¹þ¤Þ¤ì¤Þ¤¹¡£
%% foo ECHO; yymore(); bar ECHO;
¤³¤ì¤Ï¡¢
¤Þ¤ºfoo
¥ë¡¼¥ë¤Ë¤è¤Ã¤Æ‘foo’¤È¤¤¤¦Ê¸»ú¤ÎʤӤ¬Ç§¼±¤µ¤ì¤ÆECHO
¤µ¤ì¡¢
¼¡¤Ë‘bar’¤È¤¤¤¦Ê¸»ú¤ÎʤӤ¬Ç§¼±¤µ¤ì¤Æyytext
¤ÎÆâÍÆ¤Î¸å¤í¤ËÄɲ䵤줿¸å¤Ë¡¢
‘foobar’¤È¤¤¤¦Ê¸»ú¤ÎʤӤ¬ECHO
¤µ¤ì¤ë¤«¤é¤Ç¤¹¡£
¤â¤¦¾¯¤·¸½¼ÂŪ¤ÊÎã¤ò¼è¤ê¾å¤²¤Þ¤·¤ç¤¦¡£
°Ê²¼¤Î¥³¡¼¥É¤ÏÊ£¿ô¹Ô¤Îʸ»úÎó¤ò½èÍý¤¹¤ë¤Î¤Ëyymore()
¤ò»È¤Ã¤Æ¤¤¤Þ¤¹¡£
/* * yymore.lex: yymore()¤ò͸ú¤Ë»È¤¦Îã */ %{ #include <memory.h>
void yyerror(char *message) { printf("Error: %s\n",message); } %}
%x STRING %% \" BEGIN(STRING); <STRING>[^\\\n"]* yymore(); <STRING><<EOF>> { yyerror("EOF in string."); BEGIN(INITIAL); }
<STRING>\n { yyerror("Unterminated string."); BEGIN(INITIAL); } <STRING>\\\n yymore(); /* Ê£¿ô¹Ô¤Ë¤ï¤¿¤ë * ʸ»úÎó¤ò½èÍý¤¹¤ë */
<STRING>\" { yytext[yyleng-1] = '\0'; printf("string = \"%s\"",yytext); BEGIN(INITIAL); } %%
¤³¤ÎÎã¤Ç¤Ï¡¢ ¥¨¥¹¥±¡¼¥×¡¦¥·¡¼¥±¥ó¥¹¤ÎÊÑ´¹¤¬¤Þ¤Ã¤¿¤¯¹Ô¤ï¤ì¤Æ¤¤¤Ê¤¤¤Î¤Ç¡¢ ʸ»úÎó¤ËÂФ·¤Æ¤µ¤é¤Ë½èÍý¤¬É¬ÍפǤ¢¤ëÅÀ¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤¡£ ¤³¤ÎÎã¤Ï¡¢ ʸ»úÎó¥ê¥Æ¥é¥ë¤Î½èÍý¤Ë¤ª¤¤¤Æ¡¢ ¥¨¥¹¥¨¡¼¥×¡¦¥·¡¼¥±¥ó¥¹¤ò½èÍý¤¹¤ë¡¢ ¤è¤êÌò¤ËΩ¤Ä·Á¼°¤Ë³ÈÄ¥¤µ¤ì¤Þ¤¹¡£
yyless(n)
yyless()
¤Ï¡¢
yymore()
¤È¤Û¤ÜÈ¿ÂФΤ³¤È¤ò¹Ô¤¦¤â¤Î¤Ç¤¹¡£
¤³¤Î´Ø¿ô¤Ï¡¢
ºÇ½é¤Înʸ»ú°Ê³°¤Î¤¹¤Ù¤Æ¤òÌᤷ¤Þ¤¹¡£
Ìᤵ¤ì¤¿Ê¸»ú¤ÎʤӤϡ¢
¼¡¤Î¥È¡¼¥¯¥ó¤ò¥Þ¥Ã¥Á¤¹¤ë¤Î¤Ë»È¤ï¤ì¡¢
yyleng
¤Èyytext
¤Ë¤Ï¡¢
¤³¤ÎÊѲ½¤òÈ¿±Ç¤·¤¿Ãͤ¬ÀßÄꤵ¤ì¤Þ¤¹¡£
°ú¿ôn¤Ë¥¼¥í¤ò»ØÄꤷ¤Æyyless()
¤ò¸Æ¤Ó½Ð¤¹¤È¡¢
Á´ÆþÎϥǡ¼¥¿¤¬Ìᤵ¤ì¡¢
¥¹¥¥ã¥Ê¤Ï
¡ÊBEGIN
¡¢
¤Þ¤¿¤Ï¤½¤ì¤ËÎà»÷¤Î¤â¤Î¤Ç¥Ç¥Õ¥©¥ë¥È¤Îưºî¤¬Êѹ¹¤µ¤ì¤Ê¤¤¸Â¤ê¡Ë
̵¸Â¥ë¡¼¥×¤ËÆþ¤ê¤Þ¤¹¡£
Î㤨¤Ð¡¢
¼¡¤Î¥³¡¼¥É¤Ë‘foobar’¤È¤¤¤¦Ê¸»ú¤ÎʤӤòÆþÎϤȤ·¤ÆÍ¿¤¨¤ë¤È¡¢
‘foobarbar’¤È¤¤¤¦Ê¸»ú¤ÎʤӤ¬½ÐÎϤµ¤ì¤Þ¤¹¡£
%% foobar ECHO; yyless(3); [a-z]+ ECHO;
¤³¤ì¤Ï¡¢
‘foobar’¤¬Ç§¼±¤µ¤ìECHO
¤µ¤ì¤¿¸å¤Ë¡¢
‘bar’¤¬Ìᤵ¤ì¤ë¤«¤é¤Ç¤¹¡£
¤È¤Ê¤ë¤È¡¢
¼¡¤Ë¥Þ¥Ã¥Á¤¹¤ë¤Î¤Ï
¡Ê‘[a-z]+’¤È¤¤¤¦¥ë¡¼¥ë¤Ç¥Þ¥Ã¥Á¤µ¤ì¤ë¡Ë
‘bar’¤À¤±¤Ç¡¢
¤³¤ì¤¬¼¡¤ËECHO
¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£
input()
input()
¤Ï¡¢
yyin
¤«¤é¼¡¤Îʸ»ú¤ò¼è¤Ã¤ÆÊÖ¤¹´Ø¿ô¤Ç¤¹¡£
¤³¤ì¤Ï¡¢
ɸ½àŪ¤ÊFlex¥ë¡¼¥ë¡¦¥·¥¹¥Æ¥à¤ò»È¤Ã¤¿¤Î¤Ç¤Ï¤¦¤Þ¤¯°·¤¨¤Ê¤¤¥±¡¼¥¹¤ò½èÍý¤¹¤ë¤Î¤Ë¤è¤¯»È¤ï¤ì¤Þ¤¹¡£
Î㤨¤Ð¡¢
¤Û¤È¤ó¤É¤Î¸À¸ì¤Ë¤ª¤±¤ë¥³¥á¥ó¥È¤Ï¡¢
¤³¤ì¤ò»È¤Ã¤Æ½èÍý¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
¤³¤ì¤ò»È¤¦Íýͳ¤Ï¡¢
%% "/*".*"*/"
¤¬¡¢ ¥Ô¥ê¥ª¥É¤¬²þ¹Ô°Ê³°¤ÎǤ°Õ¤Îʸ»ú¤Ë¥Þ¥Ã¥Á¤·¤Æ¤·¤Þ¤¦¤¿¤á¤Ë Ê£¿ô¹Ô¤Ë¤ï¤¿¤ë¥³¥á¥ó¥È¤ò¤¦¤Þ¤¯½èÍý¤Ç¤¤º¡¢ ¤Þ¤¿¡¢
%% "/*"[.\n]*"*/"
¤Ï¡¢ ʸ»ú¥¯¥é¥¹¤¬Ç¤°Õ¤Îʸ»ú¤Ë¥Þ¥Ã¥Á¤·¤Æ¤·¤Þ¤¦¤¿¤á¤Ë¡¢ ¥Ð¥Ã¥Õ¥¡¤ò¥ª¡¼¥Ð¡¼¥Õ¥í¡¼¤µ¤»¤ë¤«¡¢ ¤µ¤â¤Ê¤¯¤Ð¥Õ¥¡¥¤¥ë¤ÎÆâÍÆ¤ò¤¹¤Ù¤ÆÆÉ¤ß¹þ¤ó¤Ç¤·¤Þ¤¦¤«¤é¤Ç¤¹¡£ ¡Ê¼ÂºÝ¤Ë¤Ï¡¢ ÇÓ¾Ū¥¹¥¿¡¼¥È¾õÂÖ¤ò»È¤¦¤³¤È¤Ç¡¢ ¤³¤¦¤·¤¿¤³¤È¤òÈó¾ï¤Ë¥¨¥ì¥¬¥ó¥È¤ÊÊýË¡¤Ç½èÍý¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£ ¼ÂÎã¤Ë¤Ä¤¤¤Æ¤Ï¡¢ Ìò¤ËΩ¤Ä¥³¡¼¥É¤ÎÈ´¿è¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤¡£ ¤·¤«¤·¡¢ POSIX¤Ë¤è¤ê¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë¤Ë¤â¤«¤«¤ï¤é¤º¡¢ ¤³¤³¤ÇɬÍפˤʤ뤤¤¯¤Ä¤«¤Îµ¡Ç½¤òLex¤¬Ä󶡤·¤Æ¤¤¤Ê¤¤¤¿¤á¤Ë¡¢ ¤³¤ÎÊýË¡¤Ë¤Ï°Ü¿¢À¤¬¤¢¤ê¤Þ¤»¤ó¡£¡Ë C¤Î¥³¥á¥ó¥È¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤·¤Æ°Ü¿¢À¤Î¤¢¤ëÊýË¡¤Ç½èÍý¤¹¤ë¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
%% "/*" { int a,b; a = input(); while(a != EOF){ b = input(); if(a == '*' && b == '/'){ break;
}else{ a = b; } } if(a == EOF){ error_message("EOF in comment"); } }
Ãí¡§¥¹¥¥ã¥Ê¤¬C++¥³¥ó¥Ñ¥¤¥é¤ò»È¤Ã¤Æ¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¾ì¹ç¤Ï¡¢
¤³¤Î´Ø¿ôinput
¤Ïyyinput
¤È¤¤¤¦Ì¾Á°¤Ë¤Ê¤ê¤Þ¤¹¡£
¤³¤ì¤Ï¡¢
input
¤È¤¤¤¦Ì¾Á°¤¬Æ±°ì̾¤ÎC++¥¹¥È¥ê¡¼¥à¤È¾×ÆÍ¤¹¤ë¤«¤é¤Ç¤¹¡£
¤Þ¤¿¡¢
Flex¤Ç¤Ïinput()
¤Ïyytext
¤ÎÆâÍÆ¤òÇ˲õ¤·¤Þ¤¹¤¬¡¢
Lex¤Ç¤Ïyytext
¤ÏÊѹ¹¤µ¤ì¤º¤½¤Î¤Þ¤Þ»Ä¤ê¤Þ¤¹¡£
¤³¤ì¤Ï¾Íè¤Î¥ê¥ê¡¼¥¹¤Ç½¤Àµ¤µ¤ì¤ëͽÄê¤Ç¤¹¡£
unput(c)
unput()
¤Ï¡¢
ʸ»úc
¤¬¼¡¤Ë¥¹¥¥ã¥ó¤µ¤ì¤ëʸ»ú¤Ë¤Ê¤ë¤è¤¦¤Ë¡¢
ʸ»úc
¤òÆþÎÏ¥¹¥È¥ê¡¼¥à¤ËÃÖ¤¯´Ø¿ô¤Ç¤¹¡£
Î㤨¤Ð¡¢
%% foo unput('b');
¤Ï‘foo’¤ò‘b’¤ÇÃÖ¤´¹¤¨¤Þ¤¹¡£
¤³¤ì¤Ï¡¢
‘foo’¤Ë¥Þ¥Ã¥Á¤·¤Æ‘b’¤òÌᤷ¡¢
¤³¤Î‘b’¤¬¼¡¤Ë¥¹¥¥ã¥ó¤µ¤ì¤ëʸ»ú¤Ë¤Ê¤ë¤«¤é¤Ç¤¹¡£
¥Ç¥Õ¥©¥ë¥È¤Î¥ë¡¼¥ë¤Ë¤è¤ê¡¢
‘b’¤Ïstdout
¤Ë½ñ¤¹þ¤Þ¤ì¤Þ¤¹¡£
£±¤Ä¤Îʸ»ú¤¬¼¡¤Ë¥¹¥¥ã¥ó¤µ¤ì¤ëʸ»ú¤Ë¤Ê¤ë¤È¤¤¤¦¤³¤È¤Ë¤Ï£±¤ÄÈù̯¤ÊÅÀ¤¬¤¢¤Ã¤Æ¡¢ ¤½¤ì¤Ï¡¢ ʸ»úÎó¤òÆþÎÏ¥¹¥È¥ê¡¼¥à¤ËÃÖ¤¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢ µÕ½ç¤Ë¹Ô¤ï¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ç¤¹¡£ °Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
foobar { char *baz = "baz"; int i = strlen(baz)-1; while(i >= 0){ unput(baz[i]); i--; } }
¤³¤ì¤Ï¡¢ ‘foobar’¤¬¥Þ¥Ã¥Á¤µ¤ì¤¿»þ¤Ë¡¢ ÆþÎÏ¥¹¥È¥ê¡¼¥à¤Ë‘baz’¤òÃÖ¤¤Þ¤¹¡£ °Ê²¼¤Ï¡¢ ¤·¤Æ¤Ï¤Ê¤é¤Ê¤¤¤³¤È¤ò¼¨¤¹Îã¤Ç¤¹¡£
/* * unput.l : unput()¤ò»È¤Ã¤Æ¹Ô¤Ã¤Æ¤Ï¤Ê¤é¤Ê¤¤ * ½èÍý¤ÎÎã */ %{ #include <stdio.h> void putback_yytext(void); %}
%% foobar putback_yytext(); raboof putback_yytext(); %%
void putback_yytext(void) { int i; int l = strlen(yytext); char buffer[YY_BUF_SIZE]; strcpy(buffer,yytext); printf("Got: %s\n",yytext); for(i=0; i<l; i++){ unput(buffer[i]); } }
¤³¤ÎÎã¤Ë‘foobar’¤òÆþÎϤȤ·¤ÆÍ¿¤¨¤ë¤È¡¢ ¤Þ¤º‘foobar’¤Ë¥Þ¥Ã¥Á¤·¡¢ ¼¡¤Ë‘raboof’¤Ë¥Þ¥Ã¥Á¤¹¤ë̵¸Â¥ë¡¼¥×¤Ë´Ù¤ê¤Þ¤¹¡£
Ãí¡§input()
¤ÈƱÍͤËunput()
¤âyytext
¤ÎÆâÍÆ¤òÇ˲õ¤·¤Þ¤¹¡£9¤Ä¤Þ¤ê¡¢
yytext
¤«¤éʸ»ú¾ðÊó¤òÊÖ¤·¤¿¤¤¾ì¹ç¤Ë¤Ï¡¢
¾å¤ÎÎã¤Ë¼¨¤µ¤ì¤ë¤è¤¦¤Ë¡¢
¤Þ¤ºyytext
¤ÎÆâÍÆ¤ò¥³¥Ô¡¼¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£
yyterminate()
¥¢¥¯¥·¥ç¥ó¤ÎÃæ¤Ç¸Æ¤Ó½Ð¤µ¤ì¤ë¤È¡¢
yyterminate()
¤Ï¥¹¥¥ã¥Ê¤Î¼Â¹Ô¤ò½ªÎ»¤µ¤»¡¢
¤½¤Î¸å¤Ëyylex()
¤¬0¤òÊÖ¤·¤Þ¤¹¡£
¤³¤Î¸å¤Ï¡¢
yyrestart()
¡Ê²¼µ»²¾È¡Ë¤¬¸Æ¤Ó½Ð¤µ¤ì¤Ê¤¤¸Â¤ê¡¢
yylex()
¤ò¸Æ¤Ó½Ð¤·¤Æ¤â¤¹¤°¤ËÉüµ¢¤·¤Æ¤·¤Þ¤¤¤Þ¤¹¡£
yyrestart(file)
yyrestart()
¤Ï¡¢
¥¹¥¥ã¥Ê¤Î¼Â¹Ô¤òºÆ³«¤¹¤ë¤è¤¦Flex¤ËÄÌÃΤ¹¤ë´Ø¿ô¤Ç¤¹¡£
¤³¤ì¤Ï°ú¿ô¤ò£±¤Ä¤À¤±¡¢
¤¹¤Ê¤ï¤Á¡¢
¥¹¥¥ã¥ó¤ÎÂоݤȤʤë¥Õ¥¡¥¤¥ë¡ÊÄ̾ï¤Ïyyin
¡Ë¤ò¼è¤ê¤Þ¤¹¡£
¤³¤ì¤Ï¡¢
EOF¤ò½èÍý¤¹¤ë¤¿¤á¤Ë»È¤¦¤³¤È¤â¤Ç¤¤Þ¤¹¤·¡¢
¤Þ¤¿¡¢
Flex¤Ë³ä¤ê¹þ¤ß¤ò¤«¤±¡¢
¤½¤Î¸å¤ËºÆ³«»Ï¤µ¤»¤ë¤³¤È¤¬¤Ç¤¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤Ë»È¤¦¤³¤È¤â¤Ç¤¤Þ¤¹¡£
¡ÊFlex¥¹¥¥ã¥Ê¤ÏºÆÆþ²Äǽ¤Ç¤Ï¤Ê¤¤¤Î¤Ç¡¢
¤³¤Î¤è¤¦¤Ê¤³¤È¤¬É¬Íפˤʤê¤Þ¤¹¡£¡Ë
YY_NEW_FILE
yyin
¤¬¿·¤·¤¤¥Õ¥¡¥¤¥ë¤ò»Ø¤¹¤è¤¦Êѹ¹¤µ¤ì¡¢
½èÍý¤¬·Ñ³¤µ¤ì¤ë¤Ù¤¤Ç¤¢¤ë¤È¤¤¤¦¤³¤È¤òFlex¤ËÄÌÃΤ¹¤ë¥Þ¥¯¥í¤Ç¤¹¡£10
°Ê²¼¤ËÎã¤ò¼¨¤·¤Þ¤¹¡£
/* * cat.lex: YY_NEW_FILE¤Î¼Â±é */ %{ #include <stdio.h>
#define ERRORMESS "Unable to open %s\n" char **names = NULL; int current = 1; %}
%% <<EOF>> { current += 1; if(names[current] != NULL){ yyin = fopen(names[current],"r"); if(yyin == NULL){ fprintf(stderr,ERRORMESS, names[current]); yyterminate(); } YY_NEW_FILE; } else { yyterminate(); } } %%
int main(int argc, char **argv) { if(argc < 2){ fprintf(stderr,"Usage: cat files....\n"); exit(1); } names = argv;
yyin = fopen(names[current],"r"); if(yyin == NULL){ fprintf(stderr,ERRORMESS,names[current]); yyterminate(); } yylex(); }
ECHO
yytext
¤ÎÆâÍÆ¤òyyout
¤Ë½ñ¤¹þ¤à¥Þ¥¯¥í¤Ç¤¹¡£
REJECT
REJECT
¤Ï¡¢
¤½¤Î»þÅÀ¤Ë¤ª¤¤¤Æ¥Þ¥Ã¥Á¤·¤Æ¤¤¤ë¤â¤Î¤ò¼õ¤±Æþ¤ì¤º¡¢
¼¡¤ËºÇ¤â¤è¤¯¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤ò¼õ¤±Æþ¤ì¤ë¤è¤¦¥¹¥¥ã¥Ê¤ËÄÌÃΤ¹¤ë¥Þ¥¯¥í¤Ç¤¹¡£
¥¹¥¥ã¥Ê¤Ï¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤ÎÃæ¤ÇºÇŤΤâ¤Î¤òõ¤·¡¢
¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤¬£²¤Ä¤¢¤Ã¤Æ¤½¤ÎŤµ¤¬Æ±¤¸¾ì¹ç¤Ï¡¢
µ½Ò¥Õ¥¡¥¤¥ë¤Ë¤ª¤¤¤ÆºÇ½é¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ëÊý¤òÁªÂò¤·¤Þ¤¹¡£
¤Ä¤Þ¤ê¡¢
ǧ¼±¤µ¤ì¤ë¥Æ¥¥¹¥È¤ÎŤµ¤Ï¡¢
Ʊ°ì¤ÎŤµ¤Ë¤Ê¤ë¤³¤È¤â¤¢¤ê¡¢
¤Þ¤¿¤Ïû¤¯¤Ê¤ë¤³¤È¤â¤¢¤ë¤È¤¤¤¦¤³¤È¤ò°ÕÌ£¤·¤Æ¤¤¤Þ¤¹¡£
REJECT
¤ò»È¤Ã¤¿¸å¤Ï¡¢
yytext
¤Èyyleng
¤Ï¿·¤·¤¤Ãͤò¼è¤ê¤Þ¤¹¡£
REJECT
¤Ë´Ø¤·¤ÆÃΤäƤª¤¯¤Ù¤½ÅÍפÊÅÀ¤¬£²¤Ä¤¢¤ê¤Þ¤¹¡£
£±¤Ä¤á¤Ï¡¢
REJECT
¤Ïʬ´ôÌ¿Îá¤Ç¤¢¤ê¡¢
·è¤·¤ÆÌá¤Ã¤Æ¤³¤Ê¤¤¤Î¤Ç¡¢
REJECT
¤Î¸å¤í¤Ëµ½Ò¤µ¤ì¤¿¥¢¥¯¥·¥ç¥ó¤Ï¼Â¹Ô¤µ¤ì¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ç¤¹¡£
£²¤Ä¤á¤Ï¡¢
REJECT
¤È¥Õ¥¡¥¹¥È¡¦¥Æ¡¼¥Ö¥ë¡Êfast table¡¿‘-F’¡Ë¤Ï°ì½ï¤Ë»È¤¦¤³¤È¤Ï¤Ç¤¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ç¤¹¡£
°Ê²¼¤Ë´Êñ¤ÊÎã¤ò¼¨¤·¤Þ¤¹¡£
/* * reject.lex: REJECT¤Èunput()¤ò°ÍѤ¹¤ë¼ÂÎã */ %% UNIX { unput('U'); unput('N'); unput('G'); unput('\0'); REJECT; } GNU printf("GNU is Not Unix!\n"); %%
¤³¤ÎÎã¤Ï¡¢
¿·¼°¤Î¥Æ¥¥¹¥ÈÂåÂØ¤Îµ»Ë¡¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£
‘UNIX’¤Ë¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤¬¸«¤Ä¤«¤ë¤È¡¢
unput()
¤Ë¤è¤Ã¤Æ‘GNU’¤È¤¤¤¦Ê¸»ú¤ÎʤӤ¬Ìᤵ¤ì¡¢
¤½¤Î»þÅÀ¤Ë¤ª¤±¤ë¥¹¥¥ã¥ó¡¦¥Ð¥Ã¥Õ¥¡¤ÎÆâÍÆ¤¬¾å½ñ¤¤µ¤ì¤Þ¤¹¡£
¼¡¤ËREJECT
¤Ë¤è¤êʬ´ô¤¬¹Ô¤ï¤ì¡¢
Ê̤Τâ¤Î¤Ë¥Þ¥Ã¥Á¤¹¤ë¤è¤¦¥¹¥¥ã¥Ê¤ËÂФ·¤ÆÄÌÃΤ¬¹Ô¤ï¤ì¤Þ¤¹¡£
‘GNU’¤¬¥Ð¥Ã¥Õ¥¡¤Ë½ñ¤¹þ¤Þ¤ì¤¿¤Î¤Ç¡¢
¤³¤ì¤¬¼¡¤Ë¥Þ¥Ã¥Á¤µ¤ì¡¢
¤½¤Î¥¢¥¯¥·¥ç¥ó¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£
°Ê²¼¤Ë¡¢
¤½¤Î·ë²Ì¤³¤¦¤Ê¤ë¤Ç¤¢¤í¤¦¤È»×¤ï¤ì¤ëÎã¤ò¼¨¤·¤Þ¤¹¡£
UNIX return GNU is Not Unix!
¼ÂºÝ¤Î¤È¤³¤í¤Ï¡¢
Flex¤Ë¤ª¤¤¤ÆREJECT
¤ÎÍÑÅӤϤۤó¤Î¾¯¤·¤·¤«¤¢¤ê¤Þ¤»¤ó¡£
¾åµ°Ê³°¤Ç¤Ï¡¢
½ÅÊ£¤¹¤ë¥Ñ¥¿¡¼¥ó¤ä¾õÂÖ¤ÎÊѹ¹¤Ë»È¤¦¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
Îã¤ò¼¨¤¹¤È¡¢
°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£
nday [1-9]|[1-2][0-9]|3[0-1] nmonth [1-9]|1[0-2] nyear [0-9]{1,4} %x DAY MONTH YEAR
%% {nday} BEGIN(DAY); REJECT; <DAY>{nday} … {nmonth} BEGIN(MONTH); REJECT; <MONTH>{nday} … {nyear} BEGIN(YEAR); REJECT; <YEAR>{nday} …
¤³¤ÎÎã¤Ç¤Ï¡¢
ÆüÉդηÁ¼°¤Ï½ÅÊ£¤·¤Æ¤ª¤ê¡¢
ºÇ½é¤Ëǧ¼±¤µ¤ì¤¿¹½À®Í×ÁǤˤè¤Ã¤Æ¡¢
¤É¤Î¤è¤¦¤ËÆüÉÕ¤ò¥Ñ¡¼¥¹¤¹¤ë¤«¤ò·èÄꤷ¤Þ¤¹¡£
¤·¤«¤·¡¢
¤³¤ÎÎã¤Ï¾¯¡¹ÉÔ¼«Á³¤Ê´¶¤¸¤¬¤·¤Þ¤¹¡£
¤È¤¤¤¦¤Î¤Ï¡¢
¾¯¤·¹Í¤¨¤ì¤Ð¡¢
REJECT
¤ò»È¤ï¤º¤Ë¡¢
¤è¤ê¸úΨŪ¤Ê¥¹¥¥ã¥Ê¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤¤ë¤«¤é¤Ç¤¹¡£
¤³¤ì¤Ï¡¢
¥¹¥¿¡¼¥È¾õÂ֤λÈÍÑÎã¤Ë¼¨¤·¤Æ¤¤¤Þ¤¹¡£
BEGIN
BEGIN
¤Ï¡¢
¥¹¥¥ã¥Ê¤ò¤¢¤ëÆÃÄê¤Î¥¹¥¿¡¼¥È¾õÂ֤ˤ¹¤ë¤¿¤á¤Î¥Þ¥¯¥í¤Ç¤¹¡£
BEGIN
¤Ë³¤¯Ì¾Á°¤Ï¥¹¥¿¡¼¥È¾õÂÖ¤Î̾Á°¤Ç¤¹¡£
Î㤨¤Ð¡¢
%x FLOAT %% floats BEGIN(FLOAT) <FLOAT>some_rule some_action …
¤Ï¡¢
‘floats’¤È¤¤¤¦Ã±¸ì¤¬¥Þ¥Ã¥Á¤·¤¿»þ¤Ë¡¢
¥¹¥¿¡¼¥È¾õÂÖ¤òFLOAT
¤ËÀßÄꤷ¤Þ¤¹
¡Ê¾ÜºÙ¤Ë¤Ä¤¤¤Æ¤Ï¡¢
see Start States Explained¡Ë¡£
YY_USER_ACTION
YY_USER_ACTION
¤Ï¡¢
¥ë¡¼¥ë¡¦¥»¥¯¥·¥ç¥óÃæ¤Î¤É¤Î¥¢¥¯¥·¥ç¥ó¤è¤ê¤âÁ°¤Ë¼Â¹Ô¤µ¤ì¤ë¥¢¥¯¥·¥ç¥ó¤òÄêµÁ¤¹¤ë¥Þ¥¯¥í¤Ç¤¹¡£
¤³¤ì¤Ï¡¢
°Ê²¼¤ÎÎã¤Ç¼¨¤¹¤è¤¦¤Ë¡¢
yytext
¤ÎÆâÍÆ¤Î¾®Ê¸»ú¤«¤éÂçʸ»ú¤Ø¤ÎÊÑ´¹Åù¤ò¹Ô¤¦¤Î¤ËÌò¤ËΩ¤Á¤Þ¤¹¡£
/* * user_act.lex: YY_USER_ACTION¤ò»È¤¦ * ¥æ¡¼¥¶¡¦¥¢¥¯¥·¥ç¥ó¤ÎÎã */ %{ #include <ctype.h> void user_action(void);
#define YY_USER_ACTION user_action(); %} %% .* ECHO; \n ECHO; %%
/* * ¤³¤Î¥æ¡¼¥¶¡¦¥¢¥¯¥·¥ç¥ó¤Ï¤¹¤Ù¤Æ¤Îʸ»ú¤ò * ñ¤ËÂçʸ»ú¤ËÊÑ´¹¤¹¤ë */ void user_action(void) { int loop; for(loop=0; loop<yyleng; loop++){ if(islower(yytext[loop])){ yytext[loop] = toupper(yytext[loop]); } } }
¤³¤ì¤Ï¡¢
¤¹¤Ù¤Æ¤ÎÆþÎÏʸ»ú¤òñ¤ËÂçʸ»ú¤ËÊÑ´¹¤·¤ÆECHO
¤·¤Þ¤¹¡£
YY_USER_ACTION
¤Î¥Ç¥Õ¥©¥ë¥È¤ÎÀßÄê¤Ç¤Ï¡¢
²¿¤â¼Â¹Ô¤µ¤ì¤Þ¤»¤ó¡£
YY_USER_INIT
YY_USER_INIT
¤Ï¡¢
¥¹¥¥ã¥ó½èÍý¤¬³«»Ï¤µ¤ì¤ëÁ°¤Ë¼Â¹Ô¤µ¤ì¤ë¥¢¥¯¥·¥ç¥ó¤òÄêµÁ¤¹¤ë¥Þ¥¯¥í¤Ç¤¹¡£
´ðËÜŪ¤Ë¤Ï¡¢
main()
´Ø¿ô¤ÎÃæ¤Ç¡¢
yylex()
¤ò¸Æ¤Ó½Ð¤¹Ê¸¤ÎÁ°¤ËƱÍͤΥ³¡¼¥É¤òµ½Ò¤¹¤ë¤Î¤ÈƱ¤¸¤³¤È¤Ç¤¹¡£
°Ê²¼¤Ë´Êñ¤ÊÎã¤ò¼¨¤·¤Þ¤¹¡£
/* * userinit.lex: YY_USER_INIT¤ò»È¤¦Îã */ %{ #define YY_USER_INIT open_input_file() extern FILE *yyin;
void open_input_file(void) { char *file_name,buffer[1024]; yyin = NULL;
while(yyin == NULL){ printf("Input file: "); file_name = fgets(buffer,1024,stdin);
if(file_name){ file_name[strlen(file_name)-1] = '\0'; yyin = fopen(file_name,"r");
if(yyin == NULL){ printf("Unable to open \"%s\"\n", file_name); }
} else { printf("stdin\n"); yyin = stdin; break; } } } %} %%
¤³¤ì¤Ï¡¢
¥Õ¥¡¥¤¥ë¤¬¥ª¡¼¥×¥ó¤µ¤ì¤ë¤«EOF¤¬¸¡½Ð¤µ¤ì¤ë¤Þ¤Ç¡¢
ÆþÎÏ¥Õ¥¡¥¤¥ë̾¤òÆþÎϤ¹¤ë¤è¤¦¥æ¡¼¥¶¤ËºÅÂ¥¤·¤Þ¤¹¡£
EOF¤¬¸¡½Ð¤µ¤ì¤¿¾ì¹ç¤Ï¡¢
ÆþÎϸµ¤Ï¥Ç¥Õ¥©¥ë¥È¤Çstdin
¤Ë¤Ê¤ê¤Þ¤¹¡£
¤³¤ì¤Ï°Ê²¼¤ÈƱ¤¸¤³¤È¤Ç¤¹¡£
/* * ¤³¤ÎÎã¤Ï¡¢Á°¤ÎÎã¤ÈƱ¤¸¤³¤È¤òYY_USER_INIT¤ò * »È¤ï¤º¤Ë¹Ô¤¦ */ %{ void open_input_file(void) { char *file_name,buffer[1024]; yyin = NULL;
while(yyin == NULL){ printf("Input file: "); file_name = fgets(buffer,1024,stdin); if(file_name){ file_name[strlen(file_name)-1] = '\0'; yyin = fopen(file_name,"r"); if(yyin == NULL){ printf("Unable to open \"%s\"\n", file_name); }
} else { printf("stdin\n"); yyin = stdin; break; } } } %} %% %%
int main(int argc, char *argv[]) { open_input_file(); yylex(); }
YY_BREAK
YY_BREAK
¤Ï¥Þ¥¯¥í¤Ç¤¹¡£
¥¤¥ó¥¿¡¼¥Õ¥§¥¤¥¹Åª¤Êµ¡Ç½¤È¤¤¤¦¤è¤ê¤â¡¢
¤à¤·¤íÀ¸À®¤µ¤ì¤ë¥³¡¼¥É¤òÊѹ¹¤¹¤ë¤¿¤á¤Ë»È¤¦¤³¤È¤¬¤Ç¤¤ë¤â¤Î¤Ç¤¹¡£
¥¹¥¥ã¥ÊÃæ¤Ë¤ª¤¤¤Æ¡¢
¤¹¤Ù¤Æ¤Î¥¢¥¯¥·¥ç¥ó¤Ï£±¤Ä¤ÎÂ礤Êswitch
ʸ¤ÎÍ×ÁǤǤ¢¤ê¡¢
¥Ç¥Õ¥©¥ë¥È¤ÇC¤Îbreak;
ʸ¤ËÃÖ¤´¹¤¨¤é¤ì¤ëYY_BREAK
¤Ë¤è¤Ã¤Æ¶èÀÚ¤é¤ì¤Þ¤¹¡£
¥ë¡¼¥ë¤Î¥¢¥¯¥·¥ç¥óÉô¤¬Â¿¤¯¤Îreturn
ʸ¤ò´Þ¤ó¤Ç¤¤¤ë¾ì¹ç¡¢
¥³¥ó¥Ñ¥¤¥é¤¬‘statement not reached’¤È¤¤¤¦¥¨¥é¡¼¡¦¥á¥Ã¥»¡¼¥¸¤ò¤¿¤¯¤µ¤ó½ÐÎϤ¹¤ë¤«¤â¤·¤ì¤Þ¤»¤ó¡£
YY_BREAK
¤òºÆÄêµÁ¤¹¤ë¤³¤È¤Ë¤è¤Ã¤Æ¡¢
¤³¤Î·Ù¹ð¥á¥Ã¥»¡¼¥¸¤Î½ÐÎϤò»ß¤á¤ë¤³¤È¤¬²Äǽ¤Ç¤¹¡£
ºÆÄêµÁ¤Ï¡¢
¥»¥ß¡¦¥³¥í¥ó¤ò´Þ¤àÀµÅö¤ÊC¤Îʸ¤Ç¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
Ãí¡§YY_BREAK
¤òºÆÄêµÁ¤·¤Æ¶õ¤Ë¤¹¤ë¤Î¤Ç¤¢¤ì¤Ð¡¢
¥¢¥¯¥·¥ç¥ó¤ÎºÇ¸å¤Ïɬ¤ºreturn;
¤«break;
¤Ë¤Ê¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤À¤µ¤¤¡£
ÌõÃí¡§Flex 2.5¤Ç¤Ï¡¢
‘%pointer’¤È‘%array’¤Ë¤è¤ê¡¢
yytext
¤Î·¿¤òÁªÂò¤Ç¤¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡£
‘%pointer’¤ò»ØÄꤷ¤¿¾ì¹ç¤Ïchar *yytext
¡¢
‘%array’¤ò»ØÄꤷ¤¿¾ì¹ç¤Ïchar yytext[YYLMAX]
¤È¤Ê¤ê¤Þ¤¹¡£
¥Ç¥Õ¥©¥ë¥È¤Ï‘%pointer’¤Ç¤¹¡£
‘%array’¤ò»ØÄꤷ¤¿¾ì¹ç¤ÎÇÛÎó¤Î¥µ¥¤¥º¤Ï¡¢
YYLMAX
¤òºÆÄêµÁ¤¹¤ë¤³¤È¤Ë¤è¤Ã¤ÆÊѹ¹²Äǽ¤Ç¤¹¡£
ÌõÃí¡§Flex 2.5¤Ç¤Ï¡¢
‘%option noyywrap’¤¬»ØÄꤵ¤ì¤Ê¤¤¸Â¤ê¡¢
yywrap()
¤Ï´Ø¿ô¤Ç¤¹¡£
ºÆÄêµÁ¤ò¤¹¤ë¤Î¤Ë¡¢
#undef
¤ÇÄêµÁ²ò½ü¤¹¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£
ÌõÃí¡§Flex 2.5¤Ç¤Ï¡¢
‘%array’¤¬»ØÄꤵ¤ì¤¿¾ì¹ç¤Ï¡¢
unput()
¤Ïyytext
¤ÎÆâÍÆ¤òÇ˲õ¤·¤Þ¤»¤ó¡£
ÌõÃí¡§Flex 2.5¤Ç¤Ï¡¢
yyin
¤òÊѹ¹¤·¤¿¸å¤ËYY_NEW_FILE
¤ò¼Â¹Ô¤¹¤ëɬÍפϤʤ¯¤Ê¤ê¤Þ¤·¤¿¡£
Next: Flex and C (Flex 2.5), Previous: Interfacing to Flex, Up: Interfacing to Flex [Contents][Index]