From dfc7d7524ed9bb74a04865a68a06982bb54fcc5c Mon Sep 17 00:00:00 2001 From: Paul McGuire Date: Wed, 8 Sep 2021 09:03:40 -0500 Subject: 226 railroad updates (#298) * Add line separators to HowToUsePyparsing.rst to call attention to PEP-8 naming in this document * Update railroad diagram generation code, to show results names as group annotations, and break out all expressions with a name set using setName. * Revert dataclasses back to NamedTuples for 3.6-7 compat; add setName calls in simpleBool.py; add simpleBool to make_diagram.py * Remove default setName calls on delimitedList * Add setName calls to simpleSQL for better diagram * Remove hard-coded debug mode * Move setName on delimitedList into test code * Restore default setName() calls for delimitedList; set default vertical=3; update jsonParser.py and simpleSQL.py with better setName() calls (and update test_diagram.py accordingly); update test_diagram.py to move asserts after tempfiles are written, moved tempfiles to local dir instead of hard-to-find temp dir * Get proper railroad diags for infixNotation * Undo forced railroad_debug * Code cleanup from PR comments * Remove hard-coded base_expr name from infix_notation * Add special EachItem to compose DiagramItem for Group-OneOrMore-Choice; refactored tests to move duplicated code to function; added names to mozillaCalendarParser.py for better diagram * Make sure root element gets in the diagram, even if it has no custom name * Update tests to reflect diagram structure changes * Add LOOKAHEAD and LOOKBEHIND annotations for FollowedBy and PrecededBy elements, and changed the annotation on Each to [ALL]; renamed _first to _element_diagram_states; add expr.streamline() in create_diagram() to collapse nested exprs; added railroad_diagram_demo.py example general blackening; update CHANGES with latest enhancements; bump version date * Fix pip command * Update CHANGES and whats_new_in_3_0_0.rst with some features and acknowledgements * Updates from PR review: change user instructions to use pyparsing[diagrams]; consistent annotations for NotAny along with FollowedBy and PrecededBy; fixed up comments and type annotations * Remove unneeded pip installs for tox (already handled in tox.ini) * Refactor duplicate code into decorator; drop unused group_results_name argument * Add diagram handling for SkipTo, and for And's constructed using `expr*N` notation (use a OneOrMore diagram with a repeat count instead of a sequence of N exprs) * Fix parsing ambiguity in railroad_diagram_demo.py so that parser can actually parse a valid input string --- pyparsing/helpers.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'pyparsing/helpers.py') diff --git a/pyparsing/helpers.py b/pyparsing/helpers.py index dc183a0..1328a79 100644 --- a/pyparsing/helpers.py +++ b/pyparsing/helpers.py @@ -783,17 +783,15 @@ def infix_notation( thisExpr = Forward().set_name(term_name) if rightLeftAssoc is OpAssoc.LEFT: if arity == 1: - matchExpr = _FB(lastExpr + opExpr) + Group( - lastExpr + opExpr + opExpr[...] - ) + matchExpr = _FB(lastExpr + opExpr) + Group(lastExpr + opExpr[1, ...]) elif arity == 2: if opExpr is not None: matchExpr = _FB(lastExpr + opExpr + lastExpr) + Group( - lastExpr + opExpr + lastExpr + (opExpr + lastExpr)[...] + lastExpr + (opExpr + lastExpr)[1, ...] ) else: matchExpr = _FB(lastExpr + lastExpr) + Group( - lastExpr + lastExpr + lastExpr[...] + lastExpr + lastExpr[1, ...] ) elif arity == 3: matchExpr = _FB( @@ -808,11 +806,11 @@ def infix_notation( elif arity == 2: if opExpr is not None: matchExpr = _FB(lastExpr + opExpr + thisExpr) + Group( - lastExpr + opExpr + thisExpr + (opExpr + thisExpr)[...] + lastExpr + (opExpr + thisExpr)[1, ...] ) else: matchExpr = _FB(lastExpr + thisExpr) + Group( - lastExpr + thisExpr + thisExpr[...] + lastExpr + thisExpr[1, ...] ) elif arity == 3: matchExpr = _FB( @@ -823,7 +821,7 @@ def infix_notation( matchExpr.set_parse_action(*pa) else: matchExpr.set_parse_action(pa) - thisExpr <<= matchExpr.set_name(term_name) | lastExpr + thisExpr <<= (matchExpr | lastExpr).setName(term_name) lastExpr = thisExpr ret <<= lastExpr return ret -- cgit v1.2.1