summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2005-04-13 18:42:00 +0000
committerPaul Eggert <eggert@cs.ucla.edu>2005-04-13 18:42:00 +0000
commitf3f4a9add0d45c4034fc486549407a29a5eea429 (patch)
treefae078fb742a536057e8c58e5108554a8bfeed36 /lib
parenta3cdfd525c1d88b2e05aff78d989ef84fd3374ee (diff)
downloadcoreutils-f3f4a9add0d45c4034fc486549407a29a5eea429.tar.xz
(zone): Allow relunit_snumber after tZONE, so
that "UTC +1 second" continues to work. Problem reported by Dmitry V. Levin. (relunit_snumber): New rule. (relunit): Use it.
Diffstat (limited to 'lib')
-rw-r--r--lib/getdate.y34
1 files changed, 20 insertions, 14 deletions
diff --git a/lib/getdate.y b/lib/getdate.y
index 4004ea923..52d15ea72 100644
--- a/lib/getdate.y
+++ b/lib/getdate.y
@@ -202,8 +202,8 @@ static long int time_zone_hhmm (textint, long int);
%parse-param { parser_control *pc }
%lex-param { parser_control *pc }
-/* This grammar has 14 shift/reduce conflicts. */
-%expect 14
+/* This grammar has 20 shift/reduce conflicts. */
+%expect 20
%union
{
@@ -321,6 +321,8 @@ local_zone:
zone:
tZONE
{ pc->time_zone = $1; }
+ | tZONE relunit_snumber
+ { pc->time_zone = $1; pc->rels_seen = true; }
| tZONE tSNUMBER o_colon_minutes
{ pc->time_zone = $1 + time_zone_hhmm ($2, $3); }
| tDAYZONE
@@ -444,54 +446,58 @@ relunit:
{ pc->rel_year += $1 * $2; }
| tUNUMBER tYEAR_UNIT
{ pc->rel_year += $1.value * $2; }
- | tSNUMBER tYEAR_UNIT
- { pc->rel_year += $1.value * $2; }
| tYEAR_UNIT
{ pc->rel_year += $1; }
| tORDINAL tMONTH_UNIT
{ pc->rel_month += $1 * $2; }
| tUNUMBER tMONTH_UNIT
{ pc->rel_month += $1.value * $2; }
- | tSNUMBER tMONTH_UNIT
- { pc->rel_month += $1.value * $2; }
| tMONTH_UNIT
{ pc->rel_month += $1; }
| tORDINAL tDAY_UNIT
{ pc->rel_day += $1 * $2; }
| tUNUMBER tDAY_UNIT
{ pc->rel_day += $1.value * $2; }
- | tSNUMBER tDAY_UNIT
- { pc->rel_day += $1.value * $2; }
| tDAY_UNIT
{ pc->rel_day += $1; }
| tORDINAL tHOUR_UNIT
{ pc->rel_hour += $1 * $2; }
| tUNUMBER tHOUR_UNIT
{ pc->rel_hour += $1.value * $2; }
- | tSNUMBER tHOUR_UNIT
- { pc->rel_hour += $1.value * $2; }
| tHOUR_UNIT
{ pc->rel_hour += $1; }
| tORDINAL tMINUTE_UNIT
{ pc->rel_minutes += $1 * $2; }
| tUNUMBER tMINUTE_UNIT
{ pc->rel_minutes += $1.value * $2; }
- | tSNUMBER tMINUTE_UNIT
- { pc->rel_minutes += $1.value * $2; }
| tMINUTE_UNIT
{ pc->rel_minutes += $1; }
| tORDINAL tSEC_UNIT
{ pc->rel_seconds += $1 * $2; }
| tUNUMBER tSEC_UNIT
{ pc->rel_seconds += $1.value * $2; }
- | tSNUMBER tSEC_UNIT
- { pc->rel_seconds += $1.value * $2; }
| tSDECIMAL_NUMBER tSEC_UNIT
{ pc->rel_seconds += $1.tv_sec * $2; pc->rel_ns += $1.tv_nsec * $2; }
| tUDECIMAL_NUMBER tSEC_UNIT
{ pc->rel_seconds += $1.tv_sec * $2; pc->rel_ns += $1.tv_nsec * $2; }
| tSEC_UNIT
{ pc->rel_seconds += $1; }
+ | relunit_snumber
+ ;
+
+relunit_snumber:
+ tSNUMBER tYEAR_UNIT
+ { pc->rel_year += $1.value * $2; }
+ | tSNUMBER tMONTH_UNIT
+ { pc->rel_month += $1.value * $2; }
+ | tSNUMBER tDAY_UNIT
+ { pc->rel_day += $1.value * $2; }
+ | tSNUMBER tHOUR_UNIT
+ { pc->rel_hour += $1.value * $2; }
+ | tSNUMBER tMINUTE_UNIT
+ { pc->rel_minutes += $1.value * $2; }
+ | tSNUMBER tSEC_UNIT
+ { pc->rel_seconds += $1.value * $2; }
;
seconds: signed_seconds | unsigned_seconds;