diff options
author | ptmcg <ptmcg@austin.rr.com> | 2022-07-09 08:46:09 -0500 |
---|---|---|
committer | ptmcg <ptmcg@austin.rr.com> | 2022-07-09 08:46:09 -0500 |
commit | 84261e37994b15c141ef58324c4d807dd70e8d71 (patch) | |
tree | 35ceb58c1cbe57b90615f388c2e1a4a61553af6e /pyparsing | |
parent | 7994f6f1cf3c05a9cd2d0e047caa782a8c0826f1 (diff) | |
download | pyparsing-git-84261e37994b15c141ef58324c4d807dd70e8d71.tar.gz |
Fix bug in delimited_list (premature streamline), issue #408
Diffstat (limited to 'pyparsing')
-rw-r--r-- | pyparsing/__init__.py | 2 | ||||
-rw-r--r-- | pyparsing/helpers.py | 30 |
2 files changed, 30 insertions, 2 deletions
diff --git a/pyparsing/__init__.py b/pyparsing/__init__.py index ffe89d0..e502ba3 100644 --- a/pyparsing/__init__.py +++ b/pyparsing/__init__.py @@ -121,7 +121,7 @@ class version_info(NamedTuple): __version_info__ = version_info(3, 0, 10, "final", 0) -__version_time__ = "05 Jul 2022 01:03 UTC" +__version_time__ = "09 Jul 2022 13:41 UTC" __version__ = __version_info__.__version__ __versionTime__ = __version_time__ __author__ = "Paul McGuire <ptmcg.gm+pyparsing@gmail.com>" diff --git a/pyparsing/helpers.py b/pyparsing/helpers.py index 802389c..ecb382b 100644 --- a/pyparsing/helpers.py +++ b/pyparsing/helpers.py @@ -1,6 +1,7 @@ # helpers.py import html.entities import re +import sys import typing from . import __diag__ @@ -46,7 +47,34 @@ def delimited_list( expr = ParserElement._literalStringClass(expr) expr = typing.cast(ParserElement, expr) - expr_copy = expr.copy().streamline() + def make_deep_name_copy(expr): + from collections import deque + MAX_EXPRS = sys.getrecursionlimit() + seen = set() + to_visit = deque([(None, expr)]) + cpy = None + num_exprs = 0 + while to_visit and num_exprs < MAX_EXPRS: + parent, cur = to_visit.pop() + num_exprs += 1 + if cur in seen: + continue + seen.add(cur) + cur = cur.copy() + if parent is None: + cpy = cur + else: + if hasattr(parent, "expr"): + parent.expr = cur + elif hasattr(parent, "exprs"): + parent.exprs.append(cur) + + to_visit.extend((cur, sub) for sub in cur.recurse()[::-1]) + getattr(cur, "exprs", []).clear() + + return cpy + + expr_copy = make_deep_name_copy(expr).streamline() dlName = f"{expr_copy} [{delim} {expr_copy}]...{f' [{delim}]' if allow_trailing_delim else ''}" if not combine: |