flex

Autres langues

Langue: ja

Autres versions - même langue

Version: April 1995 (openSuse - 09/10/07)

Section: 1 (Commandes utilisateur)

̾¾Î

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 ¤ËÁ÷¤Ã¤Æ²¼¤µ¤¤¡£