PageRenderTime 72ms CodeModel.GetById 48ms RepoModel.GetById 0ms app.codeStats 0ms

/libs/remem/savutil/parsedate/dateyacc.y

https://bitbucket.org/ArneBab/.emacs.d
Happy | 416 lines | 385 code | 31 blank | 0 comment | 0 complexity | 88cca5764bed94372f16417275a29259 MD5 | raw file
Possible License(s): GPL-2.0
  1. /*$Log: dateyacc.y,v $
  2. /*Revision 1.1.1.1 2001/04/24 15:40:54 finagler
  3. /*New CVS import, starting with 2.09 (introduction of the GPL)
  4. /*
  5. *Revision 1.2 1999/03/25 02:32:30 event
  6. *This appears to be a working version of the date indexer. Work still needs to be done on the retrieval end...
  7. *
  8. * Revision 1.1 84/09/01 15:01:22 wales
  9. * Initial revision
  10. *
  11. * Copyright (c) 1984 by Richard B. Wales
  12. *
  13. * Purpose:
  14. *
  15. * YACC parser for "parsedate" routine.
  16. *
  17. * Usage:
  18. *
  19. * Called as needed by the "parsedate" routine in "parsedate.c".
  20. * Not intended to be called from any other routine.
  21. *
  22. * Notes:
  23. *
  24. * Global contents:
  25. *
  26. * int yyparse ()
  27. * Parses the date string pointed to by the global variable
  28. * "yyinbuf". Sets the appropriate fields in the global data
  29. * structure "yyans". The returned value is 1 if there was a
  30. * syntax error, 0 if there was no error.
  31. *
  32. * Local contents:
  33. *
  34. * None.
  35. */
  36. /* ajs
  37. * ajs Code added on 850314 to allow goal := year.date '.' time
  38. * ajs and year.date := [CC]YYMMDD (YY > 23)
  39. * ajs All added lines contain "ajs" for easy searching.
  40. * ajs */
  41. %{
  42. #ifdef RCSIDENT
  43. static char rcsident[] = "$Header: /local/CVSROOT/RA/savutil/parsedate/dateyacc.y,v 1.1.1.1 2001/04/24 15:40:54 finagler Exp $";
  44. #endif
  45. #ifdef HAVE_CONFIG_H
  46. #include "config.h"
  47. #endif
  48. #include <stdio.h>
  49. #define yymaxdepth date_maxdepth
  50. #define yyparse date_parse
  51. #define yylex date_lex
  52. #define yyerror date_error
  53. #define yylval date_lval
  54. #define yychar date_char
  55. #define yydebug date_debug
  56. #define yypact date_pact
  57. #define yyr1 date_r1
  58. #define yyr2 date_r2
  59. #define yydef date_def
  60. #define yychk date_chk
  61. #define yypgo date_pgo
  62. #define yyact date_act
  63. #define yyexca date_exca
  64. #define yyerrflag date_errflag
  65. #define yynerrs date_nerrs
  66. #define yyps date_ps
  67. #define yypv date_pv
  68. #define yys date_s
  69. #define yy_yys date_yys
  70. #define yystate date_state
  71. #define yytmp date_tmp
  72. #define yyv date_v
  73. #define yy_yyv date_yyv
  74. #define yyval date_val
  75. #define yylloc date_lloc
  76. #define yyreds date_reds
  77. #define yytoks date_toks
  78. #define yylhs date_yylhs
  79. #define yylen date_yylen
  80. #define yydefred date_yydefred
  81. #define yydgoto date_yydgoto
  82. #define yysindex date_yysindex
  83. #define yyrindex date_yyrindex
  84. #define yygindex date_yygindex
  85. #define yytable date_yytable
  86. #define yycheck date_yycheck
  87. #define yyans date_ans
  88. #define yyinbuf date_inbuf
  89. #include "parsedate.h"
  90. struct parsedate yyans;
  91. /* No error routine is needed here. */
  92. #define date_error(s)
  93. %}
  94. %union {
  95. int IntVal;
  96. }
  97. %token DAY_NAME
  98. %token MONTH_NAME
  99. %token NUM9 NUM23 NUM59 NUM99 NUM2359 NUM9999 NUM235959
  100. %token NUM991231 NUM99991231 /* ajs */
  101. %token AMPM
  102. %token STD_ZONE DST_ZONE DST_SUFFIX
  103. %type <IntVal> DAY_NAME
  104. %type <IntVal> MONTH_NAME
  105. %type <IntVal> NUM9 NUM23 NUM59 NUM99 NUM2359 NUM9999 NUM235959
  106. %type <IntVal> NUM991231 NUM99991231 /* ajs */
  107. %type <IntVal> AMPM
  108. %type <IntVal> STD_ZONE DST_ZONE
  109. %type <IntVal> num59 num zone.offset
  110. %start goal
  111. %%
  112. num59:
  113. NUM23
  114. | NUM59
  115. num:
  116. NUM9
  117. | num59
  118. goal:
  119. date
  120. | date dayname
  121. | date dayname time
  122. | date dayname time year
  123. | date dayname year
  124. | date dayname year time
  125. | date time
  126. | date time dayname
  127. | date time dayname year
  128. | date time year
  129. | date time year dayname
  130. | date.year
  131. | date.year dayname
  132. | date.year dayname time
  133. | date.year time
  134. | date.year time dayname
  135. | dayname date
  136. | dayname date time
  137. | dayname date time year
  138. | dayname date.year
  139. | dayname date.year time
  140. | dayname time date
  141. | dayname time date.year
  142. | dayname time year.date
  143. | dayname year.date
  144. | dayname year.date time
  145. | dayname year time date
  146. | time
  147. | time date
  148. | time date dayname
  149. | time date dayname year
  150. | time date.year
  151. | time date.year dayname
  152. | time dayname date
  153. | time dayname date.year
  154. | time dayname year.date
  155. | time year.date
  156. | time year.date dayname
  157. | time year dayname date
  158. | year.date
  159. | year.date dayname
  160. | year.date dayname time
  161. | year.date time
  162. | year.date time dayname
  163. | year dayname date
  164. | year dayname date time
  165. | year dayname time date
  166. | year time date
  167. | year time date dayname
  168. | year time dayname date
  169. | NUM2359
  170. { yyans.hour = $1 / 100;
  171. yyans.minute = $1 % 100;
  172. yyans.second = -1; /* unspecified */
  173. }
  174. | dayname
  175. | yymmdd '.' time2359 /* ajs */
  176. | yymmdd '.' time /* ajs */
  177. | yymmdd '.' time dayname /* ajs */
  178. | error
  179. { extern char *yyinbuf;
  180. if (yyans.error == NULL) yyans.error = yyinbuf;
  181. }
  182. dayname:
  183. DAY_NAME
  184. { yyans.c_weekday = $1; }
  185. | DAY_NAME '.'
  186. { yyans.c_weekday = $1; }
  187. date.year:
  188. date year
  189. | hyphen.date '-' year
  190. | slash.date '/' year
  191. year.date:
  192. year date
  193. /* | year '-' hyphen.date (leads to parser conflict) */
  194. | year '/' slash.date
  195. | yymmdd /* ajs */
  196. /* ajs */
  197. yymmdd: /* ajs */
  198. NUM991231 /* ajs */
  199. { yyans.year = ($1 / 10000) + 1900; /* ajs */
  200. yyans.month = ($1 % 10000) / 100; /* ajs */
  201. yyans.day = ($1 % 100); /* ajs */
  202. } /* ajs */
  203. /*| NUM235959 (leads to parser conflict) */ /* ajs */
  204. | NUM99991231 /* ajs */
  205. { yyans.year = ($1 / 10000); /* ajs */
  206. yyans.month = ($1 % 10000) / 100; /* ajs */
  207. yyans.day = ($1 % 100); /* ajs */
  208. } /* ajs */
  209. date:
  210. num month.name
  211. { yyans.day = $1; }
  212. | month.name num
  213. { yyans.day = $2; }
  214. | num num
  215. { yyans.month = $1; yyans.day = $2; }
  216. hyphen.date:
  217. num '-' month.name
  218. { yyans.day = $1; }
  219. | month.name '-' num
  220. { yyans.day = $3; }
  221. | num '-' num
  222. { yyans.month = $1; yyans.day = $3; }
  223. slash.date:
  224. num '/' month.name
  225. { yyans.day = $1; }
  226. | month.name '/' num
  227. { yyans.day = $3; }
  228. | num '/' num
  229. { yyans.month = $1; yyans.day = $3; }
  230. year:
  231. NUM99 /* precludes two-digit date before 1960 */
  232. { yyans.year = 1900 + $1; }
  233. | NUM2359
  234. { yyans.year = $1; }
  235. | NUM9999
  236. { yyans.year = $1; }
  237. month.name:
  238. MONTH_NAME
  239. { yyans.month = $1; }
  240. | MONTH_NAME '.'
  241. { yyans.month = $1; }
  242. time:
  243. hour.alone
  244. | hour am.pm
  245. | hour zone
  246. | hour am.pm zone
  247. hour:
  248. NUM2359
  249. { yyans.hour = $1 / 100;
  250. yyans.minute = $1 % 100;
  251. yyans.second = -1; /* unspecified */
  252. }
  253. | hour.alone
  254. hour.alone:
  255. NUM9 ':' num59
  256. { yyans.hour = $1;
  257. yyans.minute = $3;
  258. yyans.second = -1; /* unspecified */
  259. }
  260. | NUM9 '.' num59
  261. { yyans.hour = $1;
  262. yyans.minute = $3;
  263. yyans.second = -1; /* unspecified */
  264. }
  265. | NUM9 ':' num59 ':' num59
  266. { yyans.hour = $1;
  267. yyans.minute = $3;
  268. yyans.second = $5;
  269. }
  270. | NUM9 '.' num59 '.' num59
  271. { yyans.hour = $1;
  272. yyans.minute = $3;
  273. yyans.second = $5;
  274. }
  275. | NUM23 ':' num59
  276. { yyans.hour = $1;
  277. yyans.minute = $3;
  278. yyans.second = -1; /* unspecified */
  279. }
  280. | NUM23 '.' num59
  281. { yyans.hour = $1;
  282. yyans.minute = $3;
  283. yyans.second = -1; /* unspecified */
  284. }
  285. | NUM23 ':' num59 ':' num59
  286. { yyans.hour = $1;
  287. yyans.minute = $3;
  288. yyans.second = $5;
  289. }
  290. | NUM23 '.' num59 '.' num59
  291. { yyans.hour = $1;
  292. yyans.minute = $3;
  293. yyans.second = $5;
  294. }
  295. | NUM2359 ':' num59
  296. { yyans.hour = $1 / 100;
  297. yyans.minute = $1 % 100;
  298. yyans.second = $3;
  299. }
  300. | NUM2359 '.' num59
  301. { yyans.hour = $1 / 100;
  302. yyans.minute = $1 % 100;
  303. yyans.second = $3;
  304. }
  305. | NUM235959
  306. { yyans.hour = $1 / 10000;
  307. yyans.minute = ($1 % 10000) / 100;
  308. yyans.second = $1 % 100;
  309. }
  310. am.pm:
  311. AMPM
  312. { if (yyans.hour < 1 || yyans.hour > 12)
  313. yyans.hour = -1; /* invalid */
  314. else
  315. { if (yyans.hour == 12) yyans.hour = 0;
  316. yyans.hour += $1; /* 0 for AM, 12 for PM */
  317. } }
  318. zone:
  319. STD_ZONE
  320. { yyans.zone = $1; yyans.dst = 0; }
  321. | STD_ZONE DST_SUFFIX
  322. { yyans.zone = $1 + 60; yyans.dst = 1; }
  323. | '-' STD_ZONE
  324. { yyans.zone = $2; yyans.dst = 0; }
  325. | '-' STD_ZONE DST_SUFFIX
  326. { yyans.zone = $2 + 60; yyans.dst = 1; }
  327. | DST_ZONE
  328. { yyans.zone = $1; yyans.dst = 1; }
  329. | '-' DST_ZONE
  330. { yyans.zone = $2; yyans.dst = 1; }
  331. | '+' zone.offset
  332. { yyans.zone = $2; yyans.dst = 0; }
  333. | '-' '+' zone.offset
  334. { yyans.zone = $3; yyans.dst = 0; }
  335. | '-' zone.offset
  336. { yyans.zone = - $2; yyans.dst = 0; }
  337. | '-' '-' zone.offset
  338. { yyans.zone = - $3; yyans.dst = 0; }
  339. /* new stuff follows -cabbage */
  340. | '+' zone.offset STD_ZONE
  341. { yyans.zone = $2; yyans.dst = 0; }
  342. | '+' zone.offset STD_ZONE DST_SUFFIX
  343. { yyans.zone = $2; yyans.dst = 0; }
  344. | '+' zone.offset DST_ZONE
  345. { yyans.zone = $2; yyans.dst = 0; }
  346. | '-' '+' zone.offset STD_ZONE
  347. { yyans.zone = $3; yyans.dst = 0; }
  348. | '-' '+' zone.offset STD_ZONE DST_SUFFIX
  349. { yyans.zone = $3; yyans.dst = 0; }
  350. | '-' '+' zone.offset DST_ZONE
  351. { yyans.zone = $3; yyans.dst = 0; }
  352. | '-' zone.offset STD_ZONE
  353. { yyans.zone = - $2; yyans.dst = 0; }
  354. | '-' zone.offset STD_ZONE DST_SUFFIX
  355. { yyans.zone = - $2; yyans.dst = 0; }
  356. | '-' zone.offset DST_ZONE
  357. { yyans.zone = - $2; yyans.dst = 0; }
  358. | '-' '-' zone.offset STD_ZONE
  359. { yyans.zone = - $3; yyans.dst = 0; }
  360. | '-' '-' zone.offset STD_ZONE DST_SUFFIX
  361. { yyans.zone = - $3; yyans.dst = 0; }
  362. | '-' '-' zone.offset DST_ZONE
  363. { yyans.zone = - $3; yyans.dst = 0; }
  364. zone.offset:
  365. NUM9
  366. { $$ = 60 * $1; }
  367. | NUM9 ':' num59
  368. { $$ = 60 * $1 + $3; }
  369. | NUM9 '.' num59
  370. { $$ = 60 * $1 + $3; }
  371. | NUM23
  372. { $$ = 60 * $1; }
  373. | NUM23 ':' num59
  374. { $$ = 60 * $1 + $3; }
  375. | NUM23 '.' num59
  376. { $$ = 60 * $1 + $3; }
  377. | NUM2359
  378. { $$ = 60 * ($1 / 100) | ($1 % 100); }
  379. time2359: /* ajs */
  380. NUM2359 /* ajs */
  381. { yyans.hour = $1 / 100; /* ajs */
  382. yyans.minute = $1 % 100; /* ajs */
  383. yyans.second = -1; /* ajs */
  384. } /* ajs */
  385. %%