Skip to content

Commit

Permalink
Update some examples to latest pyparsing style, PEP8 names
Browse files Browse the repository at this point in the history
  • Loading branch information
ptmcg committed Apr 1, 2023
1 parent 718e858 commit c4cf4a5
Show file tree
Hide file tree
Showing 17 changed files with 222 additions and 228 deletions.
16 changes: 8 additions & 8 deletions examples/chemicalFormulas.py
Expand Up @@ -23,7 +23,7 @@
# "E[rsu]|F[emr]?|G[ade]|H[efgos]?|I[nr]?|Kr?|L[airu]|"
# "M[dgnot]|N[abdeiop]?|Os?|P[abdmortu]?|R[abefghnu]|"
# "S[bcegimnr]?|T[abcehilm]|U(u[bhopqst])?|V|W|Xe|Yb?|Z[nr]")
elementRef = pp.Group(element + pp.Optional(pp.Word(digits), default="1"))
elementRef = pp.Group(element + pp.Opt(pp.Word(digits), default="1"))
formula = elementRef[...]


Expand All @@ -46,7 +46,7 @@ def sum_atomic_weights(element_list):

# Version 2 - access parsed items by results name
elementRef = pp.Group(
element("symbol") + pp.Optional(pp.Word(digits), default="1")("qty")
element("symbol") + pp.Opt(pp.Word(digits), default="1")("qty")
)
formula = elementRef[...]

Expand All @@ -69,9 +69,9 @@ def sum_atomic_weights_by_results_name(element_list):
print()

# Version 3 - convert integers during parsing process
integer = pp.Word(digits).setParseAction(lambda t: int(t[0])).setName("integer")
elementRef = pp.Group(element("symbol") + pp.Optional(integer, default=1)("qty"))
formula = elementRef[...].setName("chemical_formula")
integer = pp.Word(digits).add_parse_action(lambda t: int(t[0])).set_name("integer")
elementRef = pp.Group(element("symbol") + pp.Opt(integer, default=1)("qty"))
formula = elementRef[...].set_name("chemical_formula")


def sum_atomic_weights_by_results_name_with_converted_ints(element_list):
Expand Down Expand Up @@ -103,10 +103,10 @@ def cvt_subscript_int(s):
return ret


subscript_int = pp.Word(subscript_digits).addParseAction(cvt_subscript_int).set_name("subscript")
subscript_int = pp.Word(subscript_digits).add_parse_action(cvt_subscript_int).set_name("subscript")

elementRef = pp.Group(element("symbol") + pp.Optional(subscript_int, default=1)("qty"))
formula = elementRef[1, ...].setName("chemical_formula")
elementRef = pp.Group(element("symbol") + pp.Opt(subscript_int, default=1)("qty"))
formula = elementRef[1, ...].set_name("chemical_formula")
formula.runTests(
"""\
H₂O
Expand Down
96 changes: 48 additions & 48 deletions examples/delta_time.py
Expand Up @@ -39,7 +39,7 @@

# basic grammar definitions
def make_integer_word_expr(int_name, int_value):
return pp.CaselessKeyword(int_name).addParseAction(pp.replaceWith(int_value))
return pp.CaselessKeyword(int_name).add_parse_action(pp.replaceWith(int_value))


integer_word = pp.MatchFirst(
Expand All @@ -50,52 +50,52 @@ def make_integer_word_expr(int_name, int_value):
" seventeen eighteen nineteen twenty".split(),
start=1,
)
).setName("integer_word")
).set_name("integer_word")

integer = pp.pyparsing_common.integer | integer_word
integer.setName("numeric")
integer.set_name("numeric")

CK = pp.CaselessKeyword
CL = pp.CaselessLiteral
today, tomorrow, yesterday, noon, midnight, now = map(
CK, "today tomorrow yesterday noon midnight now".split()
today, tomorrow, yesterday, noon, midnight, now = CK.using_each(
"today tomorrow yesterday noon midnight now".split()
)


def plural(s):
return CK(s) | CK(s + "s").addParseAction(pp.replaceWith(s))
return CK(s) | CK(s + "s").add_parse_action(pp.replaceWith(s))


week, day, hour, minute, second = map(plural, "week day hour minute second".split())
time_units = hour | minute | second
any_time_units = (week | day | time_units).setName("time_units")
any_time_units = (week | day | time_units).set_name("time_units")

am = CL("am")
pm = CL("pm")
COLON = pp.Suppress(":")

in_ = CK("in").setParseAction(pp.replaceWith(1))
from_ = CK("from").setParseAction(pp.replaceWith(1))
before = CK("before").setParseAction(pp.replaceWith(-1))
after = CK("after").setParseAction(pp.replaceWith(1))
ago = CK("ago").setParseAction(pp.replaceWith(-1))
next_ = CK("next").setParseAction(pp.replaceWith(1))
last_ = CK("last").setParseAction(pp.replaceWith(-1))
in_ = CK("in").set_parse_action(pp.replaceWith(1))
from_ = CK("from").set_parse_action(pp.replaceWith(1))
before = CK("before").set_parse_action(pp.replaceWith(-1))
after = CK("after").set_parse_action(pp.replaceWith(1))
ago = CK("ago").set_parse_action(pp.replaceWith(-1))
next_ = CK("next").set_parse_action(pp.replaceWith(1))
last_ = CK("last").set_parse_action(pp.replaceWith(-1))
at_ = CK("at")
on_ = CK("on")

couple = (
(pp.Optional(CK("a")) + CK("couple") + pp.Optional(CK("of")))
.setParseAction(pp.replaceWith(2))
.setName("couple")
(pp.Opt(CK("a")) + CK("couple") + pp.Opt(CK("of")))
.set_parse_action(pp.replaceWith(2))
.set_name("couple")
)

a_qty = (CK("a") | CK("an")).setParseAction(pp.replaceWith(1))
the_qty = CK("the").setParseAction(pp.replaceWith(1))
a_qty = (CK("a") | CK("an")).set_parse_action(pp.replaceWith(1))
the_qty = CK("the").set_parse_action(pp.replaceWith(1))
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")
(integer | couple | a_qty | the_qty).set_name("qty_expression")
).set_name("qty")
time_ref_present = pp.Empty().add_parse_action(pp.replace_with(True))("time_ref_present")


def fill_24hr_time_fields(t):
Expand All @@ -112,25 +112,25 @@ def fill_default_time_fields(t):


weekday_name_list = list(calendar.day_name)
weekday_name = pp.oneOf(weekday_name_list).setName("weekday_name")
weekday_name = pp.one_of(weekday_name_list).set_name("weekday_name")

_24hour_time = ~(integer + any_time_units).setName("numbered_time_units") + pp.Word(pp.nums, exact=4).setName("HHMM").addParseAction(
_24hour_time = ~(integer + any_time_units).set_name("numbered_time_units") + pp.Word(pp.nums, exact=4).set_name("HHMM").add_parse_action(
lambda t: [int(t[0][:2]), int(t[0][2:])], fill_24hr_time_fields
)
_24hour_time.setName("0000 time")
_24hour_time.set_name("0000 time")
ampm = am | pm
timespec = (
integer("HH")
+ pp.Optional(
CK("o'clock") | COLON + integer("MM") + pp.Optional(COLON + integer("SS"))
+ pp.Opt(
CK("o'clock") | COLON + integer("MM") + pp.Opt(COLON + integer("SS"))
)
+ (am | pm)("ampm")
).addParseAction(fill_default_time_fields)
).add_parse_action(fill_default_time_fields)
absolute_time = _24hour_time | timespec
absolute_time.setName("absolute time")
absolute_time.set_name("absolute time")

absolute_time_of_day = noon | midnight | now | absolute_time
absolute_time_of_day.setName("time of day")
absolute_time_of_day.set_name("time of day")


def add_computed_time(t):
Expand All @@ -145,12 +145,12 @@ def add_computed_time(t):
t["computed_time"] = time(hour=t.HH, minute=t.MM, second=t.SS)


absolute_time_of_day.addParseAction(add_computed_time)
absolute_time_of_day.add_parse_action(add_computed_time)


# relative_time_reference ::= qty time_units ('ago' | ('from' | 'before' | 'after') absolute_time_of_day)
# | 'in' qty time_units
time_units = (hour | minute | second).setName("time unit")
time_units = (hour | minute | second).set_name("time unit")
relative_time_reference = (
(
qty("qty")
Expand All @@ -162,7 +162,7 @@ def add_computed_time(t):
)
)
| in_("dir") + qty("qty") + time_units("units")
).setName("relative time")
).set_name("relative time")


def compute_relative_time(t):
Expand All @@ -174,24 +174,24 @@ def compute_relative_time(t):
t["time_delta"] = timedelta(seconds=t.dir * delta_seconds)


relative_time_reference.addParseAction(compute_relative_time)
relative_time_reference.add_parse_action(compute_relative_time)

time_reference = absolute_time_of_day | relative_time_reference
time_reference.setName("time reference")
time_reference.set_name("time reference")


def add_default_time_ref_fields(t):
if "time_delta" not in t:
t["time_delta"] = timedelta()


time_reference.addParseAction(add_default_time_ref_fields)
time_reference.add_parse_action(add_default_time_ref_fields)

# absolute_day_reference ::= 'today' | 'tomorrow' | 'yesterday' | ('next' | 'last') weekday_name
# day_units ::= 'days' | 'weeks'

day_units = day | week
weekday_reference = pp.Optional(next_ | last_, 1)("dir") + weekday_name("day_name")
weekday_reference = pp.Opt(next_ | last_, 1)("dir") + weekday_name("day_name")


def convert_abs_day_reference_to_date(t):
Expand Down Expand Up @@ -222,8 +222,8 @@ def convert_abs_day_reference_to_date(t):
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")
absolute_day_reference.add_parse_action(convert_abs_day_reference_to_date)
absolute_day_reference.set_name("absolute day")

# relative_day_reference ::= 'in' qty day_units
# | qty day_units
Expand All @@ -234,7 +234,7 @@ def convert_abs_day_reference_to_date(t):
) + day_units("units") + (
ago("dir") | ((from_ | before | after)("dir") + absolute_day_reference("ref_day"))
)
relative_day_reference.setName("relative day")
relative_day_reference.set_name("relative day")


def compute_relative_date(t):
Expand All @@ -247,25 +247,25 @@ def compute_relative_date(t):
t["date_delta"] = timedelta(days=day_diff)


relative_day_reference.addParseAction(compute_relative_date)
relative_day_reference.add_parse_action(compute_relative_date)

# combine expressions for absolute and relative day references
day_reference = relative_day_reference | absolute_day_reference
day_reference.setName("day reference")
day_reference.set_name("day reference")


def add_default_date_fields(t):
if "date_delta" not in t:
t["date_delta"] = timedelta()


day_reference.addParseAction(add_default_date_fields)
day_reference.add_parse_action(add_default_date_fields)

# combine date and time expressions into single overall parser
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")
time_and_day = time_reference + time_ref_present + pp.Opt(
pp.Opt(on_) + day_reference
) | day_reference + pp.Opt(at_ + absolute_time_of_day + time_ref_present)
time_and_day.set_name("time and day")

# parse actions for total time_and_day expression
def save_original_string(s, l, t):
Expand Down Expand Up @@ -318,7 +318,7 @@ def remove_temp_keys(t):
del t[k]


time_and_day.addParseAction(save_original_string, compute_timestamp, remove_temp_keys)
time_and_day.add_parse_action(save_original_string, compute_timestamp, remove_temp_keys)


time_expression = time_and_day
Expand Down
28 changes: 14 additions & 14 deletions examples/eval_arith.py
Expand Up @@ -13,9 +13,9 @@
nums,
alphas,
Combine,
oneOf,
opAssoc,
infixNotation,
one_of,
OpAssoc,
infix_notation,
Literal,
ParserElement,
)
Expand Down Expand Up @@ -143,28 +143,28 @@ def eval(self):
variable = Word(alphas, exact=1)
operand = real | integer | variable

signop = oneOf("+ -")
multop = oneOf("* /")
plusop = oneOf("+ -")
signop = one_of("+ -")
multop = one_of("* /")
plusop = one_of("+ -")
expop = Literal("**")

# use parse actions to attach EvalXXX constructors to sub-expressions
operand.setParseAction(EvalConstant)
arith_expr = infixNotation(
arith_expr = infix_notation(
operand,
[
(signop, 1, opAssoc.RIGHT, EvalSignOp),
(expop, 2, opAssoc.LEFT, EvalPowerOp),
(multop, 2, opAssoc.LEFT, EvalMultOp),
(plusop, 2, opAssoc.LEFT, EvalAddOp),
(signop, 1, OpAssoc.RIGHT, EvalSignOp),
(expop, 2, OpAssoc.LEFT, EvalPowerOp),
(multop, 2, OpAssoc.LEFT, EvalMultOp),
(plusop, 2, OpAssoc.LEFT, EvalAddOp),
],
)

comparisonop = oneOf("< <= > >= != = <> LT GT LE GE EQ NE")
comp_expr = infixNotation(
comparisonop = one_of("< <= > >= != = <> LT GT LE GE EQ NE")
comp_expr = infix_notation(
arith_expr,
[
(comparisonop, 2, opAssoc.LEFT, EvalComparisonOp),
(comparisonop, 2, OpAssoc.LEFT, EvalComparisonOp),
],
)

Expand Down

0 comments on commit c4cf4a5

Please sign in to comment.