summaryrefslogtreecommitdiff
path: root/pyparsing
diff options
context:
space:
mode:
authorptmcg <ptmcg@austin.rr.com>2022-07-09 08:46:09 -0500
committerptmcg <ptmcg@austin.rr.com>2022-07-09 08:46:09 -0500
commit84261e37994b15c141ef58324c4d807dd70e8d71 (patch)
tree35ceb58c1cbe57b90615f388c2e1a4a61553af6e /pyparsing
parent7994f6f1cf3c05a9cd2d0e047caa782a8c0826f1 (diff)
downloadpyparsing-git-84261e37994b15c141ef58324c4d807dd70e8d71.tar.gz
Fix bug in delimited_list (premature streamline), issue #408
Diffstat (limited to 'pyparsing')
-rw-r--r--pyparsing/__init__.py2
-rw-r--r--pyparsing/helpers.py30
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: