diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2005-04-13 18:42:00 +0000 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2005-04-13 18:42:00 +0000 |
commit | f3f4a9add0d45c4034fc486549407a29a5eea429 (patch) | |
tree | fae078fb742a536057e8c58e5108554a8bfeed36 /lib | |
parent | a3cdfd525c1d88b2e05aff78d989ef84fd3374ee (diff) | |
download | coreutils-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.y | 34 |
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; |