2 /*Revision 1.1 2002-07-25 08:01:26 arjen
3 /*First checkin, AXE release 0.2
5 * Revision 1.1 84/09/01 15:01:22 wales
8 * Copyright (c) 1984 by Richard B. Wales
12 * YACC parser for "parsedate" routine.
16 * Called as needed by the "parsedate" routine in "parsedate.c".
17 * Not intended to be called from any other routine.
24 * Parses the date string pointed to by the global variable
25 * "yyinbuf". Sets the appropriate fields in the global data
26 * structure "yyans". The returned value is 1 if there was a
27 * syntax error, 0 if there was no error.
35 * ajs Code added on 850314 to allow goal := year.date '.' time
36 * ajs and year.date := [CC]YYMMDD (YY > 23)
37 * ajs All added lines contain "ajs" for easy searching.
42 static char rcsident[] = "$Header: /cvsroot/lib/AXE/src/dateyacc.y,v 1.1 2002-07-25 08:01:26 arjen Exp $";
46 #include "parsedate.h"
47 struct parseddate yyans;
49 /* No error routine is needed here. */
59 %token NUM9 NUM23 NUM59 NUM99 NUM2359 NUM9999 NUM235959
60 %token NUM991231 NUM99991231 /* ajs */
62 %token STD_ZONE DST_ZONE DST_SUFFIX
64 %type <IntVal> DAY_NAME
65 %type <IntVal> MONTH_NAME
66 %type <IntVal> NUM9 NUM23 NUM59 NUM99 NUM2359 NUM9999 NUM235959
67 %type <IntVal> NUM991231 NUM99991231 /* ajs */
69 %type <IntVal> STD_ZONE DST_ZONE
70 %type <IntVal> num59 num zone.offset
89 | date dayname time year
91 | date dayname year time
94 | date time dayname year
96 | date time year dayname
99 | date.year dayname time
101 | date.year time dayname
104 | dayname date time year
106 | dayname date.year time
108 | dayname time date.year
109 | dayname time year.date
111 | dayname year.date time
112 | dayname year time date
116 | time date dayname year
118 | time date.year dayname
120 | time dayname date.year
121 | time dayname year.date
123 | time year.date dayname
124 | time year dayname date
127 | year.date dayname time
129 | year.date time dayname
131 | year dayname date time
132 | year dayname time date
134 | year time date dayname
135 | year time dayname date
137 { yyans.hour = $1 / 100;
138 yyans.minute = $1 % 100;
139 yyans.second = -1; /* unspecified */
142 | yymmdd '.' time2359 /* ajs */
143 | yymmdd '.' time /* ajs */
144 | yymmdd '.' time dayname /* ajs */
146 { extern char *yyinbuf;
147 if (yyans.error == NULL) yyans.error = yyinbuf;
153 { yyans.c_weekday = $1; }
155 { yyans.c_weekday = $1; }
160 | hyphen.date '-' year
161 | num '-' num '-' year
162 { yyans.day = $1; yyans.month = $3; }
163 | slash.date '/' year
168 | year '-' hyphen.date
169 | year '-' num '-' num
170 { yyans.day = $5; yyans.month = $3; }
171 | year '/' slash.date
177 { yyans.year = ($1 / 10000) + 1900; /* ajs */
178 yyans.month = ($1 % 10000) / 100; /* ajs */
179 yyans.day = ($1 % 100); /* ajs */
181 /*| NUM235959 (leads to parser conflict) */ /* ajs */
182 | NUM99991231 /* ajs */
183 { yyans.year = ($1 / 10000); /* ajs */
184 yyans.month = ($1 % 10000) / 100; /* ajs */
185 yyans.day = ($1 % 100); /* ajs */
195 { yyans.month = $1; yyans.day = $2; }
211 { yyans.month = $1; yyans.day = $3; }
215 NUM59 /* 2-digit year < 60 : after 2000 */
216 { yyans.year = 2000 + $1; }
218 { yyans.year = 2000 + $1; }
219 | NUM99 /* precludes two-digit date before 1960 */
220 { yyans.year = 1900 + $1; }
229 { yyans.month = $1; }
231 { yyans.month = $1; }
243 { yyans.hour = $1 / 100;
244 yyans.minute = $1 % 100;
245 yyans.second = -1; /* unspecified */
254 yyans.second = -1; /* unspecified */
259 yyans.second = -1; /* unspecified */
261 | NUM9 ':' num59 ':' num59
266 | NUM9 '.' num59 '.' num59
274 yyans.second = -1; /* unspecified */
279 yyans.second = -1; /* unspecified */
281 | NUM23 ':' num59 ':' num59
286 | NUM23 '.' num59 '.' num59
292 { yyans.hour = $1 / 100;
293 yyans.minute = $1 % 100;
297 { yyans.hour = $1 / 100;
298 yyans.minute = $1 % 100;
302 { yyans.hour = $1 / 10000;
303 yyans.minute = ($1 % 10000) / 100;
304 yyans.second = $1 % 100;
310 { if (yyans.hour < 1 || yyans.hour > 12)
311 yyans.hour = -1; /* invalid */
313 { if (yyans.hour == 12) yyans.hour = 0;
314 yyans.hour += $1; /* 0 for AM, 12 for PM */
320 { yyans.zone = $1; yyans.dst = 0; }
321 | STD_ZONE DST_SUFFIX
322 { yyans.zone = $1 + 60; yyans.dst = 1; }
324 { yyans.zone = $2; yyans.dst = 0; }
325 | '-' STD_ZONE DST_SUFFIX
326 { yyans.zone = $2 + 60; yyans.dst = 1; }
328 { yyans.zone = $1; yyans.dst = 1; }
330 { yyans.zone = $2; yyans.dst = 1; }
332 { yyans.zone = $2; yyans.dst = 0; }
333 | '-' '+' zone.offset
334 { yyans.zone = $3; yyans.dst = 0; }
336 { yyans.zone = - $2; yyans.dst = 0; }
337 | '-' '-' zone.offset
338 { yyans.zone = - $3; yyans.dst = 0; }
345 { $$ = 60 * $1 + $3; }
347 { $$ = 60 * $1 + $3; }
351 { $$ = 60 * $1 + $3; }
353 { $$ = 60 * $1 + $3; }
355 { $$ = 60 * ($1 / 100) | ($1 % 100); }
360 { yyans.hour = $1 / 100; /* ajs */
361 yyans.minute = $1 % 100; /* ajs */
362 yyans.second = -1; /* ajs */