Home :: International :: Manuals :: Howto :: FAQ :: Man Pages :: Email Login

 
 

 

FLEX

Section: User Commands (1)
Updated: April 1995
Index Return to Main Contents
 

̾¾Î

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" ¤Î ¥ë¡¼¥ë¤Ï¼ÂºÝ¤Ë¤Ï "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 ÆþÎÏÃæ¤ÎÊ̤Υ롼¥ë¤È¤ÏÆÈΩ¤Ê¥¹¥­¥ã¥Ê¤òµ­½Ò¤·¤Þ¤¹¡£ ¤½¤Î¤¿¤á