Skip to content

Commit 3de2a23

Browse files
authored
Merge pull request #1341 from mathics/fix-matchq-errorhandler
catch malformed Pattern
2 parents 3ac1338 + bbd289a commit 3de2a23

File tree

2 files changed

+26
-7
lines changed

2 files changed

+26
-7
lines changed

mathics/builtin/base.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -721,11 +721,14 @@ def boxes_to_tex(self, leaves, **options) -> str:
721721
class PatternError(Exception):
722722
def __init__(self, name, tag, *args):
723723
super().__init__()
724+
self.name = name
725+
self.tag = tag
726+
self.args = args
724727

725728

726729
class PatternArgumentError(PatternError):
727730
def __init__(self, name, count, expected):
728-
super().__init__(None, None)
731+
super().__init__(name, "argr", count, expected)
729732

730733

731734
class PatternObject(InstanceableBuiltin, Pattern):

mathics/builtin/patterns.py

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@
4545
Integer,
4646
Rational,
4747
Real,
48+
SymbolFalse,
4849
SymbolList,
50+
SymbolTrue,
4951
)
5052
from mathics.core.rules import Rule
5153
from mathics.core.pattern import Pattern, StopGenerator
@@ -451,6 +453,9 @@ class PatternTest(BinaryOperator, PatternObject):
451453
= True
452454
>> MatchQ[-3, _Integer?(#>0&)]
453455
= False
456+
>> MatchQ[3, Pattern[3]]
457+
: First element in pattern Pattern[3] is not a valid pattern name.
458+
= False
454459
"""
455460

456461
operator = "?"
@@ -660,16 +665,23 @@ class MatchQ(Builtin):
660665
= False
661666
>> MatchQ[_Integer][123]
662667
= True
668+
>> MatchQ[3, Pattern[3]]
669+
: First element in pattern Pattern[3] is not a valid pattern name.
670+
= False
663671
"""
664672

665673
rules = {"MatchQ[form_][expr_]": "MatchQ[expr, form]"}
666674

667675
def apply(self, expr, form, evaluation):
668676
"MatchQ[expr_, form_]"
669677

670-
if match(expr, form, evaluation):
671-
return Symbol("True")
672-
return Symbol("False")
678+
try:
679+
if match(expr, form, evaluation):
680+
return SymbolTrue
681+
return SymbolFalse
682+
except PatternError as e:
683+
evaluation.message(e.name, e.tag, *(e.args))
684+
return SymbolFalse
673685

674686

675687
class Verbatim(PatternObject):
@@ -786,6 +798,7 @@ class Pattern_(PatternObject):
786798
"nodef": (
787799
"No default setting found for `1` in " "position `2` when length is `3`."
788800
),
801+
"argr": "Pattern called with 1 argument; 2 arguments are expected.",
789802
}
790803

791804
rules = {
@@ -801,10 +814,13 @@ class Pattern_(PatternObject):
801814
}
802815

803816
def init(self, expr):
804-
super(Pattern_, self).init(expr)
805-
self.varname = expr.leaves[0].get_name()
806-
if self.varname is None:
817+
if len(expr.leaves) != 2:
818+
self.error("patvar", expr)
819+
varname = expr.leaves[0].get_name()
820+
if varname is None or varname == "":
807821
self.error("patvar", expr)
822+
super(Pattern_, self).init(expr)
823+
self.varname = varname
808824
self.pattern = Pattern.create(expr.leaves[1])
809825

810826
def __repr__(self):

0 commit comments

Comments
 (0)