summaryrefslogtreecommitdiff
path: root/examples/manual/dates.lex
diff options
context:
space:
mode:
Diffstat (limited to 'examples/manual/dates.lex')
-rw-r--r--examples/manual/dates.lex106
1 files changed, 106 insertions, 0 deletions
diff --git a/examples/manual/dates.lex b/examples/manual/dates.lex
new file mode 100644
index 0000000..9429e1d
--- /dev/null
+++ b/examples/manual/dates.lex
@@ -0,0 +1,106 @@
+/*
+ * dates.lex: An example of using start states to
+ * distinguish between different date formats.
+ */
+
+%{
+#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 DAY_FIRST YEAR_FIRST YEAR_LAST YFMONTH YLMONTH
+
+%%
+
+ /* the default is month-day-year */
+
+<LONG>{day_of_the_week} strcpy(dow,yytext);
+<LONG>{month} strcpy(month,yytext); BEGIN(DAY);
+
+ /* handle the form: day-month-year */
+
+<LONG>{nday}{day_ext} strcpy(day,yytext); BEGIN(DAY_FIRST);
+<DAY_FIRST>{month} strcpy(month,yytext); BEGIN(LONG);
+<DAY>{nday}{day_ext} strcpy(day,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,"");
+ }
+
+ /* handle dates of the form: day-month-year */
+
+<SHORT>{nday} strcpy(day,yytext); BEGIN(YEAR_LAST);
+<YEAR_LAST>{nmonth} strcpy(month,yytext);BEGIN(YLMONTH);
+<YLMONTH>{nyear} strcpy(year,yytext); BEGIN(SHORT);
+
+ /* handle dates of the form: year-month-day */
+
+<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);
+
+{skip}*
+\n
+.
+
+