Rechercher une page de manuel
flex
Langue: ja
Version: April 1995 (openSuse - 09/10/07)
Section: 1 (Commandes utilisateur)
Sommaire
- ̾¾Î
- ½ñ¼°
- ³µÀâ
- ²òÀâ
- ´Êñ¤ÊÎã
- ÆþÎÏ¥Õ¥¡¥¤¥ë¤Î¥Õ¥©¡¼¥Þ¥Ã¥È
- ¥Ñ¥¿¡¼¥ó
- ÆþÎϤΥޥåÁÊýË¡
- ¥¢¥¯¥·¥ç¥ó
- À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê
- ³«»Ï¾ò·ï
- Ê£¿ô¤ÎÆþÎϥХåե¡
- ¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤Î¥ë¡¼¥ë
- »¨Â¿¤Ê¥Þ¥¯¥í
- ¥æ¡¼¥¶¤¬»ÈÍѲÄǽ¤ÊÃÍ
- YACC ¤È¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹
- ¥ª¥×¥·¥ç¥ó
- Àǽ´ØÏ¢
- C++ ¥¹¥¥ã¥Ê¤ÎÀ¸À®
- LEX ¤ª¤è¤Ó POSIX ¤È¤ÎÈó¸ß´¹À
- ¿ÇÃÇ
- ´ØÏ¢¥Õ¥¡¥¤¥ë
- ·ç´Ù / ¥Ð¥°
- ´ØÏ¢¹àÌÜ
- ºî¼Ô
̾¾Î
flex - ¹â®¤Ê»ú¶ç²òÀϽèÍý·Ï¤ÎÀ¸À®¥Ä¡¼¥ë½ñ¼°
flex [-bcdfhilnpstvwBFILTV78+? -C[aefFmr] -ooutput -Pprefix -Sskeleton] [--help --version] [filename ...]³µÀâ
Ëܥޥ˥奢¥ë¤Ï¡¢ ¥Æ¥¥¹¥È¤Î¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¥ó¥°¤ò¹Ô¤¦¥×¥í¥°¥é¥à¤òÀ¸À®¤¹¤ë¥Ä¡¼¥ë flex ¤ò°·¤¤¤Þ¤¹¡£ Ëܥޥ˥奢¥ë¤Ï¥Á¥å¡¼¥È¥ê¥¢¥ë¤È¥ê¥Õ¥¡¥ì¥ó¥¹Àá¤È¤ò´Þ¤ß¤Þ¤¹:²òÀ⠥ġ¼¥ë¤Îû¤¤³µÀâ ´Êñ¤ÊÎã ÆþÎÏ¥Õ¥¡¥¤¥ë¤Î¥Õ¥©¡¼¥Þ¥Ã¥È ¥Ñ¥¿¡¼¥ó flex ¤¬»ÈÍѤ¹¤ë³ÈÄ¥¤·¤¿Àµµ¬É½¸½ ÆþÎϤΥޥåÁÊýË¡ ²¿¤¬¥Þ¥Ã¥Á¤¹¤ë¤«¤ò·èÄꤹ¤ëµ¬Â§ ¥¢¥¯¥·¥ç¥ó ¥Ñ¥¿¡¼¥ó¤¬¥Þ¥Ã¥Á¤·¤¿»þ¤Ë²¿¤ò¹Ô¤¦¤«¤ò»ØÄꤹ¤ëÊýË¡ À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê flex ¤¬À¸À®¤¹¤ë¥¹¥¥ã¥Ê¤Ë´Ø¤¹¤ë¾ÜºÙ; ÆþÎϸµ¤ÎÀ©¸æÊýË¡ ³«»Ï¾ò·ï ¥¹¥¥ã¥Ê¤Ø¤Îʸ̮¤ÎƳÆþ¤È¡¢ "¥ß¥Ë¥¹¥¥ã¥Ê" ¤ÎÀ©¸æÊýË¡ Ê£¿ô¤ÎÆþÎϥХåե¡ Ê£¿ô¤ÎÆþÎϸµ¤ò°·¤¦ÊýË¡; ¥Õ¥¡¥¤¥ë¤Ç¤Ï¤Ê¤¯Ê¸»úÎ󤫤饹¥¥ã¥ó¤¹¤ëÊýË¡ ¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤Î¥ë¡¼¥ë ¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤Ë¥Þ¥Ã¥Á¤¹¤ëÆÃÊ̤ʥ롼¥ë »¨Â¿¤Ê¥Þ¥¯¥í ¥¢¥¯¥·¥ç¥ó¤Ç»ÈÍѲÄǽ¤Ê¥Þ¥¯¥í¤Î¤Þ¤È¤á ¥æ¡¼¥¶¤¬»ÈÍѲÄǽ¤ÊÃÍ ¥¢¥¯¥·¥ç¥ó¤Ç»ÈÍѲÄǽ¤ÊÃͤΤޤȤá Yacc ¤È¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹ lex ¥¹¥¥ã¥Ê¤È yacc ¥Ñ¡¼¥µ¤È¤Î·ë¹ç ¥ª¥×¥·¥ç¥ó flex ¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¥ª¥×¥·¥ç¥ó¤È¡¢ "%option" ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö Àǽ´ØÏ¢ ¥¹¥¥ã¥Ê¤ò²Äǽ¤Ê¸Â¤ê¹â®¤Ë¤¹¤ëÊýË¡ C++ ¥¹¥¥ã¥Ê¤ÎÀ¸À® C++ ¥¹¥¥ã¥Ê¥¯¥é¥¹À¸À®¤Î¤¿¤á¤Î (¼Â¸³Åª¤Ê) µ¡Ç½ Lex ¤ª¤è¤Ó POSIX ¤È¤ÎÈó¸ß´¹À AT&T lex ¤ª¤è¤Ó POSIX lex ɸ½à¤È flex ¤È¤Î°ã¤¤ ¿ÇÃÇ flex (¤â¤·¤¯¤ÏÀ¸À®¤·¤¿¥¹¥¥ã¥Ê) ¤¬½ÐÎϤ¹¤ë ¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤Ç°ÕÌ£¤¬ÌÀ³Î¤Ç¤Ê¤¤¤â¤Î ´ØÏ¢¥Õ¥¡¥¤¥ë flex ¤¬»ÈÍѤ¹¤ë¥Õ¥¡¥¤¥ë ·ç´Ù / ¥Ð¥° flex ¤Î´ûÃΤÎÌäÂê ´ØÏ¢¹àÌÜ ¥Ä¡¼¥ë¤Ë´Ø·¸¤¹¤ë¾¤Î¥É¥¥å¥á¥ó¥È ºî¼Ô Ï¢ÍíÊýË¡¤ò´Þ¤ß¤Þ¤¹
²òÀâ
flex ¤Ï ¥¹¥¥ã¥Ê ¤òÀ¸À®¤¹¤ë¤¿¤á¤Î¥Ä¡¼¥ë¤Ç¤¹¡£ ¤³¤³¤Ç¡¢¥¹¥¥ã¥Ê¤È¤Ï¡¢ ¥Æ¥¥¹¥ÈÆâ¤Î»ú¶ç¥Ñ¥¿¡¼¥ó¤ò²òÀϤ¹¤ë¥×¥í¥°¥é¥à¤Ç¤¹¡£ flex ¤Ï»ØÄꤷ¤¿¥Õ¥¡¥¤¥ë¡¢¤â¤·¤¯¤Ï¥Õ¥¡¥¤¥ë̾¤¬Í¿¤¨¤é¤ì¤Ê¤«¤Ã¤¿¾ì¹ç¤Ï ɸ½àÆþÎϤ«¤é¡¢À¸À®¤¹¤ë¥¹¥¥ã¥Ê¤Îµ½Ò¤òÆɤ߹þ¤ß¤Þ¤¹¡£ ¤³¤Îµ½Ò¤Ï¡¢ Àµµ¬É½¸½¤È C ¥³¡¼¥É¤Î¥Ú¥¢¤Î·Á¤ò¤È¤Ã¤Æ¤¤¤Þ¤¹¡£ ¤³¤ì¤Ï ¥ë¡¼¥ë ¤È¸Æ¤Ð¤ì¤Þ¤¹¡£ flex ¤Ï¡¢½ÐÎϤȤ·¤Æ C ¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤Î lex.yy.c ¤òÀ¸À®¤·¤Þ¤¹¤¬¡¢¤½¤ÎÃæ¤Ë yylex() ¥ë¡¼¥Á¥ó¤¬ÄêµÁ¤µ¤ì¤Þ¤¹¡£ ¤³¤Î¥Õ¥¡¥¤¥ë¤Ï¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¡¢ -ll ¥é¥¤¥Ö¥é¥ê¤È¤È¤â¤Ë¥ê¥ó¥¯¤µ¤ì¤Æ¡¢ ¼Â¹Ô·Á¼°¤È¤Ê¤ê¤Þ¤¹¡£ ¼Â¹Ô·Á¼°¤¬Áö¤ê»Ï¤á¤ë¤È¡¢ Àµµ¬É½¸½¤ò¥Þ¥Ã¥Á¤µ¤»¤ë¤¿¤á¤Ë ÆþÎϤ¬²òÀϤµ¤ì¤Þ¤¹¡£ ¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤ò¸«¤Ä¤±¤ë¤È¡¢Âбþ¤¹¤ë C ¥³¡¼¥É¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹¡£´Êñ¤ÊÎã
¤Þ¤º´Êñ¤ÊÎ㤫¤é¡¢ flex ¤Î»È¤¤Êý¤ò¸«¤Æ¹Ô¤¤Þ¤·¤ç¤¦¡£ ¼¡¤Î flex ¤ÎÆþÎϤϡ¢"username" ¤È¤¤¤¦Ê¸»úÎó¤Ë½Ð²ñ¤¦¤È¥æ¡¼¥¶¤Î¥í¥°¥¤¥ó̾¤ËÃÖ¤´¹¤¨¤ë ¥¹¥¥ã¥Ê¤ò»ØÄꤷ¤Æ¤¤¤Þ¤¹:%% username printf( "%s", getlogin() );¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢ flex ¥¹¥¥ã¥Ê¤Ë¥Þ¥Ã¥Á¤·¤Ê¤«¤Ã¤¿¥Æ¥¥¹¥È¤Ï½ÐÎϤ˥³¥Ô¡¼¤µ¤ì¤Þ¤¹¤Î¤Ç¡¢ "username" ¤òŸ³«¤·¤Ê¤¬¤éÆþÎϤò½ÐÎϤ˥³¥Ô¡¼¤¹¤ë¤³¤È¤¬ ¤³¤Î¥¹¥¥ã¥Ê¤ÎºÇ½ªÅª¤Ê·ë²Ì¤È¤Ê¤ê¤Þ¤¹¡£ ¤³¤ÎÆþÎϤˤϤ¿¤À°ì¤Ä¤Î¥ë¡¼¥ë¤À¤±¤¬¤¢¤ê¤Þ¤¹¡£ "username" ¤Ï ¥Ñ¥¿¡¼¥ó ¤Ç¤¢¤ê¡¢"printf" ¤Ï ¥¢¥¯¥·¥ç¥ó ¤Ç¤¹¡£ "%%" ¤Ï¥ë¡¼¥ë¤Î»Ï¤Þ¤ê¤Î°õ¤Ç¤¹¡£
Ê̤ÎÎã¤ò¸«¤Æ¸«¤Þ¤·¤ç¤¦:
%{ int num_lines = 0, num_chars = 0; %} %% \n ++num_lines; ++num_chars; . ++num_chars; %% main() { yylex(); printf( "# of lines = %d, # of chars = %d\n", num_lines, num_chars ); }¤³¤Î¥¹¥¥ã¥Ê¤ÏÆþÎϤÎʸ»ú¿ô¤ª¤è¤Ó¹Ô¿ô¤ò¿ô¤¨¤Þ¤¹ (¿ô¤¨¤¿ºÇ½ª·ë²Ì¤òÊó¹ð¤¹¤ë¤À¤±¤Ç¤¹)¡£ ºÇ½é¤Î¹Ô¤Ï 2 ¤Ä¤ÎÂç°èÊÑ¿ô "num_lines" ¤È "num_chars" ¤òÀë¸À¤·¤Þ¤¹¡£ ¤³¤ì¤é¤ÎÊÑ¿ô¤Ï¡¢2 ÈÖÌܤΠ"%%" ¤Î¸å¤ËÀë¸À¤µ¤ì¤Æ¤¤¤ë yylex() ¤È main() ¤Î¥ë¡¼¥Á¥ó¤«¤é¥¢¥¯¥»¥¹²Äǽ¤Ç¤¹¡£ ¤³¤³¤Ë¤Ï 2 ¤Ä¤Î¥ë¡¼¥ë¤¬¤¢¤ê¤Þ¤¹¡£ 1 ¤ÄÌܤϲþ¹Ôʸ»ú ("\n") ¤Ë¥Þ¥Ã¥Á¤·¡¢¹Ô¿ô¤Èʸ»ú¿ô¤Î¥«¥¦¥ó¥È¤òÁý²Ã¤µ¤»¤Þ¤¹¡£ ¤â¤¦ 1 ¤Ä¤Ï¡¢²þ¹Ôʸ»ú°Ê³°¤ÎÁ´¤Æ¤Îʸ»ú ("." ¤È¤¤¤¦Àµµ¬É½¸½¤Çɽ¤µ¤ì¤Æ¤¤¤Þ¤¹)¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
¼¡¤Ï¤â¤¦¤Á¤ç¤Ã¤ÈÊ£»¨¤ÊÎã¤Ç¤¹:
/* scanner for a toy Pascal-like language */ %{ /* need this for the call to atof() below */ #include <math.h> %} DIGIT [0-9] ID [a-z][a-z0-9]* %% {DIGIT}+ { printf( "An integer: %s (%d)\n", yytext, atoi( yytext ) ); } {DIGIT}+"."{DIGIT}* { printf( "A float: %s (%g)\n", yytext, atof( yytext ) ); } if|then|begin|end|procedure|function { printf( "A keyword: %s\n", yytext ); } {ID} printf( "An identifier: %s\n", yytext ); "+"|"-"|"*"|"/" printf( "An operator: %s\n", yytext ); "{"[^}\n]*"}" /* eat up one-line comments */ [ \t\n]+ /* eat up whitespace */ . printf( "Unrecognized character: %s\n", yytext ); %% main( argc, argv ) int argc; char **argv; { ++argv, --argc; /* skip over program name */ if ( argc > 0 ) yyin = fopen( argv[0], "r" ); else yyin = stdin; yylex(); }¤³¤ì¤Ï Pascal ¤Î¤è¤¦¤Ê¸À¸ì¤Îñ½ã¤Ê¥¹¥¥ã¥Ê¤Î¸¶·¿¤Ç¤¹¡£ °Û¤Ê¤Ã¤¿¥¿¥¤¥×¤Î ¥È¡¼¥¯¥ó ¤òÄêµÁ¤·¡¢¤³¤ì¤ò¸«ÉÕ¤±¤ë¤ÈÊó¹ð¤·¤Þ¤¹¡£
¤³¤ÎÎã¤Î¾ÜºÙ¤Ï¡¢°Ê¹ß¤ÎÀá¤ÇÀâÌÀ¤·¤Þ¤¹¡£
ÆþÎÏ¥Õ¥¡¥¤¥ë¤Î¥Õ¥©¡¼¥Þ¥Ã¥È
flex ¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤Ï 3 ¤Ä¤ÎÉôʬ¤«¤é¤Ê¤ê¡¢ %% ¤À¤±¤«¤é¤Ê¤ë¹Ô¤Ë¤è¤êʬ¤±¤é¤ì¤Þ¤¹:ÄêµÁ %% ¥ë¡¼¥ë %% ¥æ¡¼¥¶¥³¡¼¥ÉÄêµÁ Éôʬ¤Ï¡¢¥¹¥¥ã¥Ê¤ÎÀë¸À¤òñ½ã²½¤¹¤ëñ½ã¤Ê ̾Á° ¤ÎÄêµÁ¤ÎÀë¸À¤È¡¢¸å¤ÇÀâÌÀ¤¹¤ë ³«»Ï¾ò·ï ¤ÎÀë¸À¤È¤«¤é¤Ê¤ê¤Þ¤¹¡£
̾Á°¤ÎÄêµÁ¤Ï¼¡¤Î·Á¼°¤Ç¤¹:
̾Á° ÄêµÁ"̾Á°" ¤Ï¸ì¤Ç¤¢¤ê¡¢ ¥ì¥¿¡¼¤«¥¢¥ó¥À¡¼¥¹¥³¥¢ ('_') ¤«¤é»Ï¤Þ¤Ã¤Æ 0 ¸Ä°Ê¾å¤Î¥ì¥¿¡¼¡¦¿ô»ú¡¦'_'¡¦'-' (¥À¥Ã¥·¥å)¤¬Â³¤¤Þ¤¹¡£ ÄêµÁ¤Ï¡¢Ì¾Á°¤Ë³¤¯ºÇ½é¤ÎÈó¶õÇòʸ»ú¤«¤é»Ï¤Þ¤ê¡¢¹ÔËö¤Þ¤Ç³¤¯¤â¤Î¤È¤µ¤ì¤Þ¤¹¡£ ÄêµÁ¤Ï¸å¤Ç "{̾Á°}" ¤Ç»²¾È¤Ç¤¡¢"(ÄêµÁ)" ¤òŸ³«¤·¤Þ¤¹¡£ Î㤨¤Ð¡¢
DIGIT [0-9] ID [a-z][a-z0-9]*¤Ï¡¢ "DIGIT" ¤¬Ã±°ì¤Î¿ô»ú¤Ë¥Þ¥Ã¥Á¤¹¤ëÀµµ¬É½¸½¤Ç¤¢¤ë¤ÈÄêµÁ¤·¡¢ "ID" ¤¬¥ì¥¿¡¼¤Ë 0 ¸Ä°Ê¾å¤Î¥ì¥¿¡¼¤«¿ô»ú¤¬Â³¤¯Àµµ¬É½¸½¤Ç¤¢¤ë¤ÈÄêµÁ¤·¤Þ¤¹¡£ ¸å¤Ç½Ð¤ÆÍè¤ë»²¾È
{DIGIT}+"."{DIGIT}*¤Ï
([0-9])+"."([0-9])*¤ÈƱ¤¸¤Ç¤¢¤ê¡¢1 ¸Ä°Ê¾å¤Î¿ô»ú¤Ë '.' ¤¬Â³¤¡¢ 0 ¸Ä°Ê¾å¤Î¿ô»ú¤¬Â³¤¯¤â¤Î¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£
flex ¤ÎÆþÎϤΠ¥ë¡¼¥ë ¤Ï¼¡¤Î·Á¼°¤Î°ìÏ¢¤Î¥ë¡¼¥ë¤«¤é¤Ê¤ê¤Þ¤¹:
¥Ñ¥¿¡¼¥ó ¥¢¥¯¥·¥ç¥ó¤³¤³¤Ç¡¢¥Ñ¥¿¡¼¥ó¤Ï¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤Æ¤¤¤Æ¤Ï¤Ê¤é¤º¡¢ ¥¢¥¯¥·¥ç¥ó¤ÏƱ¤¸¹Ô¤«¤é»Ï¤Þ¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
¥Ñ¥¿¡¼¥ó¤È¥¢¥¯¥·¥ç¥ó¤Î¾ÜºÙ¤Ï¸å¤Î²òÀâ¤ò¸«¤Æ²¼¤µ¤¤¡£
ºÇ¸å¤Ë¡¢¥æ¡¼¥¶¥³¡¼¥É¤ÎÉôʬ¤Ïñ½ã¤Ë¤½¤Î¤Þ¤Þ¤Î·Á¤Ç lex.yy.c ¤Ë¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ ¥¹¥¥ã¥Ê¤ò¸Æ¤Ó½Ð¤¹¤Þ¤¿¤Ï¸Æ¤Ó½Ð¤µ¤ì¤ëÉÕ¿ï¥ë¡¼¥Á¥ó¤Î¤¿¤á¤Ë»ÈÍѤµ¤ì¤Þ¤¹¡£ ¤³¤ÎÉôʬ¤Ï¤¢¤Ã¤Æ¤â̵¤¯¤Æ¤â¹½¤¤¤Þ¤»¤ó; ̵¤¤¾ì¹ç¤Ë¤Ï¡¢ÆþÎÏ¥Õ¥¡¥¤¥ëÃæ¤Î 2 ÈÖÌܤΠ%% ¤â¾Êά¤Ç¤¤Þ¤¹¡£
ÄêµÁ¤È¥ë¡¼¥ë¤ÎÉôʬ¤Ç¤Ï¡¢ ¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤¿ ¥Æ¥¥¹¥È¤È %{ ¤È %} ¤È¤Î´Ö¤Î¥Æ¥¥¹¥È¤Ï¤½¤Î¤Þ¤Þ¤Î·Á¤Ç½ÐÎϤ˥³¥Ô¡¼¤µ¤ì¤Þ¤¹ (¤³¤ÎºÝ %{} ¤Ïºï½ü¤µ¤ì¤Þ¤¹)¡£ %{} ¤Ï¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¹Ô¤Ë¸½¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
¥ë¡¼¥ë¤ÎÉôʬ¤Ç¤Ï¡¢ ºÇ½é¤Î¥ë¡¼¥ë¤ÎÁ°¤Ë¸½¤ì¤ë¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤¿¤â¤·¤¯¤Ï %{} Éôʬ¤Î¥Æ¥¥¹¥È¤Ï¡¢ ¥¹¥¥ã¥ó¥ë¡¼¥Á¥ó¤Ë¥í¡¼¥«¥ë¤ÊÊÑ¿ô¤È¡¢ (Àë¸À¤Î¸å¤Ç¤Ï)¥¹¥¥ã¥ó¥ë¡¼¥Á¥ó¤ËÆþ¤ë¤¿¤Ó¤Ë¼Â¹Ô¤µ¤ì¤ë¥³¡¼¥É¤È¤òÀë¸À¤·¤Þ¤¹¡£ ¥ë¡¼¥ëÉôʬ¤Î¾¤Î¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤¿¤â¤·¤¯¤Ï %{} Éôʬ¤Î¥Æ¥¥¹¥È¤Ï ½ÐÎϤ˥³¥Ô¡¼¤µ¤ì¤Þ¤¹¤¬¡¢ °ÕÌ£¤Ï¤Á¤ã¤ó¤ÈÄêµÁ¤µ¤ì¤Æ¤ª¤é¤º¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¥¨¥é¡¼¤È¤Ê¤ë¤«¤âÃΤì¤Þ¤»¤ó (¤³¤Î»ÅÍÍ¤Ï POSIX ¸ß´¹¤Î¤¿¤á¤Ë¤¢¤ê¤Þ¤¹; ¾¤Î¤³¤Î¤è¤¦¤Ê»ÅÍͤϰʹߤò¸«¤Æ²¼¤µ¤¤)¡£
ÄêµÁ¤ÎÉôʬ(¥ë¡¼¥ë¤ÎÉôʬ¤Ç¤Ï¤Ê¤¤¤Ç¤¹)¤Ç¤Ï¡¢ ¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¥³¥á¥ó¥È("/*" ¤«¤é»Ï¤Þ¤ë¹Ô) ¤Ï¼¡¤Î "*/" ¤Þ¤Ç ¤½¤Î¤Þ¤Þ¤Î·Á¤Ç¥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£
¥Ñ¥¿¡¼¥ó
ÆþÎÏ¥Õ¥¡¥¤¥ë¤Î¥Ñ¥¿¡¼¥ó¤Ï³ÈÄ¥¤·¤¿Àµµ¬É½¸½¤ò»È¤Ã¤Æµ½Ò¤·¤Þ¤¹¡£ °Ê²¼¤Ë¼¨¤·¤Þ¤¹:x ʸ»ú 'x' ¤Ë¥Þ¥Ã¥Á¡£ . ²þ¹Ô¤ò½ü¤¯Á´¤Æ¤Îʸ»ú(¥Ð¥¤¥È)¡£ [xyz] "ʸ»ú¥¯¥é¥¹"; ¤³¤Î¾ì¹ç¡¢'x', 'y', 'z' ¤Î¤¤¤º¤ì¤Ë¤â ¥Þ¥Ã¥Á¤·¤Þ¤¹¡£ [abj-oZ] ÈÏ°Ï»ØÄê¤ò´Þ¤à "ʸ»ú¥¯¥é¥¹"; ¤³¤Î¾ì¹ç¡¢'a', 'b' ¤È 'j' ¤«¤é 'o' ¤Þ¤Ç¤ÎǤ°Õ¤Î¥ì¥¿¡¼¤È 'Z' ¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£ [^A-Z] "ÈÝÄêʸ»ú¥¯¥é¥¹"; ¥¯¥é¥¹¤Ë´Þ¤Þ¤ì¤Ê¤¤Ç¤°Õ¤Îʸ»ú¤Ë ¥Þ¥Ã¥Á¤·¤Þ¤¹¡£ ¤³¤Î¾ì¹ç¡¢'A' ¤«¤é 'Z' ¤Þ¤Ç¤ÎÂçʸ»ú ¡Ö°Ê³°¤Î¡×ʸ»ú¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£ [^A-Z\n] Âçʸ»ú¤È²þ¹Ô¤ò¡Ö½ü¤¯¡×Á´¤Æ¤Îʸ»ú¡£ r* 0 ¤â¤·¤¯¤Ï¤½¤ì°Ê¾å¤Î r¡£r ¤ÏǤ°Õ¤ÎÀµµ¬É½¸½¡£ r+ 1 ¤â¤·¤¯¤Ï¤½¤ì°Ê¾å¤Î r¡£ r? 0 ¤â¤·¤¯¤Ï 1¤Ä¤Î r (¡Ö¤ª¤Þ¤±¡×¤Î r) r{2,5} 2 ¤Ä¤«¤é 5¤Ä¤Þ¤Ç¤Î r¡£ r{2,} 2 ¤Ä°Ê¾å¤Î r¡£ r{4} ¤Á¤ç¤¦¤É 4¤Ä ¤Î r¡£ {̾Á°} "̾Á°" ¤ÎÄêµÁ¤ÎŸ³«¡£ (¾å¤ò»²¾È) "[xyz]\"foo" ʸ»úÎó [xyz]"foo \X X ¤¬ 'a', 'b', 'f', 'n', 'r', 't', 'v' ¤Î¤¤¤º¤ì¤«¤Î ¤È¤¡¢ANSI-C ¤Ç¤Î \X ¤Î²ò¼á¤È¤Ê¤ê¤Þ¤¹¡£ ¤½¤ì°Ê³°¤Î¾ì¹ç¡¢Ê¸»ú 'X' ('*' ¤Î¤è¤¦¤Ê¥ª¥Ú¥ì¡¼¥¿¤Î °ÕÌ£¤òÂǤÁ¾Ã¤·¡¢¤½¤Îʸ»ú¼«ÂΤò»ØÄꤹ¤ëºÝ¤Ë»È¤¤¤Þ¤¹)¡£ \123 8¿Ê¿ô¤Ç 123 ¤Èɽ¤µ¤ì¤ëʸ»ú¡£ \x2a 16¿Ê¿ô¤Ç 2a ¤Èɽ¤µ¤ì¤ëʸ»ú¡£ (r) r ¤Ë¥Þ¥Ã¥Á; ()¤Ï Í¥Àè½ç°Ì¤òÊѤ¨¤ë¤¿¤á¤Ë»ÈÍÑ¡£ (°Ê²¼¤ò»²¾È) rs Àµµ¬É½¸½ r ¤ËÀµµ¬É½¸½ s ¤¬Â³¤¯; ¡ÖÏ¢·ë(concatenation)¡× ¤È¸Æ¤Ó¤Þ¤¹¡£ r|s r ¤â¤·¤¯¤Ï s¡£ r/s ¸å¤í¤Ë s ¤¬Â³¤¯»þ¤Î r¡£ s ¤Ë¥Þ¥Ã¥Á¤¹¤ë¥Æ¥¥¹¥È¤Ï¤³¤Î¥ë¡¼¥ë¤Î "ºÇĹŬ¹ç" ¤òȽÄꤹ¤ë »þ¤Ë¤Ï´Þ¤Þ¤ì¤Þ¤¹¤¬¡¢¥¢¥¯¥·¥ç¥ó¤¬¼Â¹Ô¤µ¤ì¤ëÁ°¤Ë ÆþÎϤËÌᤵ¤ì¤Þ¤¹¡£ ¥¢¥¯¥·¥ç¥ó¤Ï r ¤Ë¥Þ¥Ã¥Á¤¹¤ë¥Æ¥¥¹¥È¤À¤±¤ò¸«¤Þ¤¹¡£ ¤³¤Î¥Ñ¥¿¡¼¥ó¤Ï "±¦Ê¸Ì®(trailing context)" ¤È¸Æ¤Ð¤ì¤Þ¤¹¡£ (flex ¤¬Àµ³Î¤Ë¥Þ¥Ã¥ÁÉÔǽ¤Ê r/s ¤ÎÁȹ礻¤ÏÊ£¿ô¤¢¤ê¤Þ¤¹; "´í¸±¤Ê±¦Ê¸Ì®" ¤Ë¤Ä¤¤¤Æ¤Ï¡¢ °Ê¹ß¤Î¡¢·ç´Ù / ¥Ð¥° ¤ÎÀá¤Îµ½Ò¤ò¸«¤Æ²¼¤µ¤¤¡£) ^r ¹ÔƬ¤Ë¤¢¤ë r¡£(¥¹¥¥ã¥ó¤Î»Ï¤Þ¤ê¤â¤·¤¯¤Ï ¥¹¥¥ã¥ó¤µ¤ì¤¿²þ¹Ô¤Î±¦¤Ç¤¹)¡£ r$ ¹ÔËö¤Ë¤¢¤ë r¡£"r/\n" ¤ÈÅù²Á(²þ¹Ô¤ÎÁ°¤Ç¤¹)¡£ "r/\n" ¤ÈƱ¤¸¤Ç¤¹¡£ flex ¤Î "²þ¹Ô" ¤Îɽ¸½¤Ï flex ¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤¿ C ¥³¥ó¥Ñ¥¤¥é¤¬²ò¼á¤¹¤ë '\n' ¤È´°Á´¤Ë°ìÃפ¹¤ë¤³¤È¤Ë Ãí°Õ¤·¤Æ²¼¤µ¤¤; ÆÃÄê¤Î¥·¥¹¥Æ¥à DOS ¤Ç¤Ï \r ¤òÆþÎϤ«¤é¼è¤ê½ü¤¯¤« "r$" ¤òɽ¤¹¤¿¤á¤ËÌÀ¼¨Åª¤Ë r/\r\n ¤ò»ÈÍѤ¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ <s>r ³«»Ï¾ò·ï s ¤Ë¤ª¤±¤ë r¡£(³«»Ï¾ò·ï¤Ë¤Ä¤¤¤Æ¤Ï°Ê²¼¤ò »²¾È)¡£ <s1,s2,s3>r ¾å¤ËƱ¤¸¡£¤¿¤À¤·³«»Ï¾ò·ï¤Ï s1, s2, s3 ¤Î¤¤¤º¤ì¤Ç¤â¤è¤¤¡£ <*>r Ǥ°Õ¤Î³«»Ï¾ò·ï¤Î r¡£³«»Ï¾ò·ï¤ÏÇÓ¾Ū¤Ê¤â¤Î¤Ç¤â¤è¤¤¡£ <<EOF>> ¥Õ¥¡¥¤¥ë¤Î½ªÎ»¡£ <s1,s2><<EOF>> ³«»Ï¾ò·ï¤¬ s1 ¤â¤·¤¯¤Ï s2 ¤Ç¤¢¤ë¤È¤¤Î¥Õ¥¡¥¤¥ë¤Î½ªÎ»¡£Ê¸»ú¥¯¥é¥¹Ãæ¤Ç¤Ï¡¢Á´¤Æ¤ÎÀµµ¬É½¸½¤Î¥ª¥Ú¥ì¡¼¥¿¤Ï¡¢ ¥¨¥¹¥±¡¼¥× ('\') ¤ª¤è¤Ó ʸ»ú¥¯¥é¥¹¥ª¥Ú¥ì¡¼¥¿¤Ç¤¢¤ë '-' ¤È ']' ¤È¥¯¥é¥¹¤ÎÀèƬ¤Î '^' ¤ò½ü¤ ÆÃÊ̤ʰÕÌ£¤ò¼º¤¦¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
¾å¤Ëµó¤²¤¿Àµµ¬É½¸½¤ÏÍ¥Àè½ç°Ì¤Ë¤è¤Ã¤Æ¥°¥ë¡¼¥×¤Ëʬ¤±¤é¤ì¤Æ¤¤¤Þ¤¹¡£ °ìÈÖ¾å¤Î¥°¥ë¡¼¥×¤¬ºÇ¤â¹â¤¤Í¥ÀèÅ٤ǡ¢ °ìÈÖ²¼¤Î¥°¥ë¡¼¥×¤ÎÍ¥Àè½ç°Ì¤¬ºÇ¤âÄ㤯¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ ¥°¥ë¡¼¥×Æâ¤Ç¤ÏƱ¤¸Í¥Àè½ç°Ì¤Ç¤¹¡£Î㤨¤Ð¡¢
foo|bar*¤Ï
(foo)|(ba(r*))¤ÈƱ¤¸¤Ç¤¹¡£¤Ê¤¼¤Ê¤é '*' ¥ª¥Ú¥ì¡¼¥¿¤ÏÏ¢·ë¤è¤êÍ¥ÀèÅÙ¤¬¹â¤¯¡¢ Ï¢·ë¤ÏÁª¸À ('|') ¤è¤êÍ¥ÀèÅÙ¤¬¹â¤¤¤«¤é¤Ç¤¹¡£¤³¤Î¥Ñ¥¿¡¼¥ó¤Ï ʸ»úÎó "foo" ¤â¤·¤¯¤Ï ʸ»úÎó "ba" ¤Ë 0 ¸Ä°Ê¾å¤Î r ¤¬¤Ä¤Å¤¯¤â¤Î¤Î ¤É¤Á¤é¤Ë¤â ¥Þ¥Ã¥Á¤·¤Þ¤¹¡£ "foo" ¤â¤·¤¯¤Ï 0 ¸Ä°Ê¾å¤Î "bar" ¤Ë¥Þ¥Ã¥Á¤µ¤»¤ë¤¿¤á¤Ë¤Ï¼¡¤Îɽ¸½¤ò»ÈÍѤ·¤Æ²¼¤µ¤¤:
foo|(bar)*0 ¸Ä°Ê¾å¤Î "foo" ¤Þ¤¿¤Ï "bar" ¤Ë¥Þ¥Ã¥Á¤¹¤ë¤¿¤á¤Ë¤Ï¼¡¤Îɽ¸½¤ò»ÈÍѤ·¤Æ²¼¤µ¤¤:
(foo|bar)*
ʸ»ú¤â¤·¤¯¤Ïʸ»úÈϰϤ˲䨡¢Ê¸»ú¥¯¥é¥¹¤âʸ»ú¥¯¥é¥¹¤Î ɽ¸½ ¤ò´Þ¤ß¤Þ¤¹¡£ ¤³¤ì¤é¤Îɽ¸½¤Ï [: ¤ª¤è¤Ó :] ¤Î¥Ç¥ê¥ß¥¿¤Ë°Ï¤Þ¤ì¤Þ¤¹ (ʸ»ú¥¯¥é¥¹¤Î '[' ¤È ']' ¤È¤Î´Ö¤Ë¸½¤ì¤ëɬÍפ¬¤¢¤ê¤Þ¤¹; ¾¤ÎÍ×ÁǤ¬Ê¸»ú¥¯¥é¥¹Ãæ¤Ë¸½¤ì¤Æ¤â¹½¤¤¤Þ¤»¤ó)¡£ ͸ú¤Êɽ¸½¤Ï°Ê²¼¤ÎÄ̤ê¤Ç¤¹:
[:alnum:] [:alpha:] [:blank:] [:cntrl:] [:digit:] [:graph:] [:lower:] [:print:] [:punct:] [:space:] [:upper:] [:xdigit:]¤³¤ì¤é¤Îɽ¸½¤ÏÂбþ¤¹¤ëɸ½à C ¤Î isXXX ´Ø¿ô¤ËŬ¹ç¤¹¤ëÁ´¤Æ¤Îʸ»ú½¸¹ç¤ò»Ø¼¨¤·¤Þ¤¹¡£Î㤨¤Ð¡¢ [:alnum:] ¤Ï isalnum() ¤¬¿¿¤òÊÖ¤¹Ê¸»ú¤ò»Ø¼¨¤·¤Þ¤¹ - ¤¹¤Ê¤ï¤Á¤¹¤Ù¤Æ¤Î¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È¤È¿ô»ú¤Ç¤¹¡£ isblank(), ¤¬Ìµ¤¤¥·¥¹¥Æ¥à¤Ç¤Ï¡¢flex ¤Ï [:blank:] ¤ò¶õÇò¤È¥¿¥Ö¤ÈÄêµÁ¤·¤Þ¤¹¡£
Î㤨¤Ð°Ê²¼¤Îɽ¸½¤ÏÁ´¤ÆƱ¤¸¤Ç¤¹:
[[:alnum:]] [[:alpha:][:digit:]] [[:alpha:]0-9] [a-zA-Z0-9]¥¹¥¥ã¥Ê¤¬Âçʸ»ú¾®Ê¸»ú¤ò°Õ¼±¤·¤Ê¤¤¾ì¹ç( -i ¥Õ¥é¥°»ØÄê»þ) [:upper:] ¤È [:lower:] ¤Ï [:alpha:] ¤ÈƱ¤¸¤Ç¤¹¡£
¥Ñ¥¿¡¼¥ó¤Ë´Ø¤¹¤ëÃí°ÕÅÀ¤Ç¤¹:
- -
- ÈÝÄêʸ»ú¥¯¥é¥¹¡¢Î㤨¤Ð¾å¤Î "[^A-Z]" ¤Ï "\n" (¤â¤·¤¯¤Ï¤³¤ì¤òɽ¤¹¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹) ¤¬ÌÀ¼¨Åª¤Ë ÈÝÄêʸ»ú¥¯¥é¥¹¤Ë¸½¤ì¤Æ¤¤¤ë¾ì¹ç (Î㤨¤Ð "[^A-Z\n]") ¤ò½ü¤ ²þ¹Ô¤Ë¥Þ¥Ã¥Á¤·¤Þ¤¹¡£ ¤³¤ì¤Ï¾¤ÎÀµµ¬É½¸½¥Ä¡¼¥ë¤¬ÈÝÄêʸ»ú¥¯¥é¥¹¤ò°·¤¦ÊýË¡¤È¤Ï°Û¤Ê¤ê¤Þ¤¹¤¬¡¢ ÉÔ¹¬¤Ê¤³¤È¤Ë¤³¤ÎÌ·½â¤ÏÎò»ËŪ¤Ë³ÎΩ¤·¤Æ¤¤¤Þ¤¹¡£ ²þ¹Ô¤Ë¥Þ¥Ã¥Á¤¹¤ë¤È¤Ï¡¢ ÆþÎϤËÊ̤Υ¯¥ª¡¼¥È¤¬Â¸ºß¤·¤Ê¤¤¾ì¹ç¤Ë [^"]* ¤Î¤è¤¦¤Ê¥Ñ¥¿¡¼¥ó¤¬ ÆþÎÏÁ´ÂΤ˥ޥåÁ¤¹¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£
- -
- ¥ë¡¼¥ë¤Ï±¦Ê¸Ì®('/' ¥ª¥Ú¥ì¡¼¥¿¤â¤·¤¯¤Ï '$' ¥ª¥Ú¥ì¡¼¥¿) ¤ò¹â¡¹°ì¤Ä¤·¤«»ý¤Æ¤Þ¤»¤ó¡£ ³«»Ï¾ò·ï '^' ¤È "<<EOF>>" ¥Ñ¥¿¡¼¥ó¤Ï ¥Ñ¥¿¡¼¥ó¤ÎºÇ½é¤Ë¤Ê¤±¤ì¤Ð¤Ê¤é¤º¡¢ '/', '$' ƱÍÍ¤Ë () Æâ¤Ë¤¤¤ì¤ë¤³¤È¤Ï½ÐÍè¤Þ¤»¤ó¡£ ¥ë¡¼¥ë¤ÎÀèƬ¤Ç¤Ï¤Ê¤¤ '^' ¤â¤·¤¯¤Ï¥ë¡¼¥ë¤Î½ª¤ê¤Ç¤Ï¤Ê¤¤ '$' ¤Ï ÆÃÊ̤ʰÕÌ£¤ò¼º¤¤¡¢Ä̾ï¤Îʸ»ú¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹¡£
- °Ê²¼¤Ï̵¸ú¤Ç¤¹:
-
foo/bar$ <sc1>foo<sc2>bar
Á°¼Ô¤Ï "foo/bar\n" ¤È½ñ¤±¤Þ¤¹¡£ - °Ê²¼¤Ç¤Ï '$' ¤È '^' ¤È¤ÏÄ̾ï¤Îʸ»ú¤È¤·¤Æ°·¤ï¤ì¤Þ¤¹:
-
foo|(bar$) foo|^bar
"foo" ¤â¤·¤¯¤Ï "²þ¹Ô¤¬Â³¤¯ bar" ¤ò»ØÄꤷ¤¿¤¤¾ì¹ç¤Ï¡¢ ¼¡¤Îɽ¸½¤ò»ÈÍѤ·¤Æ²¼¤µ¤¤ (ÆÃÊÌ¤Ê '|' ¤ÎÆ°ºî¤Ï¸å¤ÇÀâÌÀ¤·¤Þ¤¹):foo | bar$ /* action goes here */
Ʊ¤¸ÊýË¡¤Ç¡¢foo ¤â¤·¤¯¤Ï ¹ÔƬ¤Î bar ¤ò»ØÄê²Äǽ¤Ç¤¹¡£
ÆþÎϤΥޥåÁÊýË¡
À¸À®¤·¤¿¥¹¥¥ã¥Ê¤ò¼Â¹Ô¤¹¤ë¤È¡¢ ¥¹¥¥ã¥Ê¤ÏÆþÎϤò¸«¤Æ¥Ñ¥¿¡¼¥ó¤Ë¥Þ¥Ã¥Á¤¹¤ëʸ»úÎó¤òõ¤·¤Þ¤¹¡£ 1 ¤è¤ê¿¤¯¤Î¥Þ¥Ã¥Á¤ò¸«ÉÕ¤±¤ë¤È¡¢ºÇĹ¥Æ¥¥¹¥È¤Î¥Þ¥Ã¥Á¤òºÎÍѤ·¤Þ¤¹ (±¦Ê¸Ì®(trailing context rule)¤Î¸å¤í¤ÎÉôʬ¤âŤµ¤Ë´Þ¤ß¤Þ¤¹¤¬¡¢ ¸å¤í¤ÎÉôʬ¤ÏÆþÎϤËÌᤵ¤ì¤Þ¤¹)¡£ Ʊ¤¸Ä¹¤µ¤Î¥Þ¥Ã¥Á¤ò 2 ¤Ä°Ê¾å¸«ÉÕ¤±¤¿¾ì¹ç¡¢ flex ÆþÎÏ¥Õ¥¡¥¤¥ë¤ÇºÇ½é¤Ëµ½Ò¤µ¤ì¤¿¥ë¡¼¥ë¤òºÎÍѤ·¤Þ¤¹¡£¥Þ¥Ã¥Á¤¬·èÄꤹ¤ë¤È¡¢¥Þ¥Ã¥Á¤ËÂбþ¤¹¤ë¥Æ¥¥¹¥È( ¥È¡¼¥¯¥ó ¤È¸Æ¤Ð¤ì¤Þ¤¹)¤¬¥°¥í¡¼¥Ð¥ëʸ»ú¥Ý¥¤¥ó¥¿ yytext ¤Ë¤è¤ê»ÈÍѲÄǽ¤È¤Ê¤ê¡¢Ä¹¤µ¤¬¥°¥í¡¼¥Ð¥ëÀ°¿ô yyleng ¤Ë¤è¤ê»ÈÍѲÄǽ¤È¤Ê¤ê¤Þ¤¹¡£ ¤½¤Î¸å¡¢¥Þ¥Ã¥Á¤·¤¿¥Ñ¥¿¡¼¥ó¤ËÂбþ¤¹¤ë ¥¢¥¯¥·¥ç¥ó ¤¬¼Â¹Ô¤µ¤ì(¥¢¥¯¥·¥ç¥ó¤Î¾ÜºÙ¤Êµ½Ò¤Ï¸å¤Ç¹Ô¤¤¤Þ¤¹)¡¢ »Ä¤ê¤ÎÆþÎϤ¬»Ä¤ê¤Î¥Þ¥Ã¥Á¤Î¤¿¤á¤Ë¥¹¥¥ã¥ó¤µ¤ì¤Þ¤¹¡£
¥Þ¥Ã¥Á¤¬¸«ÉÕ¤«¤é¤Ê¤¤¤È¡¢ ¥Ç¥Õ¥©¥ë¥È¥ë¡¼¥ë ¤¬¼Â¹Ô¤µ¤ì¤Þ¤¹: ÆþÎϤμ¡¤Îʸ»ú¤¬¥Þ¥Ã¥Á¤·¤¿¤È¸«Ê蘆¤ì¡¢ ɸ½à½ÐÎϤ˥³¥Ô¡¼¤µ¤ì¤Þ¤¹¡£ºÇ¤â´Êñ¤ÇÀµÅö¤Ê flex ¤ÎÆþÎϤϰʲ¼¤ÎÄ̤ê¤Ç¤¹:
%%¤³¤ì¤Ï¡¢ÆþÎϤòñ½ã¤Ë½ÐÎϤ˥³¥Ô¡¼(1 ÅÙ¤Ë 1 ʸ»ú¤º¤Ä)¤¹¤ë¥¹¥¥ã¥Ê¤òÀ¸À®¤·¤Þ¤¹¡£
yytext ¤Ï 2 ¤Ä¤Î°Û¤Ê¤Ã¤¿ÊýË¡¤Ë¤è¤êÄêµÁ¤µ¤ì¤¦¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤: ʸ»ú ¥Ý¥¤¥ó¥¿ ¤â¤·¤¯¤Ïʸ»ú ÇÛÎó ¤Ç¤¹¡£ flex ¤¬¤É¤Á¤é¤ÎÄêµÁ¤ò»ÈÍѤ¹¤ë¤«¤ÏÆÃÊ̤ʥǥ£¥ì¥¯¥Æ¥£¥Ö %pointer ¤â¤·¤¯¤Ï %array ¤ò flex ¤ÎÆþÎϤκǽé¤Î(ÄêµÁ)Éôʬ¤Ë´Þ¤á¤ë¤³¤È¤Ë¤è¤êÀ©¸æ¤Ç¤¤Þ¤¹¡£ ¥Ç¥Õ¥©¥ë¥È¤Ï %pointer ¤Ç¤¢¤ê¡¢ -l lex ¸ß´¹¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤¿¾ì¹ç¤Ë¤ÏÎ㳰Ū¤Ë yytext ¤ÏÇÛÎó¤Ë¤Ê¤ê¤Þ¤¹¡£ %pointer ¤ò»ÈÍѤ¹¤ëÍøÅÀ¤Ï¥¹¥¥ã¥ó¤¬¹â®¤Ç¤¢¤ë¤³¤È¡¢ Èó¾ï¤ËÂ礤ʥȡ¼¥¯¥ó¤Ë¥Þ¥Ã¥Á¤¹¤ë»þ¤Ë¤â (ưŪ¥á¥â¥ê¤ò»ÈÍѤ·¿Ô¤¯¤µ¤Ê¤¤¸Â¤ê)¥Ð¥Ã¥Õ¥¡¥ª¡¼¥Ð¥Õ¥í¡¼¤È¤Ê¤é¤Ê¤¤¤³¤È¤Ç¤¹¡£ ·çÅÀ¤Ï¡¢¥¢¥¯¥·¥ç¥ó¤¬ yytext ¤ò½¤Àµ¤¹¤ë¤³¤È¤¬À©¸Â¤µ¤ì¤ë¤³¤È(¼¡ÀỲ¾È)¡¢ unput() ¸Æ¤Ó½Ð¤·¤¬ yytext ¤Î¸½ºß¤ÎÆâÍƤòÇ˲õ¤¹¤ë¤³¤È¤Ç¤¹¡£ ¤³¤ì¤Ï°Û¤Ê¤ë lex ¥Ð¡¼¥¸¥ç¥ó´Ö¤Ç¤Î°Ü¿¢À¤Ë´Ø¤¹¤ëƬÄˤμï¤Ç¤¹¡£
%array ¤ÎÍøÅÀ¤Ï yytext ¤ÎÆâÍƤò»×¤Ã¤¿Ä̤ê¤ËÊѹ¹¤Ç¤¤ë¤³¤È¡¢ unput() ¤ò¸Æ¤Ó½Ð¤·¤Æ¤â yytext ¤ÎÆâÍƤ¬Ç˲õ¤µ¤ì¤Ê¤¤¤³¤È¤Ç¤¹(²¼µ»²¾È)¡£ ¤½¤Î¾å¡¢´û¸¤Î lex ¥×¥í¥°¥é¥à¤Ï yytext ¤ò³°Éô¤«¤é¼¡¤Î·Á¼°¤ÎÀë¸À¤ò»ÈÍѤ·¤Æ¥¢¥¯¥»¥¹¤·¤Æ¤¤¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹:
extern char yytext[];¤³¤ÎÄêµÁ¤Ï %pointer »ÈÍÑ»þ¤Ë¤Ï¸í¤ê¤Ç¤¹¤¬¡¢ %array »ÈÍÑ»þ¤Ë¤ÏÀµ¤·¤¤¤Ç¤¹¡£
%array ¤Ï yytext ¤òʸ»ú¿ô YYLMAX (¥Ç¥Õ¥©¥ë¥È¤Ï½½Ê¬Â礤ÊÃÍ)¤ÎÇÛÎó¤Ç¤¢¤ë¤ÈÄêµÁ¤·¤Þ¤¹¡£ ¤³¤ÎÂ礤µ¤Ï¡¢ flex ¤ÎÆþÎϤκǽé¤ÎÉôʬ¤Çñ½ã¤Ë YYLMAX ¤ò°Û¤Ê¤Ã¤¿ÃÍ¤Ë #define ¤¹¤ë¤³¤È¤Ë¤è¤êÊѹ¹¤Ç¤¤Þ¤¹¡£ ¾åµ¤ÎÄ̤ꡢ %pointer »ÈÍÑ»þ¤Ë¤Ï yytext ¤ÏÂ礤ʥȡ¼¥¯¥ó¤ò³ÊǼ¤¹¤ë¤¿¤á¤ËưŪ¤ËÂ礤¯¤Ê¤ê¤Þ¤¹¡£ ¤³¤Î¤³¤È¤Ï %pointer ¤ò»ÈÍѤ·¤¿¥¹¥¥ã¥Ê¤ÏÈó¾ï¤ËÂ礤ʥȡ¼¥¯¥ó (Î㤨¤Ð¥³¥á¥ó¥È¥Ö¥í¥Ã¥¯Á´ÂÎ)¤ò³ÊǼ²Äǽ¤Ç¤¢¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¤¬¡¢ ¥¹¥¥ã¥Ê¤¬ yytext ¤ÎÂ礤µ¤òÊѤ¨¤ë¤¿¤Ó¤Ë¥È¡¼¥¯¥óÁ´ÂΤòÀèƬ¤«¤éºÆ¥¹¥¥ã¥ó¤¹¤ë¤³¤È¤¬É¬ÍפȤʤ뤿¤á ¤³¤Î¤è¤¦¤Ê¥È¡¼¥¯¥ó¤ËÂФ¹¤ë¥Þ¥Ã¥Á¥ó¥°¤ÏÃÙ¤¯¤Ê¤ê¤¦¤ë¤³¤È¤ò³Ð¤¨¤Æ¤ª¤¤¤Æ²¼¤µ¤¤¡£ ¸½ºß¡¢ yytext ¤Ï unput() ¤¬·ë²Ì¤È¤·¤ÆÊÖ¤¹¥Æ¥¥¹¥È¤¬Â礤¤»þ¤Ë¤ÏưŪ¤Ë¤ÏÂ礤¯¤Ê¤ê ¤Þ¤»¤ó; ¼Â¹Ô»þ¥¨¥é¡¼¤È¤Ê¤ê¤Þ¤¹¡£
¤Þ¤¿¡¢ %array ¤Ï C++ ¥¹¥¥ã¥Ê¥¯¥é¥¹¤Ç¤Ï»ÈÍѤǤ¤Ê¤¤¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤( c++ ¥ª¥×¥·¥ç¥ó¤Ë´Ø¤·¤Æ¤Ï²¼µ»²¾È)¡£
¥¢¥¯¥·¥ç¥ó
¥ë¡¼¥ëÃæ¤Î¥Ñ¥¿¡¼¥ó¤ÏÂбþ¤¹¤ë¥¢¥¯¥·¥ç¥ó¤ò»ý¤Á¤Þ¤¹¡£ ¥¢¥¯¥·¥ç¥ó¤ÏǤ°Õ¤Î C ¤Îʸ¤Ç¤¹¡£ ¥Ñ¥¿¡¼¥ó¤ÏºÇ½é¤Î¥¨¥¹¥±¡¼¥×¤µ¤ì¤Æ¤¤¤Ê¤¤¶õÇòʸ»ú¤Ç½ª¤ê¤Þ¤¹; ¹Ô¤Î»Ä¤ê¤¬¥¢¥¯¥·¥ç¥ó¤Ç¤¹¡£ ¥¢¥¯¥·¥ç¥ó¤¬¶õ¤Ç¤¢¤ë¾ì¹ç¡¢ ¥Ñ¥¿¡¼¥ó¤¬¥Þ¥Ã¥Á¤·¤¿»þ¤ËÆþÎϥȡ¼¥¯¥ó¤Ïñ½ã¤Ë¼Î¤Æ¤é¤ì¤Þ¤¹¡£ Î㤨¤ÐÆþÎϤ«¤éÁ´¤Æ¤Î "zap me" ¤òºï½ü¤¹¤ë¥×¥í¥°¥é¥à¤Î»ÅÍͤò¼¨¤·¤Þ¤¹:%% "zap me"(ÆþÎϤξ¤ÎÁ´¤Æ¤Îʸ»ú¤ò½ÐÎϤ˥³¥Ô¡¼¤·¤Þ¤¹¡£ ¤Ê¤¼¤Ê¤é¥Ç¥Õ¥©¥ë¥È¥ë¡¼¥ë¤Ë¥Þ¥Ã¥Á¤¹¤ë¤«¤é¤Ç¤¹¡£)
¼¡¤Ï¡¢Ê£¿ô¤Î¶õÇò¤äʸ»ú¤òñ°ì¤Î¶õÇò¤Ë°µ½Ì¤·¹ÔËö¤Î¶õÇò¤ò¼Î¤Æ¤ë¥×¥í¥°¥é¥à¤Ç¤¹:
%% [ \t]+ putchar( ' ' ); [ \t]+$ /* ignore this token */
¥¢¥¯¥·¥ç¥ó¤¬ '{' ¤ò´Þ¤à¾ì¹ç¡¢¥¢¥¯¥·¥ç¥ó¤ÏÂбþ¤¹¤ë '}' ¤Þ¤Ç³¤¡¢ Ê£¿ô¹Ô¤ËÅϤë¾ì¹ç¤â¤¢¤ê¤Þ¤¹¡£ flex ¤Ï C ¤Îʸ»úÎ󤪤è¤Ó¥³¥á¥ó¥È¤Ë´Ø¤·¤ÆÃΤäƤª¤ê¡¢ ¤½¤ì¤é¤ÎÃæ¤Î¥Ö¥ì¡¼¥¹¤ò¸í²ò¤¹¤ë¤³¤È¤Ï¤¢¤ê¤Þ¤»¤ó¤¬¡¢ ¥¢¥¯¥·¥ç¥ó¤¬ %{ ¤Ç»Ï¤Þ¤ë¤³¤È¤òµö¤·¡¢¼¡¤Î %} ¤Þ¤Ç¤Î¥Æ¥¥¹¥È¤¬¥¢¥¯¥·¥ç¥ó¤Ç¤¢¤ë¤È¤·¤Þ¤¹ (¥¢¥¯¥·¥ç¥óÆâÉô¤ÎǤ°Õ¸Ä¤Î¥Ö¥ì¡¼¥¹¤Ë¤Ï´Ø·¸¤¢¤ê¤Þ¤»¤ó)¡£
¿âľ¥Ð¡¼ ('|') ¤Î¤ß¤«¤é¤Ê¤ë¥¢¥¯¥·¥ç¥ó¤Ï "¼¡¤Î¥ë¡¼¥ë¤ÈƱ¤¸" ¤ò°ÕÌ£¤·¤Þ¤¹¡£ÀâÌÀ¤Ï°Ê²¼¤ò¸«¤Æ²¼¤µ¤¤¡£
¥¢¥¯¥·¥ç¥ó¤ÏǤ°Õ¤Î C ¥³¡¼¥É¤ò´Þ¤à¤³¤È¤¬½ÐÍè¤Þ¤¹¡£ ¤³¤ì¤Ë¤Ï¡¢ yylex() ¤ò¸Æ¤Ó½Ð¤·¤¿¥ë¡¼¥Á¥ó¤ËÂФ·¤ÆÃͤòÊÖ¤¹ return ʸ¤â´Þ¤Þ¤ì¤Þ¤¹¡£ yylex() ¤¬¸Æ¤Ð¤ì¤ë¤¿¤Ó¡¢ºÇ¸å¤Ë»Ä¤Ã¤¿¥È¡¼¥¯¥ó¤«¤é½èÍý¤òºÆ³«¤·¡¢ ¥Õ¥¡¥¤¥ë¤Î½ªÎ»¤â¤·¤¯¤Ï return ¤ò¼Â¹Ô¤¹¤ë¤Þ¤Ç½èÍý¤ò¹Ô¤¤¤Þ¤¹¡£
¥¢¥¯¥·¥ç¥ó¤Ï¼«Í³¤Ë yytext ¤òÊѹ¹¤Ç¤¤Þ¤¹¤¬¡¢Îã³°¤ÏŤµ¤òÁý¤ä¤¹¤³¤È¤Ç¤¹ (ʸ»ú¤òËöÈø¤Ë²Ã¤¨¤ë¤³¤È¤Ë¤Ê¤ê¡¢ ¤³¤ì¤ÏÆþÎÏ¥¹¥È¥ê¡¼¥à¤Î¸å³¤¹¤ëʸ»ú¤ò¾å½ñ¤¤·¤Þ¤¹)¡£ ¤³¤ì¤Ï %array »ÈÍÑ»þ¤Ë¤ÏÅö¤Æ¤Ï¤Þ¤ê¤Þ¤»¤ó(¾å½Ò); ¤³¤Î¾ì¹ç yytext ¤ò¼«Í³¤ËÊѹ¹¤Ç¤¤Þ¤¹¡£
¥¢¥¯¥·¥ç¥ó¤Ï¼«Í³¤Ë yyleng ¤òÊѹ¹¤Ç¤¤Þ¤¹¤¬¡¢¥¢¥¯¥·¥ç¥ó¤¬ yymore() ¤ò»ÈÍѤ¹¤ë»þ¤Ë¤ÏÎ㳰Ū¤ËÊѹ¹¤·¤Æ¤Ï¤¤¤±¤Þ¤»¤ó(¸å½Ò)¡£
¿¤¯¤ÎÆÃÊ̤ʥǥ£¥ì¥¯¥Æ¥£¥Ö¤¬¤¢¤ê¡¢¥¢¥¯¥·¥ç¥óÃæ¤Ë´Þ¤á¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹:
- -
- ECHO yytext ¤ò¥¹¥¥ã¥Ê¤Î½ÐÎϤ˥³¥Ô¡¼¤·¤Þ¤¹¡£
- -
- BEGIN ¸å¤í¤Ë³«»Ï¾ò·ï¤Î̾Á°¤ò½ñ¤¯¤È¡¢¥¹¥¥ã¥Ê¤òÂбþ¤¹¤ë³«»Ï¾ò·ï¤ËÀßÄꤷ¤Þ¤¹(¸å½Ò)¡£
- -
- REJECT ÆþÎÏ(¤â¤·¤¯¤ÏÆþÎϤÎƬ)¤Ë "2 ÈÖÌܤˤ褯(second best)" ¥Þ¥Ã¥Á¤¹¤ë¥ë¡¼¥ë ¤Ë¿Ê¤à¤è¤¦¤Ë¥¹¥¥ã¥Ê¤Ë»Ø¼¨¤·¤Þ¤¹¡£ "ÆþÎϤΥޥåÁÊýË¡" ¤Ç¼¨¤·¤¿¤è¤¦¤Ë¥ë¡¼¥ë¤ÏÁªÂò¤µ¤ì¡¢ yytext ¤È yyleng ¤ÏŬÀÚ¤ËÀßÄꤵ¤ì¤Þ¤¹¡£ ÁªÂò¤µ¤ì¤ë¥ë¡¼¥ë¤Ï¡¢ºÇ½é¤ËÁªÂò¤µ¤ì¤¿¥ë¡¼¥ë¤ÈƱ¤¸Ä¹¤µ¤Ç¤¢¤ë¤¬ flex ¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤Ë¤Æ¸å¤Ç½Ð¤ÆÍè¤ë¤â¤Î¡¢¤â¤·¤¯¤Ï¾¯¤Ê¤¤Ê¸»ú¿ô¤Ë¥Þ¥Ã¥Á¤¹¤ë¤â¤Î¤Ç¤¹¡£ Î㤨¤Ð¼¡¤ÎÎã¤Ç¤ÏÆþÎÏÃæ¤Î¸ì¤ò¿ô¤¨¡¢ "frob" ¤¬¸«ÉÕ¤«¤ë¤¿¤Ó¤Ë¥ë¡¼¥Á¥ó special() ¤ò¸Æ¤Ó¤Þ¤¹:
int word_count = 0; %% frob special(); REJECT; [^ \t\n]+ ++word_count;
REJECT ¤¬Ìµ¤¤¾ì¹ç¡¢ ÆþÎÏÃæ¤Î "frob" ¤Ï¸ì¤È¤·¤Æ¿ô¤¨¤é¤ì¤º¡¢ ¥¹¥¥ã¥Ê¤ÏÄ̾ïÄ̤ê¥È¡¼¥¯¥óËè¤Ë 1 ¤Ä¤Î¥¢¥¯¥·¥ç¥ó¤À¤±¤ò¹Ô¤¤¤Þ¤¹¡£ Ê£¿ô¤Î REJECT ¤ò»ÈÍѲÄǽ¤Ç¤¢¤ê¡¢¤½¤ì¤¾¤ì¸½ºß͸ú¤Ê¥ë¡¼¥ë¤Î¼¡¤ËÎɤ¤ÁªÂò¤ò¸«ÉÕ¤±¤Þ¤¹¡£ Î㤨¤Ð¼¡¤Î¥¹¥¥ã¥Ê¤Ï¡¢"abcd" ¤È¤¤¤¦¥È¡¼¥¯¥ó¤ò¥¹¥¥ã¥ó¤·¡¢ ½ÐÎÏ¤Ë "abcdabcaba" ¤ò½ñ¤¤Þ¤¹:%% a | ab | abc | abcd ECHO; REJECT; .|\n /* eat up any unmatched character */
(Á°¤Î 3 ¤Ä¤Î¥ë¡¼¥ë¤Ï 4 ÈÖÌܤΥ롼¥ë¤Î¥¢¥¯¥·¥ç¥ó¤ò¶¦Í¤·¤Þ¤¹¡£ ¤Ê¤¼¤Ê¤éÆÃÊÌ¤Ê '|' ¥¢¥¯¥·¥ç¥ó¤¬»ÈÍѤµ¤ì¤Æ¤¤¤ë¤«¤é¤Ç¤¹¡£) REJECT ¤Ï¥¹¥¥ã¥Ê¤ÎÀǽ¤È¤¤¤¦ÅÀ¤ÇÆä˥³¥¹¥È¤Î¤«¤«¤ëµ¡Ç½¤Ç¤¹; ¤â¤·¥¹¥¥ã¥Ê¤Î¥¢¥¯¥·¥ç¥ó¤Î ¤¤¤º¤ì¤« ¤Ë¤Ç¤â REJECT ¤¬»È¤ï¤ì¤¿¤Ê¤é¡¢¥¹¥¥ã¥Ê¤Î Á´¤Æ¤Î ¥Þ¥Ã¥Á¥ó¥°Â®ÅÙ¤òÄã²¼¤µ¤»¤ë¤È¤¤¤¦¤³¤È¤Ç¤¹¡£ ¤µ¤é¤Ë REJECT ¤ò¥ª¥×¥·¥ç¥ó -Cf ¤ä -CF ¤È¶¦¤ËÍѤ¤¤ë¤³¤È¤Ï½ÐÍè¤Þ¤»¤ó¡£ - ¤Þ¤¿¡¢Â¾¤ÎÆÃÊÌ¥¢¥¯¥·¥ç¥ó¤È°ã¤¤ REJECT ¤Ï ʬ´ô(branch) ¤Ç¤¢¤ë¤³¤È¤ËÃí°Õ¤·¤Æ¤¯¤À¤µ¤¤; ¤¹¤Ê¤ï¤Á REJECT ľ¸å¤Î¥¢¥¯¥·¥ç¥ó¤Ï ¼Â¹Ô ¤µ¤ì¤Þ¤»¤ó¡£
- -
- yymore() ¼¡¤Ë¥ë¡¼¥ë¤È¥Þ¥Ã¥Á¤·¤¿¤È¤¤Ë¤Ï¡¢Âбþ¤¹¤ë¥È¡¼¥¯¥ó¤Ï¡¢ ¸½ºß¤Î yytext ¤ÎÆâÍƤÈÆþ¤ì´¹¤¨¤ë¤Î¤Ç¤Ï¤Ê¤¯ yytext ¤Ë Äɲà ¤¹¤ë¤è¤¦¥¹¥¥ã¥Ê¤Ë»Ø¼¨¤·¤Þ¤¹¡£ Î㤨¤Ð¡¢ÆþÎÏ "mega-kludge" ¤¬Í¿¤¨¤é¤ì¤ë¤È¡¢°Ê²¼¤Ï "mega-mega-kludge" ¤ò½ÐÎϤ˽ñ¤¤Þ¤¹:
%% mega- ECHO; yymore(); kludge ECHO;
ºÇ½é¤Î "mega-" ¤Ï¥Þ¥Ã¥Á¤·½ÐÎϤ˥¨¥³¡¼¤µ¤ì¤Þ¤¹¡£ ¼¡¤Ë "kludge" ¤¬¥Þ¥Ã¥Á¤·¤Þ¤¹¤¬¡¢Ä¾Á°¤Î "mega-" ¤¬¤Þ¤À yytext ¤ÎÀèƬ¤Ë»Ä¤Ã¤Æ¤ª¤ê¡¢"kludge" ¤Î ECHO ¥ë¡¼¥ë¤Ï¼ÂºÝ¤Ë¤Ï "mage-kludge" ¤ò½ñ¤¤Þ¤¹¡£
yymore() ¤Î»ÈÍѤ˴ؤ· 2 ¤Ä¤ÎÃí°ÕÅÀ¤¬¤¢¤ê¤Þ¤¹¡£ ¤Þ¤º¡¢ yymore() ¤Ï¸½ºß¤Î¥È¡¼¥¯¥ó¤ÎÂ礤µ¤òÈ¿±Ç¤¹¤ë yyleng ¤ÎÃͤÎÀµ³Î¤µ¤Ë°Í¸¤¹¤ë¤³¤È¤Ç¤¢¤ê¡¢ yymore() »ÈÍÑ»þ¤Ë¤Ï yyleng ¤òÊѹ¹¤·¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó¡£ ¼¡¤Ë¡¢ ¥¹¥¥ã¥Ê¤Î¥¢¥¯¥·¥ç¥ó¤Ë yymore() ¤¬¤¢¤ë¤È¡¢¥¹¥¥ã¥Ê¤Î¥Þ¥Ã¥Á®Å٤˼㴳°±Æ¶Á¤¬¤¢¤ê¤Þ¤¹¡£
- -
- yyless(n) ¸½ºß¤Î¥È¡¼¥¯¥ó¤«¤éºÇ½é¤Î n ʸ»ú¤ò½ü¤¤¤¿¤â¤Î¤òÆþÎÏ¥¹¥È¥ê¡¼¥à¤ËÌᤷ¤Þ¤¹¡£ Ìᤷ¤¿Ê¸»úÎó¤Ï¥¹¥¥ã¥Ê¤¬¼¡¤Î¥Þ¥Ã¥Á¥ó¥°¤ò¤È¤ë¤È¤¤ËºÆÅÙ¥¹¥¥ã¥ó¤µ¤ì¤Þ¤¹¡£ yytext ¤È yyleng ¤ÏŬÀÚ¤ËÄ´À°¤µ¤ì¤Þ¤¹(Î㤨¤Ð yyleng ¤Ï n ¤È¤Ê¤ê¤Þ¤¹)¡£ Î㤨¤Ð¡¢ÆþÎÏ "foobar" ¤¬Í¿¤¨¤é¤ì¤ë¤È¡¢°Ê²¼¤Ï "foobarbar" ¤ò½ñ¤¤Þ¤¹:
%% foobar ECHO; yyless(3); [a-z]+ ECHO;
°ú¿ô 0 ¤ò yyless ¤ËÍ¿¤¨¤ë¤È¡¢¸½ºß¤ÎÆþÎÏʸ»úÎóÁ´ÂΤ¬ºÆÅÙ¥¹¥¥ã¥ó¤µ¤ì¤Þ¤¹¡£ (Î㤨¤Ð BEGIN ¤ò»ÈÍѤ·¤Æ)¼¡¤Ë¥¹¥¥ã¥Ê¤¬ÆþÎϤ¹¤ëÊýË¡¤òÊѹ¹¤·¤Æ¤¤¤Ê¤¤¤È¡¢Ìµ¸Â¥ë¡¼¥×¤È¤Ê¤ê¤Þ¤¹¡£
yyless ¤Ï¥Þ¥¯¥í¤Ç¤¢¤ê¡¢flex ÆþÎÏ¥Õ¥¡¥¤¥ë¤Ç¤Î¤ß»ÈÍѲÄǽ¤Ç¤¢¤ê¡¢ Ê̤Υ½¡¼¥¹¥Õ¥¡¥¤¥ë¤«¤é¤Ï»ÈÍÑÉÔǽ¤Ç¤¢¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
- -
- unput(c) ʸ»ú c ¤òÆþÎÏ¥¹¥È¥ê¡¼¥à¤ØÌᤷ¤Þ¤¹¡£Ìᤷ¤¿Ê¸»ú¤Ï¼¡¤Ë¥¹¥¥ã¥ó¤µ¤ì¤ëʸ»ú¤Ë¤Ê¤ê¤Þ¤¹¡£ ¼¡¤Î¥¢¥¯¥·¥ç¥ó¤Ï¸½ºß¤Î¥È¡¼¥¯¥ó¤ò¼è¤ê¾å¤²¡¢ ³ç¸ÌÆâ¤ËÆþ¤ì¤ÆºÆ¥¹¥¥ã¥ó¤·¤Þ¤¹¡£
{ int i; /* Copy yytext because unput() trashes yytext */ char *yycopy = strdup( yytext ); unput( ')' ); for ( i = yyleng - 1; i >= 0; --i ) unput( yycopy[i] ); unput( '(' ); free( yycopy ); }
unput() ¤Ïʸ»ú¤òÆþÎÏ¥¹¥È¥ê¡¼¥à¤Î ÀèƬ ¤ËÌ᤹¤Î¤Ç¡¢Ê¸»úÎó¤òÌ᤹¾ì¹ç¤Ë¤Ï¸å¤í¤«¤éÁ°¤Ë¸þ¤«¤Ã¤ÆÌ᤹ɬÍפ¬¤¢¤ê¤Þ¤¹¡£
unput() »ÈÍÑ»þ¤Î½ÅÍפÊÀøºßŪ¤ÊÌäÂê¤Ï¡¢ %pointer »ÈÍÑ»þ(¥Ç¥Õ¥©¥ë¥È)¤Ë unput() ¤ò¸Æ¤Ó½Ð¤¹¤È¡¢ ±¦Ã¼¤Îʸ»ú¤«¤é³«»Ï¤· 1 ʸ»ú¤º¤Äº¸¤Ë¸þ¤«¤Ã¤Æ¾ÃÈñ¤µ¤ì¡¢ yytext ¤ÎÆâÍƤ¬ Ç˲õ ¤µ¤ì¤ë¤³¤È¤Ç¤¹¡£ (¾åµÎã¤Î¤è¤¦¤Ë) unput() ¸Æ¤Ó½Ð¤·¸å¤â yytext ¤ÎÆâÍƤòÊݸ¤¹¤ë¤¿¤á¤Ë¤Ï¡¢»Ï¤á¤ËÊ̤ξì½ê¤Ë¥³¥Ô¡¼¤¹¤ë¤«¡¢ ¥¹¥¥ã¥Ê¤ò %array ¤ò»È¤¦¤è¤¦¤Ë¹½ÃÛ¤¹¤ë¤³¤È¤Ç¤¹(ÆþÎϤΥޥåÁÊýË¡»²¾È)¡£
ºÇ¸å¤Ë¡¢ EOF ¤òÌᤷ¤ÆÆþÎÏ¥¹¥È¥ê¡¼¥à¤Ë¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤ò¥Þ¡¼¥¯¤¹¤ë¤È¤Ï ½ÐÍè¤Ê¤¤¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
- -
- input() ¼¡¤Îʸ»ú¤òÆþÎÏ¥¹¥È¥ê¡¼¥à¤«¤éÆɤߤޤ¹¡£ ¼¡¤ÎÎã¤Ï C ¥³¥á¥ó¥È¤ò¿©¤Ù¤Þ¤¹:
%% "/*" { register int c; for ( ; ; ) { while ( (c = input()) != '*' && c != EOF ) ; /* eat up text of comment */ if ( c == '*' ) { while ( (c = input()) == '*' ) ; if ( c == '/' ) break; /* found the end */ } if ( c == EOF ) { error( "EOF in comment" ); break; } } }
(¥¹¥¥ã¥Ê¤¬ C++ ¤Ç¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¤È¤¤Ï¡¢¤³¤Î¥ë¡¼¥Á¥ó¤Ï yyinput() ¤È¤¤¤¦Ì¾¾Î¤Ë¤Ê¤ê¡¢ C++ ¥¹¥È¥ê¡¼¥à¤Î input ¤È̾Á°¤¬¾×Æͤ¹¤ë¤³¤È¤òÈò¤±¤Þ¤¹¡£) - -
- YY_FLUSH_BUFFER ¥¹¥¥ã¥Ê¤ÎÆâÉô¥Ð¥Ã¥Õ¥¡¤ò¥Õ¥é¥Ã¥·¥å¤·¡¢ ¼¡¤Ë¥¹¥¥ã¥Ê¤¬¥È¡¼¥¯¥ó¤ò¥Þ¥Ã¥Á¤·¤è¤¦¤È¤·¤¿»þ ¥Ð¥Ã¥Õ¥¡¤ò YY_INPUT ¤Ë¤Æ¥ê¥Õ¥£¥ë¤·¤Þ¤¹(À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤Ç¸å½Ò)¡£ ¤³¤Î¥¢¥¯¥·¥ç¥ó¤Ï¡¢ Ê£¿ô¤ÎÆþÎϥХåե¡¤Ë¤ª¤¤¤Æ¸å½Ò¤¹¤ë ¤è¤ê°ìÈÌŪ¤Ê yy_flush_buffer() ´Ø¿ô¤ÎÆÃÊ̤ʥ±¡¼¥¹¤Ç¤¹¡£
- -
- yyterminate() ¥¢¥¯¥·¥ç¥ó¤Î return ʸ¤ÎÂå¤ï¤ê¤Ë»È¤¦¤³¤È¤¬½ÐÍè¤Þ¤¹¡£ yyterminate() ¤Ï¥¹¥¥ã¥Ê¤ò½ªÎ»¤·¡¢"Á´¤Æ½ªÎ»" ¤ò°ÕÌ£¤¹¤ë 0 ¤ò¸Æ¤Ó½Ð¤·¸µ´Ø¿ô¤ËÊÖ¤·¤Þ¤¹¡£ ¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï yyterminate() ¤Ï¥Õ¥¡¥¤¥ë¤Î½ª¤ï¤ê¤Ë㤷¤¿¤È¤¤Ë¤â¸Æ¤Ð¤ì¤Þ¤¹¡£ yyterminate() ¤Ï¥Þ¥¯¥í¤Ç¤¢¤ê¡¢ÄêµÁ¤·¤Ê¤ª¤¹¤³¤È¤¬¤Ç¤¤Þ¤¹¡£
À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê
flex ¤Î½ÐÎÏ¤Ï lex.yy.c ¤È¤¤¤¦¥Õ¥¡¥¤¥ë¤Ç¤¢¤ê¡¢¥¹¥¥ã¥ó¥ë¡¼¥Á¥ó yylex() ¤È¡¢¥È¡¼¥¯¥ó¤Î¥Þ¥Ã¥Á¥ó¥°¤Ë»ÈÍѤ¹¤ëÊ£¿ô¤Î¥Æ¡¼¥Ö¥ë¤È¡¢ Ê£¿ô¤ÎÉÕ°¥ë¡¼¥Á¥ó¤È¥Þ¥¯¥í¤«¤é¤Ê¤ê¤Þ¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¡¢ yylex() ¤Ï¼¡¤Î¤è¤¦¤ËÀë¸À¤µ¤ì¤Þ¤¹:int yylex() { ... various definitions and the actions in here ... }(´Ä¶¤¬´Ø¿ô¥×¥í¥È¥¿¥¤¥×¤ò¥µ¥Ý¡¼¥È¤·¤Æ¤¤¤ë¾ì¹ç¡¢ "int yylex( void )" ¤È¤Ê¤ê¤Þ¤¹¡£) ¤³¤ÎÄêµÁ¤Ï "YY_DECL" ¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¤³¤È¤Ë¤è¤êÊѹ¹¤Ç¤¤Þ¤¹¡£ Î㤨¤Ð¼¡¤Î¤è¤¦¤Ë»ÈÍѤ¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹:
#define YY_DECL float lexscan( a, b ) float a, b;¤³¤ì¤Ï¥¹¥¥ã¥ó¥ë¡¼¥Á¥ó¤Î̾Á°¤ò lexscan ¤È¤·¡¢ÉâÆ°¾®¿ôÅÀ¿ô¤òÊÖ¤¹¤è¤¦¤Ë¤·¡¢2 ¤Ä¤ÎÉâÆ°¾®¿ôÅÀ¿ô¤ò°ú¿ô¤È¤·¤Þ¤¹¡£ K&R ¤ÎÈó¥×¥í¥È¥¿¥¤¥×¤Î´Ø¿ôÀë¸À¤ò»ÈÍѤ·¤Æ¥¹¥¥ã¥ó¥ë¡¼¥Á¥ó¤ËÂФ·¤Æ°ú¿ô¤ò Í¿¤¨¤ë¾ì¹ç¡¢ÄêµÁ¤ò¥»¥ß¥³¥í¥ó(;)¤Ç½ªÎ»¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£
yylex() ¤Ï¸Æ¤Ð¤ì¤ë¤¿¤Ó¡¢¥°¥í¡¼¥Ð¥ëÆþÎÏ¥Õ¥¡¥¤¥ë yyin (¥Ç¥Õ¥©¥ë¥È¤Ç¤Ïɸ½àÆþÎÏ)¤«¤é¥È¡¼¥¯¥ó¤ò¥¹¥¥ã¥ó¤·¤Þ¤¹¡£ ¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤Ë¤Ê¤ë(¤³¤Î¾ì¹ç 0 ¤òÊÖ¤·¤Þ¤¹)¤«¡¢ ¥¢¥¯¥·¥ç¥ó¤¬ return ʸ¤ò¼Â¹Ô¤¹¤ë¤Þ¤Ç¡¢¼Â¹Ô¤ò³¤±¤Þ¤¹¡£
¥¹¥¥ã¥Ê¤¬¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤ËÅþ㤹¤ë¤È¡¢ yyin ¤¬¿·¤¿¤Ê¥Õ¥¡¥¤¥ë¤ò»Ø¤µ¤Ê¤¤¤« (¿·¤¿¤Ê¥Õ¥¡¥¤¥ë¤ò»Ø¤¹¾ì¹ç¤Ï¤³¤Î¥Õ¥¡¥¤¥ë¤Î¥¹¥¥ã¥ó¤ò³¤±¤Þ¤¹)¡¢ yyrestart() ¤¬¸Æ¤Ð¤ì¤Ê¤¤¸Â¤ê¡¢ ¸å³¤¹¤ë¸Æ¤Ó½Ð¤·¤Ï̤ÄêµÁ¤Ç¤¹¡£ yyrestart() ¤Ï FILE * ¥Ý¥¤¥ó¥¿( YY_INPUT ¤òÀßÄꤷ¤Æ yyin °Ê³°¤Î¥½¡¼¥¹¤ò¥¹¥¥ã¥ó¤¹¤ë¤è¤¦¤Ë¤·¤¿¾ì¹ç¤Ë¤Ï nil ¤â²Ä¤Ç¤¹) ¤Ç¤¢¤ë°ú¿ô¤ò 1 ¤Ä¤È¤ê¡¢¤½¤Î¥Õ¥¡¥¤¥ë¤«¤é¤Î¥¹¥¥ã¥ó¤Î¤¿¤á¤Ë yyin ¤ò½é´ü²½¤·¤Þ¤¹¡£ ËܼÁŪ¤Ë¡¢ yyin ¤ò¿·¤·¤¤ÆþÎÏ¥Õ¥¡¥¤¥ë¤Ë³ä¤êÅö¤Æ¤ë¤³¤È¤È yyrestar() ¤ò»ÈÍѤ¹¤ë¤³¤È¤È¤ÏƱ¤¸¤Ç¤¹; ¸å¼Ô¤ÏÁ°¤Î¥Ð¡¼¥¸¥ç¥ó¤Î flex ¤È¤Î¸ß´¹À¤Î¤¿¤á¤Ë»ÈÍѲÄǽ¤Ç¤¢¤ê¡¢ ¤Þ¤¿¥¹¥¥ã¥ó¤ÎÅÓÃæ¤ÇÆþÎÏ¥Õ¥¡¥¤¥ë¤òÊѤ¨¤ë¤³¤È¤¬²Äǽ¤Ç¤¹¡£ °ú¿ô¤ò yyin ¤È¤·¤Æ¸Æ¤Ó½Ð¤¹¤³¤È¤Ë¤è¤ê¡¢¸½ºß¤ÎÆþÎϥХåե¡¤ò¼Î¤Æ¤ë¤³¤È¤â½ÐÍè¤Þ¤¹; ¤¿¤À¤·¡¢ YY_FLUSH_BUFFER (¾å½Ò)¤ò»ÈÍѤ¹¤ëÊý¤¬Îɤ¤¤Ç¤¹¡£ yyrestart() ¤Ï INITIAL ¤Î³«»Ï¾ò·ï¤òÊѹ¹¤· ¤Ê¤¤ ¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤ (¸å½Ò¤Î³«»Ï¾ò·ï»²¾È)¡£
¤¢¤ë¥¢¥¯¥·¥ç¥óÃæ¤Ç return ʸ¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ë¤è¤ê yylex() ¤¬¥¹¥¥ã¥ó¤ò»ß¤á¤¿¾ì¹ç¡¢¥¹¥¥ã¥Ê¤ÏºÆÅٸƤӽФ·²Äǽ¤Ç¤¢¤ê¡¢ ¤³¤Î¾ì¹ç¥¹¥¥ã¥ó¤Î»Ä¤ê¤ÎÉôʬ¤«¤éºÆ³«¤·¤Þ¤¹¡£
¥Ç¥Õ¥©¥ë¥È¤Ç(¸úΨ¤Î¤¿¤á)¡¢¥¹¥¥ã¥Ê¤Ïñ½ã¤Ê getc() ¥³¡¼¥ë¤Ç¤Ï¤Ê¤¯¥Ö¥í¥Ã¥¯¥ê¡¼¥É¤ò¹Ô¤¤¡¢ yyin ¤«¤éʸ»ú¤òÆɤߤޤ¹¡£ ÆþÎϼèÆÀÊýË¡¤Ï YY_INPUT ¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¤³¤È¤Ë¤è¤êÀ©¸æ¤Ç¤¤Þ¤¹¡£ YY_INPUT ¸Æ¤Ó½Ð¤·¼ê½ç¤Ï "YY_INPUT(buf,result,max_size)" ¤Ç¤¹¡£ ¤³¤Î¥¢¥¯¥·¥ç¥ó¤Ï¡¢ buf ʸ»úÇÛÎóÃæ¤ËºÇÂç max_size ʸ»ú¤òÍÑ°Õ¤·¡¢À°¿ôÊÑ¿ô result Ãæ¤ËÆɤ᤿ʸ»ú¿ô¤â¤·¤¯¤ÏÄê¿ô YY_NULL (Unix ¥·¥¹¥Æ¥à¤Ç¤Ï 0)¤òÆþ¤ì¤ÆÊÖ¤·¤Þ¤¹¡£ ¥Ç¥Õ¥©¥ë¥È¤Î YY_INPUT ¤Ï¥°¥í¡¼¥Ð¥ë¥Õ¥¡¥¤¥ë¥Ý¥¤¥ó¥¿ "yyin" ¤«¤éÆɤߤޤ¹¡£
YY_INPUT ¤Î¥µ¥ó¥×¥ëÄêµÁ¤Ç¤¹(ÆþÎÏ¥Õ¥¡¥¤¥ë¤ÎÄêµÁÉô¤Ë³ÊǼ):
%{ #define YY_INPUT(buf,result,max_size) \ { \ int c = getchar(); \ result = (c == EOF) ? YY_NULL : (buf[0] = c, 1); \ } %}¤³¤ÎÄêµÁ¤Ë¤è¤ê¡¢ÆþÎϽèÍý¤Ï 1 ÅÙ¤Ë 1 ʸ»ú¤º¤Ä¹Ô¤¦¤è¤¦¤ËÊѹ¹¤µ¤ì¤Þ¤¹¡£
¥¹¥¥ã¥Ê¤¬ YY_INPUT ¤«¤é¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤òÄÌÃΤµ¤ì¤¿¾ì¹ç¡¢ ¥¹¥¥ã¥Ê¤Ï yywrap() ´Ø¿ô¤ò¥Á¥§¥Ã¥¯¤·¤Þ¤¹¡£ yywrap() ´Ø¿ô¤¬µ¶(¥¼¥í)¤òÊÖ¤¹¾ì¹ç¡¢´Ø¿ô¤Ï³¹ÔÃæ¤Ç¤¢¤ë¤È¤µ¤ì¡¢ yyin ¤òÊ̤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤ò»Ø¤¹¤è¤¦¤ËÀßÄꤷ¡¢¥¹¥¥ã¥ó¤ò³¹Ô¤·¤Þ¤¹¡£ ´Ø¿ô¤¬¿¿(Èó¥¼¥í)¤òÊÖ¤¹¾ì¹ç¡¢¥¹¥¥ã¥Ê¤Ï½ªÎ»¤·¡¢¸Æ¤Ó½Ð¤·¸µ¤Ë 0 ¤òÊÖ¤·¤Þ¤¹¡£ ¤É¤Á¤é¤Î¾ì¹ç¤â³«»Ï¾ò·ï¤ÏÊѲ½¤·¤Ê¤¤¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤; ¤Ä¤Þ¤ê INITIAL ¤Ë¤ÏÌá¤ê ¤Þ¤»¤ó¡£
Æȼ«¤Î yywrap() ¤òÀßÄꤷ¤Ê¤¤¾ì¹ç¡¢ %option noyywrap (¤³¤Î¾ì¹ç¥¹¥¥ã¥Ê¤Ï yywrap() ¤¬ 1 ¤òÊÖ¤·¤¿¤«¤Î¤è¤¦¤ËÆ°ºî¤·¤Þ¤¹)¤ò»ÈÍѤ¹¤ë¤«¡¢¥Õ¥é¥° -ll ¤ò»ØÄꤷ¤Æ¥Ç¥Õ¥©¥ë¥È¤Î¥ë¡¼¥Á¥ó(¾ï¤Ë 1 ¤òÊÖ¤·¤Þ¤¹)¤ò»ÈÍѤ·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£
¥Õ¥¡¥¤¥ë¤Ç¤Ï¤Ê¤¯¥á¥â¥êÃæ¤Î¥Ð¥Ã¥Õ¥¡¤«¤é¥¹¥¥ã¥ó¤¹¤ë¤¿¤á¤Î 3 ¤Ä¤Î¥ë¡¼¥Á¥ó¤ò »ÈÍѲÄǽ¤Ç¤¹: yy_scan_string(), yy_scan_bytes(), yy_scan_buffer() ¡£ ¤³¤ì¤é¤Ë´Ø¤¹¤ëµÄÏÀ¤ÏÊ£¿ô¤ÎÆþÎϥХåե¡¤ÎÀá¤ò»²¾È¤·¤Æ²¼¤µ¤¤¡£
¥¹¥¥ã¥Ê¤Ï¡¢¼«¸Ê¤Î ECHO ½ÐÎϤò yyout ¥°¥í¡¼¥Ð¥ë(¥Ç¥Õ¥©¥ë¥È¤Ç¤Ïɸ½à½ÐÎϤǤ¢¤ê¡¢ Ê̤ΠFILE ¥Ý¥¤¥ó¥¿¤Ë³ä¤êÅö¤Æ¤ë¤³¤È¤ÇºÆÄêµÁ¤Ç¤¤Þ¤¹)¤Ë½ñ¤¤Þ¤¹¡£
³«»Ï¾ò·ï
flex ¤Ï¡¢¾ò·ïŪ¤Ë͸ú¤È¤Ê¤ë¥ë¡¼¥ë¤Î¤¿¤á¤Îµ¡¹½¤òÄ󶡤·¤Þ¤¹¡£ ¥Ñ¥¿¡¼¥ó¤Î¥×¥ì¥Õ¥£¥Ã¥¯¥¹¤¬ "<sc>" ¤È¤Ê¤Ã¤Æ¤¤¤ë¥ë¡¼¥ë¤Ï¡¢ ¥¹¥¥ã¥Ê¤¬ "sc" ¤È¤¤¤¦Ì¾Á°¤Î³«»Ï¾ò·ï¤Ë¤¤¤ë¾ì¹ç¤Î¤ß͸ú¤Ç¤¹¡£ Î㤨¤Ð¡¢<STRING>[^"]* { /* eat up the string body ... */ ... }¤Ï¥¹¥¥ã¥Ê¤¬ "STRING" ³«»Ï¾ò·ï¤Ë¤¤¤ë»þ¤Î¤ß͸ú¤Ç¤¢¤ê¡¢
<INITIAL,STRING,QUOTE>\. { /* handle an escape ... */ ... }¤Ï¸½ºß¤Î³«»Ï¾ò·ï¤¬¡¢ "INITIAL", "STRING", "QUOTE" ¤Î¤¤¤º¤ì¤«¤Î¾ì¹ç¤Î¤ß͸ú¤Ç¤¹¡£
³«»Ï¾ò·ï¤Ï¡¢ÆþÎϤÎÄêµÁ(ÀèƬ)Éô¤Ë¤ª¤¤¤Æ¡¢¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤Ê¤¤¹Ô¤Ç %s ¤â¤·¤¯¤Ï %x ¤«¤é»Ï¤Þ¤ê̾Á°¤¬Â³¤¯¹Ô¤Ë¤ª¤¤¤ÆÀë¸À¤µ¤ì¤Þ¤¹¡£ Á°¼Ô¤Ï ÆâÊñŪ ³«»Ï¾ò·ï¤ò¡¢ ¸å¼Ô¤Ï ÇÓ¾Ū ³«»Ï¾ò·ï¤ò¡¢¤½¤ì¤¾¤ìÀë¸À¤·¤Þ¤¹¡£ ³«»Ï¾ò·ï¤ò͸ú¤Ë¤¹¤ë¤Î¤Ï BEGIN ¥¢¥¯¥·¥ç¥ó¤Ç¤¹¡£ ¼¡¤Î BEGIN ¥¢¥¯¥·¥ç¥ó¤¬¼Â¹Ô¤µ¤ì¤ë¤Þ¤Ç¡¢Í¿¤¨¤é¤ì¤¿³«»Ï¾ò·ï¤Î¥ë¡¼¥ë¤Ï͸ú¤Ç¤¢¤ê¡¢ ¾¤Î³«»Ï¾ò·ï¤Î¥ë¡¼¥ë¤Ï̵¸ú¤Ç¤¹¡£ ³«»Ï¾ò·ï¤¬ ÆâÊñŪ ¤Ê¾ì¹ç¡¢³«»Ï¾ò·ï¤ò»ý¤¿¤Ê¤¤¥ë¡¼¥ë¤â¤Þ¤¿Í¸ú¤Ç¤¹¡£ ³«»Ï¾ò·ï¤¬ ÇÓ¾Ū ¤Ê¾ì¹ç¡¢ ³«»Ï¾ò·ï¤òËþ¤¿¤¹¥ë¡¼¥ë ¤À¤± ¤¬Í¸ú¤Ç¤¹¡£ Ʊ¤¸ÇÓ¾³«»Ï¾ò·ï¤Ë°Í¸¤¹¤ë¥ë¡¼¥ë¤ÎÁȤϡ¢ flex ÆþÎÏÃæ¤ÎÊ̤Υ롼¥ë¤È¤ÏÆÈΩ¤Ê¥¹¥¥ã¥Ê¤òµ½Ò¤·¤Þ¤¹¡£ ¤½¤Î¤¿¤á¡¢ÇÓ¾³«»Ï¾ò·ï¤ò»ÈÍѤ¹¤ì¤Ð¡¢"¥ß¥Ë¥¹¥¥ã¥Ê" (ÊÌÉôʬ¤È¤ÏʸˡŪ¤Ë°Û¤Ê¤ëÉôʬ(Î㤨¤Ð¥³¥á¥ó¥È)¤ËÂФ¹¤ë¥¹¥¥ã¥Ê) ¤ò´Êñ¤Ë»ØÄê¤Ç¤¤Þ¤¹¡£
ÆâÊñŪ³«»Ï¾ò·ï¤ÈÇÓ¾Ū³«»Ï¾ò·ï¤È¤¬¤Þ¤À¾¯¤·Û£Ëæ¤Ç¤¢¤ë¤Ê¤é¡¢ ξ¼Ô¤Î´Ø·¸¤òɽ¤¹Îã¤ò¼¨¤·¤ÆÀâÌÀ¤·¤Þ¤¹¡£°Ê²¼¤Î¥ë¡¼¥ë¤ÎÁÈ:
%s example %% <example>foo do_something(); bar something_else();¤Ï
%x example %% <example>foo do_something(); <INITIAL,example>bar something_else();¤ÈÅù²Á¤Ç¤¹¡£ <INITIAL,example> ¤¬Ìµ¤¤¤È¡¢2 ÈÖÌܤÎÎã¤Ë¤ª¤±¤ë bar ¥Ñ¥¿¡¼¥ó¤Ï¡¢³«»Ï¾ò·ï¤¬ example ¤Î¾ì¹ç¡¢Í¸ú¤È¤Ê¤ê¤Þ¤»¤ó(¤¹¤Ê¤ï¤Á¥Þ¥Ã¥Á¤·¤Þ¤»¤ó)¡£ <example> ¤À¤±¤ò bar ¤Ë¤Ä¤±¤ë¤È¡¢ example ¤À¤±¤Ë¤ª¤¤¤Æ͸ú¤È¤Ê¤ê¡¢ INITIAL ¤Ç¤Ï͸ú¤È¤Ê¤ê¤Þ¤»¤ó¡£°ìÊý¡¢ºÇ½é¤ÎÎã¤Ç¤Ï¤É¤Á¤é¤Î¾ì¹ç¤Ç¤â͸ú¤Ç¤¹¡£ ¤Ê¤¼¤Ê¤éºÇ½é¤ÎÎã¤Ç¤Ï example ³«»Ï¾ò·ï¤Ï ÆâÊñŪ (%s) ³«»Ï¾ò·ï¤À¤«¤é¤Ç¤¹¡£
Æüì¤Ê³«»Ï¾ò·ï»ØÄê»Ò <*> ¤ÏÁ´¤Æ¤Î³«»Ï¾ò·ï¤Ë¥Þ¥Ã¥Á¤¹¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£ ¤³¤Î¤¿¤á¡¢¾å¤ÎÎã¤Ï¼¡¤Î¤è¤¦¤Ë¤â½ñ¤±¤Þ¤¹;
%x example %% <example>foo do_something(); <*>bar something_else();
¥Ç¥Õ¥©¥ë¥È¥ë¡¼¥ë(¥Þ¥Ã¥Á¤·¤Ê¤«¤Ã¤¿Ê¸»ú¤ËÂФ·¤Æ¤Ï ECHO ¤Ç¤¹)¤Ï³«»Ï¾ò·ïÃæ¤Ç¤â͸ú¤Ç¤¹¡£ ¤³¤ì¤Ï¼¡¤Î¤â¤Î¤ÈÅù²Á¤Ç¤¹:
<*>.|\n ECHO;
BEGIN(0) ¤Ï¡¢³«»Ï¾ò·ï¤Î̵¤¤¥ë¡¼¥ë¤À¤±¤¬Í¸ú¤Ç¤¢¤ë¡¢ºÇ½é¤Î¾õÂÖ¤ËÌá¤ê¤Þ¤¹¡£ ¤³¤Î¾õÂ֤ϳ«»Ï¾ò·ï "INITIAL" ¤È¤·¤Æ»²¾È¤Ç¤¤ë¤¿¤á¡¢ BEGIN(INITIAL) ¤Ï BEGIN(0) ¤ÈÅù²Á¤Ç¤¹¡£ (³«»Ï¾ò·ï̾¤ò³ç¤ë³ç¸Ì¤ÏÉÔÍפǤ¹¤¬¡¢Îɤ¤¥¹¥¿¥¤¥ë¤Ç¤¢¤ë¤È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£)
BEGIN ¥¢¥¯¥·¥ç¥ó¤Ï¡¢¥ë¡¼¥ëÉô¤ÎÀèƬ¤Î¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤¿¥³¡¼¥ÉÃæ¤Ë¸½¤ì¤Æ¤âÎɤ¤¤Ç¤¹¡£ Î㤨¤Ð°Ê²¼¤ÎÎã¤Ç¤Ï¡¢ yylex() ¤¬¸Æ¤Ð¤ì¥°¥í¡¼¥Ð¥ëÊÑ¿ô enter_special ¤¬¿¿¤Î¾ì¹ç¤Ë¤Ï¡¢¥¹¥¥ã¥Ê¤Ï "SPECIAL" ³«»Ï¾ò·ï¤ËÆþ¤ê¤Þ¤¹:
int enter_special; %x SPECIAL %% if ( enter_special ) BEGIN(SPECIAL); <SPECIAL>blahblahblah ...more rules follow...
³«»Ï¾ò·ï¤òÀâÌÀ¤¹¤ë¤¿¤á¤Ë¡¢ "123.456" ¤Î¤è¤¦¤Êʸ»úÎó¤ò 2 Ä̤ê¤Î°Û¤Ê¤Ã¤¿²ò¼á¤ò¤¹¤ë¥¹¥¥ã¥Ê¤ò¼¨¤·¤Þ¤¹¡£ ¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¤³¤ì¤Ï¡¢ À°¿ô "123" ¤È¥É¥Ã¥È ('.') ¤ÈÀ°¿ô "456" ¤Î 3 ¥È¡¼¥¯¥ó¤Ë¿ô¤¨¤é¤ì¤Þ¤¹¡£ ¤·¤«¤·¡¢¤³¤Îʸ»úÎó¤ÎÁ°¤Ë "expect-floats" ¤Îʸ»úÎ󤬤¢¤ë¾ì¹ç¡¢ ¤³¤ì¤Ïñ°ì¤Î¥È¡¼¥¯¥ó¤Ç¤¢¤ë¤È¤µ¤ì¡¢ÉâÆ°¾®¿ôÅÀ¿ô 123.456 ¤È¤µ¤ì¤Þ¤¹:
%{ #include <math.h> %} %s expect %% expect-floats BEGIN(expect); <expect>[0-9]+"."[0-9]+ { printf( "found a float, = %f\n", atof( yytext ) ); } <expect>\n { /* that's the end of the line, so * we need another "expect-number" * before we'll recognize any more * numbers */ BEGIN(INITIAL); } [0-9]+ { printf( "found an integer, = %d\n", atoi( yytext ) ); } "." printf( "found a dot\n" );¼¡¤Ï¡¢C ¤Î¥³¥á¥ó¥È¤òÍý²ò(¤·¤Æ¼Î¤Æ¤ë)°ìÊý¤Ç¡¢ ¸½ºß¤ÎÆþÎϹԤò¿ô¤¨¤ë¥¹¥¥ã¥Ê¤Ç¤¹¡£
%x comment %% int line_num = 1; "/*" BEGIN(comment); <comment>[^*\n]* /* eat anything that's not a '*' */ <comment>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */ <comment>\n ++line_num; <comment>"*"+"/" BEGIN(INITIAL);¤³¤Î¥¹¥¥ã¥Ê¤Ï³Æ¥ë¡¼¥ë¤Ç²Äǽ¤ÊºÇÂç¤Î¥Æ¥¥¹¥È¤Ë¥Þ¥Ã¥Á¤·¤è¤¦¤È¤¹¤ë¾ì¹ç¡¢ ¤Á¤ç¤Ã¤È¤·¤¿ÌäÂ꤬µ¯¤³¤ê¤Þ¤¹¡£ °ìÈÌŪ¤Ë¤Ï¡¢¹â®¤Ê¥¹¥¥ã¥Ê¤òµ½Ò¤¹¤ë¾ì¹ç¡¢ ³Æ¥ë¡¼¥ë¤ÇºÇÂç¤Î¥Þ¥Ã¥Á¤òÆÀ¤è¤¦¤È¤¹¤ë¤³¤È¤¬ºÇ¤âÀ®¸ù¤·¤Þ¤¹¡£
³«»Ï¾ò·ï̾¤Ï¼ÂºÝ¤Ë¤ÏÀ°¿ôÃͤǤ¢¤ê¡¢³ÊǼ¤¹¤ë¤³¤È¤¬½ÐÍè¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£ ¤½¤Î¤¿¤á¡¢¾åµÎã¤Ï°Ê²¼¤Î¤è¤¦¤Ë³ÈÄ¥¤Ç¤¤Þ¤¹:
%x comment foo %% int line_num = 1; int comment_caller; "/*" { comment_caller = INITIAL; BEGIN(comment); } ... <foo>"/*" { comment_caller = foo; BEGIN(comment); } <comment>[^*\n]* /* eat anything that's not a '*' */ <comment>"*"+[^*/\n]* /* eat up '*'s not followed by '/'s */ <comment>\n ++line_num; <comment>"*"+"/" BEGIN(comment_caller);¤µ¤é¤Ë¡¢¸½ºß¤Î³«»Ï¾ò·ï¤òÀ°¿ôÃͤǤ¢¤ë¥Þ¥¯¥í YY_START ¤Ë¤Æ¥¢¥¯¥»¥¹¤Ç¤¤Þ¤¹¡£ Î㤨¤Ð¡¢¾åµ¤Î comment_caller ¤Ø¤ÎÂåÆþ¤Ï¼¡¤Î¤è¤¦¤Ëµ½Ò¤Ç¤¤Þ¤¹¡£
comment_caller = YY_START;flex ¤Ï YYSTATE ¤ò YY_START ¤Î¥¨¥¤¥ê¥¢¥¹¤È¤·¤ÆÄ󶡤·¤Þ¤¹ (AT&T ¤Î lex ¤¬»ÈÍѤ·¤Æ¤¤¤Þ¤¹)¡£
³«»Ï¾ò·ï¤ÏÆȼ«¤Î̾Á°¶õ´Ö¤ò»ý¤¿¤Ê¤¤¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤; %s ¤ä %x ¤ÎÀë¸À¤Ë¤ª¤±¤ë̾Á°Àë¸À¤Î°·¤¤¤Ï #define ¤ÈƱ¤¸¤Ç¤¹¡£
ºÇ¸å¤Ë¡¢ÇÓ¾Ū³«»Ï¾ò·ï¤ò»ÈÍѤ¹¤ë¡¢ Ÿ³«¤µ¤ì¤¿¥¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹¤ò´Þ¤à(Ť¹¤®¤ëʸ»úÎó¤Î¥Á¥§¥Ã¥¯¤Ï´Þ¤ß¤Þ¤»¤ó) C ¥¹¥¿¥¤¥ë¤Î¥¯¥ª¡¼¥Èʸ»úÎó¤Ø¤Î¥Þ¥Ã¥ÁÊýË¡¤ò¼¨¤·¤Þ¤¹:
%x str %% char string_buf[MAX_STR_CONST]; char *string_buf_ptr; \" string_buf_ptr = string_buf; BEGIN(str); <str>\" { /* saw closing quote - all done */ BEGIN(INITIAL); *string_buf_ptr = '\0'; /* return string constant token type and * value to parser */ } <str>\n { /* error - unterminated string constant */ /* generate error message */ } <str>\\[0-7]{1,3} { /* octal escape sequence */ int result; (void) sscanf( yytext + 1, "%o", &result ); if ( result > 0xff ) /* error, constant is out-of-bounds */ *string_buf_ptr++ = result; } <str>\\[0-9]+ { /* generate error - bad escape sequence; something * like '\48' or '\0777777' */ } <str>\\n *string_buf_ptr++ = '\n'; <str>\\t *string_buf_ptr++ = '\t'; <str>\\r *string_buf_ptr++ = '\r'; <str>\\b *string_buf_ptr++ = '\b'; <str>\\f *string_buf_ptr++ = '\f'; <str>\\(.|\n) *string_buf_ptr++ = yytext[1]; <str>[^\\\n\"]+ { char *yptr = yytext; while ( *yptr ) *string_buf_ptr++ = *yptr++; }
¾åµÎã¤Î¤è¤¦¤ËƱ°ì¤Î³«»Ï¾ò·ï¤ò»ý¤ÄÁ´¤Æ¤Î¥ë¡¼¥ë¤ÎÁ°¤Ë ³«»Ï¾ò·ï¤ò½ñ¤«¤Í¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤¬Â¿¤¤¤Ç¤¹¡£ flex ¤Ï¤³¤ì¤ò´Êñ¤«¤ÄåºÎï¤Ë¤¹¤ë¤¿¤á³«»Ï¾ò·ï ¥¹¥³¡¼¥× ¤òƳÆþ¤·¤Þ¤·¤¿¡£ ³«»Ï¾ò·ï¥¹¥³¡¼¥×¤Ï¼¡¤Î¤è¤¦¤Ë»Ï¤Þ¤ê¤Þ¤¹:
<SCs>{¤³¤³¤Ç SCs ¤Ï 1 ¤Ä°Ê¾å¤Î³«»Ï¾ò·ï¤Î¥ê¥¹¥È¤Ç¤¹¡£ ³«»Ï¾ò·ï¥¹¥³¡¼¥×Æâ¤Ç¤Ï¡¢ ºÇ½é¤Î '{' ¤Ë¥Þ¥Ã¥Á¤¹¤ë¤Þ¤Ç¤Î '}' ¤Ë¤ª¤¤¤Æ¡¢Á´¤Æ¤Î¥ë¡¼¥ë¤Ï¼«Æ°Åª¤Ë <SCs> ¤Î¥×¥ì¥Õ¥£¥Ã¥¯¥¹¤¬ÉÕ¤¤Þ¤¹¡£ ¤½¤Î¤¿¤á¡¢Î㤨¤Ð
<ESC>{ "\\n" return '\n'; "\\r" return '\r'; "\\f" return '\f'; "\\0" return '\0'; }¤Ï¼¡¤Î¤â¤Î¤ÈÅù²Á¤Ç¤¹:
<ESC>"\\n" return '\n'; <ESC>"\\r" return '\r'; <ESC>"\\f" return '\f'; <ESC>"\\0" return '\0';³«»Ï¾ò·ï¥¹¥³¡¼¥×¤Ï¥Í¥¹¥È¤¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
³«»Ï¾ò·ï¤Î¥¹¥¿¥Ã¥¯¤òÀ©¸æ¤¹¤ë¤¿¤á¤Ë 3 ¤Ä¤Î¥ë¡¼¥Á¥ó¤ò»ÈÍѲÄǽ¤Ç¤¹:
- void yy_push_state(int new_state)
- ¸½ºß¤Î³«»Ï¾ò·ï¤ò³«»Ï¾ò·ï¥¹¥¿¥Ã¥¯¤ÎÀèƬ¤Ë¥×¥Ã¥·¥å¤·¡¢ BEGIN new_state ¤ò»ÈÍѤ·¤¿¤«¤Î¤è¤¦¤Ë new_state ¤ËÀÚ¤êÂؤ¨¤Þ¤¹ (³«»Ï¾ò·ï̾¤ÏÀ°¿ôÃͤǤ⤢¤ë¤³¤È¤ò»×¤¤½Ð¤·¤Æ²¼¤µ¤¤)¡£
- void yy_pop_state()
- ¥¹¥¿¥Ã¥¯¤ÎÀèƬ¤ò¥Ý¥Ã¥×¤·¡¢ BEGIN ¤ò»ÈÍѤ·¤Æ¤½¤Î³«»Ï¾ò·ï¤ËÀÚ¤êÂؤ¨¤Þ¤¹¡£
- int yy_top_state()
- ¥¹¥¿¥Ã¥¯¤ÎÆâÍƤòÊѹ¹¤»¤º¤Ë¡¢¥¹¥¿¥Ã¥¯¤ÎÀèƬ¤òÊÖ¤·¤Þ¤¹¡£
³«»Ï¾ò·ï¥¹¥¿¥Ã¥¯¤ÏưŪ¤ËÂ礤¯¤Ê¤ê¡¢ ¤Þ¤¿ÁȤ߹þ¤ß»þ¤Î¥µ¥¤¥ºÀ©¸Â¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ¥á¥â¥ê¤ò»È¤¤ÀÚ¤ë¤È¡¢¥×¥í¥°¥é¥à¼Â¹Ô¤ÏÃæ»ß¤µ¤ì¤Þ¤¹¡£
³«»Ï¾ò·ï¥¹¥¿¥Ã¥¯¤ò»ÈÍѤ¹¤ë¤¿¤á¤Ë¤Ï¡¢¥¹¥¥ã¥Ê¤Ï %option stack ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤ò¥¤¥ó¥¯¥ë¡¼¥É¤¹¤ëɬÍפ¬¤¢¤ê¤Þ¤¹ (²¼µ¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ²¼¤µ¤¤)¡£
Ê£¿ô¤ÎÆþÎϥХåե¡
¥¹¥¥ã¥Ê¤Ë¤è¤Ã¤Æ¤Ï(¥Õ¥¡¥¤¥ë¤Î "include" ¤ò¥µ¥Ý¡¼¥È¤¹¤ëÅù) Ê£¿ô¤ÎÆþÎÏ¥¹¥È¥ê¡¼¥à¤ò°·¤¦É¬Íפ¬¤¢¤ê¤Þ¤¹¡£ flex ¥¹¥¥ã¥Ê¤Ç¤ÏÂ礤ʥХåե¡¥ê¥ó¥°¤ò¹Ô¤¦¤¿¤á¡¢ ¥¹¥¥ã¥ó¥³¥ó¥Æ¥¥¹¥È¤Ë±Æ¶Á¤µ¤ì¤ë YY_INPUT ¤òñ½ã¤Ë½ñ¤´¹¤¨¤ë¤À¤±¤Ç¤Ï¼¡¤ÎÆþÎϤ¬¤É¤³¤«¤éÆɤޤì¤ë¤Î¤«¤òÀ©¸æ¤Ç¤¤Þ¤»¤ó¡£ YY_INPUT ¤¬¸Æ¤Ð¤ì¤ë¤Î¤Ï¥¹¥¥ã¥Ê¤¬¥Ð¥Ã¥Õ¥¡¤Î½ª¤ê¤ËÅþ㤹¤ë»þ¤À¤±¤Ç¤¹¤Î¤Ç¡¢ Î㤨¤Ð "include" ¤Î¤è¤¦¤ËÆþÎϸµ¤òÀÚ¤êÂؤ¨¤ëɬÍפΤ¢¤ëʸ¤ò¥¹¥¥ã¥ó¤·¤¿¸å¤Ç¤â Ĺ»þ´Ö¤òÈñ¤¹¾ì¹ç¤¬¤¢¤ê¤Þ¤¹¡£¤³¤ÎÍͤÊÌäÂê¤ò²ò·è¤¹¤ë¤¿¤á¡¢ flex ¤ÏÊ£¿ô¤ÎÆþÎϥХåե¡¤òÀ¸À®¤·¤ÆÀÚ¤êÂؤ¨¤ëµ¡¹½¤òÄ󶡤·¤Þ¤¹¡£ ÆþÎϥХåե¡¤Ï¼¡¤Î¤è¤¦¤ËÀ¸À®¤µ¤ì¤Þ¤¹:
YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )¤³¤ì¤Ï FILE ¥Ý¥¤¥ó¥¿¤È size ¤ò¼è¤ê¡¢Í¿¤¨¤é¤ì¤ë file ¤Ë´ØÏ¢¤· size ʸ»ú¤òÊÝ»ý¤¹¤ë¤Ë½½Ê¬¤Ê¥Ð¥Ã¥Õ¥¡¤òÀ¸À®¤·¤Þ¤¹ (µ¿¤ï¤·¤¤¾ì¹ç¤Ë¤Ï size ¤Ë¤Ï YY_BUF_SIZE ¤ò»ÈÍѤ·¤Æ²¼¤µ¤¤)¡£ ¤³¤ì¤Ï¡¢Ê̤Υ롼¥Á¥ó(²¼µ»²¾È)¤ËÅϤ¹¤¿¤á¤Î YY_BUFFER_STATE ¥Ï¥ó¥É¥ë¤òÊÖ¤·¤Þ¤¹¡£ YY_BUFFER_STATE ¤Î¥¿¥¤¥×¤Ï struct yy_buffer_state ¹½Â¤ÂΤؤΥݥ¤¥ó¥¿¤Ç¤¢¤ë¤¿¤á¡¢ °ÂÁ´¤Î¤¿¤á YY_BUFFER_STATE ÊÑ¿ô¤ò ((YY_BUFFER_STATE) 0) ¤È½é´ü²½¤¹¤ë¤³¤È¤¬½ÐÍè¡¢ ¥¹¥¥ã¥Ê¤Ç¤Ï¤Ê¤¯¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤Ë¤ª¤¤¤Æ ÆþÎϥХåե¡¤òÀµ¤·¤¯Àë¸À¤¹¤ë¤¿¤á¤Ë¤³¤Î¹½Â¤ÂΤò»²¾È¤¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£ yy_create_buffer ¸Æ¤Ó½Ð¤·¤Ë¤ª¤±¤ë FILE ¥Ý¥¤¥ó¥¿¤Ï YY_INPUT ¤«¤é¸«¤¨¤ë yyin ¤ÎÃͤÈƱ¤¸¤è¤¦¤Ë¤À¤±»ÈÍѤµ¤ì¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤; YY_INPUT ¤òºÆÄêµÁ¤·¤Æ yyin ¤ò»È¤ï¤Ê¤¤¤è¤¦¤Ë¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢ yy_create_buffer ¤ËÂФ·¤Æ°ÂÁ´¤Ë¥Ë¥ë FILE ¥Ý¥¤¥ó¥¿¤òÅϤ»¤Þ¤¹¡£ ¥¹¥¥ã¥ó¤¹¤ë¥Ð¥Ã¥Õ¥¡¤òÁªÂò¤¹¤ë¤¿¤á¤Ë¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Þ¤¹:
void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )¤³¤ì¤Ï¥¹¥¥ã¥Ê¤ÎÆþÎϥХåե¡¤òÀÚ¤êÂؤ¨¡¢ ¥È¡¼¥¯¥ó¤¬ new_buffer ¤«¤éÍè¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹¡£ ¿·¤¿¤Ê¥Õ¥¡¥¤¥ë¤ò¥ª¡¼¥×¥ó¤·¤Æ yyin ¤ò»Ø¤¹¤Î¤Ç¤Ï¤Ê¤¯¡¢¥¹¥¥ã¥ó¤ò·Ñ³¤¹¤ë¤¿¤á¤Ë yywrap() ¤«¤é yy_switch_to_buffer() ¤ò»ÈÍѤ¹¤ë¤³¤È¤¬¤¢¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£ ¤Þ¤¿¡¢ yy_switch_to_buffer() ¤Þ¤¿¤Ï yywrap() ¤Ë¤è¤ëÆþÎϸµ¤ÎÀÚ¤êÂؤ¨¤Ï³«»Ï¾ò·ï¤òÊѹ¹¤· ¤Ê¤¤ ¤³¤È¤Ë¤âÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
void yy_delete_buffer( YY_BUFFER_STATE buffer )¤Ï¥Ð¥Ã¥Õ¥¡¤Ë´ØÏ¢¤Å¤±¤é¤ì¤¿¥¹¥È¥ì¡¼¥¸¤ÎÊÖ´ÔÍ×µá¤Ë»ÈÍѤ·¤Þ¤¹¡£( buffer ¤Ï¥Ë¥ë¤Ç¤â¹½¤¤¤Þ¤»¤ó¤¬¤³¤Î¾ì¹ç¤³¤Î¥ë¡¼¥Á¥ó¤Ï²¿¤â¤·¤Þ¤»¤ó¡£) ¸½ºß¤Î¥Ð¥Ã¥Õ¥¡¤ÎÆâÍƤò¥¯¥ê¥¢¤¹¤ë¤Ë¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Þ¤¹:
void yy_flush_buffer( YY_BUFFER_STATE buffer )¤³¤Î´Ø¿ô¤Ï¥Ð¥Ã¥Õ¥¡¤ÎÆâÍƤò¼Î¤Æ¤ë¤¿¤á¡¢ ¼¡¤Ë¥¹¥¥ã¥Ê¤¬¤³¤Î¥Ð¥Ã¥Õ¥¡¤È¥È¡¼¥¯¥ó¤Î¥Þ¥Ã¥Á¤ò¹Ô¤¦¾ì¹ç¡¢ ¥¹¥¥ã¥Ê¤Ï¤Þ¤º YY_INPUT ¤ò»ÈÍѤ·¤Æ¤³¤Î¥Ð¥Ã¥Õ¥¡¤ò¥Õ¥£¥ë¤·¤Þ¤¹¡£
yy_new_buffer() ¤Ï yy_create_buffer() ¤Î¥¨¥¤¥ê¥¢¥¹¤Ç¤¢¤ê¡¢Æ°Åª¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀ¸À®¤ÈÇ˲õ¤Î¤¿¤á¤Ë»ÈÍѤ¹¤ë C++ ¤Î new ¤È delete ¤È¤Î¸ß´¹À¤Î¤¿¤á¤ËÄ󶡤·¤Æ¤¤¤Þ¤¹¡£
ºÇ¸å¤Ë YY_CURRENT_BUFFER ¥Þ¥¯¥í¤Ï¡¢¸½ºß¤Î¥Ð¥Ã¥Õ¥¡¤ËÂФ¹¤ë YY_BUFFER_STATE ¥Ï¥ó¥É¥ë¤òÊÖ¤·¤Þ¤¹¡£
¤³¤Îµ¡Ç½¤ò»ÈÍѤ·¤Æ¥¤¥ó¥¯¥ë¡¼¥É¥Õ¥¡¥¤¥ë¤òŸ³«¤¹¤ë¥¹¥¥ã¥Ê¤Îµ½ÒÎã¤Ç¤¹( <<EOF>> µ¡Ç½¤Ï¸å½Ò¤·¤Þ¤¹):
/* the "incl" state is used for picking up the name * of an include file */ %x incl %{ #define MAX_INCLUDE_DEPTH 10 YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH]; int include_stack_ptr = 0; %} %% include BEGIN(incl); [a-z]+ ECHO; [^a-z\n]*\n? ECHO; <incl>[ \t]* /* eat the whitespace */ <incl>[^ \t\n]+ { /* got the include file name */ if ( include_stack_ptr >= MAX_INCLUDE_DEPTH ) { fprintf( stderr, "Includes nested too deeply" ); exit( 1 ); } include_stack[include_stack_ptr++] = YY_CURRENT_BUFFER; yyin = fopen( yytext, "r" ); if ( ! yyin ) error( ... ); yy_switch_to_buffer( yy_create_buffer( yyin, YY_BUF_SIZE ) ); BEGIN(INITIAL); } <<EOF>> { if ( --include_stack_ptr < 0 ) { yyterminate(); } else { yy_delete_buffer( YY_CURRENT_BUFFER ); yy_switch_to_buffer( include_stack[include_stack_ptr] ); } }¥Õ¥¡¥¤¥ë¤Ç¤Ï¤Ê¤¯¥á¥â¥ê¾å¤Îʸ»úÎó¤ò¥¹¥¥ã¥ó¤¹¤ë¤¿¤á¤Î ÆþÎϥХåե¡¤òÀßÄꤹ¤ë¤¿¤á¤Î 3 ¤Ä¤Î¥ë¡¼¥Á¥ó¤ò»ÈÍѲÄǽ¤Ç¤¹¡£ ¤¤¤º¤ì¤âʸ»úÎó¤ò¥¹¥¥ã¥ó¤¹¤ë¿·¤·¤¤ÆþÎϥХåե¡¤òÀ¸À®¤·¡¢Âбþ¤¹¤ë YY_BUFFER_STATE ¥Ï¥ó¥É¥ë(½ªÎ»»þ¤Ë¤Ï yy_delete_buffer() ¤Ë¤Æ¾Ãµî¤·¤Þ¤¹)¤òÊÖ¤·¤Þ¤¹¡£¿·¤·¤¤¥Ð¥Ã¥Õ¥¡¤ËÀÚ¤êÂؤ¨¤ë»þ¤Ë¤Ï yy_switch_to_buffer() ¤ò»ÈÍѤ·¡¢¼¡¤Î yylex() ¤Î¸Æ¤Ó½Ð¤·»þ¤Ë¤Ï¤³¤Îʸ»úÎó¤ò¥¹¥¥ã¥ó³«»Ï¤·¤Þ¤¹¡£
- yy_scan_string(const char *str)
- NUL ¥¿¡¼¥ß¥Í¡¼¥È¤µ¤ì¤¿Ê¸»úÎó¤ò¥¹¥¥ã¥ó¤·¤Þ¤¹¡£
- yy_scan_bytes(const char *bytes, int len)
- len ¥Ð¥¤¥È (NUL ¤¬´Þ¤Þ¤ì¤ë¤«¤âÃΤì¤Þ¤»¤ó)¤ò°ÌÃÖ bytes ¤«¤é¥¹¥¥ã¥ó¤·¤Þ¤¹¡£
¤É¤Á¤é¤Î´Ø¿ô¤âʸ»úÎó¤â¤·¤¯¤Ï¥Ð¥¤¥ÈÎó¤Î ¥³¥Ô¡¼ ¤òÀ¸À®¤·¤Æ¤«¤é¥¹¥¥ã¥ó¤·¤Þ¤¹¡£( yylex() ¤Ï¥¹¥¥ã¥ó¤¹¤ë¥Ð¥Ã¥Õ¥¡¤ÎÆâÍƤòÊѹ¹¤¹¤ë¤¿¤á¡¢¤³¤ì¤¬Ë¾¤Þ¤·¤¤¤Î¤Ç¤¹¡£) ¥³¥Ô¡¼¤òÈò¤±¤ë¤¿¤á¤Ë¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Þ¤¹:
- yy_scan_buffer(char *base, yy_size_t size)
- ¥Ð¥Ã¥Õ¥¡Æâ¤Ç base ¤«¤é size ¥Ð¥¤¥È¤ÎŤµ¤ò¥¹¥¥ã¥ó¤·¤Þ¤¹¡£ºÇ¸å¤Î 2 ¥Ð¥¤¥È¤Ï YY_END_OF_BUFFER_CHAR (ASCII NUL) ¤Ç¤¢¤ë ɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ¤³¤ì¤é¤ÎºÇ¸å¤Î 2 ¥Ð¥¤¥È¤Ï¥¹¥¥ã¥ó¤µ¤ì¤Þ¤»¤ó; ¤½¤Î¤¿¤á¥¹¥¥ã¥ó¤ÎÆâÍÆ¤Ï base[0] ¤«¤é base[size-2] ¤Þ¤Ç¤Çξü¤ò´Þ¤ß¤Þ¤¹¡£
- ¤³¤ÎÍͤˤʤë¤è¤¦¤Ë base ¤òÀßÄꤷ¤Ê¤«¤Ã¤¿¾ì¹ç(¤Ä¤Þ¤êºÇ¸å¤Î 2 ¤Ä¤Î YY_END_OF_BUFFER_CHAR ¥Ð¥¤¥È¤ò˺¤ì¤¿¾ì¹ç)¡¢ yy_scan_buffer() ¤Ï¿·¤·¤¤¥Ð¥Ã¥Õ¥¡¤òÀ¸À®¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¥Ë¥ë¥Ý¥¤¥ó¥¿¤òÊÖ¤·¤Þ¤¹¡£
- ·¿ yy_size_t ¤ÏÀ°¿ô·¿¤Ç¤¢¤ê¡¢ ¥Ð¥Ã¥Õ¥¡¤ÎÂ礤µ¤òÈ¿±Ç¤¹¤ëÀ°¿ô¼°¤ò¤³¤Î·¿¤Ë¥¥ã¥¹¥È¤¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤Î¥ë¡¼¥ë
ÆÃÊ̥롼¥ë "<<EOF>>" ¤Ï¡¢ ¥Õ¥¡¥¤¥ë¤Î½ªÎ»»þ¤â¤·¤¯¤Ï yywrap() ¤¬Èó¥¼¥í(¤¹¤Ê¤ï¤Á½èÍý¤¹¤ë¥Õ¥¡¥¤¥ë¤¬Ìµ¤¤¤³¤È¤òɽ¤¹)¤Î»þ¤Ë ¹Ô¤ï¤ì¤ë¤Ù¤¥¢¥¯¥·¥ç¥ó¤òɽ¤·¤Þ¤¹¡£ ¥¢¥¯¥·¥ç¥ó¤Ï°Ê²¼¤Î 4 ¤Ä¤Î¤¦¤Á¤Î¤¤¤º¤ì¤«¤Ç½ª¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£- -
- yyin ¤Ë¿·¤·¤¤¥Õ¥¡¥¤¥ë¤ò³ä¤êÅö¤Æ¤ë(Á°¤Î¥Ð¡¼¥¸¥ç¥ó¤Î flex ¤Ç¤Ï¡¢ ³ä¤êÅö¤Æ¸å¤ËÆÃÊ̤ʥ¢¥¯¥·¥ç¥ó YY_NEW_FILE ¤ò¸Æ¤Ó½Ð¤¹É¬Íפ¬¤¢¤ê¤Þ¤·¤¿; º£¤Ç¤ÏÉÔÍפǤ¹¡£);
- -
- return ʸ¤ò¼Â¹Ô¤¹¤ë;
- -
- ÆÃÊÌ¤Ê yyterminate() ¥¢¥¯¥·¥ç¥ó¤ò¼Â¹Ô¤¹¤ë;
- -
- yy_switch_to_buffer() ¤ò»ÈÍѤ·¤Æ¿·¤¿¤Ê¥Ð¥Ã¥Õ¥¡¤ËÀÚ¤êÂؤ¨¤ë (¾åµÎã¤Ç¼¨¤·¤¿Ä̤ê)¡£
<<EOF>> ¥ë¡¼¥ë¤ò¾¤Î¥Ñ¥¿¡¼¥ó¤È¶¦¤Ë»ÈÍѤ·¤Æ¤Ï¤Ê¤ê¤Þ¤»¤ó; ¾¤Î¥Ñ¥¿¡¼¥ó¤Ï³«»Ï¾ò·ï¤Î¥ê¥¹¥È¤È¤â¤Ë¤À¤±Ëþ¤¿¤µ¤ì¤ë¤«¤é¤Ç¤¹¡£ Ëþ¤¿¤µ¤ì¤Ê¤¤ <<EOF>> ¥ë¡¼¥ë¤¬Í¿¤¨¤é¤ì¤¿¾ì¹ç¡¢ <<EOF>> ¥¢¥¯¥·¥ç¥ó¤ò¤Þ¤À»ý¤Ã¤Æ¤¤¤Ê¤¤ Á´¤Æ¤Î ³«»Ï¾ò·ï¤ËŬÍѤµ¤ì¤Þ¤¹¡£ <<EOF>> ¥ë¡¼¥ë¤òºÇ½é¤Î³«»Ï¾ò·ï¤À¤±¤Ë»ØÄꤹ¤ë¤¿¤á¤Ë¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Æ²¼¤µ¤¤¡£
<INITIAL><<EOF>>
¤³¤ì¤é¤Î¥ë¡¼¥ë¤ÏÊĤ¸¤Æ¤¤¤Ê¤¤¥³¥á¥ó¥È¤òÊá¤Þ¤¨¤ë¾ì¹çÅù¤ËÊØÍø¤Ç¤¹¡£ Î㤨¤Ð:
%x quote %% ...other rules for dealing with quotes... <quote><<EOF>> { error( "unterminated quote" ); yyterminate(); } <<EOF>> { if ( *++filelist ) yyin = fopen( *filelist, "r" ); else yyterminate(); }
»¨Â¿¤Ê¥Þ¥¯¥í
¥Þ¥¯¥í YY_USER_ACTION ¤Ë¤Ï¥Þ¥Ã¥Á¥ë¡¼¥ë¥¢¥¯¥·¥ç¥ó¤ËÀè¤À¤Ã¤Æ¾ï¤Ë¹Ô¤¦¥¢¥¯¥·¥ç¥ó¤òÄêµÁ¤Ç¤¤Þ¤¹¡£ Î㤨¤Ð¡¢yytext ¤ò¾®Ê¸»ú¤ËÊÑ´¹¤¹¤ë¥ë¡¼¥Á¥ó¤ò¸Æ¤Ö¤è¤¦¤Ë #define ½ÐÍè¤Þ¤¹¡£ YY_USER_ACTION µ¯Æ°»þ¤Ë¤Ï¡¢ÊÑ¿ô yy_act ¤Ï¥Þ¥Ã¥Á¤·¤¿¥ë¡¼¥ë¤ÎÈÖ¹æ¤òÍ¿¤¨¤Þ¤¹(¥ë¡¼¥ë¤Ï 1 ÈÖ¤«¤é¿ô¤¨¤Þ¤¹)¡£ ³Æ¥ë¡¼¥ë¤¬¥Þ¥Ã¥Á¤¹¤ëÉÑÅÙ¤òÃΤꤿ¤¤¾ì¹ç¤òÁÛÁü¤·¤Æ²¼¤µ¤¤¡£ °Ê²¼¤Ë»Å³Ý¤±¤ò¼¨¤·¤Þ¤¹:#define YY_USER_ACTION ++ctr[yy_act]¤³¤³¤Ç ctr ¤ÏÇÛÎó¤Ç¤¢¤ê¡¢¤½¤ì¤¾¤ì¤Î¥ë¡¼¥ë¤¬¥Þ¥Ã¥Á¤·¤¿²ó¿ô¤ò·×¿ô¤·¤Þ¤¹¡£ ¥Þ¥¯¥í YY_NUM_RULES ¤Ï¥ë¡¼¥ë¤ÎÁí¿ô¤òɽ¤¹¤¿¤á( -s ¤ò»È¤Ã¤¿»þ¤Ç¤µ¤¨¥Ç¥Õ¥©¥ë¥È¥ë¡¼¥ë¤ò´Þ¤ß¤Þ¤¹)¡¢ Àµ¤·¤¤ ctr ¤ÎÀë¸À¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹:
int ctr[YY_NUM_RULES];
¥Þ¥¯¥í YY_USER_INIT ¤Ë¤ÏºÇ½é¤Î¥¹¥¥ã¥ó¤ÎÁ°¤Ë¾ï¤Ë¹Ô¤¦¥¢¥¯¥·¥ç¥ó¤òºÆÄêµÁ¤Ç¤¤Þ¤¹ (¥¹¥¥ã¥Ê¤ÎÆâÉô½é´ü²½¤ÎÁ°¤Ë¹Ô¤ï¤ì¤Þ¤¹)¡£ Î㤨¤Ð¥Ç¡¼¥¿É½¤òÆɤ߹þ¤ó¤À¤ê¡¢¥í¥°¥Õ¥¡¥¤¥ë¤ò¥ª¡¼¥×¥ó¤¹¤ë¤¿¤á¤Ë»ÈÍѤǤ¤Þ¤¹¡£
¥Þ¥¯¥í yy_set_interactive(is_interactive) ¤Ï¸½ºß¤Î¥Ð¥Ã¥Õ¥¡¤¬ ÂÐÏÃŪ ¤È¸«Ê蘆¤ì¤Æ¤¤¤ë¤«Èݤ«¤òÀ©¸æ¤¹¤ë¤¿¤á¤Ë»ÈÍѤ·¤Þ¤¹¡£ ÂÐÏÃŪ¤Ê¥Ð¥Ã¥Õ¥¡¤Î½èÍý¤ÏÃÙ¤¯¤Ê¤ê¤Þ¤¹¤¬¡¢ ¥¹¥¥ã¥Ê¤ÎÆþÎϸµ¤¬ÂÐÏÃŪ¤Ç¤¢¤ê¥Ð¥Ã¥Õ¥¡¤ò¥Õ¥£¥ë¤¹¤ë¤Î¤òÂԤĤ³¤È¤Ëµ¯°ø¤¹¤ë ÌäÂê¤òÈò¤±¤ë¤¿¤á¤Ë¤Ï»ØÄꤷ¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó(°Ê²¼¤Î -I %option interactive ¥Õ¥é¥°¤Ë´Ø¤¹¤ëµÄÏÀ¤ò»²¾È¤·¤Æ²¼¤µ¤¤)¡£ ¥Þ¥¯¥íµ¯Æ°»þ¤ËÈó¥¼¥í¤ò»ØÄꤹ¤ë¤È¥Ð¥Ã¥Õ¥¡¤ÏÂÐÏÃŪ¤Ë¤Ê¤ê¡¢ ¥¼¥í¤ò»ØÄꤹ¤ë¤ÈÈóÂÐÏÃŪ¤Ë¤Ê¤ê¤Þ¤¹¡£ ¤³¤Î¥Þ¥¯¥í¤Î»ÈÍÑ¤Ï %option interactive , %option always-interactive , %option never-interactive ¤ËÍ¥À褷¤Þ¤¹(²¼µ¥ª¥×¥·¥ç¥ó¤ò»²¾È¤·¤Æ²¼¤µ¤¤)¡£ ¥Ð¥Ã¥Õ¥¡¤ò¥¹¥¥ã¥ó¤·¤ÆÂÐÏÃŪ¤Ç¤¢¤ë(¤â¤·¤¯¤Ï¤Ç¤Ê¤¤)¤ÈȽÃǤµ¤ì¤ëÁ°¤Ë¡¢ yy_set_interactive() ¤òµ¯Æ°¤·¤Æ²¼¤µ¤¤¡£
¥Þ¥¯¥í yy_set_bol(at_bol) ¤Ï¸½ºß¤Î¥Ð¥Ã¥Õ¥¡¤Ë¤ª¤±¤ë¼¡¤Î¥È¡¼¥¯¥ó¤ËÂФ¹¤ë¥Þ¥Ã¥Á¤Î¤¿¤á¤Î¥¹¥¥ã¥ó¤¬ ¹ÔƬ¤«¤é»Ï¤Þ¤ë¤«Èݤ«¤òÀ©¸æ¤·¤Þ¤¹¡£ Èó¥¼¥í¤Î¥Þ¥¯¥í°ú¿ô¤Ï¡¢'^' ¤¬ÉÕ¤¤¤¿¥ë¡¼¥ë¤ò͸ú¤Ë¤·¤Þ¤¹¤¬¡¢ ¥¼¥í¤Î¥Þ¥¯¥í°ú¿ô¤Ï '^' ¤¬ÉÕ¤¤¤¿¥ë¡¼¥ë¤ò̵¸ú¤Ë¤·¤Þ¤¹¡£
¸½ºß¤Î¥Ð¥Ã¥Õ¥¡¤«¤é¥¹¥¥ã¥ó¤µ¤ì¤¿¼¡¤Î¥È¡¼¥¯¥ó¤¬Í¸ú¤Ê '^' ¥ë¡¼¥ë¤ò»ý¤Ä»þ¡¢ ¥Þ¥¯¥í YY_AT_BOL() ¤Ï¿¿¤òÊÖ¤·¤Þ¤¹¡£ ¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Ïµ¶¤òÊÖ¤·¤Þ¤¹¡£
À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤Ç¤Ï¡¢Á´¤Æ¤Î¥¢¥¯¥·¥ç¥ó¤ÏÂ礤ʰì¤Ä¤Î switch ʸ¤Ë ½¸¤á¤é¤ì¡¢ YY_BREAK ¤Çʬ¤±¤é¤ì¤Æ¤¤¤Þ¤¹¡£ YY_BREAK ¤ÏºÆÄêµÁ²Äǽ¤Ç¤¹¡£¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¤½¤ì¤¾¤ì¤Î¥ë¡¼¥ë¤Î¥¢¥¯¥·¥ç¥ó¤ò ʬ¤±¤ë¤¿¤á¤Îñ¤Ê¤ë "break" ¤Ç¤¹¡£ YY_BREAK ¤òºÆÄêµÁ¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢Î㤨¤Ð C++ ¥æ¡¼¥¶¤¬ #define YY_BREAK ¤ò²¿¤â¤·¤Ê¤¤¤è¤¦¤ËÄêµÁ¤· (¤¿¤À¤·Á´¤Æ¤Î¥ë¡¼¥ë¤¬ "break" ¤« "return" ¤Ç½ª¤ë¤è¤¦¤Ë Ãí°Õ¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó!)¡¢ ¥ë¡¼¥ë¤Î¥¢¥¯¥·¥ç¥ó¤¬ "return" ¤Ç½ª¤ë¤³¤È¤Ë¤è¤ê YY_BREAK ¤¬¥¢¥¯¥»¥¹¤Ç¤¤Ê¤¤¤³¤È¤Ëµ¯°ø¤¹¤ë¡¢ Åþã¤Ç¤¤Ê¤¤Ê¸¤¬¤¢¤ë¤È¤¤¤¦·Ù¹ð¤òÈò¤±¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
¥æ¡¼¥¶¤¬»ÈÍѲÄǽ¤ÊÃÍ
¤³¤ÎÀá¤Ç¤Ï¥æ¡¼¥¶¤¬¥ë¡¼¥ë¤Î¥¢¥¯¥·¥ç¥óÉôʬ¤Ç»ÈÍѲÄǽ¤ÊÃͤò¤Þ¤È¤á¤Þ¤¹¡£- -
- char *yytext ¸½¥È¡¼¥¯¥ó¤Î¥Æ¥¥¹¥È¤òÊÝ»ý¤·¤Æ¤¤¤Þ¤¹¡£ÆâÍƤòÊѹ¹¤·¤Æ¤â¹½¤¤¤Þ¤»¤ó¤¬¡¢ ¤½¤ÎŤµ¤ò¿¤Ð¤·¤Æ¤Ï¤¤¤±¤Þ¤»¤ó(½ª¤ê¤Ëʸ»ú¤òÄɲ䷤ƤϤ¤¤±¤Ê¤¤)¡£
- ¥¹¥¥ã¥Ê¤Îµ½Ò¤ÎºÇ½é¤ÎÉôʬ¤ËÆÃÊ̤ʻؼ¨¤Ç¤¢¤ë %array ¤¬½ñ¤«¤ì¤Æ¤¤¤ë¤È¤¡¢ yytext ¤Ï char yytext[YYLMAX] ¤ÈÄêµÁ¤µ¤ì¤Þ¤¹¡£ YYLMAX ¤Ï¥Þ¥¯¥í¤Ç¡¢¥Ç¥Õ¥©¥ë¥È¤ÎÃÍ (¿¤¯¤Î¾ì¹ç8KB) ¤òÊѹ¹¤·¤¿¤¤¾ì¹ç¤Ë¤Ï ºÇ½é¤ÎÉôʬ¤ÇºÆÄêµÁ²Äǽ¤Ç¤¹¡£ %array ¤ò»È¤¦¤È¤¤¤¯¤é¤«ÃÙ¤¤¥¹¥¥ã¥Ê¤Ë¤Ê¤ê¤Þ¤¹¤¬¡¢ yytext ¤ÎÃÍ¤Ï input() ¤È unput() ¤Î¸Æ¤Ó½Ð¤·¤Ç¤âÇ˲õ¤µ¤ì¤Ê¤¯¤Ê¤ê¤Þ¤¹¡£ yytext ¤¬Ê¸»ú¥Ý¥¤¥ó¥¿¤Ç¤¢¤ë¾ì¹ç¡¢ ¤³¤ì¤é¤Î´Ø¿ô¸Æ¤Ó½Ð¤·¤Ï yytext ¤òÇ˲õ¤¹¤ë²ÄǽÀ¤¬¤¢¤ê¤Þ¤¹¡£ %array ¤ÈÂоΤʻØÄê %pointer ¤¬¥Ç¥Õ¥©¥ë¥È¤Ç¤¹¡£
- C++ ¤Î¥¹¥¥ã¥Ê¥¯¥é¥¹¤òÀ¸À®¤¹¤ë (¥ª¥×¥·¥ç¥ó -+ ) ¤È¤¤Ë¤Ï %array ¤Ï»È¤¨¤Þ¤»¤ó¡£
- -
- int yyleng ¸½¥È¡¼¥¯¥ó¤ÎŤµ¤òÊÝ»ý¤·¤Æ¤¤¤Þ¤¹¡£
- -
- FILE *yyin ¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç flex ¤¬Æɤà¥Õ¥¡¥¤¥ë¤Ç¤¹¡£ºÆÄêµÁ¤¹¤ë¤³¤È¤Ï²Äǽ¤Ç¤¹¤¬¡¢¥¹¥¥ã¥ó¤ò »Ï¤á¤ëÁ°¤« EOF ¤ËÅþ㤷¤¿¸å¤Ç¤Î¤ßºÆÄêµÁ¤Ï°ÕÌ£¤ò»ý¤Á¤Þ¤¹¡£ ¥¹¥¥ã¥ó¤ÎÅÓÃæ¤ÇÊѹ¹¤¹¤ë¤ÈͽÁÛ³°¤Î·ë²Ì¤ò¤â¤¿¤é¤·¤Þ¤¹¡£ ¤È¤¤¤¦¤Î¤â flex ¤ÏÆþÎϤò¥Ð¥Ã¥Õ¥¡¥ê¥ó¥°¤·¤Æ¤¤¤ë¤«¤é¤Ç¤¹; ¤½¤Î¤è¤¦¤Ê¾ì¹ç¤Ë¤Ï¡¢Ä¾ÀܺÆÄêµÁ¤»¤º yyrestart() ¤ò»È¤Ã¤Æ²¼¤µ¤¤¡£ ¥Õ¥¡¥¤¥ë¤Î½ª¤ï¤ê¤Ç¥¹¥¥ã¥ó¤¬½ªÎ»¤·¤¿¾ì¹ç¤Ë¤Ï yyin ¤ò¿·¤·¤¤ÆþÎÏ¥Õ¥¡¥¤¥ë¤Ë³ä¤êÅö¤Æ¡¢ ºÆ¤Ó¥¹¥¥ã¥Ê¤ò¸Æ¤Ó½Ð¤·¤Æ¥¹¥¥ã¥ó¤ò³¤±¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
- -
- void yyrestart( FILE *new_file ) ¤ò¸Æ¤Ö¤³¤È¤Ç yyin ¤¬¿·¤·¤¤ÆþÎÏ¥Õ¥¡¥¤¥ë¤ò»Ø¤¹¤è¤¦¤Ë½ÐÍè¤Þ¤¹¡£¿·¤·¤¤¥Õ¥¡¥¤¥ë¤Ø¤ÎÊѹ¹¤Ï ¤¹¤°¤Ë¹Ô¤ï¤ì¤Þ¤¹ (¤½¤ì¤Þ¤Ç¤Ë¥Ð¥Ã¥Õ¥¡¤ËÆɤ߹þ¤Þ¤ì¤Æ¤¤¤¿ÆþÎϤϼº¤ï¤ì¤Þ¤¹)¡£ yyin ¤ò°ú¿ô¤È¤·¤Æ yyrestart() ¤ò¸Æ¤Ö¤È¡¢¸½ºß¤ÎÆþÎϥХåե¡¤ò¼Î¤Æ¤ÆƱ¤¸ÆþÎÏ¥Õ¥¡¥¤¥ë¤ò ¥¹¥¥ã¥ó¤·Â³¤±¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
- -
- FILE *yyout ¤Ï ECHO ¥¢¥¯¥·¥ç¥ó¤¬¹Ô¤ï¤ì¤ëÂоݤΥե¡¥¤¥ë¤Ç¤¹¡£ ¥æ¡¼¥¶¤¬ºÆ³äÅö¤¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
- -
- YY_CURRENT_BUFFER ¥«¥ì¥ó¥È¥Ð¥Ã¥Õ¥¡¤Î YY_BUFFER_STATE ¥Ï¥ó¥É¥ë¤òÊÖ¤·¤Þ¤¹¡£
- -
- YY_START ¸½ºß¤Î³«»Ï¾ò·ï¤ËÂбþ¤¹¤ëÀ°¿ôÃͤòÊÖ¤·¤Þ¤¹¡£ ³¤¤¤Æ¤³¤ÎÃͤò BEGIN ¤È¶¦¤Ë»È¤¦¤³¤È¤Ç¡¢¥¹¥¥ã¥Ê¤ò¤½¤Î³«»Ï¾ò·ï¤ØÌ᤹¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
YACC ¤È¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹
flex ¤Î¼ç¤Ê»ÈÍÑÊýË¡¤Î°ì¤Ä¤Ï¡¢ yacc ¥Ñ¡¼¥µ¥¸¥§¥Í¥ì¡¼¥¿¤È¶¦¤Ë»ÈÍѤ¹¤ë¤³¤È¤Ç¤¹¡£ yacc ¥Ñ¡¼¥µ¤Ï yylex() ¤È¸À¤¦Ì¾Á°¤Î¥ë¡¼¥Á¥ó¤ò¸Æ¤Ó¡¢¼¡¤ÎÆþÎϥȡ¼¥¯¥ó¤ò¸«ÉÕ¤±¤ë¤â¤Î¤È¤·¤Æ¤¤¤Þ¤¹¡£ ¤³¤Î¥ë¡¼¥Á¥ó¤Ï¡¢¼¡¤Î¥È¡¼¥¯¥ó¤Î·¿¤òÊÖ¤·¡¢ ´ØÏ¢¤¹¤ëÃͤò¥°¥í¡¼¥Ð¥ë¤Î yylval ¤Ë³ÊǼ¤¹¤ë¤â¤Î¤È¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ flex ¤ò yacc ¤È¶¦¤Ë»È¤¦¤Ë¤Ï¡¢ yacc ¤Ë -d ¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Æ¡¢ yacc ¤ÎÆþÎϤ˸½¤ì¤ëÁ´¤Æ¤Î %tokens ¤ÎÄêµÁ¤ò´Þ¤à y.tab.h ¥Õ¥¡¥¤¥ë¤òÀ¸À®¤µ¤»¤Þ¤¹¡£ ¤³¤Î¥Õ¥¡¥¤¥ë¤Ï flex ¥¹¥¥ã¥Ê¤Ë¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤Þ¤¹¡£ Î㤨¤Ð¥È¡¼¥¯¥ó¤Î°ì¤Ä¤¬ "TOK_NUMBER" ¤Ç¤¢¤ë¾ì¹ç¡¢ ¥¹¥¥ã¥Ê¤Î°ìÉôʬ¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹:%{ #include "y.tab.h" %} %% [0-9]+ yylval = atoi( yytext ); return TOK_NUMBER;
¥ª¥×¥·¥ç¥ó
flex ¤Ë¤Ï°Ê²¼¤Î¤è¤¦¤Ê¥ª¥×¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹:- -b
- ¥Ð¥Ã¥¯¥¢¥Ã¥×¾ðÊó¤ò lex.backup ¤Ë½ÐÎϤ·¤Þ¤¹¡£ ¤³¤Î¥Õ¥¡¥¤¥ë¤Ë¤Ï¡¢¥¹¥¥ã¥Ê¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×(backing-up)¤òɬÍפȤ¹¤ë¾õÂÖ¤È ¤½¤ì¤ËÂбþ¤¹¤ëÆþÎÏʸ»ú¤Î°ìÍ÷¤¬¥ê¥¹¥È¤µ¤ì¤Þ¤¹¡£ ¥ë¡¼¥ë¤òÄɲ乤뤳¤È¤Ç¥Ð¥Ã¥¯¥¢¥Ã¥×¾õÂÖ¤ò¼è¤ê½ü¤¯¤³¤È ¤¬¤Ç¤¤Þ¤¹¡£¥Ð¥Ã¥¯¥¢¥Ã¥×¾õÂÖ¤¬ Á´¤Æ ¼è¤ê½ü¤«¤ì¡¢ -Cf ¤Þ¤¿¤Ï -CF ¤ò»ØÄꤹ¤ë¤È¡¢À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤Î¼Â¹Ô®ÅÙ¤¬¸þ¾å¤·¤Þ¤¹( -p ¥Õ¥é¥°¤ò¸«¤Æ²¼¤µ¤¤)¡£ ¥¹¥¥ã¥Ê¤ò¤®¤ê¤®¤ê¤Þ¤ÇºÇŬ²½¤·¤è¤¦¤È¤·¤Æ¤ë¥æ¡¼¥¶¤Î¤ß¤¬ ¤³¤Î¥ª¥×¥·¥ç¥ó¤Ë´Ø·¸¤¢¤ê¤Þ¤¹¡£ (¸å½Ò¤ÎÀǽ´ØÏ¢¤ÎÀá¤ò¸«¤Æ²¼¤µ¤¤¡£)
- -c
- ²¿¤â¤·¤Þ¤»¤ó¡£POSIX ¸ß´¹¤Î¤¿¤á¤ËÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£
- -d
- À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤¬ ¥Ç¥Ð¥Ã¥° ¥â¡¼¥É¤Ç¼Â¹Ô¤µ¤ì¤Þ¤¹¡£ yy_flex_debug ¤¬Èó¥¼¥í¤Î¾ì¹ç(¥Ç¥Õ¥©¥ë¥È)¡¢ ¥Ñ¥¿¡¼¥ó¤¬Ç§¼±¤µ¤ì¤ë¤¿¤Ó¤Ë¡¢¥¹¥¥ã¥Ê¤Ï¼¡¤Î¤è¤¦¤Ê¥á¥Ã¥»¡¼¥¸¤ò ɸ½à¥¨¥é¡¼½ÐÎÏ ¤Ø½ÐÎϤ·¤Þ¤¹¡£
--accepting rule at line 53 ("the matched text")
¹ÔÈÖ¹æ¤Ï¥¹¥¥ã¥Ê¤òÄêµÁ¤·¤Æ¤¤¤ë¥Õ¥¡¥¤¥ë (flex¤ËÍ¿¤¨¤é¤ì¤¿¥Õ¥¡¥¤¥ë) ¤Ç¤Î¥ë¡¼¥ë¤Î°ÌÃ֤Ǥ¹¡£ ¥¹¥¥ã¥Ê¤¬¥Ð¥Ã¥¯¥¢¥Ã¥×¤·¤¿¤È¤¡¢¥Ç¥Õ¥©¥ë¥È¥ë¡¼¥ë¤ò¼õ¤±Æþ¤ì¤¿¤È¤¡¢ ÆþÎϥХåե¡¤ÎºÇ¸å¤ËÅþ㤷¤¿¤È¤ (¤¢¤ë¤¤¤Ï¡¢NUL¤ËÅþ㤷¤¿¤È¤; ¥¹¥¥ã¥Ê¤Ë¤Ï¡¢¤³¤ÎÆó¤Ä¤Î¶èÊ̤ϤĤ¤Þ¤»¤ó) ¡¢¥Õ¥¡¥¤¥ë¤ÎºÇ¸å¤ËÅþ㤷¤¿ ¤È¤¤Ë¤â¥á¥Ã¥»¡¼¥¸¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£ - -f
- ¹â®¤Ê¥¹¥¥ã¥Ê ¤ò»ØÄꤷ¤Þ¤¹¡£ ¥Æ¡¼¥Ö¥ë°µ½Ì¤Ï¹Ô¤ï¤ì¤º¡¢É¸½àÆþ½ÐÎϤò¥Ð¥¤¥Ñ¥¹¤·¤Þ¤¹¡£ ¤½¤Î·ë²ÌÀ¸À®¤µ¤ì¤ë¥¹¥¥ã¥Ê¤ÏÂ礤¯¤Ê¤ê¤Þ¤¹¤¬¡¢¹â®¤Ê¤â¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£ ¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï -Cfr ¤ÈƱÅù¤Ç¤¹ (°Ê²¼¤ò»²¾È)¡£
- -h
- flex ¤Î¥ª¥×¥·¥ç¥ó¤ÎÍ×Ì󤫤é¤Ê¤ë "¥Ø¥ë¥×" ¤ò ɸ½à½ÐÎÏ ¤Ë½ñ¤½Ð¤·½ªÎ»¤·¤Þ¤¹¡£ -? ¤È --help ¤È¤Ï -h ¤ÈƱ¤¸¤Ç¤¹¡£
- -i
- Âçʸ»ú¾®Ê¸»ú¤ò¶èÊ̤·¤Ê¤¤ ¥¹¥¥ã¥Ê¤òÀ¸À®¤·¤Þ¤¹¡£ flex ¤ÎÆþÎϥѥ¿¡¼¥ó¤ËÍ¿¤¨¤é¤ì¤ëʸ»ú¤¬Âçʸ»ú¤Ç¤¢¤ë¤«¾®Ê¸»ú¤Ç¤¢¤ë¤«¤Ï¶èÊ̤µ¤ì¤º¡¢ ¥¹¥¥ã¥Ê¤ËÆþÎϤµ¤ì¤ëʸ»úÎó¤ÏÂçʸ»ú¾®Ê¸»ú¤Ë´Ø·¸¤Ê¤¯¥Þ¥Ã¥Á¤·¤Þ¤¹¡£ ¥Þ¥Ã¥Á¤·¤¿¥Æ¥¥¹¥È yytext ¤Ç¤ÏÆþÎÏ»þ¤ÎÂçʸ»ú¾®Ê¸»ú¤¬Êݸ¤µ¤ì¤Þ¤¹ (Âçʸ»ú¤ò¾®Ê¸»ú¤ËÊÑ´¹¤·¤¿¤ê¤·¤Þ¤»¤ó)¡£
- -l
- AT&T ¤Î lex ¤Î¼ÂÁõ¤ËÂФ·¤ÆºÇÂç¸Â¤Î¸ß´¹À¤ò»ý¤¿¤»¤Þ¤¹¡£¤³¤ì¤Ï ´°Á´¤Ê ¸ß´¹À¤ò°ÕÌ£¤·¤Þ¤»¤ó¡£ ¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤ÈÀǽ¤ËÂ礤ʱƶÁ¤¬¤¢¤ê¤Þ¤¹¡£ ¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¡¢ -+, -f, -F, -Cf, -CF ¤ÈƱ»þ¤Ë»ÈÍѤǤ¤Þ¤»¤ó¡£¾Ü¤·¤¯¤Ï¡¢ ¸å½Ò¤Î "Lex ¤ª¤è¤Ó POSIX ¤È¤ÎÈó¸ß´¹À" ¤ÎÀá¤ò¸æÍ÷²¼¤µ¤¤¡£ ¤Þ¤¿¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢ YY_FLEX_LEX_COMPAT ¤¬À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤Î̾Á°¤Ë #define ¤µ¤ì¤Þ¤¹¡£
- -n
- ²¿¤â¤·¤Þ¤»¤ó¡£POSIX ¸ß´¹¤Î¤¿¤á¤Ë¤À¤±ÍÑ°Õ¤µ¤ì¤¿¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£
- -p
- Àǽ¾ðÊó¤òɸ½à¥¨¥é¡¼½ÐÎϤ˽ÐÎϤ·¤Þ¤¹¡£ flex ÆþÎÏ¥Õ¥¡¥¤¥ë¤Îµ½Ò¤Î¤¦¤Á¡¢ À¸À®¤µ¤ì¤ë¥¹¥¥ã¥Ê¤ÎÀǽÄã²¼¤Î¿¼¹ï¤Ê¸¶°ø¤È¤Ê¤ëÉôʬ¤Ë¤Ä¤¤¤Æ¡¢ ¥³¥á¥ó¥È¤µ¤ì¤Þ¤¹¡£ ¥ª¥×¥·¥ç¥ó¤ò2²ó»ØÄꤹ¤ë¤È¡¢¤è¤êºÙ¤«¤ÊÀǽÄã²¼¤Ë¤Ä¤¤¤Æ¤â ¥³¥á¥ó¥È¤¬½ÐÎϤµ¤ì¤Þ¤¹¡£
- REJECT ¡¦ %option yylineno ¡¦²ÄÊÑű¦Ê¸Ì®(·ç´Ù/¥Ð¥°¤ÎÀá¤Ç¸å½Ò)¤Ï¿Âç¤Ê¤ëÀǽ¤Ø¤Î°±Æ¶Á¤¬¤¢¤ê¤Þ¤¹; yymore() ¤Î»ÈÍÑ¡¦ ^ ¥ª¥Ú¥ì¡¼¥¿¡¦ -I ¥Õ¥é¥°¤Ï¾®¤µ¤ÊÀǽ¤Î°±Æ¶Á¤¬¤¢¤ê¤Þ¤¹¡£
- -s
- ¥Ç¥Õ¥©¥ë¥È¥ë¡¼¥ë (¥Þ¥Ã¥Á¤·¤Ê¤¤¥¹¥¥ã¥Ê¤ÎÆþÎϤò ɸ½à½ÐÎÏ ¤Ë½ÐÎϤ¹¤ë) ¤¬ÍÞÀ©¤µ¤ì¤Þ¤¹¡£¥ë¡¼¥ë¤Ë¥Þ¥Ã¥Á¤·¤Ê¤¤ÆþÎϤ¬É½¤ì¤¿¤È¤¡¢¥¹¥¥ã¥Ê¤Ï ¥¨¥é¡¼¤Ç°Û¾ï½ªÎ»¤·¤Þ¤¹¡£ ¥¹¥¥ã¥Ê¤Î¥ë¡¼¥ë¤ÎÁȤËÈ´¤±¤¬Ìµ¤¤¤«¤ò³Îǧ¤¹¤ë¾ì¹ç¤Ë͸ú¤Ç¤¹¡£
- -t
- lex.yy.c ¤Ç¤Ï¤Ê¤¯¡¢É¸½à½ÐÎϤ˥¹¥¥ã¥Ê¤ò½ñ¤½Ð¤·¤Þ¤¹¡£
- -v
- À¸À®¤¹¤ë¥¹¥¥ã¥Ê¤ÎÆÃħ¤ÎÍ×Ìó¤ò ɸ½à¥¨¥é¡¼½ÐÎÏ ¤Ë½ÐÎϤ¹¤ë¤è¤¦¤Ë flex ¤Ë»Ø¼¨¤·¤Þ¤¹¡£ ¤Û¤È¤ó¤É¤ÎÆÃħ¤ÏÄ̾ï¤Î flex ¥æ¡¼¥¶¤Ë¤Ï°ÕÌ£¤¬¤¢¤ê¤Þ¤»¤ó¤¬¡¢ºÇ½é¤Î¹Ô¤Ï flex ¤Î¥Ð¡¼¥¸¥ç¥ó¤òɽ¼¨¤·( -V ¤Çɽ¼¨¤µ¤ì¤ë¤â¤ÈƱ¤¸¤Ç¤¹)¡¢¼¡¤Î¹Ô¤Ï¥Ç¥Õ¥©¥ë¥È¤ò´Þ¤à¥¹¥¥ã¥ÊÀ¸À®»þ¤Î¥Õ¥é¥°¤Ç¤¹¡£
- -w
- ·Ù¹ð¥á¥Ã¥»¡¼¥¸¤òÍÞÀ©¤·¤Þ¤¹¡£
- -B
- ÂÐÏÃŪ ¤Ê¥¹¥¥ã¥Ê (°Ê²¼¤Î -I ¤Î¹à¤ò»²¾È) ¤Ç¤Ï¤Ê¤¯ ¥Ð¥Ã¥ÁŪ ¤Ê¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦ flex ¤Ë»Ø¼¨¤·¤Þ¤¹¡£ Ä̾ï -B ¤ò»ÈÍѤ¹¤ë¤Î¤Ï¡¢¥¹¥¥ã¥Ê¤òÂÐÏÃŪ¤Ë»ÈÍѤ·¤Ê¤¤¤³¤È¤¬ ʬ¤«¤Ã¤Æ¤¤¤ë »þ¤Ç¤¢¤ê¡¢ ¾¯¤·¤Ç¤â Àǽ¤òÄɵᤷ¤¿¤¤»þ¤Ç¤¹¡£ ¤è¤êÂ礤¤Àǽ¤òÄɵ᤹¤ë¾ì¹ç¤Ë¤Ï¡¢ -Cf ¤â¤·¤¯¤Ï -CF ¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤Ù¤¤Ç¤¹(¸å½Ò)¡£ -B ¤ò¼«Æ°Åª¤ËÀßÄꤷ¤Þ¤¹¡£
- -F
- ¹â®¤Ê ¥¹¥¥ã¥Ê¥Æ¡¼¥Ö¥ë¤Îɽ¸½¤ò»È¤¦(ɸ½àÆþ½ÐÎϤϥХ¤¥Ñ¥¹¤¹¤ë)¤³¤È¤ò»ØÄꤷ¤Þ¤¹¡£ ¤³¤Îɽ¸½¤Ï¡¢´°Á´¥Æ¡¼¥Ö¥ëɽ¸½ (-f) ¤È¤Û¤ÜƱ¤¸¤°¤é¤¤¹â®¤Ç¡¢ ¤¢¤ë¼ï¤Î¥Ñ¥¿¡¼¥ó¤ËÂФ·¤Æ¤Ï¤«¤Ê¤ê¾®¤µ¤¯ (¤¢¤ë¼ï¤ËÂФ·¤Æ¤ÏÂ礤¯) ¤Ê¤ê¤Þ¤¹¡£ Ä̾¼¡¤Î¤è¤¦¤Ë¡¢¥Ñ¥¿¡¼¥ó¤ÎÁȤ¬ "keywords" ¤È¤½¤ÎÂбþ ¤ª¤è¤Ó "identifier" ¥ë¡¼¥ë¤«¤é¤Ê¤ë¾ì¹ç:
"case" return TOK_CASE; "switch" return TOK_SWITCH; ... "default" return TOK_DEFAULT; [a-z]+ return TOK_ID;
¤³¤Î¾ì¹ç¡¢´°Á´¥Æ¡¼¥Ö¥ëɽ¸½¤ò»ÈÍѤ¹¤ëÊý¤¬Îɤ¤¤Ç¤¹¡£ ¤â¤· "identifier" ¥ë¡¼¥ë¤«¤é¤Î¤ßɽ¸½¤µ¤ì¡¢ ¥¡¼¥ï¡¼¥É¤ò¸¡ÃΤ¹¤ë¤¿¤á¤Ë¥Ï¥Ã¥·¥åɽÅù¤ò»ÈÍѤ¹¤ë¾ì¹ç¤Ï¡¢ -F ¤ò»ÈÍѤ¹¤ëÊý¤¬Îɤ¤¤Ç¤¹¡£ - ¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï -CFr ¤ÈÅù²Á¤Ç¤¹ (°Ê²¼¤ò»²¾È)¡£ ¤³¤ì¤Ï -+ ¥ª¥×¥·¥ç¥ó¤È¤ÏƱ»þ¤Ë»ØÄê¤Ç¤¤Þ¤»¤ó¡£
- -I
- flex ¤Ë ÂÐÏÃŪ ¤Ê¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦¤Ë»Ø¼¨¤·¤Þ¤¹¡£ ÂÐÏÃŪ¤Ê¥¹¥¥ã¥Ê¤Ï¡¢ ÀèÆɤߤ¹¤ë¤³¤È¤Ë¤è¤ê¥Þ¥Ã¥Á¤¹¤ë¥È¡¼¥¯¥ó¤¬´°Á´¤Ë·è¤Þ¤ë¾ì¹ç¤Î¤ßÀèÆɤߤ·¤Þ¤¹¡£ ¸½ºß¤Î¥È¡¼¥¯¥ó¤¬´û¤ËÌÀ¤é¤«¤Ê¾ì¹ç¤Ç¤â¾ï¤ËÀèÆɤߤ¹¤ëÊýË¡¤Ï¡¢ ɬÍ×»þ¤Î¤ßÀèÆɤߤ¹¤ëÊýË¡¤è¤ê¾¯¤·Â®¤¤¤Ç¤¹¡£ ¤·¤«¤·¡¢¾ï¤ËÀèÆɤߤ¹¤ëÊýË¡¤Ç¤ÏÂÐÏÃÀǽ¤ËÃø¤·¤¯°±Æ¶Á¤¬¤¢¤ê¤Þ¤¹; Î㤨¤Ð¥æ¡¼¥¶¤¬²þ¹Ô¤òÆþÎϤ·¤¿¾ì¹ç¡¢ Ê̤Π¥È¡¼¥¯¥ó¤òÆþÎϤ¹¤ë¤Þ¤Ç¤½¤ì¤Ï²þ¹Ô¤È¤·¤Æǧ¼±¤µ¤ì¤Þ¤»¤ó¡£ Âç³µ¤Î¾ì¹ç¡¢¼¡¤Î¹ÔÁ´ÂΤòÆþÎϤ¹¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£
- flex ¤Î¥¹¥¥ã¥Ê¤Î¥Ç¥Õ¥©¥ë¥È¤Ï ÂÐÏÃŪ ¤Ç¤¢¤ê¡¢Îã³°¤Ï -Cf ¤ä -CF ¤È¤¤¤Ã¤¿¥Æ¡¼¥Ö¥ë°µ½Ì¥ª¥×¥·¥ç¥ó(¸å½Ò)»ÈÍÑ»þ¤Ç¤¹¡£ ¹âÀǽÄɵá»þ¤Ë¤Ï¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤¤¤ë¤Ù¤¤Ç¤¹¤Î¤Ç¡¢ ¤³¤ì¤é¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢ flex ¤Ï¼Â¹Ô»þÀǽ¤ò¾¯¤·µ¾À·¤Ë¤·¤Æľ´ÑŪ¤ÊÂÐÏÃŪ¤Ê¿¶Éñ¤¤¤ò¼è¤Ã¤Æ¤¤¤ë¤â¤Î¤È¤·¤Þ¤¹¡£ -I ¥ª¥×¥·¥ç¥ó¤ò -Cf ¤ä -CF ¤È¶¦¤Ë »ÈÍѤǤ¤Ê¤¤ ¤³¤È¤Ë¤âÃí°Õ¤·¤Æ²¼¤µ¤¤¡£ ¼ÂºÝ¤Ï¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏÉÔÍפǤ¹; µö¤µ¤ì¤ë¾ì¹ç¡¢¥Ç¥Õ¥©¥ë¥È¤Ç͸ú¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£
- isatty() ¤¬¥¹¥¥ã¥Ê¤ÎÆþÎϤËÂФ·¤Æµ¶¤òÊÖ¤¹¾ì¹ç¡¢ -I ¤¬»ØÄꤵ¤ì¤Æ¤¤¤¿¾ì¹ç¤Ç¤â¡¢flex ¤Ï¥Ð¥Ã¥Á¥â¡¼¥É¤ØÌá¤ê¤Þ¤¹¡£ ¤Ê¤Ë¤¬¤¢¤Ã¤Æ¤âÂÐÏå⡼¥É¤ò¶¯À©¤¹¤ë¤Ë¤Ï¡¢ %option always-interactive (¸å½Ò¤Î¥ª¥×¥·¥ç¥ó¤ò»²¾È) ¤ò»ÈÍѤ·¤Þ¤¹¡£
- ¥¹¥¥ã¥Ê¤òÂÐÏÃŪ¤Ç ̵¤¤ ¤è¤¦¤Ë¶¯À©¤¹¤ë¤Ë¤Ï -B (Àè½Ò)¤ò»ÈÍѤ·¤Þ¤¹¡£
- -L
- flex ¤Ë #line ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤ò lex.yy.c Ãæ¤ËÀ¸À®¤·¤Ê¤¤¤è¤¦¤Ë»Ø¼¨¤·¤Þ¤¹¡£ ¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï¤³¤Î #line ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤òÀ¸À®¤¹¤ë¤Î¤Ç¡¢ ¥¢¥¯¥·¥ç¥ó¤Ë¤ª¤±¤ë¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤Ï¡¢¥ª¥ê¥¸¥Ê¥ë¤Î flex ÆþÎÏ¥Õ¥¡¥¤¥ë( ¥¨¥é¡¼¤¬ÆþÎÏ¥Õ¥¡¥¤¥ë¤Î¥³¡¼¥É¤Ëµ¯°ø¤¹¤ë¾ì¹ç)¤â¤·¤¯¤Ï ¥Õ¥¡¥¤¥ë lex.yy.c ( flex ¤Î¸í¤ê -- °Ê²¼¤ÎÅŻҥ᡼¥ë¥¢¥É¥ì¥¹¤ËÊó¹ð¤·¤Æ²¼¤µ¤¤) ¤Ë¤ª¤±¤ëÀµ¤·¤¤°ÌÃÖ¤òÍ¿¤¨¤Þ¤¹¡£
- -T
- flex ¤ò ¥È¥ì¡¼¥¹ ¥â¡¼¥É¤Ç¼Â¹Ô¤·¤Þ¤¹¡£ ÆþÎϤηÁ¼°¤È¤½¤Î·ë²Ì¤È¤·¤Æ½ÐÎϤµ¤ì¤ëÈó·èÄêÀ/·èÄêÀ͸ ¥ª¡¼¥È¥Þ¥È¥ó¤Ë´Ø¤·¤Æ ɸ½à¥¨¥é¡¼½ÐÎÏ ¤Ë¿Î̤Υá¥Ã¥»¡¼¥¸¤ò½ÐÎϤ·¤Þ¤¹¡£ ¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï¼ç¤Ë flex ¤ò¥á¥ó¥Æ¥Ê¥ó¥¹¤¹¤ë¤¿¤á¤Ë»È¤ï¤ì¤Þ¤¹¡£
- -V
- ¥Ð¡¼¥¸¥ç¥óÈÖ¹æ¤ò ɸ½à½ÐÎÏ ¤Ë½ÐÎϤ·¤Æ½ªÎ»¤·¤Þ¤¹¡£ --version ¤Ï -V ¤ÈƱ¤¸¤Ç¤¹¡£
- -7
- 7 ¥Ó¥Ã¥È¤Î¥¹¥¥ã¥Ê¤òÀ¸À®¤·¤Þ¤¹¡£ ¤¹¤Ê¤ï¤Á¡¢ÆþÎÏ¤Ë 7 ¥Ó¥Ã¥È¤Îʸ»ú¤Î¤ß¤ò»ÈÍѤ¹¤ë¤³¤È¤ò°ÕÌ£¤·¤Þ¤¹¡£ -7 ¤ò»ØÄꤹ¤ëÍøÅÀ¤Ï¡¢ -8 ¥ª¥×¥·¥ç¥ó(¸å½Ò)¤ò»ØÄꤷ¤ÆÀ¸À®¤¹¤ë¥Æ¡¼¥Ö¥ë¤ÎȾʬ¤Þ¤Ç¾®¤µ¤¯¤Ê¤ê¤¦¤ë¤³¤È¤Ç¤¹¡£ ·çÅÀ¤Ï¡¢ÆþÎÏ¤Ë 8 ¥Ó¥Ã¥Èʸ»ú¤¬´Þ¤Þ¤ì¤Æ¤¤¤ë»þ¤Ë¡¢ ¥¹¥¥ã¥Ê¤¬¥Ï¥ó¥°¤â¤·¤¯¤Ï¥¯¥é¥Ã¥·¥å¤¹¤ë¤³¤È¤Ç¤¹¡£
- ¤·¤«¤·¤Ê¤¬¤é¡¢ -Cf ¤ä -CF ¤È¤¤¤Ã¤¿¥Æ¡¼¥Ö¥ë°µ½Ì¥ª¥×¥·¥ç¥ó»ÈÍÑ»þ¤Ë¤Ï¥Æ¡¼¥Ö¥ë°µ½Ì¤Î¸ú²Ì¤Ï¾¯¤Ê¤¯¡¢ °Ü¿¢À¤¬Ãø¤·¤¯Äã²¼¤¹¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£ flex ¤Î¥Ç¥Õ¥©¥ë¥È¤ÎÆ°ºî¤Ç¤Ï¡¢ -Cf ¤ä -CF, ¤ò»ØÄꤷ¤Ê¤¤¸Â¤ê 8 ¥Ó¥Ã¥È¥¹¥¥ã¥Ê¤òÀ¸À®¤·¤Þ¤¹¡£ »ØÄê»þ¤Ë¤Ï¡¢ ¤¢¤Ê¤¿¤Î¥µ¥¤¥È¤¬¾ï¤Ë 8 ¥Ó¥Ã¥È¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦¤Ë (USA °Ê³°¤Î¥µ¥¤¥È¤Ç¤ÏÎɤ¯¤¢¤ê¤Þ¤¹)¤·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢ 7 ¥Ó¥Ã¥È¥¹¥¥ã¥Ê¤òÀ¸À®¤·¤Þ¤¹¡£ flex ¤¬ 7 ¥Ó¥Ã¥È¤â¤·¤¯¤Ï 8 ¥Ó¥Ã¥È¤Î¤¤¤º¤ì¤Î¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤Î¤«¤ò ÃΤꤿ¤¤¾ì¹ç¤Ë¤Ï¡¢¾å½Ò¤Î -v ¤Î½ÐÎϤΥե饰¤ÎÍ×Ìó¤òÄ´¤Ù¤Æ²¼¤µ¤¤¡£
- -Cfe ¤â¤·¤¯¤Ï -CFe (¤³¤ì¤é¤Î¥Æ¡¼¥Ö¥ë°µ½Ì¥ª¥×¥·¥ç¥ó¤ª¤è¤ÓÅù²Á¥¯¥é¥¹¤Ï¸å½Ò) ¤ò»ÈÍѤ·¤Æ¤â¡¢flex ¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç 8 ¥Ó¥Ã¥È¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤³¤È¤Ë Ãí°Õ¤·¤Æ²¼¤µ¤¤¡£ ¤Ê¤¼¤Ê¤é¡¢´°Á´¤Ê 8 ¥Ó¥Ã¥È¥Æ¡¼¥Ö¥ë¤Ï 7 ¥Ó¥Ã¥È¥Æ¡¼¥Ö¥ë¤ÈÈæ¤Ù¤Æ¤â ¤¿¤¤¤·¤Æ¹â²Á¤Ë¤Ï¤Ê¤é¤Ê¤¤¤«¤é¤Ç¤¹¡£
- -8
- 8 ¥Ó¥Ã¥È¤Î¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦¤Ë flex ¤Ë»Ø¼¨¤·¤Þ¤¹¡£¤¹¤Ê¤ï¤Á 8 ¥Ó¥Ã¥Èʸ»ú¤ò²ò¼á¤·¤Þ¤¹¡£ °µ½Ì¥ª¥×¥·¥ç¥ó -Cf ¤È -CF »ÈÍÑ»þ¤Ë¤Î¤ßɬÍפǤ¹¡£ ¤Ê¤¼¤Ê¤é flex ¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï 8 ¥Ó¥Ã¥È¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤«¤é¤Ç¤¹¡£
- flex ¤Î¥Ç¥Õ¥©¥ë¥ÈÆ°ºî¤È 7 ¥Ó¥Ã¥È¤ª¤è¤Ó 8 ¥Ó¥Ã¥È¥¹¥¥ã¥Ê¤Î ¥È¥ì¡¼¥É¥ª¥Õ¤Ë´Ø¤·¤Æ¤Ï¡¢¾åµ -7 ¤ÎµÄÏÀ¤ò¸«¤Æ²¼¤µ¤¤¡£
- -+
- C++ ¤Î¥¹¥¥ã¥Ê¥¯¥é¥¹¤òÀ¸À®¤·¤Þ¤¹¡£ ¾Ü¤·¤¯¤Ï C++ ¥¹¥¥ã¥Ê¤ÎÀ¸À®¤Ç¸å½Ò¤·¤Þ¤¹¡£
- -C[aefFmr]
- ¥Æ¡¼¥Ö¥ë°µ½Ì¤ÎÄøÅ٤ȡ¢ ¤è¤ê°ìÈÌŪ¤Ë¤Ï¾®¤µ¤¤¥¹¥¥ã¥Ê¤È¹â®¤Ê¥¹¥¥ã¥Ê¤È¤Î¥È¥ì¡¼¥É¥ª¥Õ¤ò»ØÄꤷ¤Þ¤¹¡£
- -Ca ("¥¢¥é¥¤¥ó") À¸À®¤µ¤ì¤ë¥¹¥¥ã¥Ê¤Î¥Æ¡¼¥Ö¥ë¤Ï¡¢ ¥á¥â¥ê¥¢¥¯¥»¥¹¤ª¤è¤Ó·×»»¤Î¤¿¤á¤Ë¥¢¥é¥¤¥ó¤µ¤ì¤ë¤¿¤á¡¢¤è¤êÂ礤ʤâ¤Î¤Ë¤Ê¤ê¤Þ¤¹¡£ RISC ¥¢¡¼¥¥Æ¥¯¥Á¥ã¤Ç¤Ï¥í¥ó¥°¥ï¡¼¥É¤Î¥Õ¥§¥Ã¥Á¤ª¤è¤ÓÁàºî¤Ï ¥·¥ç¡¼¥È¥ï¡¼¥É¤È¤¤¤Ã¤¿¤è¤ê¾®¤µ¤ÊÂ礤µ¤Î¤â¤Î¤ËÂФ¹¤ë¤â¤Î¤è¤ê¸úΨŪ¤Ç¤¹¡£ ¾ì¹ç¤Ë¤è¤Ã¤Æ¤Ï¥¹¥¥ã¥Ê¤Î¥Æ¡¼¥Ö¥ë¥µ¥¤¥º¤¬Ä̾ï¤Î 2Çܤˤʤ뤳¤È¤â¤¢¤ê¤Þ¤¹¡£
- -Ce Åù²Á¥¯¥é¥¹ (Ʊ°ì¤Î»ú¶ç°À¤ò»ý¤Äʸ»ú¥»¥Ã¥È)¤ò¹½ÃÛ¤·¤Þ¤¹ (Î㤨¤Ð¡¢ flex ÆþÎÏÃæ¤Ë¿ô»ú¤¬¸½¤ì¤ë¤Î¤¬Ê¸»ú¥¯¥é¥¹ "[0-9]" ¤Î¤ß¤Î¾ì¹ç¡¢ ¿ô»ú '0', '1', ..., '9' ¤ÏÁ´¤ÆƱ¤¸Åù²Á¥¯¥é¥¹¤Ë¤Ê¤ê¤Þ¤¹)¡£ ¿¤¯¤Î¾ì¹ç¡¢Åù²Á¥¯¥é¥¹¤òÍѤ¤¤ë¤³¤È¤ÇºÇ½ªÅª¤Ê¥Æ¡¼¥Ö¥ë/ ¥ª¥Ö¥¸¥§¥¯¥È¥Õ¥¡¥¤¥ë¤Î¥µ¥¤¥º¤ò·àŪ(Ê¿¶Ñ¤·¤Æ 1/2-1/5)¤Ë¸º¤é¤¹¤³¤È¤¬½ÐÍè¤Þ¤¹¡£ ¤Þ¤¿¡¢¤½¤ÎºÝ¤ÎÀǽ¥³¥¹¥È¤ÏÈó¾ï¤ËÄ㤯ÍÞ¤¨¤é¤ì¤Þ¤¹ ( 1ʸ»ú¥¹¥¥ã¥ó¤¹¤ë¤´¤È¤Ë 1²ó¤ÎÇÛÎ󸡺÷¤ò¹Ô¤¦¤À¤±¤Ç¤¹)¡£
- -Cf ´°Á´(full) ¥¹¥¥ã¥Ê¥Æ¡¼¥Ö¥ë¤òÀ¸À®¤¹¤ë¤³¤È¤ò»Ø¼¨¤·¤Þ¤¹ - flex ¤Ï¡¢Ê̤ξõÂ֤˴ؤ¹¤ëÎà»÷¤·¤¿Á«°Ü´Ø¿ô¤ò¤¦¤Þ¤¯ÍøÍѤ¹¤ë¤È¤¤¤¦¡¢ ¥Æ¡¼¥Ö¥ë°µ½Ì¼êË¡¤òÍѤ¤¤Þ¤»¤ó¡£
- -CF Ê̤ι⮥¹¥¥ã¥Êɽ¸½( -F ¥Õ¥é¥°¤Ë¤Æµ½Ò)¤òÍѤ¤¤ë¤³¤È¤ò»ØÄꤷ¤Þ¤¹¡£ ¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï -+ ¤ÈƱ»þ¤Ë»ÈÍѤǤ¤Þ¤»¤ó¡£
- -Cm flex ¤Ë ¥á¥¿Åù²Á¥¯¥é¥¹ ¤ò¹½ÃÛ¤¹¤ë¤è¤¦»Ø¼¨¤·¤Þ¤¹¡£ ¥á¥¿Åù²Á¥¯¥é¥¹¤Ï°ì½ï¤Ë»È¤ï¤ì¤ë¤³¤È¤Î¿¤¤Åù²Á¥¯¥é¥¹ (Åù²Á¥¯¥é¥¹¤¬»È¤ï¤ì¤Æ¤¤¤Ê¤¤¤È¤¤Ë¤Ïʸ»ú·²) ¤Î½¸¹ç¤Ç¤¹¡£ °µ½Ì¥Æ¡¼¥Ö¥ë¤ò»È¤Ã¤Æ¤¤¤ë¤È¤¡¢ ¥á¥¿Åù²Á¥¯¥é¥¹¤Ï¿¤¯¤Î¾ì¹ç¤Ë¤«¤Ê¤ê¤Î¸ú²ÌŪ¤ò¤â¤¿¤é¤·¤Þ¤¹¤¬¡¢ ¤ä¤äÀǽ¤Ë±Æ¶Á¤·¤Þ¤¹ (1-2 ²ó¤Î¾ò·ï¥Æ¥¹¥È¤È 1 ²ó¤ÎÇÛÎ󸡺÷¤¬¥¹¥¥ã¥ó¤·¤¿Ê¸»ú¤´¤È¤Ë¹Ô¤ï¤ì¤Þ¤¹)¡£
- -Cr À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤ÏÆþÎϤËÂФ·¤Æ¤Ïɸ½àÆþ½ÐÎϥ饤¥Ö¥é¥ê(ɸ½àÆþ½ÐÎÏ)¤ò ¥Ð¥¤¥Ñ¥¹ ¤·¤Þ¤¹¡£ ¥¹¥¥ã¥Ê¤Ï¡¢ fread() ¤ä getc() ¤Ç¤Ï¤Ê¤¯¡¢ read() ¥·¥¹¥Æ¥à¥³¡¼¥ë¤ò»ÈÍѤ·¤Þ¤¹¡£ Àǽ²þÁ±·ë²Ì¤Ï¥·¥¹¥Æ¥à¤Ë°Í¸¤·¤Þ¤¹¡£ ¥ª¥×¥·¥ç¥ó -Cf ¤â¤·¤¯¤Ï -CF ¤ò»ÈÍѤ·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ë¤Ï¡¢ °ìÈ̤ˤ³¤Î¥ª¥×¥·¥ç¥ó¤ÏÀǽ¤ò¤¢¤Þ¤ê²þÁ±¤·¤Þ¤»¤ó¡£ -Cr ¤ò»ØÄꤹ¤ë¤È¡¢Î㤨¤Ð¥¹¥¥ã¥Ê¤òÀßÄꤹ¤ëÁ°¤Ëɸ½àÆþ½ÐÎϤò»ÈÍѤ·¤Æ yyin ¤òÆɤ߼è¤ëÅù¤·¤¿¾ì¹ç´ñ̯¤ÊÆ°ºî¤È¤Ê¤êÆÀ¤Þ¤¹ (ɸ½àÆþ½ÐÎϤÎÆþÎϥХåե¡¤Ë°ÊÁ°Æɤ߹þ¤ó¤À¤â¤Î¤ò¡¢¥¹¥¥ã¥Ê¤ÏÆɤá¤Þ¤»¤ó)¡£
- -Cr ¤Ï YY_INPUT ¤òÄêµÁ¤·¤¿¾ì¹ç°ÕÌ£¤¬¤¢¤ê¤Þ¤»¤ó (Á°½Ò¤ÎÀ¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤ò»²¾È)¡£ ¥¹¥¥ã¥Ê¤Î¸Æ½Ð¤ËÀè¤À¤Ã¤Æɸ½àÆþÎϤò»È¤Ã¤Æ yyin ¤«¤éÆɤߤÀ¤·¤Æ¤¤¤ë¤È¤¤Ë¤Ï¡¢Í½ÁÛ³°¤Î¿¶¤ëÉñ¤¤¤ò¤¹¤ë¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£
- -C ¤Î¤ß¤ò»ØÄꤷ¤¿¤È¤¤Ë¤Ï¡¢¥¹¥¥ã¥Ê¤Ï¥Æ¡¼¥Ö¥ë°µ½Ì¤Ï¹Ô¤¤¤Þ¤¹¤¬¡¢ Åù²Á¥¯¥é¥¹¤â¥á¥¿Åù²Á¥¯¥é¥¹¤â»È¤¤¤Þ¤»¤ó¡£
- ¥ª¥×¥·¥ç¥ó -Cf ¤È -CF ¤Ï¥ª¥×¥·¥ç¥ó -Cm ¤òƱ»þ¤Ë»ØÄꤷ¤Æ¤â°ÕÌ£¤ò¤Ê¤·¤Þ¤»¤ó - ¤Ê¤¼¤Ê¤é¡¢¥Æ¡¼¥Ö¥ë°µ½Ì¤¬¹Ô¤ï¤ì¤Ê¤¤¤È¤¥á¥¿Åù²Á¥¯¥é¥¹ ¤Ï¸½¤ì¤Ê¤¤¤«¤é¤Ç¤¹¡£ ¤½¤ì°Ê³°¤Î¥ª¥×¥·¥ç¥ó¤Ï¼«Í³¤ËÁȤ߹ç¤ï¤»¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
- ¥Ç¥Õ¥©¥ë¥È¤ÎÀßÄê¤Ï -Cem ¤Ç¤¹¡£¤³¤Î¤È¤ flex ¤ÏÅù²Á¥¯¥é¥¹¤È¥á¥¿Åù²Á¥¯¥é¥¹¤òÀ¸À®¤·¤Þ¤¹¡£ ¤³¤ÎÀßÄê¤ÏºÇ¤â¹â¤¤¥Æ¡¼¥Ö¥ë°µ½Ì¤ò¹Ô¤¤¤Þ¤¹¡£ ¥Æ¡¼¥Ö¥ë¥µ¥¤¥º¤ÎÂ礤µ¤È¼Â¹Ô¤Î¹â®À¤Ï¥È¥ì¡¼¥É¥ª¥Õ¤Î´Ø·¸¤Ë¤¢¤ê¡¢ °ìÈ̤Ë
-
ÃÙ¤¤¤¬ ¾®¤µ¤¤ -Cem -Cm -Ce -C -C{f,F}e -C{f,F} -C{f,F}a ®¤¤¤¬ Â礤¤
¤È¤Ê¤ê¤Þ¤¹¡£ ¾®¤µ¤¤¥Æ¡¼¥Ö¥ë¤Î¥¹¥¥ã¥Ê¤ÏÄ̾ïÀ¸À®¤â¥³¥ó¥Ñ¥¤¥ë¤â¹â®¤Ç¤¢¤ë¤¿¤á¡¢ Ä̾ï¤Î³«È¯»þ¤ÏºÇÂç¤Î°µ½Ì¤ò¹Ô¤¦¤Ç¤·¤ç¤¦¡£ - À½ÉʤΥ¹¥¥ã¥Ê¤Ç¤Ï¡¢ -Cfe ¤¬Â®ÅÙ¤ÈÂ礤µ¤ÎÎɤ¤¥Ð¥é¥ó¥¹¤Ç¤¹¡£
- -ooutput
- lex.yy.c ¤Ç¤Ï¤Ê¤¯¥Õ¥¡¥¤¥ë output ¤Ë¥¹¥¥ã¥Ê¤ò½ñ¤¯¤è¤¦¤Ë flex ¤Ë»Ø¼¨¤·¤Þ¤¹¡£ -o ¤È -t ¥ª¥×¥·¥ç¥ó¤òÁȤ߹ç¤ï¤»¤ë¤È¡¢ ¥¹¥¥ã¥Ê¤Ï ɸ½à½ÐÎÏ ¤Ë½ñ¤«¤ì¤Þ¤¹¤¬¡¢ #line ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö( \-L ¤Ë¤Æ¾å½Ò)¤Ï¥Õ¥¡¥¤¥ë output ¤ò»²¾È¤·¤Þ¤¹¡£
- -Pprefix
- flex ¤Î»È¤¦¥Ç¥Õ¥©¥ë¥È¤Î¥×¥ì¥Õ¥£¥Ã¥¯¥¹ yy ¤ÎÂå¤ï¤ê¤Ë prefix ¤ò»È¤¤¤Þ¤¹¡£¤³¤ì¤Ï¥°¥í¡¼¥Ð¥ëÊÑ¿ô¤È¥Õ¥¡¥¤¥ë̾¤Ë±Æ¶Á¤·¤Þ¤¹¡£ Î㤨¤Ð -Pfoo ¤È¤¹¤ë¤È¡¢ yytext ¤Î̾Á°¤Ï footext ¤È¤Ê¤ê¤Þ¤¹¡£ ¤Þ¤¿¥Ç¥Õ¥©¥ë¥È¤Î½ÐÎÏ¥Õ¥¡¥¤¥ë̾¤ò lex.yy.c ¤«¤é lex.foo.c ¤ËÊѤ¨¤Þ¤¹¡£ ±Æ¶Á¤ò¼õ¤±¤ë̾Á°¤Î°ìÍ÷¤Ç¤¹:
yy_create_buffer yy_delete_buffer yy_flex_debug yy_init_buffer yy_flush_buffer yy_load_buffer_state yy_switch_to_buffer yyin yyleng yylex yylineno yyout yyrestart yytext yywrap
(C++ ¥¹¥¥ã¥Ê»ÈÍÑ»þ¤Ë¤Ï yywrap ¤È yyFlexLexer ¤À¤±¤¬±Æ¶Á¤ò¼õ¤±¤Þ¤¹¡£) ¥¹¥¥ã¥Ê¤ÎÃæ¤Ç¤Ï¡¢¥°¥í¡¼¥Ð¥ëÊÑ¿ô¤ª¤è¤Ó´Ø¿ô¤ò ¤É¤Á¤é¤Î̾Á°¤Ç¤Ç¤â»²¾È¤Ç¤¤Þ¤¹; ³°ÉôŪ¤Ë¤Ï½¤Àµ¤·¤¿Ì¾Á°¤Î¤ß»ý¤Á¤Þ¤¹¡£ - ¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤³¤È¤Ë¤è¤ê¡¢Ê£¿ô¤Î flex ¥×¥í¥°¥é¥à¤òƱ°ì¤Î¼Â¹Ô·Á¼°¤ËÍưפ˥ê¥ó¥¯¤¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹¡£ ¤·¤«¤·¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï yywrap() ¤Î̾Á°¤ò¤âÊѤ¨¤Þ¤¹¤Î¤Ç¡¢ Æȼ«¤Î(ŬÀÚ¤Ë̾Á°¤òÉÕ¤±¤¿)¥ë¡¼¥Á¥ó¤ò¥¹¥¥ã¥Ê¤Î¤¿¤á¤ËÍÑ°Õ¤¹¤ë¤«¡¢ %option noyywrap ¤ò»ÈÍѤ·¤Æ -ll ¤È¥ê¥ó¥¯¤¹¤ë ɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ¤É¤ì¤â¥Ç¥Õ¥©¥ë¥È¤Ç¤ÏÄ󶡤µ¤ì¤Þ¤»¤ó¡£
- -Sskeleton_file
- flex ¤¬¥¹¥¥ã¥Ê¤ò¹½ÃÛ¤¹¤ë¤Î¤Ë»È¤¦¥Ç¥Õ¥©¥ë¥È¤Î ¥¹¥±¥ë¥È¥ó¥Õ¥¡¥¤¥ë¤ËÍ¥À褷¤Þ¤¹¡£ flex ¤Î¥á¥ó¥Æ¥Ê¥ó¥¹¤ä³«È¯¤ò¤¹¤ë¾ì¹ç°Ê³°¡¢¤³¤Î¥ª¥×¥·¥ç¥ó¤ÏɬÍפ¢¤ê¤Þ¤»¤ó¡£
flex ¤Ï¡¢flex ¤Î¥³¥Þ¥ó¥É¥é¥¤¥ó¤Ç¤Ï¤Ê¤¯¡¢ ¥¹¥¥ã¥Ê»ÅÍ͵½ÒÃ椫¤é¥ª¥×¥·¥ç¥ó¤òÀ©¸æ¤¹¤ëµ¡¹½¤òÄ󶡤·¤Þ¤¹¡£ ¤³¤ì¤Ï¥¹¥¥ã¥Ê¤ÎºÇ½é¤ÎÉôʬ¤Ë %option ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤ò´Þ¤á¤ë¤³¤È¤Ç¼Â¸½¤Ç¤¤Þ¤¹¡£ ñ°ì¤Î %option ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤Ë¤ª¤¤¤ÆÊ£¿ô¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄê¤Ç¤¡¢ ¤Þ¤¿Ê£¿ô¤Î¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤ò flex ÆþÎÏ¥Õ¥¡¥¤¥ë¤ÎºÇ½é¤ÎÉôʬ¤ËÃÖ¤¯¤³¤È¤¬½ÐÍè¤Þ¤¹¡£
¤Û¤È¤ó¤É¤Î¥ª¥×¥·¥ç¥ó¤¬Ã±½ã¤Ê̾Á°¤Ç¤¢¤ê¡¢ ¥ª¥×¥·¥ç¥ó¤È¤·¤ÆÁ°¤Ë "no" ¤È¤¤¤¦¸ì(¶õÇò¤ò¤Ï¤µ¤ß¤Þ¤»¤ó)¤òÉÕ¤±¤Æ °ÕÌ£¤òȿž¤Ç¤¤Þ¤¹¡£ ¿ôÃÍ¤Ï flex ¤Î¥Õ¥é¥°¤ä¤½¤Îȿž¤ÈÅù²Á¤Ç¤¹¡£
7bit -7 ¥ª¥×¥·¥ç¥ó 8bit -8 ¥ª¥×¥·¥ç¥ó align -Ca ¥ª¥×¥·¥ç¥ó backup -b ¥ª¥×¥·¥ç¥ó batch -B ¥ª¥×¥·¥ç¥ó c++ -+ ¥ª¥×¥·¥ç¥ó caseful ¤Þ¤¿¤Ï case-sensitive -i ¥ª¥×¥·¥ç¥ó¤ÎµÕ(¥Ç¥Õ¥©¥ë¥È) case-insensitive ¤Þ¤¿¤Ï caseless -i ¥ª¥×¥·¥ç¥ó debug -d ¥ª¥×¥·¥ç¥ó default -s ¥ª¥×¥·¥ç¥ó¤ÎµÕ ecs -Ce ¥ª¥×¥·¥ç¥ó fast -F ¥ª¥×¥·¥ç¥ó full -f ¥ª¥×¥·¥ç¥ó interactive -I ¥ª¥×¥·¥ç¥ó lex-compat -l ¥ª¥×¥·¥ç¥ó meta-ecs -Cm ¥ª¥×¥·¥ç¥ó perf-report -p ¥ª¥×¥·¥ç¥ó read -Cr ¥ª¥×¥·¥ç¥ó stdout -t ¥ª¥×¥·¥ç¥ó verbose -v ¥ª¥×¥·¥ç¥ó warn -w ¥ª¥×¥·¥ç¥ó¤ÎµÕ (-w ¥ª¥×¥·¥ç¥ó¤Ë¤Ï "%option nowarn" ¤ò»ÈÍѤ·¤Æ²¼¤µ¤¤) array "%array" ¤ÈÅù²Á pointer "%pointer" ¤ÈÅù²Á(¥Ç¥Õ¥©¥ë¥È)%option ¤Ë¤Ï¡¢Â¾¤Ç¤ÏÍøÍѤǤ¤Ê¤¤µ¡Ç½¤òÄ󶡤¹¤ë¤â¤Î¤â¤¢¤ê¤Þ¤¹:
- always-interactive
- ÆþÎϤò¾ï¤Ë "ÂÐÏÃŪ" ¤Ë°·¤¦¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦¤Ë flex ¤Ë»Ø¼¨¤·¤Þ¤¹¡£ Ä̾¿·¤¿¤ÊÆþÎÏ¥Õ¥¡¥¤¥ëËè¤Ë¥¹¥¥ã¥Ê¤Ï isatty() ¤ò¸Æ¤Ó½Ð¤·¡¢¥¹¥¥ã¥Ê¤ÎÆþÎϸµ¤¬ÂÐÏÃŪ¤Ç¤¢¤ê 1 ÅÙ¤Ë 1 ʸ»ú¤º¤ÄÆɤà¤Ù¤¤« ¤É¤¦¤«È½Äꤷ¤è¤¦¤È¤·¤Þ¤¹¡£ °ìÊý¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¤³¤ÎÍͤʸƤӽФ·¤Ï¹Ô¤¤¤Þ¤»¤ó¡£
- main
- ¥¹¥¥ã¥Ê¤ËÂФ·¡¢ yylex() ¤ò¸Æ¤Ó½Ð¤¹¤À¤±¤Î¥Ç¥Õ¥©¥ë¥È¤Î main() ¥×¥í¥°¥é¥à¤òÄ󶡤¹¤ë¤è¤¦¤Ë»Ø¼¨¤·¤Þ¤¹¡£ ¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï noyywrap (¸å½Ò)¤â°ÅÌÛŪ¤Ë»Ø¼¨¤·¤Þ¤¹¡£
- never-interactive
- ÆþÎϤò "ÂÐÏÃŪ" ¤È¤Ï¤·¤Ê¤¤¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦¤Ë flex ¤Ë»Ø¼¨¤·¤Þ¤¹ (¤³¤ì¤â¤Þ¤¿ isatty() ¤ò¸Æ¤Ó½Ð¤·¤Þ¤»¤ó)¡£ ¤³¤ì¤Ï always-interactive ¤ÎµÕ¤Ç¤¹¡£
- stack
- ³«»Ï¾ò·ï¥¹¥¿¥Ã¥¯¤Î»ÈÍѤò͸ú¤Ë¤·¤Þ¤¹(Á°½Ò¤Î³«»Ï¾ò·ï¤ò»²¾È)¡£
- stdinit
- ÀßÄꤵ¤ì¤Æ¤¤¤ë¾ì¹ç (¤¹¤Ê¤ï¤Á %option stdinit) yyin ¤ª¤è¤Ó yyout ¤ò¡¢ ¥Ç¥Õ¥©¥ë¥È¤Î nil ¤Ç¤Ï¤Ê¤¯¡¢ ɸ½àÆþÎÏ ¤È ɸ½à½ÐÎÏ ¤ËÀßÄꤷ¤Þ¤¹¡£ ´û¸¤Î lex ¥×¥í¥°¥é¥à¤Ë¤Ï¡¢ ANSI C ¸ß´¹¤Ç¤Ï¤Ê¤¤¤â¤Î¤Î¡¢¤³¤ÎÆ°ºî¤Ë°Í¸¤·¤Æ¤¤¤ë¤â¤Î¤¬¤¢¤ê¤Þ¤¹¡£ ANSI C ¤Ç¤Ï ɸ½àÆþÎÏ ¤È ɸ½à½ÐÎÏ ¤¬¥³¥ó¥Ñ¥¤¥ë»þ¤ÎÄê¿ô¤Ç¤¢¤ëɬÍפϤ¢¤ê¤Þ¤»¤ó¡£
- yylineno
- ÆþÎϤ«¤éÆɤ߼è¤Ã¤¿¸½ºß¤Î¹ÔÈÖ¹æ¤ò¥°¥í¡¼¥Ð¥ëÊÑ¿ô yylineno ¤ËÊÝ»ý¤¹¤ë¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤è¤¦¤Ë¡¢ flex ¤Ë»Ø¼¨¤·¤Þ¤¹¡£ ¤³¤Î¥ª¥×¥·¥ç¥ó¤Ï %option lex-compat ¤«¤é°ÅÌÛŪ¤Ë»ØÄꤵ¤ì¤Þ¤¹¡£
- yywrap
- ¥»¥Ã¥È¤µ¤ì¤Æ¤¤¤Ê¤¤¾ì¹ç (¤¹¤Ê¤ï¤Á %option noyywrap) ¡¢¥¹¥¥ã¥Ê¤Ï¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤ËºÝ¤· yywrap() ¤ò¸Æ¤Ð¤ºÃ±¤Ë¥¹¥¥ã¥ó¤¹¤Ù¤¥Õ¥¡¥¤¥ë¤¬¤â¤¦Ìµ¤¤¤â¤Î¤È¤¹¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹( ¥æ¡¼¥¶¤¬ yyin ¤ò¿·¤·¤¤¥Õ¥¡¥¤¥ë¤ò»Ø¤¹¤è¤¦¤Ë¤·¡¢ºÆÅÙ yylex() ¤ò¸Æ¤Ó½Ð¤¹¤Þ¤Ç¤Ç¤¹)¡£
flex ¤Ï¥ë¡¼¥ë¥¢¥¯¥·¥ç¥ó¤ò¥¹¥¥ã¥ó¤·¡¢ REJECT ¤È yymore() ¤Îµ¡Ç½¤¬»È¤ï¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤òÄ´¤Ù¤Þ¤¹¡£ reject ¤È yymore ¤Î¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤È¡¢ ¥ª¥×¥·¥ç¥ó¤Ç»ØÄꤷ¤¿Ä̤ê¤Ë¤³¤ÎȽÄê¤ËÍ¥À褷¤Þ¤¹¡£ ¥ª¥×¥·¥ç¥ó¤Î»ØÄê¤Ï¡¢¥»¥Ã¥È¤·¤Æµ¡Ç½¤ò»ÈÍѤ·¤Æ¤¤¤ë¤³¤È¤ò¼¨¤¹(Î㤨¤Ð %option reject) ¡¢¤â¤·¤¯¤Ï¥¢¥ó¥»¥Ã¥È¤·¤Æµ¡Ç½¤ò»ÈÍѤ·¤Æ¤¤¤Ê¤¤¤³¤È¤ò¼¨¤¹(Î㤨¤Ð %option noyymore) ¤â¤Î¤È¤·¤Þ¤¹¡£
¼¡¤Î¥ª¥×¥·¥ç¥ó¤Ïʸ»úÎó¤ÎÃͤò¼è¤ê¡¢'=' ¤Ç¶èÀÚ¤ê¤Þ¤¹:
%option outfile="ABC"¤³¤ì¤Ï -oABC ¤ÈƱ¤¸¤Ç¤¢¤ê¡¢
%option prefix="XYZ"¤Ï -PXYZ ¤ÈƱ¤¸¤Ç¤¹¡£ ºÇ¸å¤Ë¡¢
%option yyclass="foo"¤Ï C++ ¥¹¥¥ã¥ÊÀ¸À®»þ¤Î¤ß͸ú( -+ ¥ª¥×¥·¥ç¥ó)¤Ç¤¹¡£¤³¤ì¤Ï flex ¤ËÂФ·¤Æ¡¢ foo ¤¬ yyFlexLexer ¤Î¥µ¥Ö¥¯¥é¥¹¤Ç¤¢¤ë¤³¤È¤òÃΤ餻¤Þ¤¹¤Î¤Ç¡¢ flex ¤Ï¥¢¥¯¥·¥ç¥ó¤ò yyFlexLexer::yylex() ¤Ç¤Ï¤Ê¤¯ foo::yylex() ¤Î¥á¥ó¥Ð´Ø¿ô¤È¤·¤Þ¤¹¡£ ¤Þ¤¿¡¢( yyFlexLexer::LexerError() ¤òµ¯Æ°¤¹¤ë¤³¤È¤Ë¤è¤ê)¸Æ¤Ó½Ð¤¹¤È¼Â¹Ô»þ¥¨¥é¡¼¤ò½üµî¤¹¤ë yyFlexLexer::yylex() ¥á¥ó¥Ð´Ø¿ô¤òÀ¸À®¤·¤Þ¤¹¡£ ¾ÜºÙ¤Ï¸å½Ò¤Î C++ ¥¹¥¥ã¥Ê¤ÎÀ¸À®¤ò¸«¤Æ²¼¤µ¤¤¡£
À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤«¤éÉÔÍפʥ롼¥Á¥ó¤ò½ü¤¤¿¤¤ lint ½ãÀµ¼çµÁ¼Ô¤Î¤¿¤á¤Ë ¿¤¯¤Î¥ª¥×¥·¥ç¥ó¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£ °Ê²¼¤ò¥¢¥ó¥»¥Ã¥È¤¹¤ë¤È(Î㤨¤Ð %option nounput )¡¢Âбþ¤¹¤ë¥ë¡¼¥Á¥ó¤ÏÀ¸À®¤µ¤ì¤ë¥¹¥¥ã¥Ê¤«¤é½ü¤«¤ì¤Þ¤¹:
input, unput yy_push_state, yy_pop_state, yy_top_state yy_scan_buffer, yy_scan_bytes, yy_scan_string( yy_push_state() Åù¤Ï %option stack ¤ò»ÈÍѤ·¤Ê¤¤¾ì¹ç¤Ë¤Ï¸½¤ì¤Þ¤»¤ó)¡£
Àǽ´ØÏ¢
flex ¤Î¼ç¤Ê¥Ç¥¶¥¤¥ó¥´¡¼¥ë¤Ï¹âÀǽ¤Ê¥¹¥¥ã¥Ê¤òÀ¸À®¤¹¤ë¤³¤È¤Ç¤¹¡£ ¿¤¯¤Î¥ë¡¼¥ë¥»¥Ã¥È¤òÎɤ¯°·¤¦¤³¤È¤ÇºÇŬ²½¤µ¤ì¤Þ¤¹¡£ ´û¤Ë³µÀ⤷¤¿ -C ¥ª¥×¥·¥ç¥ó»ÈÍѤˤè¤ë¥Æ¡¼¥Ö¥ë°µ½Ì¤Ëµ¯°ø¤¹¤ë®Å٤ؤαƶÁ¤Î¾¤Ë¡¢ Àǽ¤ò°²½¤µ¤»¤ë¿¤¯¤Î¥ª¥×¥·¥ç¥ó/¥¢¥¯¥·¥ç¥ó¤¬¤¢¤ê¤Þ¤¹¡£ ¤½¤ì¤é¤ò¹â²Á¤Ê¤â¤Î¤«¤é°Â²Á¤Ê¤â¤Î¤Ø¤Èʤ٤ޤ¹:REJECT %option yylineno ¼«Í³Ä¹¤Î±¦Ê¸Ì®(trailing context) ¥Ð¥Ã¥¯¥¢¥Ã¥×¤¬É¬Íפʥѥ¿¡¼¥ó¤ÎÁÈ %array %option interactive %option always-interactive '^' ¹ÔƬ¥ª¥Ú¥ì¡¼¥¿ yymore()ºÇ½é¤Î 3 ¤Ä¤ÏÈó¾ï¤Ë¹â²Á¤Ç¤¢¤ê¡¢ºÇ¸å¤Î 2 ¤Ä¤ÏÈó¾ï¤Ë°Â²Á¤Ç¤¹¡£ unput() ¤ÏÀøºßŪ¤ËÈó¾ï¤ËÂ礤ʻŻö¤ò¤¹¤ë¥ë¡¼¥Á¥ó¸Æ¤Ó½Ð¤·¤È¤·¤Æ¼ÂÁõ¤µ¤ì¤Æ¤¤¤ë¤Î¤ËÂФ·¡¢ yyless() ¤ÏÈó¾ï¤Ë°Â²Á¤Ê¥Þ¥¯¥í¤Ç¤¹; ¤Ç¤¹¤«¤é¥¹¥¥ã¥ó¤·¤¿Í¾Ê¬¤Ê¥Æ¥¥¹¥È¤òÌ᤹¤À¤±¤Î¾ì¹ç¤Ë¤Ï yyless() ¤ò»È¤Ã¤Æ²¼¤µ¤¤¡£
Àǽ¤¬½ÅÍפʾì¹ç¤Ë¤Ï¡¢½ÐÍ褦¤ë¸Â¤ê¤ÎÅØÎϤǤâ¤Ã¤Æ REJECT ¤òÈò¤±¤Æ²¼¤µ¤¤¡£ ¤³¤ì¤ÏÆä˹â²Á¤Ê¥ª¥×¥·¥ç¥ó¤Ç¤¹¡£
¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼è¤ê½ü¤¯¤È¡¢Í𻨤ˤʤꡢ ¤Ò¤É¤¯¶ìÏ«¤·¤ÆÊ£»¨¤Ê¥¹¥¥ã¥Ê¤òºî¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£ ¼ÂºÝŪ¤Ë¤Ï -b ¥Õ¥é¥°¤ò»ØÄꤷ¤Æ lex.backup ¥Õ¥¡¥¤¥ë¤òÀ¸À®¤¹¤ë¤³¤È¤«¤é»Ï¤á¤Þ¤¹¡£Î㤨¤Ð¡¢ÆþÎÏ
%% foo return TOK_KEYWORD; foobar return TOK_KEYWORD;¤ËÂФ·¤Æ¤Ï¡¢¥Õ¥¡¥¤¥ë¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹:
State #6 is non-accepting - associated rule line numbers: 2 3 out-transitions: [ o ] jam-transitions: EOF [ \001-n p-\177 ] State #8 is non-accepting - associated rule line numbers: 3 out-transitions: [ a ] jam-transitions: EOF [ \001-` b-\177 ] State #9 is non-accepting - associated rule line numbers: 3 out-transitions: [ r ] jam-transitions: EOF [ \001-q s-\177 ] Compressed tables always back up.ºÇ½é¤Î¿ô¹Ô¤Ï¡¢ 'o' ¤ËÁ«°Ü¤Ç¤¤ë¤¬Â¾¤Îʸ»ú¤Ë¤ÏÁ«°Ü¤Ç¤¤Ê¤¤¾õÂÖ¤¬¤¢¤ê¡¢ ¤½¤Î¾õÂ֤Ǥϸ½ºß¥¹¥¥ã¥ó¤µ¤ì¤¿¥Æ¥¥¹¥È¤Ï¾¤Î¥ë¡¼¥ë¤Ë¤Ï¥Þ¥Ã¥Á¤·¤Ê¤¤¤³¤È¤ò ɽ¤·¤Þ¤¹¡£ ¤³¤Î¾õÂÖ¤¬È¯À¸¤·¤¿¤Î¤Ï¡¢ ÆþÎÏ¥Õ¥¡¥¤¥ë¤Î¹Ô 2, 3 ¤Î¥ë¡¼¥ë¤Ë¥Þ¥Ã¥Á¤·¤è¤¦¤È¤·¤¿»þ¤Ç¤¹¡£ ¥¹¥¥ã¥Ê¤¬¤³¤ÎÍͤʾõÂ֤ˤ¢¤ê 'o' °Ê³°¤Îʸ»ú¤òÆɤó¤À¾ì¹ç¤Ë¤Ï¡¢ ¥Þ¥Ã¥Á¤¹¤ë¥ë¡¼¥ë¤òõ¤¹¤¿¤á¤Î¥Ð¥Ã¥¯¥¢¥Ã¥×¤¬É¬ÍפȤʤê¤Þ¤¹¡£ ¾¯¤·¹Í¤¨¤ì¤Ð¡¢¤³¤ì¤Ï "fo" ¤ò¸«¤¿»þ¤Ë¤¢¤ë¾õÂ֤˰㤤¤Ê¤¤¤³¤È¤¬Ê¬¤«¤ë¤Ç¤·¤ç¤¦¡£ ¤³¤ÎÍͤʻþ¡¢'o' °Ê³°¤Î¤â¤Î¤¬¸½¤ì¤ë¤È¡¢ ¥¹¥¥ã¥Ê¤Ï¡¢Ã±¤Ë 'f' ¤Ë¥Þ¥Ã¥Á¤¹¤ë(¥Ç¥Õ¥©¥ë¥È¥ë¡¼¥ë)¤È¤³¤í¤Þ¤Ç Ìá¤ê(¥Ð¥Ã¥¯¥¢¥Ã¥×¤·)¤Þ¤¹¡£
¾õÂÖ #8 ¤Ë´Ø·¸¤¹¤ë¥³¥á¥ó¥È¤Ï¡¢ "foob" ¤¬¥¹¥¥ã¥ó¤µ¤ì¤¿»þ¤ËÌäÂ꤬¤¢¤ë¤³¤È¤òɽ¤·¤Æ¤¤¤Þ¤¹¡£ ¼ÂºÝ¡¢'a' °Ê³°¤Îʸ»ú¤Ë½Ð²ñ¤¦¤È¡¢¥¹¥¥ã¥Ê¤Ï "foo" ¤ò¼õÍý¤¹¤ë¤È¤³¤í¤Þ¤ÇÌá¤ê¤Þ¤¹¡£ ƱÍͤ˾õÂÖ #9 ¤Ë´Ø·¸¤¹¤ë¥³¥á¥ó¥È¤Ï¡¢ "fooba" ¤¬¥¹¥¥ã¥ó¤µ¤ì 'r' ¤¬Â³¤«¤Ê¤¤¾ì¹ç¤Ë´Ø·¸¤·¤Þ¤¹¡£
ºÇ¸å¤Î¥³¥á¥ó¥È¤¬ÄÌÃΤ¹¤ë¤Î¤Ï¡¢ -Cf ¤ä -CF ¤ò»È¤Ã¤Æ¤¤¤ë¤Î¤Ç¤Ê¤±¤ì¤Ð ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼è¤ê½ü¤³¤¦¤ÈÅØÎϤ¹¤ë¤³¤È¤Ï̵°ÕÌ£¤Ç¤¢¤ë¤³¤È¤Ç¤¹¡£ ¤Ê¤¼¤Ê¤é¡¢°µ½Ì¤µ¤ì¤¿¥¹¥¥ã¥Ê¤ËÂФ·¤Æ¤½¤Î¤è¤¦¤Ê¤³¤È¤ò¤·¤Æ¤â¡¢ Àǽ¾å¤ÎÍø±×¤Ï̵¤¤¤«¤é¤Ç¤¹¡£
¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼è¤ê½ü¤¯¤¿¤á¤Ë¤Ï "¥¨¥é¡¼" ¥ë¡¼¥ë¤òÄɲä·¤Þ¤¹:
%% foo return TOK_KEYWORD; foobar return TOK_KEYWORD; fooba | foob | fo { /* false alarm, not really a keyword */ return TOK_ID; }
¥¡¼¥ï¡¼¥É¤Î¥ê¥¹¥È¤«¤é¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò¼è¤ê½ü¤¯¤Ë¤Ï¡¢"Á´¤Æ¤òÊá¤Þ¤¨¤ë" ¥ë¡¼¥ë¤ò»ÈÍѤ¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹:
%% foo return TOK_KEYWORD; foobar return TOK_KEYWORD; [a-z]+ return TOK_ID;Ä̾ŬÀڤʻþ¤Ë¤Ï¤³¤ì¤Ï°ìÈÖÎɤ¤²ò·èºö¤Ç¤¹¡£
¥Ð¥Ã¥¯¥¢¥Ã¥×¥á¥Ã¥»¡¼¥¸¤Ï¥«¥¹¥±¡¼¥É¤¹¤ë¤³¤È¤¬Â¿¤¤¤Ç¤¹¡£ Ê£»¨¤Ê¥ë¡¼¥ë¤ÎÁȤǤϡ¢¿ôÉ´¤â¤Î¥á¥Ã¥»¡¼¥¸¤òÆÀ¤ë¤Î¤ÏÉáÄ̤Τ³¤È¤Ç¤¹¡£ ¤·¤«¤·¡¢¤³¤ì¤ò²òÀϤ¹¤ì¤Ð¡¢¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò½üµî¤¹¤ë¤¿¤á¤Ë¤Ï ÂçÄñ¤Î¾ì¹ç¿ô¥À¡¼¥¹¤Î¥ë¡¼¥ë¤Ë¤À¤±´Ø·¸¤¢¤ë¤³¤È¤¬Ê¬¤«¤ë¤Ç¤·¤ç¤¦ (¤·¤«¤·¡¢´Ö°ã¤¨¤ë¤³¤È¤¬Â¿¤¯¡¢¸í¤Ã¤¿¥ë¡¼¥ë¤¬¶öÁ³Í¸ú¤Ê¥È¡¼¥¯¥ó¤Ë¥Þ¥Ã¥Á¤·ÆÀ¤Þ¤¹¡£ ¾Íè¤Î flex ¤Îµ¡Ç½¤Ç¤Ï¡¢ ¼«Æ°Åª¤Ë¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò½üµî¤¹¤ë¥ë¡¼¥ë¤òÄɲ乤ë¤è¤¦¤Ë¤Ê¤ë¤«¤âÃΤì¤Þ¤»¤ó)¡£
¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò½üµî¤¹¤ë¤³¤È¤Ë¤è¤êÍø±×¤¬¤¢¤ë¤Î¤Ï¡¢ Á´¤Æ¤Î ¥Ð¥Ã¥¯¥¢¥Ã¥×¤ò½üµî¤·¤¿»þ¤À¤±¤È¤¤¤¦¤³¤È¤ò³Ð¤¨¤Æ¤ª¤¯¤³¤È¤Ï½ÅÍפǤ¹¡£ ¤¿¤Ã¤¿°ì¤Ä¤ò»Ä¤·¤Æ¤â²¿¤âÆÀ¤ë¤³¤È¤¬½ÐÍè¤Þ¤»¤ó¡£
²ÄÊÑŤΠ±¦Ê¸Ì® (º¸Éôʬ¤È±¦Éôʬ¤Î¤¤¤º¤ì¤«¤â¤·¤¯¤ÏξÊý¤¬²ÄÊÑĹ)¤Ï REJECT ¤È¤Û¤ÜƱ¤¸¤À¤±¤Î(¤¹¤Ê¤ï¤ÁÁêÅö¤Î)ÀǽÎô²½¤È¤Ê¤ê¤Þ¤¹¡£ ¤½¤Î¤¿¤á¼¡¤Î¤è¤¦¤Ê¥ë¡¼¥ë:
%% mouse|rat/(cat|dog) run();¤Ï¼¡¤Î¤è¤¦¤Ë½ñ¤¯¤«:
%% mouse/cat|dog run(); rat/cat|dog run();¼¡¤Î¤è¤¦¤Ë½ñ¤¤¤¿Êý¤¬Îɤ¤¤Ç¤¹:
%% mouse|rat/cat run(); mouse|rat/dog run();ÆÃÊÌ¤Ê '|' ¥¢¥¯¥·¥ç¥ó¤Ï½õ¤±¤Ë¤Ï¤Ê¤ê ¤Þ¤»¤ó ¤·¡¢¤«¤¨¤Ã¤Æ¾õ¶·¤ò°¤¯¤·¤Þ¤¹ (¸å½Ò¤Î·ç´Ù/¥Ð¥°¤ò»²¾È)¡£
¥¹¥¥ã¥Ê¤ÎÀǽ¤ò¸þ¾å¤µ¤»¤ë¤¿¤á¤Î;ÃÏ(¼Â¸½¤ÏºÇ¤âÍÆ°×)¤Ï¡¢ ¥Þ¥Ã¥Á¤¹¤ë¥È¡¼¥¯¥ó¤¬Ä¹¤±¤ì¤Ð¥¹¥¥ã¥Ê¤¬¹â®¤Ë¤Ê¤ë¤³¤È¤Ë¤¢¤ê¤Þ¤¹¡£ Ť¤¥È¡¼¥¯¥ó¤Ç¤Ï¤Û¤È¤ó¤É¤ÎÆþÎϽèÍý¤Ï(û¤¤)ÆâÉô¥ë¡¼¥×¤Ç½èÍý¤µ¤ì¡¢ ¥¢¥¯¥·¥ç¥ó¤Î¤¿¤á¤Ë¥¹¥¥ã¥Ê´Ä¶¤òÀßÄꤹ¤ëÄɲäλŻö(Î㤨¤Ð yytext) ¤ò¤Û¤È¤ó¤É¤·¤Ê¤¤¤«¤é¤Ç¤¹¡£ C ¥³¥á¥ó¥È¤Î¥¹¥¥ã¥Ê¤ò»×¤¤½Ð¤·¤Þ¤·¤ç¤¦:
%x comment %% int line_num = 1; "/*" BEGIN(comment); <comment>[^*\n]* <comment>"*"+[^*/\n]* <comment>\n ++line_num; <comment>"*"+"/" BEGIN(INITIAL);¼¡¤Î¤è¤¦¤Ë½ñ¤¯¤È¹â®¤Ë¤Ê¤ê¤Þ¤¹:
%x comment %% int line_num = 1; "/*" BEGIN(comment); <comment>[^*\n]* <comment>[^*\n]*\n ++line_num; <comment>"*"+[^*/\n]* <comment>"*"+[^*/\n]*\n ++line_num; <comment>"*"+"/" BEGIN(INITIAL);º£Å٤ϡ¢²þ¹ÔËè¤ËÊ̤Υ¢¥¯¥·¥ç¥ó¤Î½èÍý¤ò¹Ô¤¦¤Î¤Ç¤Ï¤Ê¤¯¡¢ ²þ¹Ôǧ¼±¤Ï¥ë¡¼¥ë´Ö¤Ç "ʬ»¶" ¤µ¤ì¡¢ ²Äǽ¤Ê¸Â¤êŤ¤¥Æ¥¥¹¥È¤Ë¥Þ¥Ã¥Á¤¹¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£ ¥ë¡¼¥ë¤Î Äɲà ¤Ï¥¹¥¥ã¥Ê¤òÃÙ¤¯ ¤·¤Þ¤»¤ó! ¥¹¥¥ã¥Ê¤Î®Å٤ϡ¢¥ë¡¼¥ë¿ô¤È¤â¡¢ ¥ª¥Ú¥ì¡¼¥¿ '*' ¤ä '|' ¤È¤¤¤Ã¤¿¤â¤Î¤Ë´ð¤Å¤¯¥ë¡¼¥ë¤ÎÊ£»¨¤µ (¤³¤ÎÀá¤Î»Ï¤á¤Ç°·¤¤¤Þ¤·¤¿)¤È¤âÆÈΩ¤Ç¤¹¡£
ºÇ¸å¤Î¹â®²½¤ÎÎã¤Ç¤¹: 1 ¹Ô¤Ë 1 ¤Ä¤º¤Ä¤Ç¤¢¤êÊ̤Îʸ»ú¤ÏÉÕ¤«¤Ê¤¤¤è¤¦¤Ê¡¢ ¼±Ê̻Ҥȥ¡¼¥ï¡¼¥É¤òÁ´¤Æ¥Õ¥¡¥¤¥ë¤«¤é¥¹¥¥ã¥ó¤¹¤ë¤³¤È¤ò¹Í¤¨¤Þ¤¹¡£ ºÇ½é¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¤Ç¤·¤ç¤¦:
%% asm | auto | break | ... etc ... volatile | while /* it's a keyword */ .|\n /* it's not a keyword */¸åÌá¤ê¤òÈò¤±¤ë¤¿¤á¤ËÁ´¤Æ¤òÊá¤Þ¤¨¤ë¥ë¡¼¥ë¤òƳÆþ¤·¤Þ¤¹:
%% asm | auto | break | ... etc ... volatile | while /* it's a keyword */ [a-z]+ | .|\n /* it's not a keyword */1 ¹Ô¤ËÀµ³Î¤Ë 1 ¸ì¤À¤±¤¢¤ë¤³¤È¤¬Êݾڤµ¤ì¤Æ¤¤¤ë¾ì¹ç¡¢ ²þ¹Ô¤Îǧ¼±¤òÊ̤Υȡ¼¥¯¥ó¤ÈÊ»¤»¤ë¤³¤È¤Ç¡¢ ¥Þ¥Ã¥Á¤ÎÁí¿ô¤òȾʬ¤Ë¸º¤é¤¹¤³¤È¤¬½ÐÍè¤Þ¤¹:
%% asm\n | auto\n | break\n | ... etc ... volatile\n | while\n /* it's a keyword */ [a-z]+\n | .|\n /* it's not a keyword */¤³¤³¤Ç¡¢ºÆÅ٥Х寥¢¥Ã¥×¤ò¥¹¥¥ã¥Ê¤ËÁȤ߹þ¤ó¤À¤³¤È¤Ë µ¤¤òÉÕ¤±¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£ ¼ÂºÝ ²æ¡¹¤Ï ÆþÎÏ¥¹¥È¥ê¡¼¥à¤Ï¥ì¥¿¡¼¤È²þ¹Ô¤À¤±¤Ç¤¢¤ë¤³¤È¤òÃΤäƤ¤¤Þ¤¹¤¬¡¢ flex ¤Ï¤³¤ì¤¬Ê¬¤«¤é¤Ê¤¤¤¿¤á¡¢ ¥È¡¼¥¯¥ó "auto" ¤Ê¤É¤ò¥¹¥¥ã¥ó¤·¤¿¼¡¤Îʸ»ú¤¬²þ¹Ô¤Ç¤â¥ì¥¿¡¼¤Ç¤â¤Ê¤¤¾ì¹ç¤Ë¤Ï ¥Ð¥Ã¥¯¥¢¥Ã¥×¤¬É¬ÍפǤ¢¤ë¤È¹Í¤¨¤Þ¤¹¡£ °ÊÁ°¤Ï "auto" ¥ë¡¼¥ë¤ËŬ¹ç¤·¤½¤ì¤Ç½ª¤ê¤Ç¤·¤¿¤¬¡¢ º£¤Ï "auto" ¥ë¡¼¥ë¤Ï̵¤¯¡¢"auto\n" ¥ë¡¼¥ë¤À¤±¤¬¤¢¤ê¤Þ¤¹¡£ ¥Ð¥Ã¥¯¥¢¥Ã¥×¤Î²ÄǽÀ¤ò½üµî¤¹¤ë¤¿¤á¤Ë¤Ï¡¢ ºÇ¸å¤Î²þ¹Ô°Ê³°¤Î¥ë¡¼¥ë¤òÆó½Å²½¤¹¤ë¤«¡¢ ¤½¤Î¤è¤¦¤ÊÆþÎϤ˽Ф¯¤ï¤µ¤Ê¤¤¤Î¤ÇʬÎà¤ÏÉÔÍפÈʬ¤«¤Ã¤Æ¤¤¤ë¤¿¤á¡¢ ²þ¹Ô¤òƳÆþ¤·¤Ê¤¤¤â¤¦°ì¤Ä¤ÎÁ´¤Æ¤òÊá¤Þ¤¨¤ë¥ë¡¼¥ë¤òƳÆþ¤¹¤ë¤³¤È¤¬½ÐÍè¤Þ¤¹:
%% asm\n | auto\n | break\n | ... etc ... volatile\n | while\n /* it's a keyword */ [a-z]+\n | [a-z]+ | .|\n /* it's not a keyword */-Cf ¤òÉÕ¤±¤Æ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤È¡¢¼ÂºÝÌäÂê¾å flex ¤ÇÆÀ¤é¤ì¤ë¤Û¤ÜºÇ®¤Ë¤Ê¤ê¤Þ¤¹¡£
ºÇ¸å¤ÎÃí°Õ»ö¹à: flex ¤Ï NUL ¤Ë¥Þ¥Ã¥Á¤¹¤ë»þ¤Ë¤ÏÃÙ¤¯¡¢¥È¡¼¥¯¥ó¤¬Ê£¿ô¤Î NUL ¤ò´Þ¤à»þ¤Ë¤ÏÆäËÃÙ¤¤¤Ç¤¹¡£ ¥Æ¥¥¹¥È¤¬¤·¤Ð¤·¤Ð NUL ¤ò´Þ¤à¤â¤Î¤ÈͽÁÛ¤µ¤ì¤ë¾ì¹ç¤Ë¤Ï¡¢¥Æ¥¥¹¥È¤Î û¤¤ Éôʬ¤È¥Þ¥Ã¥Á¤¹¤ë¤è¤¦¤Ë¥ë¡¼¥ë¤ò½ñ¤¯¤Ù¤¤Ç¤¹¡£
¤â¤¦°ì¤Ä¤ÎÀǽ¤Ë´Ø¤¹¤ëºÇ½ªÃí°Õ»ö¹à: ÆþÎϤΥޥåÁÊýË¡¤ÎÀá¤Ç´û¤Ë¼¨¤·¤¿¤è¤¦¤Ë¡¢ Â礤ʥȡ¼¥¯¥ó¤òǼ¤á¤ë¤¿¤á¤Ë yytext ¤Î¥µ¥¤¥º¤òưŪ¤ËÊѹ¹¤¹¤ë¤È½èÍý¤¬ÃÙ¤¯¤Ê¤ê¤Þ¤¹¡£ ¤Ê¤¼¤Ê¤é¡¢(µðÂç¤Ê)¥È¡¼¥¯¥ó¤òºÆÅÙÀèƬ¤«¤é¥¹¥¥ã¥ó¤·¤Ê¤ª¤µ¤Í¤Ð¤Ê¤é¤Ê¤¤¤«¤é¤Ç¤¹¡£ Àǽ¤¬½ÅÍפʾì¹ç¡¢ ¥Æ¥¥¹¥È¤Î "Â礤Ê" Éôʬ¤Ë¥Þ¥Ã¥Á¤µ¤»¤ë¤Ù¤¤Ç¤¹¤¬ "µðÂç¤Ê" Éôʬ¤Ë¥Þ¥Ã¥Á¤µ¤»¤ë ¤Ù¤¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ξ¼Ô¤ÎºæÌÜ¤Ï 8K ʸ»ú/¥È¡¼¥¯¥ó¤Ç¤¹¡£
C++ ¥¹¥¥ã¥Ê¤ÎÀ¸À®
flex ¤Ï 2 Ä̤ê¤Î C++ ¥¹¥¥ã¥ÊÀ¸À®ÊýË¡¤òÄ󶡤·¤Þ¤¹¡£ ºÇ½é¤ÎÊýË¡¤Ï flex ¤¬À¸À®¤·¤¿¥¹¥¥ã¥Ê¤òñ¤Ë C ¥³¥ó¥Ñ¥¤¥é¤Ç¤Ï¤Ê¤¯ C++ ¥³¥ó¥Ñ¥¤¥é¤Ç ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤È¤¤¤¦¤â¤Î¤Ç¤¹¡£ ¤³¤Î¾ì¹ç¥³¥ó¥Ñ¥¤¥ë¥¨¥é¡¼¤Ë¤Ï½Ð²ñ¤ï¤Ê¤¤¤Ï¤º¤Ç¤¹ (¸«ÉÕ¤±¤¿¾ì¹ç¤Ë¤Ïºî¼Ô¤ÎÀá¤Ç¸å½Ò¤¹¤ëÅŻҥ᡼¥ë¥¢¥É¥ì¥¹¤ËÊó¹ð¤·¤Æ²¼¤µ¤¤)¡£ ¤³¤Î¾ì¹ç¥ë¡¼¥ë¤Ë¤ª¤¤¤Æ C ¥³¡¼¥É¤Ç¤Ï¤Ê¤¯ C++ ¥³¡¼¥É¤ò½ñ¤¯¤³¤È¤¬½ÐÍè¤Þ¤¹¡£ ¥¹¥¥ã¥Ê¤Î¥Ç¥Õ¥©¥ë¥È¤ÎÆþÎϸµ¤Ï yyin ¤Î¤Þ¤Þ¤Ç¤¢¤ê¡¢ ¥Ç¥Õ¥©¥ë¥È¤Î¥¨¥³¡¼Àè¤Ï yyout ¤Î¤Þ¤Þ¤Ç¤¢¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£ ¤É¤Á¤é¤â FILE * ÊÑ¿ô¤Î¤Þ¤Þ¤Ç¤¢¤ê¡¢C++ streams ¤Ç¤Ï¤Ê¤¤¤Ç¤¹¡£flex ¤Ë C++ ¥¹¥¥ã¥Ê¥¯¥é¥¹¤òÀ¸À®¤µ¤»¤ë¤³¤È¤â½ÐÍè¤Þ¤¹¡£ -+ ¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë(¤â¤·¤¯¤ÏÅù²ÁŪ¤Ë %option c++ ¤ò»È¤¦)¤È¤³¤Î¤è¤¦¤Ë¼Â¹Ô¤µ¤ì¡¢ flex ¤Î¼Â¹Ô·Á¼°Ì¾¤¬ '+' ¤Ç½ª¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¼«Æ°Åª¤Ë»ØÄꤵ¤ì¤Þ¤¹¡£ ¤³¤Î¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È flex ¤¬À¸À®¤¹¤ë¥¹¥¥ã¥Ê¤Î¥Ç¥Õ¥©¥ë¥È¤Ï¥Õ¥¡¥¤¥ë lex.yy.cc ¤È¤Ê¤ê lex.yy.c ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤Ï 2 ¤Ä¤Î C++ ¥¯¥é¥¹¤È¤Î¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄêµÁ¤¹¤ë¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë FlexLexer.h ¤ò¥¤¥ó¥¯¥ë¡¼¥É¤·¤Þ¤¹¡£
ºÇ½é¤Î¥¯¥é¥¹ FlexLexer ¤Ï°ìÈÌŪ¤Ê¥¹¥¥ã¥Ê¥¯¥é¥¹¤òÄêµÁ¤¹¤ëÃê¾Ý´ðÈ×¥¯¥é¥¹¤òÄ󶡤·¤Þ¤¹¡£ °Ê²¼¤Î¥á¥ó¥Ð´Ø¿ô¤òÄ󶡤·¤Þ¤¹:
- const char* YYText()
- ºÇ¸å¤Ë¥Þ¥Ã¥Á¤·¤¿¥Æ¥¥¹¥È¤òÊÖ¤·¤Þ¤¹¡£ yytext ¤ÈÅù²Á¤Ç¤¹¡£
- int YYLeng()
- ºÇ¸å¤Ë¥Þ¥Ã¥Á¤·¤¿¥È¡¼¥¯¥ó¤ÎŤµ¤òÊÖ¤·¤Þ¤¹¡£ yyleng ¤ÈÅù²Á¤Ç¤¹¡£
- int lineno() const
- ¸½ºß¤ÎÆþÎϤιÔÈÖ¹æ( %option yylineno »²¾È)¤â¤·¤¯¤Ï %option yylineno ¤ò»ÈÍѤ·¤Æ¤¤¤Ê¤¤¾ì¹ç¤Ë¤Ï 1 ¤òÊÖ¤·¤Þ¤¹¡£
- void set_debug( int flag )
- ¥¹¥¥ã¥Ê¤Î¥Ç¥Ð¥Ã¥°¥Õ¥é¥°¤ò¥»¥Ã¥È¤·¤Þ¤¹¡£ yy_flex_debug ¤ËÂåÆþ¤¹¤ë¤Î¤ÈƱ¤¸¤Ç¤¹(¥ª¥×¥·¥ç¥ó¤ÎÀá¤ÇÁ°½Ò)¡£ ¥¹¥¥ã¥Ê¹½ÃÛ»þ¤Ë %option debug ¤ò»ÈÍѤ·¤Æ¥Ç¥Ð¥Ã¥°¾ðÊó¤òÁȤ߹þ¤àɬÍפ¬¤¢¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£
- int debug() const
- ¸½ºß¤Î¥Ç¥Ð¥Ã¥°¥Õ¥é¥°¤ÎÀßÄê¤òÊÖ¤·¤Þ¤¹¡£
¤Þ¤¿¼¡¤Î¤â¤Î¤ÈÅù²Á¤Ê¥á¥ó¥Ð´Ø¿ô¤âÄ󶡤µ¤ì¤Þ¤¹ yy_switch_to_buffer(), yy_create_buffer() (ºÇ½é¤Î°ú¿ô¤Ï istream* ¥ª¥Ö¥¸¥§¥¯¥È¥Ý¥¤¥ó¥¿¤Ç¤¢¤ê FILE* ¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó), yy_flush_buffer(), yy_delete_buffer(), yyrestart() (¤³¤ì¤â¤Þ¤¿ºÇ½é¤Î°ú¿ô¤Ï istream* ¥ª¥Ö¥¸¥§¥¯¥È¥Ý¥¤¥ó¥¿¤Ç¤¹)¡£
2 ÈÖÌܤΥ¯¥é¥¹¤Ï FlexLexer.h ¤ÇÄêµÁ¤µ¤ì¤ë yyFlexLexer ¤Ç¤¢¤ê¡¢ FlexLexer ¤«¤éƳ½Ð¤·¤¿¤â¤Î¤Ç¤¹¡£ °Ê²¼¤ÎÄɲäΥá¥ó¥Ð´Ø¿ô¤òÄêµÁ¤·¤Þ¤¹:
- yyFlexLexer( istream* arg_yyin = 0, ostream* arg_yyout = 0 )
- Í¿¤¨¤é¤ì¤¿Æþ½ÐÎÏ¥¹¥È¥ê¡¼¥à¤ò»È¤¦ yyFlexLexer ¥ª¥Ö¥¸¥§¥¯¥È¤ò¹½ÃÛ¤·¤Þ¤¹¡£ »ØÄꤷ¤Ê¤¤¾ì¹ç¤Ë¤Ï¤½¤ì¤¾¤ì¥¹¥È¥ê¡¼¥à¤Î¥Ç¥Õ¥©¥ë¥È cin ¤È cout ¤Ë¤Ê¤ê¤Þ¤¹¡£
- virtual int yylex()
- ¤³¤ì¤Ï yylex() ¤¬Ä̾ï¤Î flex ¥¹¥¥ã¥Ê¤ËÂФ·¤Æ¹Ô¤Ã¤¿¤Î¤ÈƱÍͤÎÌò³ä¤òô¤¤¤Þ¤¹: ¥ë¡¼¥ë¤Î¥¢¥¯¥·¥ç¥ó¤¬ÃͤòÊÖ¤¹¤Þ¤Ç¡¢ ÆþÎÏ¥¹¥È¥ê¡¼¥à¤ò¥¹¥¥ã¥ó¤·¡¢¥È¡¼¥¯¥ó¤ò¾ÃÈñ¤·¤Þ¤¹¡£ yyFlexLexer ¤«¤é¥µ¥Ö¥¯¥é¥¹ S ¤òƳ½Ð¤· yylex() ¤«¤é S ¤Î¥á¥ó¥Ð´Ø¿ô¤ª¤è¤ÓÊÑ¿ô¤ò¥¢¥¯¥»¥¹¤·¤¿¤¤¾ì¹ç¡¢ %option yyclass=S ¤ò»ØÄꤷ¤Æ yyFlexLexer ¤Ç¤Ï¤Ê¤¯¥µ¥Ö¥¯¥é¥¹¤ò»ÈÍѤ¹¤ë¤³¤È¤ò flex ¤ËÃΤ餻¤ëɬÍפ¬¤¢¤ê¤Þ¤¹¡£ ¤³¤Î¾ì¹ç yyFlexLexer::yylex() ¤òÀ¸À®¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¢ flex ¤Ï S::yylex() (¤ª¤è¤Ó¸Æ¤Ó½Ð¤µ¤ì¤¿¤Ê¤é yyFlexLexer::LexerError() ¤ò¸Æ¤Ó½Ð¤¹¥À¥ß¡¼¤Î yyFlexLexer::yylex() ¤â)¤òÀ¸À®¤·¤Þ¤¹¡£
- virtual void switch_streams(istream* new_in = 0,
- ostream* new_out = 0) yyin ¤ò new_in (Èó¥Ë¥ë¤Î¾ì¹ç) ¤ËºÆ³äÅö¤·¡¢ yyout ¤ò new_out (ƱÍÍ)¤ËºÆ³äÅö¤·¤Þ¤¹¡£ yyin ¤¬ºÆ³äÅö¤µ¤ì¤¿¾ì¹ç¤Ë¤Ï°ÊÁ°¤ÎÆþÎϥХåե¡¤Ï¾Ãµî¤µ¤ì¤Þ¤¹¡£
- int yylex( istream* new_in, ostream* new_out = 0 )
- ¤Þ¤ºÆþÎÏ¥¹¥È¥ê¡¼¥à¤ò switch_streams( new_in, new_out ) ¤ò»ÈÍѤ·¤ÆÀÚ¤êÂؤ¨¡¢ yylex() ¤ÎÃͤòÊÖ¤·¤Þ¤¹¡£
¤µ¤é¤Ë¡¢ yyFlexLexer ¤Ï¼¡¤Î¥×¥í¥Æ¥¯¥È¤µ¤ì¤¿²¾ÁÛ´Ø¿ô¤òÄêµÁ¤·¤Þ¤¹¡£ ¥¹¥¥ã¥Ê¤Ë¤¢¤ï¤»¤Æ¤³¤ì¤é¤òƳ½Ð¥¯¥é¥¹¤Ë¤ª¤¤¤ÆºÆÄêµÁ½ÐÍè¤Þ¤¹:
- virtual int LexerInput( char* buf, int max_size )
- ºÇÂç max_size ʸ»ú¤ò buf ¤ËÆɤ߹þ¤ß¡¢Æɤ᤿ʸ»ú¿ô¤òÊÖ¤·¤Þ¤¹¡£ ÆþÎϤνª¤ê¤ò¼¨¤¹¤Ë¤Ï 0 ʸ»ú¤òÊÖ¤·¤Þ¤¹¡£"ÂÐÏÃŪ" ¥¹¥¥ã¥Ê( -B ¤È -I ¥Õ¥é¥°¤ò»²¾È)¤Ï¥Þ¥¯¥í YY_INTERACTIVE ¤òÄêµÁ¤¹¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£ LexerInput() ¤òºÆÄêµÁ¤·¡¢ ÂÐÏÃŪ¤ÊÆþÎϸµ¤ò¥¹¥¥ã¥ó¤¹¤ë²ÄǽÀ¤¬¤¢¤ë¤«¤É¤¦¤«¤Ë°Í¸¤·¤Æ °Û¤Ê¤ë¥¢¥¯¥·¥ç¥ó¤¬É¬ÍפȤʤë¾ì¹ç¡¢ ¤³¤Î̾Á°¤¬Â¸ºß¤¹¤ë¤«¤É¤¦¤«¤Î¥Æ¥¹¥È¤Ï #ifdef ¤Ë¤Æ²Äǽ¤Ç¤¹¡£
- virtual void LexerOutput( const char* buf, int size )
- size ʸ»ú¤ò¥Ð¥Ã¥Õ¥¡ buf ¤«¤é½ñ¤½Ð¤·¤Þ¤¹¡£ ¥¹¥¥ã¥Ê¤Î¥ë¡¼¥ë¤¬ NUL ¤ò´Þ¤à¥Æ¥¥¹¥È¤Ë¥Þ¥Ã¥Á²Äǽ¤Ê¾ì¹ç¡¢ NUL ½ªÃ¼¤µ¤ì¤Æ¤¤¤ë¤³¤Î¥Ð¥Ã¥Õ¥¡¤Ï "ÆâÉô¤Ë" NUL ¤ò´Þ¤ó¤Ç¤¤¤Æ¤â¹½¤¤¤Þ¤»¤ó¡£
- virtual void LexerError( const char* msg )
- Ã×̿Ū¤Ê¥¨¥é¡¼¥á¥Ã¥»¡¼¥¸¤òÊó¹ð¤·¤Þ¤¹¡£ ¥Ç¥Õ¥©¥ë¥È¤Î¤³¤Î´Ø¿ô¤Ï¥á¥Ã¥»¡¼¥¸¤ò¥¹¥È¥ê¡¼¥à cerr ¤Ë½ñ¤¡¢½ªÎ»¤·¤Þ¤¹¡£
yyFlexLexer ¥ª¥Ö¥¸¥§¥¯¥È¤Ï Á´¤Æ¤Î ¥¹¥¥ã¥ó»þ¤Î¾õÂÖ¤ò´Þ¤à¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£ ¤½¤ì¤æ¤¨¤³¤ÎÍͤʥª¥Ö¥¸¥§¥¯¥È¤ò¥ê¥¨¥ó¥È¥é¥ó¥È¤Ê¥¹¥¥ã¥Ê¤È¤·¤Æ»ÈÍѤǤ¤Þ¤¹¡£ Ʊ°ì¤Î yyFlexLexer ¥¯¥é¥¹¤ÎÊ£¿ô¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤ò¶ñÂβ½²Äǽ¤Ç¤¢¤ê¡¢ Ê£¿ô¤Î C++ ¥¹¥¥ã¥Ê¥¯¥é¥¹¤òÁȤ߹ç¤ï¤»¾åµ -P ¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ¹¤ë¤³¤È¤ÇƱ°ì¤Î¥×¥í¥°¥é¥à¤Ç»ÈÍѲÄǽ¤Ç¤¹¡£
ºÇ¸å¤Ë %array µ¡Ç½¤Ï C++ ¥¹¥¥ã¥Ê¥¯¥é¥¹¤Ç¤Ï»ÈÍѤǤ¤Ê¤¤¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤; %pointer ¤ò»ÈÍѤ·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó(¥Ç¥Õ¥©¥ë¥È)¡£
ñ½ã¤Ê C++ ¥¹¥¥ã¥Ê¤ÎÎã¤ò°Ê²¼¤Ë¼¨¤·¤Þ¤¹:
// An example of using the flex C++ scanner class. %{ int mylineno = 0; %} string \"[^\n"]+\" ws [ \t]+ alpha [A-Za-z] dig [0-9] name ({alpha}|{dig}|\$)({alpha}|{dig}|[_.\-/$])* num1 [-+]?{dig}+\.?([eE][-+]?{dig}+)? num2 [-+]?{dig}*\.{dig}+([eE][-+]?{dig}+)? number {num1}|{num2} %% {ws} /* skip blanks and tabs */ "/*" { int c; while((c = yyinput()) != 0) { if(c == '\n') ++mylineno; else if(c == '*') { if((c = yyinput()) == '/') break; else unput(c); } } } {number} cout << "number " << YYText() << '\n'; \n mylineno++; {name} cout << "name " << YYText() << '\n'; {string} cout << "string " << YYText() << '\n'; %% int main( int /* argc */, char** /* argv */ ) { FlexLexer* lexer = new yyFlexLexer; while(lexer->yylex() != 0) ; return 0; }Ê£¿ô¤Î(°Û¤Ê¤Ã¤¿)»ú¶ç²òÀÏ¥¯¥é¥¹¤òÀ¸À®¤·¤¿¤¤¾ì¹ç¡¢ -P ¥Õ¥é¥° (¤â¤·¤¯¤Ï prefix= ¥ª¥×¥·¥ç¥ó) ¤ò»ÈÍѤ·¤Æ³Æ yyFlexLexer ¤ò xxFlexLexer Åù¤ÎÊ̤Î̾Á°¤Ë¤·¤Þ¤¹¡£ ¼¡¤Ë»ú¶ç²òÀÏ¥¯¥é¥¹¤Î¥½¡¼¥¹¤´¤È¤Ë <FlexLexer.h> ¤ò¥¤¥ó¥¯¥ë¡¼¥É¤·¤Þ¤¹¡£ °Ê²¼¤Î¤è¤¦¤Ë yyFlexLexer ¤ò¥ê¥Í¡¼¥à¤·¤Þ¤¹:
#undef yyFlexLexer #define yyFlexLexer xxFlexLexer #include <FlexLexer.h> #undef yyFlexLexer #define yyFlexLexer zzFlexLexer #include <FlexLexer.h>¤³¤ì¤Ï¤¢¤ë¥¹¥¥ã¥Ê¤ËÂФ· %option prefix=xx ¤ò»ÈÍѤ·¤â¤¦°ìÊý¤ËÂФ· %option prefix=zz ¤ò»ÈÍѤ·¤¿¾ì¹ç¤Ç¤¹¡£
½ÅÍ×: ¸½ºß¤Î¥¹¥¥ã¥ó¥¯¥é¥¹¤Î·Á¼°¤Ï ¼Â¸³Åª ¤Ç¤¢¤ê¡¢¥á¥¸¥ã¡¼¥ê¥ê¡¼¥¹¤¬ÊѤï¤ë¤ÈÂ礤¯Êѹ¹¤µ¤ì¤ë²ÄǽÀ¤¬¤¢¤ê¤Þ¤¹¡£
LEX ¤ª¤è¤Ó POSIX ¤È¤ÎÈó¸ß´¹À
flex ¤Ï AT&T Unix ¤Î lex ¥Ä¡¼¥ë¤Î¥ê¥é¥¤¥È¤Ç¤¹¤¬(2 ¤Ä¤Î¼ÂÁõ¤Ï¤¤¤«¤Ê¤ë¥³¡¼¥É¤â¶¦Í¤·¤Þ¤»¤ó)¡¢ ¤¤¤¯¤Ð¤¯¤«¤Î³ÈÄ¥¤ÈÈó¸ß´¹À¤ò»ý¤Ã¤Æ¤ª¤ê¡¢ ¤É¤Á¤é¤Î¼ÂÁõ¤Ç¤â¼õÍý²Äǽ¤Ê¥¹¥¥ã¥Ê¤ò½ñ¤¤¿¤¤Êý¤Ï ¤³¤ì¤ò°Õ¼±¤·¤Ê¤±¤ì¤Ð¤Ê¤ê¤Þ¤»¤ó¡£ flex ¤Ï POSIX lex »ÅÍͤ˴°Á´¹çÃפ·¤Þ¤¹¤¬¡¢Îã³°¤Ï %pointer (¥Ç¥Õ¥©¥ë¥È)»ÈÍÑ¤È unput() ¸Æ¤Ó½Ð¤·¤Ë¤è¤ê yytext ¤ÎÆâÍƤòÇ˲õ¤¹¤ë¤³¤È¤Ç¤¢¤ê¡¢¤³¤ì¤Ï POSIX »ÅÍͤËÈ¿¤·¤Þ¤¹¡£¤³¤ÎÀá¤Ç¤Ï¡¢ flex ¤È AT&T lex ¤È POSIX »ÅÍͤȤδ֤ÎÁ´¤Æ¤Î´ûÃΤÎÈó¸ß´¹À¤ò°·¤¤¤Þ¤¹¡£
flex ¤Î -l ¥ª¥×¥·¥ç¥ó¤Ï¥ª¥ê¥¸¥Ê¥ë¤Î AT&T lex ¼ÂÁõ¤È¤ÎºÇÂç¤Î¸ß´¹À¤ò͸ú¤Ë¤·¤Þ¤¹¤¬¡¢ À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê¤ÎÀǽ¤ÏÂ礤¯Äã²¼¤·¤Þ¤¹¡£ -l ¥ª¥×¥·¥ç¥ó¤ò»ÈÍѤ·¤Æ¤âȯÀ¸¤·¤¦¤ëÈó¸ß´¹À¤Ï¸å¤Ç½Ò¤Ù¤Þ¤¹¡£
flex ¤Ï°Ê²¼¤ÎÎã³°¤ò½ü¤ lex ¤È´°Á´¸ß´¹¤Ç¤¹:
- -
- ¥É¥¥å¥á¥ó¥È¤ËµºÜ¤µ¤ì¤Æ¤¤¤Ê¤¤ lex ¥¹¥¥ã¥ÊÆâÉô¤ÎÊÑ¿ô yylineno ¤Ï -l ¤â¤·¤¯¤Ï %option yylineno ¤ò»ÈÍѤ·¤Ê¤¤¤È¥µ¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó¡£
- yylineno ¤Ï¥¹¥¥ã¥ÊËè(ñ°ì¤Î¥°¥í¡¼¥Ð¥ëÊÑ¿ô)¤Ç¤Ï¤Ê¤¯¡¢¥Ð¥Ã¥Õ¥¡Ëè¤Ë´ÉÍý¤µ¤ì¤ë¤Ù¤¤Ç¤¹¡£
- yylineno ¤Ï POSIX »ÅÍͤǤϤ¢¤ê¤Þ¤»¤ó¡£
- -
- input() ¥ë¡¼¥Á¥ó¤ÏºÆÄêµÁ¤Ç¤¤Þ¤»¤ó¤¬¡¢ ¥ë¡¼¥ë¤Ë¥Þ¥Ã¥Á¤·¤¿¤â¤Î¤Ë¸å³¤¹¤ëʸ»ú¤òÆɤि¤á¤Ë¸Æ¤Ð¤ì¤¨¤Þ¤¹¡£ input() ¤¬¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤ËÅþ㤹¤ë¤È¡¢Ä̾ï¤Î yywrap() ½èÍý¤Ï½ªÎ»¤·¤Þ¤¹¡£``¼ÂºÝ¤Î'' ¥Õ¥¡¥¤¥ë¤Î½ª¤ê¤Ï EOF ¤È¤·¤ÆÊÖ¤µ¤ì¤Þ¤¹¡£
- ¼ÂºÝ¤Ë¤ÏÆþÎÏ¤Ï YY_INPUT ¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¤³¤È¤Ë¤è¤êÀ©¸æ¤µ¤ì¤Þ¤¹¡£
- input() ¤òºÆÄêµÁ¤Ç¤¤Ê¤¤¤È¤¤¤¦ flex ¤ÎÀ©¸Â¤Ï¡¢ºÇ½é¤Ë yyin ¤òÀßÄꤹ¤ë°Ê³°¤Î¥¹¥¥ã¥ÊÆþÎÏÀ©¸æÊýË¡¤òñ¤Ëµ¬Äꤷ¤Æ¤¤¤Ê¤¤¤È¤¤¤¦¡¢ POSIX »ÅÍͤȹçÃפ·¤Þ¤¹¡£
- -
- unput() ¥ë¡¼¥Á¥ó¤ÏºÆÄêµÁ¤Ç¤¤Þ¤»¤ó¡£¤³¤ÎÀ©¸Â¤Ï POSIX ¤Ë¹çÃפ·¤Æ¤¤¤Þ¤¹¡£
- -
- flex ¥¹¥¥ã¥Ê¤Ï lex ¥¹¥¥ã¥Ê¤È¤Ï°Û¤Ê¤ê¥ê¥¨¥ó¥È¥é¥ó¥È¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ ¼ÂºÝ¡¢ÂÐÏÃŪ¤Ê¥¹¥¥ã¥Ê¤Ë¤ª¤¤¤Æ¡¢ ³ä¤ê¹þ¤ß¥Ï¥ó¥É¥é¤Ë¤Æ¥í¥ó¥°¥¸¥ã¥ó¥×¤òÍѤ¤¤Æ¥¹¥¥ã¥Ê¤«¤éæ½Ð¤·¡¢ ¤½¤Î¸å¥¹¥¥ã¥Ê¤òºÆÅٸƤӽФ¹¾ì¹ç¡¢°Ê²¼¤Î¥á¥Ã¥»¡¼¥¸¤òÆÀ¤ë¤Ç¤·¤ç¤¦:
fatal flex scanner internal error--end of buffer missed
¥¹¥¥ã¥Ê¤ËºÆÅÙÆþ¤ë¤¿¤á¤Ë¤Ï¡¢¤Þ¤º°Ê²¼¤Î¤è¤¦¤Ë¤·¤Æ²¼¤µ¤¤yyrestart( yyin );
¤³¤Î¸Æ¤Ó½Ð¤·¤Ë¤è¤êÆþÎϥХåե¡¤Ï¼Î¤Æ¤é¤ì¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤; Ä̾盧¤ì¤ÏÂÐÏÃŪ¥¹¥¥ã¥Ê¤Ç¤ÏÌäÂê¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£ - ¤Þ¤¿¡¢C++ ¥¹¥¥ã¥Ê¥¯¥é¥¹¤Ï¥ê¥¨¥ó¥È¥é¥ó¥È ¤Ç¤¹ ¤Î¤Ç¡¢C++ ¤ò»ÈÍѤǤ¤ë¤Î¤Ê¤é¡¢C++ ¤ò»ÈÍѤ¹¤Ù¤¤Ç¤¹¡£ Á°½Ò¤Î "C++ ¥¹¥¥ã¥Ê¤ÎÀ¸À®" ¤ò»²¾È¤·¤Æ²¼¤µ¤¤¡£
- -
- output() ¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ ECHO ¥Þ¥¯¥í¤«¤é¤Î½ÐÎϤϥե¡¥¤¥ë¥Ý¥¤¥ó¥¿ yyout (¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï ɸ½à½ÐÎÏ )¤ËÂФ·¤Æ¹Ô¤ï¤ì¤Þ¤¹¡£
- output() ¤Ï POSIX »ÅÍͤˤϤ¢¤ê¤Þ¤»¤ó¡£
- -
- lex ¤ÏÇÓ¾Ū³«»Ï¾ò·ï (%x) ¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó¤¬¡¢¤³¤ì¤Ï POSIX »ÅÍͤˤ¢¤ê¤Þ¤¹¡£
- -
- ÄêµÁ¤òŸ³«¤¹¤ë»þ¡¢ flex ¤Ç¤Ï³ç¸Ì¤Ç³ç¤ê¤Þ¤¹¡£ lex ¤Ç¤Ï°Ê²¼¤Ï:
NAME [A-Z][A-Z0-9]* %% foo{NAME}? printf( "Found it\n" ); %%
ʸ»úÎó "foo" ¤Ë¤Ï¥Þ¥Ã¥Á¤·¤Þ¤»¤ó¡£ ¤Ê¤¼¤Ê¤éŸ³«¤µ¤ì¤¿¥Þ¥¯¥í¤Ï¥ë¡¼¥ë "foo[A-Z][A-Z0-9]*?" ¤ÈÅù²Á¤Ë¤Ê¤ê¡¢ Í¥ÀèÅÙ¤Ë¤Æ `?' ¤Ï "[A-Z0-9]*" ¤È·ë¤ÓÉÕ¤¤Þ¤¹¡£ flex ¤Ç¤Ï¥ë¡¼¥ë¤¬Å¸³«¤µ¤ì¤ë¤È "foo([A-Z][A-Z0-9]*)?" ¤È¤Ê¤ê¡¢ ʸ»úÎó "foo" ¤¬¥Þ¥Ã¥Á¤·¤Þ¤¹¡£ - ^ ¤Ç»Ï¤Þ¤ë¤« $ ¤Ç½ª¤ëÄêµÁ¤Ï¡¢Å¸³«»þ¤Ë³ç¸Ì¤Ç³ç¤é¤º¡¢ ¤³¤ì¤é¤Î¥ª¥Ú¥ì¡¼¥¿¤¬ÄêµÁ¤Ë¤ª¤¤¤ÆÆÃÊ̤ʰÕÌ£¤ò¼º¤ï¤Ê¤¤¤è¤¦¤Ë¤¹¤ë¤³¤È¤Ë Ãí°Õ¤·¤Æ²¼¤µ¤¤¡£ ¤·¤«¤· <s>, /, <<EOF>> ¥ª¥Ú¥ì¡¼¥¿¤Ï flex ¤ÎÄêµÁ¤Ç¤Ï»ÈÍѤǤ¤Þ¤»¤ó¡£
- -l ¤ò»ÈÍѤ¹¤ë¤È¡¢ lex ¤Î¿¶Éñ¤¤¤ÈƱ¤¸¤¯ÄêµÁ¤ò³ç¸Ì¤Ç³ç¤ê¤Þ¤»¤ó¡£
- POSIX »ÅÍͤǤϡ¢ÄêµÁ¤ò³ç¸Ì¤Ç³ç¤ê¤Þ¤¹¡£
- -
- lex ¤Î¼ÂÁõ¤Ë¤è¤Ã¤Æ¤Ï¡¢ ¥ë¡¼¥ë¤Î¥Ñ¥¿¡¼¥ó¤Î±¦Â¦¤Ë¶õÇò¤¬¤¢¤ë¾ì¹ç¡¢ ¥ë¡¼¥ë¤Î¥¢¥¯¥·¥ç¥ó¤òÊ̤ιԤ«¤é»Ï¤á¤ë¤³¤È¤òµö¤·¤Þ¤¹:
%% foo|bar<space here> { foobar_action(); }
flex ¤Ï¤³¤Îµ¡Ç½¤ò¥µ¥Ý¡¼¥È¤·¤Þ¤»¤ó¡£ - -
- lex ¤Î %r (Ratfor ¥¹¥¥ã¥Ê¤ÎÀ¸À®)¥ª¥×¥·¥ç¥ó¤Ï¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£ ¤³¤ì¤Ï POSIX »ÅÍͤˤϴޤޤì¤Þ¤»¤ó¡£
- -
- ¥¹¥¥ã¥Ê¤ò %array ¤ò»ÈÍѤ·¤Æ¹½ÃÛ¤·¤¿¤Î¤Ç¤Ï¤Ê¤¤¸Â¤ê¡¢ unput() ¸Æ¤Ó½Ð¤·¸å¤Ë¤Ï¡¢¼¡¤Î¥È¡¼¥¯¥ó¤Ë¥Þ¥Ã¥Á¤¹¤ë¤Þ¤Ç yytext ¤Ï̤ÄêµÁ¤Ç¤¹¡£ ¤³¤ì¤Ï lex ¤Ë¤â POSIX »ÅÍͤˤâÅö¤Æ¤Ï¤Þ¤ê¤Þ¤»¤ó¡£ -l ¥ª¥×¥·¥ç¥ó¤ò»ØÄꤹ¤ë¤È¤³¤ÎÈó¸ß´¹À¤ò¼è¤ê½ü¤¤Þ¤¹¡£
- -
- {} (¿ôÃÍÈÏ°Ï)¥ª¥Ú¥ì¡¼¥¿¤ÎÍ¥ÀèÅÙ¤¬°Û¤Ê¤ê¤Þ¤¹¡£ lex ¤Ï "abc{1,3}" ¤ò "1 ÅÙ¤« 2 ÅÙ¤« 3 Å٤Π'abc' ¤Ë¥Þ¥Ã¥Á" ¤È²ò¼á¤·¤Þ¤¹¤¬¡¢ flex ¤Ï "'ab' ¤Ë 1 ÅÙ¤« 2 ÅÙ¤« 3 Å٤Π'c' ¤¬Â³¤¯¤â¤Î¤Ë¥Þ¥Ã¥Á" ¤È²ò¼á¤·¤Þ¤¹¡£ ¸å¼Ô¤¬ POSIX »ÅÍͤ˹çÃפ·¤Þ¤¹¡£
- -
- ^ ¥ª¥Ú¥ì¡¼¥¿¤ÎÍ¥ÀèÅÙ¤¬°Û¤Ê¤ê¤Þ¤¹¡£ lex ¤Ï "^foo|bar" ¤ò "¹ÔƬ¤Î 'foo' ¤«Ç¤°Õ°ÌÃ֤Π'bar' ¤Ë¥Þ¥Ã¥Á" ¤È²ò¼á¤·¤Þ¤¹¤¬¡¢ flex ¤Ï "¹ÔƬ¤Î 'foo' ¤« 'bar' ¤Ë¥Þ¥Ã¥Á" ¤È²ò¼á¤·¤Þ¤¹¡£ ¸å¼Ô¤¬ POSIX »ÅÍͤ˹çÃפ·¤Þ¤¹¡£
- -
- lex ¤Ç¥µ¥Ý¡¼¥È¤µ¤ì¤Æ¤¤¤ë %a Åù¤ÎÆÃÊ̤ʥơ¼¥Ö¥ë¥µ¥¤¥º¤ÎÀë¸À¤Ï flex ¥¹¥¥ã¥Ê¤Ç¤ÏÉÔÍפǤ¹; flex ¤Ï¤³¤ì¤é¤ò̵»ë¤·¤Þ¤¹¡£
- -
- flex ¤È lex ¤Î¤É¤Á¤é¤Ç¤â¥¹¥¥ã¥Ê¤ò»ÈÍѲÄǽ¤Ë½ñ¤±¤ë¤è¤¦¤Ë¡¢ FLEX_SCANNER ¤È¤¤¤¦Ì¾Á°¤òÄêµÁ¤·¤Þ¤¹¡£ ¥¹¥¥ã¥Ê¤òÀ¸À®¤·¤¿ flex ¤Î¥Ð¡¼¥¸¥ç¥ó¤òɽ¤¹ YY_FLEX_MAJOR_VERSION ¤È YY_FLEX_MINOR_VERSION ¤ò¡¢¥¹¥¥ã¥Ê¤Ï´Þ¤ß¤Þ¤¹ (Î㤨¤Ð 2.5 ¥ê¥ê¡¼¥¹¤Ç¤Ï¤³¤ì¤é¤Ï¤½¤ì¤¾¤ì 2 ¤È 5 ¤Ë¤Ê¤ê¤Þ¤¹)¡£
°Ê²¼¤Î flex ¤Îµ¡Ç½¤Ï lex ¤ª¤è¤Ó POSIX »ÅÍͤˤϴޤޤì¤Þ¤»¤ó:
C++ ¥¹¥¥ã¥Ê %option ³«»Ï¾ò·ï¥¹¥³¡¼¥× ³«»Ï¾ò·ï¥¹¥¿¥Ã¥¯ ÂÐÏÃŪ/ÈóÂÐÏÃŪ¥¹¥¥ã¥Ê yy_scan_string() Åù yyterminate() yy_set_interactive() yy_set_bol() YY_AT_BOL() <<EOF>> <*> YY_DECL YY_START YY_USER_ACTION YY_USER_INIT #line ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö ¥¢¥¯¥·¥ç¥ó¤Î¼þ¤ê¤Î %{} ñ°ì¹Ô¤Ë¤ª¤±¤ëÊ£¿ô¤Î¥¢¥¯¥·¥ç¥ó¤µ¤é¤Ë¤Û¤ÜÁ´¤Æ¤Î flex ¥Õ¥é¥°¤Ç¤¹¡£ ¥ê¥¹¥È¤ÎºÇ¸å¤Îµ¡Ç½¤Î°ÕÌ£¤Ï¡¢ flex ¤Ç¤ÏÊ£¿ô¤Î¥¢¥¯¥·¥ç¥ó¤ò¥»¥ß¥³¥í¥ó¤Ç¶èÀڤäÆƱ°ì¹Ô¤Ëµ½Ò²Äǽ¤Ç¤¹¤¬¡¢ lex ¤Ç¤Ï¼¡¤Î
foo handle_foo(); ++num_foos_seen;¤Ï (¶Ã¤¯¤Ù¤¤³¤È¤Ë) ¼¡¤Î¤è¤¦¤ËÀÚ¤êµÍ¤á¤é¤ì¤ë¤È¤¤¤¦¤³¤È¤Ç¤¹¡£
foo handle_foo();flex ¤Ï¥¢¥¯¥·¥ç¥ó¤òÀÚ¤êµÍ¤á¤Þ¤»¤ó¡£ ¥Ö¥ì¡¼¥¹¤Ç³ç¤é¤ì¤Ê¤¤¥¢¥¯¥·¥ç¥ó¤Ïñ½ã¤Ë¹ÔËö¤Ç½ªÎ»¤·¤Þ¤¹¡£
¿ÇÃÇ
warning, rule cannot be matched ¾ï¤ËƱ¤¸¥Æ¥¥¹¥È¤Ë¥Þ¥Ã¥Á¤¹¤ë¥ë¡¼¥ë¤¬Á°¤Ë¤¢¤ë¤Î¤Ç¡¢ Í¿¤¨¤é¤ì¤¿¥ë¡¼¥ë¤¬¥Þ¥Ã¥Á¤·¤Þ¤»¤ó¡£ Î㤨¤Ð°Ê²¼¤Î "foo" ¤Ï "Á´¤Æ¤òÊá¤Þ¤¨¤ë" ¥ë¡¼¥ë¤Î¸å¤í¤Ë¤¢¤ê¤Þ¤¹¤Î¤Ç ·è¤·¤Æ¥Þ¥Ã¥Á¤·¤Þ¤»¤ó:[a-z]+ got_identifier(); foo got_foo();¥¹¥¥ã¥ÊÃæ¤Ç REJECT ¤ò»ÈÍѤ¹¤ë¤È¤³¤Î·Ù¹ð¤òÍÞÀ©¤·¤Þ¤¹¡£
warning, -s option given but default rule can be matched (¤ª¤½¤é¤¯¤¢¤ëÆÃÄê¤Î³«»Ï¾ò·ï¤Î¤â¤È¤Ç¤Ï) ¥Ç¥Õ¥©¥ë¥È¥ë¡¼¥ë (Ǥ°Õ¤Î°ìʸ»ú¤Ë¥Þ¥Ã¥Á¤¹¤ë) ¤·¤«ÆÃÄê¤ÎÆþÎÏ¤Ë ÂФ·¤Æ¤Ï¥Þ¥Ã¥Á¤·¤Ê¤¤¤³¤È¤¬¤¢¤ê¤Þ¤¹¡£ -s ¤ò»ØÄꤷ¤Æ¤¤¤ë¤Î¤Ç¡¢¤ª¤½¤é¤¯¤½¤¦¤Ê¤ê¤Þ¤»¤ó¡£
reject_used_but_not_detected undefined ¤¢¤ë¤¤¤Ï yymore_used_but_not_detected undefined - ¤³¤ì¤é¤Î¥¨¥é¡¼¤Ï ¥³¥ó¥Ñ¥¤¥ë»þ¤Ëµ¯¤¤Þ¤¹¡£¥¹¥¥ã¥Ê¤¬ REJECT ¤â¤·¤¯¤Ï yymore() ¤ò»È¤Ã¤Æ¤¤¤Þ¤¹¤¬ flex ¤¬¤½¤Î¤³¤È¤Ëµ¤¤Å¤«¤Ê¤«¤Ã¤¿¤È¤¤¤¦¤³¤È¤Ç¤¹¡£ ¤Ä¤Þ¤ê¡¢ flex ¤ÏºÇ½é¤Î 2 ¤Ä¤ÎÉôʬ¤òõ¤·¤Æ¤â ¤³¤ì¤é¤Î¥¢¥¯¥·¥ç¥ó¤Î½Ð¸½¤ò¸«¤Ä¤±¤é¤ì¤Ê¤«¤Ã¤¿¤Î¤Ç¤¹¤¬¡¢ ¼ÂºÝ¤Ë¤Ï²¿¤é¤«¤ÎÊýË¡ (Î㤨¤Ð #include ¥Õ¥¡¥¤¥ë¤ò²ð¤·¤Æ)¤Ç¤³¤ì¤é¤¬µ½Ò¤µ¤ì¤Æ¤¤¤¿¡¢¤È¤¤¤¦¤³¤È¤Ç¤¹¡£ %option reject ¤« %option yymore ¤ò»ÈÍѤ·¤Æ¡¢flex ¤Ë¤³¤ì¤é¤Îµ¡Ç½¤ò¼ÂºÝ¤Ë»ÈÍѤ·¤Æ¤¤¤ë¤³¤È¤ò¶µ¤¨¤Æ²¼¤µ¤¤¡£
flex scanner jammed - -s ¤Ç¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥¹¥¥ã¥Ê¤¬¡¢¤É¤Î¥ë¡¼¥ë¤Ë¤â¥Þ¥Ã¥Á¤·¤Ê¤¤ ÆþÎÏʸ»úÎó¤ËÁø¶ø¤·¤Þ¤·¤¿¡£ ÆâÉôŪ¤ÊÌäÂê¤Ëµ¯°ø¤·¤Æ¤³¤Î¥¨¥é¡¼¤¬µ¯¤³¤ë¤³¤È¤â¤¢¤ê¤Þ¤¹¡£
token too large, exceeds YYLMAX - ¥¹¥¥ã¥Ê¤¬ %array ¤ò»È¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ë¡¢¤¢¤ë¥ë¡¼¥ë¤¬Äê¿ô YYLMAX (¥Ç¥Õ¥©¥ë¥È¤Ç 8K ¥Ð¥¤¥È) ¤è¤êÂ礤Êʸ»úÎó¤È¥Þ¥Ã¥Á¤·¤Þ¤·¤¿¡£ flex ¤ÎÆþÎÏ¥Õ¥¡¥¤¥ë¤ÎÄêµÁÉô¤Ç YYLMAX ¤ò #define ¤¹¤ë¤³¤È¤ÇÃͤòÂ礤¯¤Ç¤¤Þ¤¹¡£
scanner requires -8 flag to use the character 'x' - ¥¹¥¥ã¥Ê¤Îµ½Ò¤Ë 8 ¥Ó¥Ã¥È¤Îʸ»ú 'x' ¤ò¼±Ê̤¹¤ëÉôʬ¤¬¤¢¤ê¡¢ -Cf ¤â¤·¤¯¤Ï -CF ¤Î¥Æ¡¼¥Ö¥ë°µ½Ì¥ª¥×¥·¥ç¥ó¤Î¤¿¤á¤Ë¥Ç¥Õ¥©¥ë¥È¤Î 7 ¥Ó¥Ã¥È¤Ë¤Ê¤Ã¤Æ¤¤¤ë ¤Ë¤â¤«¤«¤ï¤é¤º¡¢ -8 ¥ª¥×¥·¥ç¥ó¤ò¤Ä¤±¤Æ¤¤¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ç¤¹¡£ ¾ÜºÙ¤Ï -7 ¥Õ¥é¥°¤Î¥ª¥×¥·¥ç¥ó¤ÎµÄÏÀ¤ò»²¾È¤·¤Æ²¼¤µ¤¤¡£
flex scanner push-back overflow - unput() ¤Ç¥Æ¥¥¹¥È¤òÌᤷ¤¹¤®¤¿¤¿¤á¡¢¥¹¥¥ã¥Ê¤Î¥Ð¥Ã¥Õ¥¡¤Ï Ìᤷ¤¿¥Æ¥¥¹¥È¤È¸½¥È¡¼¥¯¥ó¤ò yytext ¤ËÊݤƤޤ»¤ó¡£ ¤³¤Î¾ì¹ç¡¢ÍýÁÛŪ¤Ë¤Ï¥¹¥¥ã¥Ê¤¬Æ°Åª¤Ë¥Ð¥Ã¥Õ¥¡¤ÎÂ礤µ¤òÊѤ¨¤ë¤Ù¤¤Ç¤¹¤¬¡¢ ¸½ºß¤Î¤È¤³¤í¤½¤¦¤Ê¤Ã¤Æ¤Ï¤¤¤Þ¤»¤ó¡£
input buffer overflow, can't enlarge buffer because scanner uses REJECT - ¥¹¥¥ã¥Ê¤ÏÈó¾ï¤ËÂ礤ʥȡ¼¥¯¥ó¤Î¥Þ¥Ã¥Á¤òÄ´¤Ù¤Æ¤¤¤Æ¡¢ÆþÎϥХåե¡¤ò ³ÈÄ¥¤¹¤ëɬÍפ¬µ¯¤¤Þ¤·¤¿¡£¤·¤«¤·¤Ê¤¬¤é¡¢¥Ð¥Ã¥Õ¥¡¤Î³ÈÄ¥¤Ï REJECT ¤ò»È¤¦¥¹¥¥ã¥Ê¤Ç¤ÏƯ¤¤Þ¤»¤ó¡£
fatal flex scanner internal error--end of buffer missed - ¥¹¥¥ã¥Ê¤¬»ÈÍѤ·¤Æ¤¤¤ë¥Õ¥ì¡¼¥à¤«¤é(¤ò±Û¤¨¤Æ)¥í¥ó¥°¥¸¥ã¥ó¥×¤·¤¿¸å¡¢ ºÆÅÙ¥¹¥¥ã¥Ê¤ËÆþ¤Ã¤¿¾ì¹ç¤Ëµ¯¤³¤ê¤Þ¤¹¡£ ºÆÅÙ¥¹¥¥ã¥Ê¤ËÆþ¤ëÁ°¤Ë:
yyrestart( yyin );¤ò»È¤¦¤«¡¢Á°½Ò¤Î¤è¤¦¤Ë C++ ¥¹¥¥ã¥Ê¥¯¥é¥¹¤ò»ÈÍѤ¹¤ë¤è¤¦¤Ë¤·¤Æ²¼¤µ¤¤¡£
too many start conditions in <> construct! - ¸ºß¤¹¤ë¤è¤ê¿¤¯¤Î³«»Ï¾ò·ï¤ò <> Ãæ¤ËµºÜ¤·¤Þ¤·¤¿ (¾¯¤Ê¤¯¤È¤â°ì¤Ä¤òÆóÅÙµºÜ¤·¤Þ¤·¤¿)¡£
´ØÏ¢¥Õ¥¡¥¤¥ë
- -ll
- ¥¹¥¥ã¥Ê¤¬¥ê¥ó¥¯¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¥é¥¤¥Ö¥é¥ê¡£
- lex.yy.c
- À¸À®¤µ¤ì¤¿¥¹¥¥ã¥Ê(¥·¥¹¥Æ¥à¤Ë¤è¤Ã¤Æ¤Ï lexyy.c ¤È¤¤¤¦Ì¾Á°¤Ë¤Ê¤ê¤Þ¤¹)¡£
- lex.yy.cc
- -+ ¤ò»È¤Ã¤¿»þ¤ËºîÀ®¤µ¤ì¤¿ C++ ¥¹¥¥ã¥Ê¥¯¥é¥¹¡£
- <FlexLexer.h>
- C++ ¥¹¥¥ã¥Ê¥Ù¡¼¥¹¥¯¥é¥¹ FlexLexer ¤È¤½¤ÎƳ½Ð¥¯¥é¥¹ yyFlexLexer ¤òÄêµÁ¤¹¤ë¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¡£
- flex.skl
- ¥¹¥±¥ë¥È¥ó¥¹¥¥ã¥Ê¡£ ¤³¤Î¥Õ¥¡¥¤¥ë¤Ï flex ¤Î¼Â¹Ô»þ¤Ç¤Ï¤Ê¤¯¡¢flex ¤ò¹½ÃÛ¤¹¤ë»þ¤Î¤ßÍøÍѤµ¤ì¤Þ¤¹¡£
- lex.backup
- -b ¥Õ¥é¥°ÍѤΥХ寥¢¥Ã¥×¾ðÊó(¥·¥¹¥Æ¥à¤Ë¤è¤Ã¤Æ¤Ï lex.bck ¤È¤¤¤¦Ì¾Á°¤Ë¤Ê¤ê¤Þ¤¹)¡£
·ç´Ù / ¥Ð¥°
±¦Ê¸Ì®(trailing context)¥Ñ¥¿¡¼¥ó¤ÎÃæ¤Ë¤Ï¡¢Àµ¤·¤¯¥Þ¥Ã¥Á¤»¤º ·Ù¹ð¥á¥Ã¥»¡¼¥¸ ("dangerous trailing context") ¤ò½Ð¤¹¤â¤Î¤¬¤¢¤ê¤Þ¤¹¡£ ¤³¤ì¤é¤Î¥Ñ¥¿¡¼¥ó¤Ï¡¢ ¥ë¡¼¥ë¤ÎºÇ½é¤ÎÉôʬ¤¬ 2ÈÖÌܤÎƬ¤ÎÉôʬ¤È¥Þ¥Ã¥Á¤¹¤ë¤è¤¦¤Ê¤â¤Î¤Ç¤¹¡£ Î㤨¤Ð "zx*/xy*" ¤Î¾ì¹ç¡¢'x*' ¤Ï±¦Ê¸Ì®¤ÎƬ¤Î 'x' ¤È¥Þ¥Ã¥Á¤·¤Þ¤¹¡£ (POSIX ¥É¥é¥Õ¥È¤Ç¤Ï¤½¤Î¤è¤¦¤Ê¥Ñ¥¿¡¼¥ó¤Ë¥Þ¥Ã¥Á¤¹¤ë¥Æ¥¥¹¥È¤Ï ̤ÄêµÁ¤Ç¤¢¤ë¤È½Ò¤Ù¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ¤·¤Æ²¼¤µ¤¤¡£)±¦Ê¸Ì®¤ÎÃæ¤Ë¤Ï¡¢¼ÂºÝ¤Ë¤Ï¸ÇÄêŤǤ¢¤ë¤Î¤Ë¤½¤¦¤È¤Ï²ò¼á¤µ¤ì¤Ê¤¤¤â¤Î¤¬¤¢¤ê¡¢ ¾å¤Ë½Ò¤Ù¤¿Àǽ¤ÎÄã²¼¤¬µ¯¤³¤ê¤Þ¤¹¡£ Æäˡ¢ '|' ¤ä {n} (Î㤨¤Ð "foo{3}") ¤Ï¾ï¤Ë²ÄÊÑŤǤ¢¤ë¤È²ò¼á¤µ¤ì¤Þ¤¹¡£
±¦Ê¸Ì®¤ÈÆÃÊ̤ʥ¢¥¯¥·¥ç¥ó '|' ¤òÁȤ߹ç¤ï¤»¤ë¤È ¸ÇÄê¤Î ±¦Ê¸Ì®¤¬¤è¤ê¥³¥¹¥È¤Î¤«¤«¤ë ²ÄÊѤΠ±¦Ê¸Ì®¤È¤Ê¤ê¤Þ¤¹¡£Î㤨¤Ð¡¢¼¡¤Î¤è¤¦¤Ê¤â¤Î¤Ç¤¹:
%% abc | xyz/def
%array ¤â¤·¤¯¤Ï -l ¥ª¥×¥·¥ç¥ó¤ò»ØÄꤷ¤Ê¤¤¾ì¹ç¡¢ unput() ¤ò»È¤¦¤È yytext ¤È yyleng ¤òÇ˲õ¤·¤Þ¤¹¡£
NUL ¤Î¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¥ó¥°¤Ï¾¤Îʸ»ú¤ÎÈæ³Ó¤è¤ê¤«¤Ê¤êÃÙ¤¯¤Ê¤Ã¤Æ¤¤¤Þ¤¹¡£
ÆþÎϥХåե¡¤ÎưŪ¤ÊÂ礤µ¤ÎºÆÄ´À°¤Ï»þ´Ö¤¬¤«¤«¤ê¤Þ¤¹¡£¤³¤ì¤Ï¸½¥È¡¼¥¯¥ó (°ìÈ̤˵ðÂç)¤Þ¤Ç¤Î¥Þ¥Ã¥Á¤·¤¿Á´¥Æ¥¥¹¥È¤ÎºÆ¥¹¥¥ã¥ó¤òȼ¤¦¤¿¤á¤Ç¤¹¡£
ÆþÎϤΥХåե¡¥ê¥ó¥°¤ÈÀèÆɤߤΤ¿¤á¡¢ <stdio.h> ¥ë¡¼¥Á¥ó¤È º®¹ç¤·¤Æ»È¤¦¤³¤È¤¬½ÐÍè¤Þ¤»¤ó¡£Î㤨¤Ð¡¢ getchar() ¤È flex ¤Î¥ë¡¼¥ë¤Ï¤¦¤Þ¤¯¹Ô¤¤Þ¤»¤ó¡£Âå¤ï¤ê¤Ë input() ¤ò»È¤Ã¤Æ²¼¤µ¤¤¡£
-v ¥ª¥×¥·¥ç¥ó¤Çɽ¼¨¤µ¤ì¤ëÁ´¥Æ¡¼¥Ö¥ë¥¨¥ó¥È¥ê¤Ë¤Ï¡¢ ¤É¤Î¥ë¡¼¥ë¤¬¥Þ¥Ã¥Á¤·¤¿¤Î¤«¤ò·èÄꤹ¤ë¤Î¤ËɬÍפʥơ¼¥Ö¥ë¥¨¥ó¥È¥ê¿ô¤¬ ´Þ¤Þ¤ì¤Æ¤¤¤Þ¤»¤ó¡£¥¨¥ó¥È¥ê¤Î¿ô¤Ï¥¹¥¥ã¥Ê¤¬ REJECT ¤ò»È¤Ã¤Æ¤¤¤Ê¤¤¤È¤¤Ë¤Ï DFA ¾õÂÖ¿ô¤ËÅù¤·¤¯¡¢ »È¤Ã¤Æ¤¤¤ë¤È¤¤Ë¤Ï DFA ¾õÂÖ¿ô¤è¤ê¤¤¤¯¤é¤«Â礤¯¤Ê¤ê¤Þ¤¹¡£
REJECT ¤¬¥ª¥×¥·¥ç¥ó -f ¤â¤·¤¯¤Ï -F ¤È¤È¤â¤Ë»È¤¨¤Þ¤»¤ó¡£
flex ¤ÎÆâÉô¥¢¥ë¥´¥ê¥º¥à¤Ë¤Ä¤¤¤Æ¤Î¥É¥¥å¥á¥ó¥È¤¬É¬ÍפǤ¹¡£
´ØÏ¢¹àÌÜ
lex(1), yacc(1), sed(1), awk(1)John Levine, Tony Mason, and Doug Brown, Lex & Yacc, O'Reilly and Associates. Âè 2 ÈǤòÆþ¼ê¤¹¤ë¤³¤È¡£
M. E. Lesk and E. Schmidt, LEX - Lexical Analyzer Generator
Alfred Aho, Ravi Sethi and Jeffrey Ullman, Compilers: Principles, Techniques and Tools, Addison-Wesley (1986). flex ¤Ç»ÈÍѤ·¤Æ¤¤¤ë¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¥ó¥°µ»Ë¡¤ò²òÀ⤷¤Æ¤¤¤ë(·èÄêÀ¥ª¡¼¥È¥Þ¥È¥ó)¡£
ºî¼Ô
Vern Paxson ¤¬Â¿¤¯¤Î¥¢¥¤¥Ç¥£¥¢¤È¥¤¥ó¥¹¥Ô¥ì¡¼¥·¥ç¥ó¤òÆÀ¤ë½õ¤±¤ò Van Jacobson ¤«¤é¼õ¤±¤Þ¤·¤¿¡£ ¥ª¥ê¥¸¥Ê¥ë¥Ð¡¼¥¸¥ç¥ó¤Ï Jef Poskanzer ¤¬ºîÀ®¤·¤Þ¤·¤¿¡£ ¹â®¥Æ¡¼¥Ö¥ëɽ¸½¤Ï Van Jacobson ¤Î¥Ç¥¶¥¤¥ó¤ÎÉôʬ¼ÂÁõ¤Ç¤¹¡£ ¤³¤Î¼ÂÁõ¤Ï Kevin Gong ¤È Vern Paxson ¤¬¹Ô¤¤¤Þ¤·¤¿¡£Â¿¤¯¤Î flex ¥Ù¡¼¥¿¥Æ¥¹¥¿¡¢¥Õ¥£¡¼¥É¥Ð¥Ã¥«¡¢¥³¥ó¥È¥ê¥Ó¥å¡¼¥¿¡¢ÆÃ¤Ë Francois Pinard, Casey Leedom, Robert Abramovitz, Stan Adermann, Terry Allen, David Barker-Plummer, John Basrai, Neal Becker, Nelson H.F. Beebe, benson@odi.com, Karl Berry, Peter A. Bigot, Simon Blanchard, Keith Bostic, Frederic Brehm, Ian Brockbank, Kin Cho, Nick Christopher, Brian Clapper, J.T. Conklin, Jason Coughlin, Bill Cox, Nick Cropper, Dave Curtis, Scott David Daniels, Chris G. Demetriou, Theo Deraadt, Mike Donahue, Chuck Doucette, Tom Epperly, Leo Eskin, Chris Faylor, Chris Flatters, Jon Forrest, Jeffrey Friedl, Joe Gayda, Kaveh R. Ghazi, Wolfgang Glunz, Eric Goldman, Christopher M. Gould, Ulrich Grepel, Peer Griebel, Jan Hajic, Charles Hemphill, NORO Hideo, Jarkko Hietaniemi, Scott Hofmann, Jeff Honig, Dana Hudes, Eric Hughes, John Interrante, Ceriel Jacobs, Michal Jaegermann, Sakari Jalovaara, Jeffrey R. Jones, Henry Juengst, Klaus Kaempf, Jonathan I. Kamens, Terrence O Kane, Amir Katz, ken@ken.hilco.com, Kevin B. Kenny, Steve Kirsch, Winfried Koenig, Marq Kole, Ronald Lamprecht, Greg Lee, Rohan Lenard, Craig Leres, John Levine, Steve Liddle, David Loffredo, Mike Long, Mohamed el Lozy, Brian Madsen, Malte, Joe Marshall, Bengt Martensson, Chris Metcalf, Luke Mewburn, Jim Meyering, R. Alexander Milowski, Erik Naggum, G.T. Nicol, Landon Noll, James Nordby, Marc Nozell, Richard Ohnemus, Karsten Pahnke, Sven Panne, Roland Pesch, Walter Pelissero, Gaumond Pierre, Esmond Pitt, Jef Poskanzer, Joe Rahmeh, Jarmo Raiha, Frederic Raimbault, Pat Rankin, Rick Richardson, Kevin Rodgers, Kai Uwe Rommel, Jim Roskind, Alberto Santini, Andreas Scherer, Darrell Schiebel, Raf Schietekat, Doug Schmidt, Philippe Schnoebelen, Andreas Schwab, Larry Schwimmer, Alex Siegel, Eckehard Stolz, Jan-Erik Strvmquist, Mike Stump, Paul Stuart, Dave Tallman, Ian Lance Taylor, Chris Thewalt, Richard M. Timoney, Jodi Tsai, Paul Tuinenga, Gary Weik, Frank Whaley, Gerhard Wilhelms, Kent Williams, Ken Yap, Ron Zellar, Nathan Zelle, David Zuhn, ¤ª¤è¤Ó»ä¤ÎºÇÄã¤Î¥á¡¼¥ë¥¢¡¼¥«¥¤¥ÖǽÎϤ«¤é³ê¤êÍî¤Á¤¿Êý¡¹¡¢ ¤½¤ì¤é¤ÎÊý¡¹¤Î¶¨ÎϤˤâƱÍͤ˴¶¼Õ¤·¤Þ¤¹¡£
Keith Bostic, Jon Forrest, Noah Friedman, John Gilmore, Craig Leres, John Levine, Bob Mulcahy, G.T. Nicol, Francois Pinard, Rich Salz, Richard Stallman ¤Ë¤Ï¿¤¯¤ÎǺ¤ß¤Îʬ»¶¤Ë´Ø¤·¤Æ´¶¼Õ¤·¤Þ¤¹¡£
Esmond Pitt ¤È Earle Horton ¤Ë¤Ï 8 ¥Ó¥Ã¥Èʸ»ú¥µ¥Ý¡¼¥È¤Ë´Ø¤·¤Æ; Benson Margulies ¤È Fred Burke ¤Ë¤Ï C++ ¥µ¥Ý¡¼¥È¤Ë´Ø¤·¤Æ; Kent Williams ¤È Tom Epperly ¤Ë¤Ï C++ ¥¯¥é¥¹¥µ¥Ý¡¼¥È¤Ë´Ø¤·¤Æ; Ove Ewerlid ¤Ë¤Ï NUL ¤Î¥µ¥Ý¡¼¥È¤Ë´Ø¤·¤Æ; Eric Hughes ¤Ë¤ÏÊ£¿ô¥Ð¥Ã¥Õ¥¡¤Î¥µ¥Ý¡¼¥È¤Ë´Ø¤·¤Æ¡¢¤½¤ì¤¾¤ì´¶¼Õ¤·¤Þ¤¹¡£
¤³¤ÎºîÉʤÏÅö½é¡¢»ä¤¬ CA Berkeley ¤Î Lawrence Berkeley Laboratory ¤Ë¤ª¤±¤ë Real Time Systems Group ¤Ë¤¤¤¿»þ¤ËºîÀ®¤µ¤ì¤Þ¤·¤¿¡£ »ä¤Ë¶¨ÎϤ·¤Æ¤¯¤ì¤¿Êý¡¹¤Ë´¶¼Õ¤·¤Þ¤¹¡£
¥³¥á¥ó¥È¤Ï vern@ee.lbl.gov ¤ËÁ÷¤Ã¤Æ²¼¤µ¤¤¡£
Contenus ©2006-2024 Benjamin Poulain
Design ©2006-2024 Maxime Vantorre