# HG changeset patch # User Paul Eggert # Date 1113417811 0 # Node ID 73e3d526838befae6d482de31b39af716792f1f5 # Parent 06cda1ed2c7fd3bbefeb8777bea215313114465a (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. diff --git a/lib/getdate.y b/lib/getdate.y --- a/lib/getdate.y +++ b/lib/getdate.y @@ -202,8 +202,8 @@ %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 @@ 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 @@ { 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;