diff --git a/lib/matplotlib/_mathtext.py b/lib/matplotlib/_mathtext.py index 25a825b7b0d9..24aab9046e27 100644 --- a/lib/matplotlib/_mathtext.py +++ b/lib/matplotlib/_mathtext.py @@ -1894,6 +1894,7 @@ def csnames(group, names): p.function = csnames("name", self._function_names) p.group = p.start_group + ZeroOrMore(p.token)("group") + p.end_group + p.unclosed_group = (p.start_group + ZeroOrMore(p.token)("group") + StringEnd()) p.frac = cmd(r"\frac", p.required_group("num") + p.required_group("den")) p.dfrac = cmd(r"\dfrac", p.required_group("num") + p.required_group("den")) @@ -1942,6 +1943,7 @@ def csnames(group, names): p.token <<= ( p.simple | p.auto_delim + | p.unclosed_group | p.unknown_symbol # Must be last ) @@ -2030,7 +2032,7 @@ def main(self, s, loc, toks): return [Hlist(toks)] def math_string(self, s, loc, toks): - return self._math_expression.parseString(toks[0][1:-1]) + return self._math_expression.parseString(toks[0][1:-1], parseAll=True) def math(self, s, loc, toks): hlist = Hlist(toks) @@ -2250,6 +2252,9 @@ def end_group(self, s, loc, toks): self.pop_state() return [] + def unclosed_group(self, s, loc, toks): + raise ParseFatalException(s, len(s), "Expected '}'") + def font(self, s, loc, toks): self.get_state().font = toks["font"] return [] diff --git a/lib/matplotlib/tests/test_mathtext.py b/lib/matplotlib/tests/test_mathtext.py index d80312495d91..5a9e8a8b9264 100644 --- a/lib/matplotlib/tests/test_mathtext.py +++ b/lib/matplotlib/tests/test_mathtext.py @@ -320,6 +320,7 @@ def test_fontinfo(): (r'$a^2^2$', r'Double superscript'), (r'$a_2_2$', r'Double subscript'), (r'$a^2_a^2$', r'Double superscript'), + (r'$a = {b$', r"Expected '}'"), ], ids=[ 'hspace without value', @@ -347,7 +348,8 @@ def test_fontinfo(): 'unknown symbol', 'double superscript', 'double subscript', - 'super on sub without braces' + 'super on sub without braces', + 'unclosed group', ] ) def test_mathtext_exceptions(math, msg):