summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorptmcg <ptmcg@austin.rr.com>2023-03-07 00:52:09 -0600
committerptmcg <ptmcg@austin.rr.com>2023-03-07 00:52:09 -0600
commite6706c178564abdce4296629001291eb1ba68a6c (patch)
tree282c3cc6a7912793a8e6a920b7990613e5374cf4
parent28e4abe1c394e52c39b0dd00537e8312eb2cd9ae (diff)
downloadpyparsing-git-e6706c178564abdce4296629001291eb1ba68a6c.tar.gz
Don't always override exception messages in MatchFirst or Or classes - addresses #464
-rw-r--r--CHANGES4
-rw-r--r--pyparsing/__init__.py2
-rw-r--r--pyparsing/core.py9
3 files changed, 12 insertions, 3 deletions
diff --git a/CHANGES b/CHANGES
index e71c9ab..f82f7f3 100644
--- a/CHANGES
+++ b/CHANGES
@@ -55,6 +55,10 @@ help from Devin J. Pohly in structuring the code to enable this peaceful transit
`DelimitedList`. `delimited_list` and the older `delimitedList` method will be
deprecated in a future release, in favor of `DelimitedList`.
+- Error messages from `MatchFirst` and `Or` expressions will try to give more details
+ if one of the alternatives matches better than the others, but still fails.
+ Question raised in Issue #464 by msdemlei, thanks!
+
- Added new class method `ParserElement.using_each`, to simplify code
that creates a sequence of `Literals`, `Keywords`, or other `ParserElement`
subclasses.
diff --git a/pyparsing/__init__.py b/pyparsing/__init__.py
index 22bc21f..336041e 100644
--- a/pyparsing/__init__.py
+++ b/pyparsing/__init__.py
@@ -121,7 +121,7 @@ class version_info(NamedTuple):
__version_info__ = version_info(3, 1, 0, "alpha", 1)
-__version_time__ = "07 Mar 2023 01:33 UTC"
+__version_time__ = "07 Mar 2023 06:50 UTC"
__version__ = __version_info__.__version__
__versionTime__ = __version_time__
__author__ = "Paul McGuire <ptmcg.gm+pyparsing@gmail.com>"
diff --git a/pyparsing/core.py b/pyparsing/core.py
index 71c2690..02ae50a 100644
--- a/pyparsing/core.py
+++ b/pyparsing/core.py
@@ -4147,7 +4147,10 @@ class Or(ParseExpression):
raise max_fatal
if maxException is not None:
- # maxException.msg = self.errmsg
+ # infer from this check that all alternatives failed at the current position
+ # so emit this collective error message instead of any single error message
+ if maxExcLoc == loc:
+ maxException.msg = self.errmsg
raise maxException
else:
raise ParseException(
@@ -4260,7 +4263,9 @@ class MatchFirst(ParseExpression):
maxExcLoc = len(instring)
if maxException is not None:
- if maxException.msg == self.exprs[0].errmsg:
+ # infer from this check that all alternatives failed at the current position
+ # so emit this collective error message instead of any individual error message
+ if maxExcLoc == loc:
maxException.msg = self.errmsg
raise maxException
else: