1 /* 2 * dates.lex: An example of using start states to 3 * distinguish between different date formats. 4 */ 5 6 %{ 7 #include <ctype.h> 8 9 char month[20],dow[20],day[20],year[20]; 10 11 %} 12 13 skip of|the|[ \t,]* 14 15 mon (mon(day)?) 16 tue (tue(sday)?) 17 wed (wed(nesday)?) 18 thu (thu(rsday)?) 19 fri (fri(day)?) 20 sat (sat(urday)?) 21 sun (sun(day)?) 22 23 day_of_the_week ({mon}|{tue}|{wed}|{thu}|{fri}|{sat}|{sun}) 24 25 jan (jan(uary)?) 26 feb (feb(ruary)?) 27 mar (mar(ch)?) 28 apr (apr(il)?) 29 may (may) 30 jun (jun(e)?) 31 jul (jul(y)?) 32 aug (aug(ust)?) 33 sep (sep(tember)?) 34 oct (oct(ober)?) 35 nov (nov(ember)?) 36 dec (dec(ember)?) 37 38 first_half ({jan}|{feb}|{mar}|{apr}|{may}|{jun}) 39 second_half ({jul}|{aug}|{sep}|{oct}|{nov}|{dec}) 40 month {first_half}|{second_half} 41 42 nday [1-9]|[1-2][0-9]|3[0-1] 43 nmonth [1-9]|1[0-2] 44 nyear [0-9]{1,4} 45 46 year_ext (ad|AD|bc|BC)? 47 day_ext (st|nd|rd|th)? 48 49 %s LONG SHORT 50 %s DAY DAY_FIRST YEAR_FIRST YEAR_LAST YFMONTH YLMONTH 51 52 %% 53 54 /* the default is month-day-year */ 55 56 <LONG>{day_of_the_week} strcpy(dow,yytext); 57 <LONG>{month} strcpy(month,yytext); BEGIN(DAY); 58 59 /* handle the form: day-month-year */ 60 61 <LONG>{nday}{day_ext} strcpy(day,yytext); BEGIN(DAY_FIRST); 62 <DAY_FIRST>{month} strcpy(month,yytext); BEGIN(LONG); 63 <DAY>{nday}{day_ext} strcpy(day,yytext); BEGIN(LONG); 64 65 <LONG>{nyear}{year_ext} { 66 printf("Long:\n"); 67 printf(" DOW : %s \n",dow); 68 printf(" Day : %s \n",day); 69 printf(" Month : %s \n",month); 70 printf(" Year : %s \n",yytext); 71 strcpy(dow,""); 72 strcpy(day,""); 73 strcpy(month,""); 74 } 75 76 /* handle dates of the form: day-month-year */ 77 78 <SHORT>{nday} strcpy(day,yytext); BEGIN(YEAR_LAST); 79 <YEAR_LAST>{nmonth} strcpy(month,yytext);BEGIN(YLMONTH); 80 <YLMONTH>{nyear} strcpy(year,yytext); BEGIN(SHORT); 81 82 /* handle dates of the form: year-month-day */ 83 84 <SHORT>{nyear} strcpy(year,yytext); BEGIN(YEAR_FIRST); 85 <YEAR_FIRST>{nmonth} strcpy(month,yytext);BEGIN(YFMONTH); 86 <YFMONTH>{nday} strcpy(day,yytext); BEGIN(SHORT); 87 88 89 <SHORT>\n { 90 printf("Short:\n"); 91 printf(" Day : %s \n",day); 92 printf(" Month : %s \n",month); 93 printf(" Year : %s \n",year); 94 strcpy(year,""); 95 strcpy(day,""); 96 strcpy(month,""); 97 } 98 99 long\n BEGIN(LONG); 100 short\n BEGIN(SHORT); 101 102 {skip}* 103 \n 104 . 105 106 107