xref: /netbsd-src/external/bsd/flex/dist/examples/manual/dates.lex (revision 901e7e84758515fbf39dfc064cb0b45ab146d8b0)
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