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 |
|
---|