Previous: Start State Notes (Flex 2.5), Up: Start States   [Contents][Index]


3.8.5 ¥¹¥¿¡¼¥È¾õÂ֤λÈÍÑÎã

¥×¥í¥°¥é¥ß¥ó¥°¤Ë¤ª¤¤¤Æ¡¢ ²¿¤«¤ò¤¹¤ëÊýË¡¤ò³Ø¤Ö¤Î¤ËºÇÎɤÎÊýË¡¤Ï¡¢ ¼ÂºÝ¤Ë¤½¤ì¤ò¤ä¤Ã¤Æ¤ß¤ë¤³¤È¤Ç¤¹¡£ ¤½¤Î¤³¤È¤Ëα°Õ¤·¡¢ ¥¹¥¿¡¼¥È¾õÂÖ¤ò¤É¤Î¤è¤¦¤Ë»È¤¦¤³¤È¤¬¤Ç¤­¤ë¤«¤ò¼¨¤¹¼ÂÎã¤ò°Ê²¼¤Ëµó¤²¤Þ¤¹¡£

/*
 * dates.lex: ÆüÉդΰۤʤë·Á¼°¤ò¼±Ê̤¹¤ë¤¿¤á¤Ë
 *            ¥¹¥¿¡¼¥È¾õÂÖ¤ò»ÈÍѤ¹¤ëÎã
 */

%{
#include <ctype.h>

char month[20],dow[20],day[20],year[20];

%}

skip of|the|[ \t,]* /* ¤³¤Îʸ»ú¤ÎʤӤò̵»ë¤¹¤ë */

mon  (mon(day)?)    /* ÍËÆü¤Î̾Á°¤ÎŤ¤·Á¼°¤Èû¤¤·Á¼°¤Î */
tue  (tue(sday)?)   /* ¤É¤Á¤é¤Ë¤â¥Þ¥Ã¥Á¤¹¤ë¤è¤¦ÀßÄꤹ¤ë */
wed  (wed(nesday)?)
thu  (thu(rsday)?)
fri  (fri(day)?)
sat  (sat(urday)?)
sun  (sun(day)?)

 /* °Ê²¼¤Ï¤¹¤Ù¤Æ¤Î²Äǽ¤ÊÍËÆü¤òɽ¤¹ */

day_of_the_week ({mon}|{tue}|{wed}|{thu}|{fri}|{sat}|{sun})

jan  (jan(uary)?)   /* ¤¹¤Ù¤Æ¤Î·î¤Ë¤Ä¤¤¤ÆÆ±ÍͤΤ³¤È¤ò¹Ô¤¦ */
feb  (feb(ruary)?)
mar  (mar(ch)?)
apr  (apr(il)?)
may  (may)
jun  (jun(e)?)
jul  (jul(y)?)
aug  (aug(ust)?)
sep  (sep(tember)?)
oct  (oct(ober)?)
nov  (nov(ember)?)
dec  (dec(ember)?)

 /* °Ê²¼¤Ï¤¹¤Ù¤Æ¤Î²Äǽ¤Ê·î¤Î̾Á°¤òɽ¤¹ */

first_half  ({jan}|{feb}|{mar}|{apr}|{may}|{jun})
second_half ({jul}|{aug}|{sep}|{oct}|{nov}|{dec})
month       {first_half}|{second_half}

 /*
  * Æü¡¢·î¡¢Ç¯¤Î¿ôÃÍ·Á¼°
  * ¤³¤ì¤é¤Ï½ÅÊ£¤·¤Æ¤¤¤ë¤¿¤á¡¢Àµ¤·¤¯¥Ñ¡¼¥¹¤¹¤ë¤Ë¤Ï¡¢
  * ¥¹¥¿¡¼¥È¾õÂÖ¤ÈÆüÉդηÁ¼°¤Ë´Ø¤¹¤ë¤¢¤ëÄøÅÙ¤ÎÃμ±
  * ¤¬É¬ÍפǤ¢¤ë¤³¤È¤ËÃí°Õ
  */

nday         [1-9]|[1-2][0-9]|3[0-1] 
nmonth       [1-9]|1[0-2]
nyear        [0-9]{1,4}

 /* ǯ¤ÈÆü¤Î¤¿¤á¤Î³ÈÄ¥»Ò */

year_ext    (ad|AD|bc|BC)?
day_ext     (st|nd|rd|th)?

  /*
   * ¤³¤Î¥×¥í¥°¥é¥à¤ÎºÇ¸å¤Ë¤¢¤ë¥ë¡¼¥ë¤ò»È¤Ã¤Æ¤¹¤Ù¤Æ¤Î̵´Ø·¸¤Ê
   * ¥Æ¥­¥¹¥È¤ò½èÍý¤¹¤ë¤¿¤á¤Ë¡¢ÈóÇÓ¾Ū¤Ê¥¹¥¿¡¼¥È¾õÂÖ¤ò»È¤¦¡£
   * ¤³¤¦¤·¤Ê¤¤¤È¡¢¸Ä¡¹¤Î¥¹¥¿¡¼¥È¾õÂ֤Υ֥í¥Ã¥¯¤Ë¥ë¡¼¥ë¤òÄɲÃ
   * ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¯¤Ê¤ë¡£µ¬ÌϤÎÂ礭¤¤¥¹¥­¥ã¥Ê¤Ë¤ª¤¤¤Æ¤Ï¡¢
   * ¤³¤ì¤Ï¼Â¹Ô²Äǽ¤ÊÁªÂò»è¤Ç¤¢¤ë¤³¤È¤¬Â¿¤¤¡£¤Ê¤¼¤Ê¤é¡¢¥ë¡¼¥ë
   * ¤ÎÄɲäϥ¹¥­¥ã¥Ê¤Î¥¹¥Ô¡¼¥É¤Ë±Æ¶Á¤òÍ¿¤¨¤Ê¤¤¤«¤é¤Ç¤¢¤ë¡£
   * ¤³¤³¤Ç¤Ï¡¢´Ê·é¤µ¤òÍ¥À褵¤»¤ë¤³¤È¤Ë¤¹¤ë
   */

%s LONG SHORT
%s DAY MONTH   /* Ť¤·Á¼°¤ÎÆüÉդΤ¿¤á¤ËÄɲä·¤¿¾õÂÖ */
%s YEAR_FIRST YEAR_LAST YFMONTH YLMONTH

%%

 /*
  * ÍËÆü¤Ï¾ï¤ËºÇ½é¤ËÃÖ¤«¤ì¡¢¸å¤í¤Ë³¤¯ÆüÉդν¤¾þ»Ò¤È¤·¤Æ
  * µ¡Ç½¤¹¤ë¤â¤Î¤È²¾Äꤵ¤ì¤ë¡£¤è¤Ã¤Æ¡¢ÍËÆü¤ÏÊ£¿ô¤ÎÆüÉÕ·Á¼°
  * ¤Î´Ö¤Ç¶¦ÍѲÄǽ¤Ç¤¢¤ë
  */

<LONG>{day_of_the_week} strcpy(dow,yytext); 

 /*
  * ·î-Æü-ǯ¤È¤¤¤¦·Á¼°¤ÎÆüÉÕ¤ò½èÍý¤¹¤ë
  * ¥Ñ¡¼¥¹¾õÂÖ¤Ï
  * LONG->[·î¤Ë¥Þ¥Ã¥Á]->DAY->LONG
  * ¤Î¤è¤¦¤ËÁ«°Ü¤¹¤ë
  */

<LONG>{month}         strcpy(month,yytext); BEGIN(DAY);
<DAY>{nday}{day_ext}  strcpy(day,yytext);   BEGIN(LONG);  

 /*
  * Æü-·î-ǯ¤È¤¤¤¦·Á¼°¤ÎÆüÉÕ¤ò½èÍý¤¹¤ë
  * ¥Ñ¡¼¥¹¾õÂÖ¤Ï
  * LONG->[Æü¤Ë¥Þ¥Ã¥Á]->MONTH->LONG
  * ¤Î¤è¤¦¤ËÁ«°Ü¤¹¤ë
  */

<LONG>{nday}{day_ext} strcpy(day,yytext);   BEGIN(MONTH);
<MONTH>{month}        strcpy(month,yytext); BEGIN(LONG);

 /*
  * ÆüÉÕ¤Îǯ¤ÎÉôʬ¤ÏºÇ¸å¤ËÃÖ¤«¤ì¤ë¤â¤Î¤È¹Í¤¨¤é¤ì¤ë¡£¤·¤¿¤¬¤Ã¤Æ¡¢
  * ǯ¤ò¸«¤Ä¤±¤¿¤é¥Ñ¡¼¥¹¤µ¤ì¤¿ÆüÉÕ¤òɽ¼¨¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡£¤â¤Á
  * ¤í¤ó¡¢ÆüÉդȤ·¤ÆÉÔÅö¤Ê¤â¤Î¤Ç¤¢¤ì¤Ð¥´¥ß¤¬½ÐÎϤµ¤ì¤ë¤³¤È¤Ë¤Ê¤ë
  */

<LONG>{nyear}{year_ext} {
                          printf("Long:\n");
                          printf("  DOW   : %s \n",dow);
                          printf("  Day   : %s \n",day);
                          printf("  Month : %s \n",month);
                          printf("  Year  : %s \n",yytext);
                          strcpy(dow,"");
                          strcpy(day,"");
                          strcpy(month,"");
                        }

 /*
  * Æü-·î-ǯ¤È¤¤¤¦·Á¼°¤ÎÆüÉÕ¤ò½èÍý¤¹¤ë
  * SHORT¾õÂ֤ǿôÃÍ·Á¼°¤ÎÆü¤ò¸«¤Ä¤±¤¿¾ì¹ç¤Ï¡¢Ç¯¤¬ÆüÉդκǸå¤ÎÉôʬ
  * ¤Ë¤Ê¤ë¤È²¾Äꤹ¤ë
  * ¥Ñ¡¼¥¹¾õÂÖ¤Ï
  * SHORT->[Æü¤Ë¥Þ¥Ã¥Á]->YEAR_LAST->YLMONTH->SHORT
  * ¤Î¤è¤¦¤ËÁ«°Ü¤¹¤ë
  */

<SHORT>{nday}        strcpy(day,yytext);  BEGIN(YEAR_LAST);
<YEAR_LAST>{nmonth}  strcpy(month,yytext);BEGIN(YLMONTH);
<YLMONTH>{nyear}     strcpy(year,yytext); BEGIN(SHORT);

 /*
  * ǯ-·î-Æü¤È¤¤¤¦·Á¼°¤ÎÆüÉÕ¤ò½èÍý¤¹¤ë
  * SHORT¾õÂ֤ǿôÃÍ·Á¼°¤Îǯ¤ò¸«¤Ä¤±¤¿¾ì¹ç¤Ï¡¢Æü¤¬ÆüÉդκǸå¤ÎÉôʬ
  * ¤Ë¤Ê¤ë¤È²¾Äꤹ¤ë
  * ¥Ñ¡¼¥¹¾õÂÖ¤Ï
  * SHORT->[ǯ¤Ë¥Þ¥Ã¥Á]->YEAR_FIRST->YFMONTH->SHORT 
  * ¤Î¤è¤¦¤ËÁ«°Ü¤¹¤ë
  */

<SHORT>{nyear}        strcpy(year,yytext); BEGIN(YEAR_FIRST);
<YEAR_FIRST>{nmonth}  strcpy(month,yytext);BEGIN(YFMONTH);
<YFMONTH>{nday}       strcpy(day,yytext);  BEGIN(SHORT);

 /*
  * ¿ôÃÍ·Á¼°¤ÎÆüÉդǤϡ¢Ç¯¤ÏºÇ½é¤Ë¤Ê¤ë¤³¤È¤âºÇ¸å¤Ë¤Ê¤ë¤³¤È¤â²Äǽ¡£
  * ¤·¤¿¤¬¤Ã¤Æ¡¢¥Ñ¡¼¥¹¤·¤¿¤â¤Î¤ò¤¤¤Äɽ¼¨¤¹¤Ù¤­¤«¤ò¼¨¤¹¤Î¤Ë²þ¹Ô¤ò»È¤¦
  */

<SHORT>\n               {
                          printf("Short:\n");
                          printf("  Day   : %s \n",day);
                          printf("  Month : %s \n",month);
                          printf("  Year  : %s \n",year);
                          strcpy(year,""); 
                          strcpy(day,"");
                          strcpy(month,"");
                        }

 /*
  * °Ê²¼¤Ë¤è¤ê¡¢Ã»¤¤¡Ê¿ô»ú¡Ë·Á¼°¤ÈŤ¤¡Ê±Ñ¿ô»ú¡Ë·Á¼°¤È¤òÀڤ괹¤¨¤ë
  */

long\n     BEGIN(LONG);
short\n    BEGIN(SHORT);

 /*
  * °Ê²¼¤Î¥ë¡¼¥ë¤Ï¡¢Ìµ´Ø·¸¤Ê¥Æ¥­¥¹¥È¤ò¸«¤Ä¤±¤ÆÇË´þ¤¹¤ë
  * ¡Ê¥Þ¥Ã¥Á¤µ¤ì¤¿¥Æ¥­¥¹¥È¤Ï¥Ç¥Õ¥©¥ë¥È¤Ç¤ÏECHO¤µ¤ì¤Ê¤¤¤¬¡¢
  *   ¥Þ¥Ã¥Á¤µ¤ì¤Ê¤«¤Ã¤¿¥Æ¥­¥¹¥È¤ÏECHO¤µ¤ì¤ë¡£¥Ô¥ê¥ª¥É¤Ï
  *   ²þ¹Ô°Ê³°¤Î¤¹¤Ù¤Æ¤Îʸ»ú¤ò¸«¤Ä¤±¤ë¡£²þ¹Ô¤Ï\n¤Ë¤è¤Ã¤Æ
  *   ¸«¤Ä¤±¤é¤ì¤ë¡Ë
  */

{skip}*
\n
.  

¤³¤Î¼ÂÎã¤Ï¡¢ ÍÍ¡¹¤Ê·Á¼°¤ÎÆüÉÕ¤ò¥¹¥­¥ã¥ó¤·¡¢ ¹½À®Ã±°Ì¤Ëʬ³ä¤·¤Þ¤¹¡£ Î㤨¤Ð¡¢ °Ê²¼¤Î¤â¤Î¤òÀµ¤·¤¯¥¹¥­¥ã¥ó¤·¡¢ ÆüÉդθġ¹¤ÎÉôʬ¤ò¼±Ê̤·¤Þ¤¹¡£

short
1989:12:23
1989:11:12
23:12:1989
11:12:1989
1989/12/23
1989/11/12
23/12/1989
11/12/1989
1989-12-23
1989-11-12
23-12-1989
11-12-1989
long
Friday the 5th of January, 1989
Friday, 5th of January, 1989
Friday, January 5th, 1989
Fri, January 5th, 1989
Fri, Jan 5th, 1989
Fri, Jan 5, 1989
FriJan 5, 1989
FriJan5, 1989
FriJan51989
Jan51989

¥Õ¥¡¥¤¥ë¤ÎºÇ½é¤ÎÉôʬ¤Ç¤Ï¡¢ ·î¡¢¤ª¤è¤Ó¡¢ÆüÉդΰۤʤëÉôʬ¤Ë»È¤ï¤ì¤ë¿ô»ú·Á¼°¤òñ¤ËÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£ ¤³¤Î¼ÂÎã¤Ç¤Ï¡¢ ¤¢¤ëÆÃÄê¤ÎÊýË¡¤Ç¥¹¥­¥ã¥ó½èÍý¤¬¿Ê¹Ô¤¹¤ë¤è¤¦¶¯À©¤¹¤ë¤¿¤á¤Ë¡¢ ¥¹¥¿¡¼¥È¾õÂÖ¤ò»È¤¤¤Þ¤¹¡£ Î㤨¤Ð¡¢ ¹Ô¤ÎÀèÆ¬¤Ç‘1989’¤ò¸«¤Ä¤±¤ì¤Ð¡¢ ¤½¤ì¤¬Æü¤È·î¤ÎÁȤ߹ç¤ï¤»¤Ç¤Ï¤Ê¤¯Ç¯¤Ç¤¢¤ê¡¢ ¤·¤¿¤¬¤Ã¤Æ¡¢ ÆüÉդμ¡¤ÎÉôʬ¤¬·î¤Ë°ã¤¤¤Ê¤¤¤³¤È¤¬Ê¬¤ê¡¢ ¥¹¥­¥ã¥ó½èÍý¤¬¤½¤Î¤È¤ª¤ê¤Ë¿Ê¤à¤è¤¦¶¯À©¤·¤Þ¤¹¡£ ¤³¤Î¤³¤È¤Ë¤è¤ê¡¢ Èó¾ï¤Ëñ½ã¤Ê¾õÂÖ¶îÆ°¤Î¥Ñ¡¼¥µ¤ò¸ú²ÌŪ¤ËºîÀ®¤·¤¿¤³¤È¤Ë¤Ê¤ê¡¢ ÆüÉÕ¤ò¤½¤Î¹½À®Í×ÁǤˤ¦¤Þ¤¯Ê¬³ä¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤Þ¤¹ ¡Ê¤³¤Î¥¹¥­¥ã¥Ê¤ÎÆâÉô¤Çµ¯¤³¤Ã¤Æ¤¤¤ë¤³¤È¤ò¥Õ¥í¡¼¡¦¥Á¥ã¡¼¥È¤ËÉÁ¤¤¤Æ¤ß¤ì¤Ð¡¢ ¤³¤Î¤³¤È¤¬ÌÀÎÆ¤Ë¸«¤Æ¤È¤ì¤ë¤Ç¤·¤ç¤¦¡Ë¡£

¤³¤Î¥Þ¥Ë¥å¥¢¥ëÃæ¤Î¾¤Î¼ÂÎã¤ÈƱÍͤˡ¢ ¤³¤Î¼ÂÎã¤â

flex -i dates.lex
cc -o dates lex.yy.c -lfl

¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ë¤è¤ê¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤Þ¤¹¡£ ¤Þ¤¿¡¢ examples¥µ¥Ö¥Ç¥£¥ì¥¯¥È¥ê¤Ë¤ª¤¤¤ÆÃ±¤Ë‘make dates’¤ò¼Â¹Ô¤¹¤ë¤³¤È¤Ë¤è¤ê¡¢ ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤â¤Ç¤­¤Þ¤¹¡£


Previous: Start State Notes (Flex 2.5), Up: Start States   [Contents][Index]