diff options
author | Paul McGuire <ptmcg@users.noreply.github.com> | 2020-06-28 12:30:23 -0500 |
---|---|---|
committer | Paul McGuire <ptmcg@users.noreply.github.com> | 2020-06-28 12:30:23 -0500 |
commit | 466c9072e8b702695f7adf9044e846b06d427f87 (patch) | |
tree | dcfec0e614a7198a251f967168c488f7b5087132 /examples/delta_time.py | |
parent | 04a631fe8002d4a91ed7959998727c348e28525c (diff) | |
download | pyparsing-git-466c9072e8b702695f7adf9044e846b06d427f87.tar.gz |
Add expression names and restructure relative time and day expressions based on reviewing railroad diag
Diffstat (limited to 'examples/delta_time.py')
-rw-r--r-- | examples/delta_time.py | 60 |
1 files changed, 38 insertions, 22 deletions
diff --git a/examples/delta_time.py b/examples/delta_time.py index 5f820a9..dfe7a65 100644 --- a/examples/delta_time.py +++ b/examples/delta_time.py @@ -51,6 +51,7 @@ integer_word = pp.MatchFirst( ) ) integer = pp.pyparsing_common.integer | integer_word +integer.setName("numeric") CK = pp.CaselessKeyword CL = pp.CaselessLiteral @@ -81,12 +82,17 @@ last_ = CK("last").setParseAction(pp.replaceWith(-1)) at_ = CK("at") on_ = CK("on") -couple = (pp.Optional(CK("a")) + CK("couple") + pp.Optional(CK("of"))).setParseAction( - pp.replaceWith(2) +couple = ( + (pp.Optional(CK("a")) + CK("couple") + pp.Optional(CK("of"))) + .setParseAction(pp.replaceWith(2)) + .setName("couple") ) + a_qty = (CK("a") | CK("an")).setParseAction(pp.replaceWith(1)) the_qty = CK("the").setParseAction(pp.replaceWith(1)) -qty = pp.ungroup(integer | couple | a_qty | the_qty).setName("qty") +qty = pp.ungroup( + (integer | couple | a_qty | the_qty).setName("qty_expression") +).setName("qty") time_ref_present = pp.Empty().addParseAction(pp.replaceWith(True))("time_ref_present") @@ -119,8 +125,10 @@ timespec = ( + (am | pm)("ampm") ).addParseAction(fill_default_time_fields) absolute_time = _24hour_time | timespec +absolute_time.setName("absolute time") absolute_time_of_day = noon | midnight | now | absolute_time +absolute_time_of_day.setName("time of day") def add_computed_time(t): @@ -138,18 +146,21 @@ def add_computed_time(t): absolute_time_of_day.addParseAction(add_computed_time) -# relative_time_reference ::= qty time_units ('from' | 'before' | 'after') absolute_time_of_day -# | qty time_units 'ago' +# relative_time_reference ::= qty time_units ('ago' | ('from' | 'before' | 'after') absolute_time_of_day) # | 'in' qty time_units -time_units = hour | minute | second +time_units = (hour | minute | second).setName("time unit") relative_time_reference = ( - qty("qty") + time_units("units") + ago("dir") - | qty("qty") - + time_units("units") - + (from_ | before | after)("dir") - + pp.Group(absolute_time_of_day)("ref_time") + ( + qty("qty") + + time_units("units") + + ( + ago("dir") + | (from_ | before | after)("dir") + + pp.Group(absolute_time_of_day)("ref_time") + ) + ) | in_("dir") + qty("qty") + time_units("units") -) +).setName("relative time") def compute_relative_time(t): @@ -164,6 +175,7 @@ def compute_relative_time(t): relative_time_reference.addParseAction(compute_relative_time) time_reference = absolute_time_of_day | relative_time_reference +time_reference.setName("time reference") def add_default_time_ref_fields(t): @@ -209,19 +221,18 @@ absolute_day_reference = ( today | tomorrow | yesterday | now + time_ref_present | weekday_reference ) absolute_day_reference.addParseAction(convert_abs_day_reference_to_date) - +absolute_day_reference.setName("absolute day") # relative_day_reference ::= 'in' qty day_units -# | qty day_units 'ago' -# | 'qty day_units ('from' | 'before' | 'after') absolute_day_reference -relative_day_reference = ( - in_("dir") + qty("qty") + day_units("units") - | qty("qty") + day_units("units") + ago("dir") - | qty("qty") - + day_units("units") - + (from_ | before | after)("dir") - + absolute_day_reference("ref_day") +# | qty day_units +# ('ago' +# | ('from' | 'before' | 'after') absolute_day_reference) +relative_day_reference = in_("dir") + qty("qty") + day_units("units") | qty( + "qty" +) + day_units("units") + ( + ago("dir") | ((from_ | before | after)("dir") + absolute_day_reference("ref_day")) ) +relative_day_reference.setName("relative day") def compute_relative_date(t): @@ -238,6 +249,7 @@ relative_day_reference.addParseAction(compute_relative_date) # combine expressions for absolute and relative day references day_reference = relative_day_reference | absolute_day_reference +day_reference.setName("day reference") def add_default_date_fields(t): @@ -251,6 +263,7 @@ day_reference.addParseAction(add_default_date_fields) time_and_day = time_reference + time_ref_present + pp.Optional( pp.Optional(on_) + day_reference ) | day_reference + pp.Optional(at_ + absolute_time_of_day + time_ref_present) +time_and_day.setName("time and day") # parse actions for total time_and_day expression def save_original_string(s, l, t): @@ -400,6 +413,9 @@ def main(): "the day after tomorrow": timedelta(days=2) - time_of_day, "tomorrow": timedelta(days=1) - time_of_day, "the day before yesterday": timedelta(days=-2) - time_of_day, + "8am the day after tomorrow": timedelta(days=+2) + - time_of_day + + timedelta(hours=8), "yesterday": timedelta(days=-1) - time_of_day, "today": -time_of_day, "midnight": -time_of_day, |