Repository: sympy/sympy

Issue:
String formatting of `sympy.core.numbers.Zero`
Given

```
>>> import sympy as sy
>>> x = sy.Symbol('x')
>>> y=x
```

you can avoid this

```
>>> '{:1.2f}'.format(y.subs(x,3))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported format string passed to Integer.__format__
```

using `evalf()` or `float()`:

```
>>> '{:1.2f}'.format(y.subs(x,3).evalf())
'3.00'
>>> '{:1.2f}'.format(float(y.subs(x,3)))
'3.00'
```

But if the numeric result is zero, I discovered the hard way that only `float()` works:

```
>>> '{:1.2f}'.format(y.subs(x,0).evalf())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported format string passed to Zero.__format__
>>> '{:1.2f}'.format(float(y.subs(x,0)))
'0.00'
```

Is that behavior intentional?

Discussion:
sympy-bot: :white_check_mark:

Hi, I am the [SymPy bot](https://github.com/sympy/sympy-bot) (v167). I'm here to help you write a release notes entry. Please read the [guide on how to write release notes](https://github.com/sympy/sympy/wiki/Writing-Release-Notes).



Your release notes are in good order.

Here is what the release notes will look like:
* core
  * support float format for Expr ([#23476](https://github.com/sympy/sympy/pull/23476) by [@eagleoflqj](https://github.com/eagleoflqj))

This will be added to https://github.com/sympy/sympy/wiki/Release-Notes-for-1.11.

<details><summary>Click here to see the pull request description that was parsed.</summary>

    <!-- Your title above should be a short description of what
    was changed. Do not include the issue number in the title. -->

    #### References to other Issues or PRs
    <!-- If this pull request fixes an issue, write "Fixes #NNNN" in that exact
    format, e.g. "Fixes #1234" (see
    https://tinyurl.com/auto-closing for more information). Also, please
    write a comment on that issue linking back to this pull request once it is
    open. -->

    Fixes #23290
    #### Brief description of what is fixed or changed

    #### Other comments

    #### Release Notes

    <!-- Write the release notes for this release below between the BEGIN and END
    statements. The basic format is a bulleted list with the name of the subpackage
    and the release note for this PR. For example:

    * solvers
      * Added a new solver for logarithmic equations.

    * functions
      * Fixed a bug with log of integers.

    or if no release note(s) should be included use:

    NO ENTRY

    See https://github.com/sympy/sympy/wiki/Writing-Release-Notes for more
    information on how to write release notes. The bot will check your release
    notes automatically to see if they are formatted correctly. -->

    <!-- BEGIN RELEASE NOTES -->
    * core
      * support float format for Expr
    <!-- END RELEASE NOTES -->


</details><p>

github-actions[bot]: Benchmark results from GitHub Actions

Lower numbers are good, higher numbers are bad. A ratio less than 1
means a speed up and greater than 1 means a slowdown. Green lines
beginning with `+` are slowdowns (the PR is slower then master or
master is slower than the previous release). Red lines beginning
with `-` are speedups.

Significantly changed benchmark results (PR vs master)
```diff

```
Significantly changed benchmark results (master vs previous release)
```diff
       before           after         ratio
     [77f1d79c]       [f1769a2a]
     <sympy-1.10.1^0>                 
+      98.3±0.5ms        178±0.8ms     1.81  sum.TimeSum.time_doit

```
Full benchmark results can be found as artifacts in GitHub Actions
(click on checks at the top of the PR).
oscargus: Looks good! Out of curiosity (and laziness): will this also evaluate a more complicated expression to that precision? Would it be worth testing something like  `"{:50:48f}".format(exp(sin(1)))`?

Patch:
diff --git a/sympy/core/expr.py b/sympy/core/expr.py
index d66dff3ef2..0a8a3bc9d7 100644
--- a/sympy/core/expr.py
+++ b/sympy/core/expr.py
@@ -3,6 +3,7 @@
 from typing import TYPE_CHECKING
 from collections.abc import Iterable
 from functools import reduce
+import re
 
 from .sympify import sympify, _sympify
 from .basic import Basic, Atom
@@ -380,6 +381,18 @@ def __trunc__(self):
         else:
             return Integer(self)
 
+    def __format__(self, format_spec: str):
+        if self.is_number:
+            mt = re.match(r'\+?\d*\.(\d+)f', format_spec)
+            if mt:
+                prec = int(mt.group(1))
+                rounded = self.round(prec)
+                if rounded.is_Integer:
+                    return format(int(rounded), format_spec)
+                if rounded.is_Float:
+                    return format(rounded, format_spec)
+        return super().__format__(format_spec)
+
     @staticmethod
     def _from_mpmath(x, prec):
         if hasattr(x, "_mpf_"):
diff --git a/sympy/parsing/latex/LaTeX.g4 b/sympy/parsing/latex/LaTeX.g4
index 36ed8dd0fe..a043e507d8 100644
--- a/sympy/parsing/latex/LaTeX.g4
+++ b/sympy/parsing/latex/LaTeX.g4
@@ -114,10 +114,7 @@ FUNC_OVERLINE: '\\overline';
 CMD_TIMES: '\\times';
 CMD_CDOT: '\\cdot';
 CMD_DIV: '\\div';
-CMD_FRAC:
-    '\\frac'
-    | '\\dfrac'
-    | '\\tfrac';
+CMD_FRAC: '\\frac';
 CMD_BINOM: '\\binom';
 CMD_DBINOM: '\\dbinom';
 CMD_TBINOM: '\\tbinom';
@@ -210,6 +207,8 @@ comp:
 	| abs_group
 	| func
 	| atom
+	| frac
+	| binom
 	| floor
 	| ceil;
 
@@ -217,6 +216,8 @@ comp_nofunc:
 	group
 	| abs_group
 	| atom
+	| frac
+	| binom
 	| floor
 	| ceil;
 
@@ -232,8 +233,6 @@ atom: (LETTER | SYMBOL) subexpr?
 	| NUMBER
 	| DIFFERENTIAL
 	| mathit
-	| frac
-	| binom
 	| bra
 	| ket;
 
diff --git a/sympy/parsing/latex/_antlr/latexlexer.py b/sympy/parsing/latex/_antlr/latexlexer.py
index 44df4328fd..5c010cc8e8 100644
--- a/sympy/parsing/latex/_antlr/latexlexer.py
+++ b/sympy/parsing/latex/_antlr/latexlexer.py
@@ -20,7 +20,7 @@
 def serializedATN():
     with StringIO() as buf:
         buf.write(u"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2")
-        buf.write(u"Z\u03a9\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4")
+        buf.write(u"Z\u039c\b\1\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4")
         buf.write(u"\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r")
         buf.write(u"\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22")
         buf.write(u"\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4")
@@ -75,31 +75,30 @@ def serializedATN():
         buf.write(u";\3;\3;\3;\3;\3;\3;\3<\3<\3<\3<\3<\3<\3<\3=\3=\3=\3=")
         buf.write(u"\3=\3=\3=\3>\3>\3>\3>\3>\3>\3?\3?\3?\3?\3?\3?\3?\3?\3")
         buf.write(u"?\3?\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3B\3B\3B")
-        buf.write(u"\3B\3B\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3C\3")
-        buf.write(u"C\3C\5C\u02e9\nC\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E")
-        buf.write(u"\3E\3E\3E\3F\3F\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G\3G\3G\3")
-        buf.write(u"G\3G\3H\3H\3I\3I\3J\3J\3K\3K\3L\3L\7L\u0314\nL\fL\16")
-        buf.write(u"L\u0317\13L\3L\3L\3L\6L\u031c\nL\rL\16L\u031d\5L\u0320")
-        buf.write(u"\nL\3M\3M\3N\3N\3O\6O\u0327\nO\rO\16O\u0328\3O\3O\3O")
-        buf.write(u"\3O\3O\7O\u0330\nO\fO\16O\u0333\13O\3O\7O\u0336\nO\f")
-        buf.write(u"O\16O\u0339\13O\3O\3O\3O\3O\3O\7O\u0340\nO\fO\16O\u0343")
-        buf.write(u"\13O\3O\3O\6O\u0347\nO\rO\16O\u0348\5O\u034b\nO\3P\3")
-        buf.write(u"P\7P\u034f\nP\fP\16P\u0352\13P\5P\u0354\nP\3P\3P\3P\7")
-        buf.write(u"P\u0359\nP\fP\16P\u035c\13P\3P\5P\u035f\nP\5P\u0361\n")
-        buf.write(u"P\3Q\3Q\3Q\3Q\3Q\3R\3R\3S\3S\3S\3S\3S\3S\3S\3S\3S\5S")
-        buf.write(u"\u0373\nS\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3U\3")
-        buf.write(u"U\3U\3V\3V\3W\3W\3W\3W\3W\3W\3W\3W\3W\5W\u0390\nW\3X")
-        buf.write(u"\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3")
-        buf.write(u"[\3[\6[\u03a6\n[\r[\16[\u03a7\5\u0315\u0350\u035a\2\\")
-        buf.write(u"\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31")
-        buf.write(u"\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31")
-        buf.write(u"\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(")
-        buf.write(u"O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:")
-        buf.write(u"s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089F")
-        buf.write(u"\u008bG\u008dH\u008fI\u0091J\u0093K\u0095\2\u0097L\u0099")
+        buf.write(u"\3B\3B\3C\3C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3E\3E\3")
+        buf.write(u"E\3E\3E\3E\3E\3E\3F\3F\3F\3F\3F\3F\3F\3F\3G\3G\3G\3G")
+        buf.write(u"\3G\3G\3G\3G\3H\3H\3I\3I\3J\3J\3K\3K\3L\3L\7L\u0307\n")
+        buf.write(u"L\fL\16L\u030a\13L\3L\3L\3L\6L\u030f\nL\rL\16L\u0310")
+        buf.write(u"\5L\u0313\nL\3M\3M\3N\3N\3O\6O\u031a\nO\rO\16O\u031b")
+        buf.write(u"\3O\3O\3O\3O\3O\7O\u0323\nO\fO\16O\u0326\13O\3O\7O\u0329")
+        buf.write(u"\nO\fO\16O\u032c\13O\3O\3O\3O\3O\3O\7O\u0333\nO\fO\16")
+        buf.write(u"O\u0336\13O\3O\3O\6O\u033a\nO\rO\16O\u033b\5O\u033e\n")
+        buf.write(u"O\3P\3P\7P\u0342\nP\fP\16P\u0345\13P\5P\u0347\nP\3P\3")
+        buf.write(u"P\3P\7P\u034c\nP\fP\16P\u034f\13P\3P\5P\u0352\nP\5P\u0354")
+        buf.write(u"\nP\3Q\3Q\3Q\3Q\3Q\3R\3R\3S\3S\3S\3S\3S\3S\3S\3S\3S\5")
+        buf.write(u"S\u0366\nS\3T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3U")
+        buf.write(u"\3U\3U\3V\3V\3W\3W\3W\3W\3W\3W\3W\3W\3W\5W\u0383\nW\3")
+        buf.write(u"X\3X\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z")
+        buf.write(u"\3[\3[\6[\u0399\n[\r[\16[\u039a\5\u0308\u0343\u034d\2")
+        buf.write(u"\\\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r")
+        buf.write(u"\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30")
+        buf.write(u"/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K")
+        buf.write(u"\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8")
+        buf.write(u"o9q:s;u<w=y>{?}@\177A\u0081B\u0083C\u0085D\u0087E\u0089")
+        buf.write(u"F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095\2\u0097L\u0099")
         buf.write(u"M\u009b\2\u009dN\u009fO\u00a1P\u00a3Q\u00a5R\u00a7S\u00a9")
         buf.write(u"T\u00abU\u00adV\u00afW\u00b1X\u00b3Y\u00b5Z\3\2\5\5\2")
-        buf.write(u"\13\f\17\17\"\"\4\2C\\c|\3\2\62;\2\u03d3\2\3\3\2\2\2")
+        buf.write(u"\13\f\17\17\"\"\4\2C\\c|\3\2\62;\2\u03c4\2\3\3\2\2\2")
         buf.write(u"\2\5\3\2\2\2\2\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r")
         buf.write(u"\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2\2\2\25")
         buf.write(u"\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35")
@@ -140,16 +139,16 @@ def serializedATN():
         buf.write(u"\u0287\3\2\2\2q\u028f\3\2\2\2s\u0297\3\2\2\2u\u029f\3")
         buf.write(u"\2\2\2w\u02a7\3\2\2\2y\u02ae\3\2\2\2{\u02b5\3\2\2\2}")
         buf.write(u"\u02bb\3\2\2\2\177\u02c5\3\2\2\2\u0081\u02cc\3\2\2\2")
-        buf.write(u"\u0083\u02d2\3\2\2\2\u0085\u02e8\3\2\2\2\u0087\u02ea")
-        buf.write(u"\3\2\2\2\u0089\u02f1\3\2\2\2\u008b\u02f9\3\2\2\2\u008d")
-        buf.write(u"\u0301\3\2\2\2\u008f\u0309\3\2\2\2\u0091\u030b\3\2\2")
-        buf.write(u"\2\u0093\u030d\3\2\2\2\u0095\u030f\3\2\2\2\u0097\u0311")
-        buf.write(u"\3\2\2\2\u0099\u0321\3\2\2\2\u009b\u0323\3\2\2\2\u009d")
-        buf.write(u"\u034a\3\2\2\2\u009f\u0360\3\2\2\2\u00a1\u0362\3\2\2")
-        buf.write(u"\2\u00a3\u0367\3\2\2\2\u00a5\u0372\3\2\2\2\u00a7\u0374")
-        buf.write(u"\3\2\2\2\u00a9\u037a\3\2\2\2\u00ab\u0384\3\2\2\2\u00ad")
-        buf.write(u"\u038f\3\2\2\2\u00af\u0391\3\2\2\2\u00b1\u0397\3\2\2")
-        buf.write(u"\2\u00b3\u03a1\3\2\2\2\u00b5\u03a3\3\2\2\2\u00b7\u00b8")
+        buf.write(u"\u0083\u02d2\3\2\2\2\u0085\u02d7\3\2\2\2\u0087\u02dd")
+        buf.write(u"\3\2\2\2\u0089\u02e4\3\2\2\2\u008b\u02ec\3\2\2\2\u008d")
+        buf.write(u"\u02f4\3\2\2\2\u008f\u02fc\3\2\2\2\u0091\u02fe\3\2\2")
+        buf.write(u"\2\u0093\u0300\3\2\2\2\u0095\u0302\3\2\2\2\u0097\u0304")
+        buf.write(u"\3\2\2\2\u0099\u0314\3\2\2\2\u009b\u0316\3\2\2\2\u009d")
+        buf.write(u"\u033d\3\2\2\2\u009f\u0353\3\2\2\2\u00a1\u0355\3\2\2")
+        buf.write(u"\2\u00a3\u035a\3\2\2\2\u00a5\u0365\3\2\2\2\u00a7\u0367")
+        buf.write(u"\3\2\2\2\u00a9\u036d\3\2\2\2\u00ab\u0377\3\2\2\2\u00ad")
+        buf.write(u"\u0382\3\2\2\2\u00af\u0384\3\2\2\2\u00b1\u038a\3\2\2")
+        buf.write(u"\2\u00b3\u0394\3\2\2\2\u00b5\u0396\3\2\2\2\u00b7\u00b8")
         buf.write(u"\7.\2\2\u00b8\4\3\2\2\2\u00b9\u00bb\t\2\2\2\u00ba\u00b9")
         buf.write(u"\3\2\2\2\u00bb\u00bc\3\2\2\2\u00bc\u00ba\3\2\2\2\u00bc")
         buf.write(u"\u00bd\3\2\2\2\u00bd\u00be\3\2\2\2\u00be\u00bf\b\3\2")
@@ -343,94 +342,89 @@ def serializedATN():
         buf.write(u"\3\2\2\2\u02d2\u02d3\7^\2\2\u02d3\u02d4\7f\2\2\u02d4")
         buf.write(u"\u02d5\7k\2\2\u02d5\u02d6\7x\2\2\u02d6\u0084\3\2\2\2")
         buf.write(u"\u02d7\u02d8\7^\2\2\u02d8\u02d9\7h\2\2\u02d9\u02da\7")
-        buf.write(u"t\2\2\u02da\u02db\7c\2\2\u02db\u02e9\7e\2\2\u02dc\u02dd")
-        buf.write(u"\7^\2\2\u02dd\u02de\7f\2\2\u02de\u02df\7h\2\2\u02df\u02e0")
-        buf.write(u"\7t\2\2\u02e0\u02e1\7c\2\2\u02e1\u02e9\7e\2\2\u02e2\u02e3")
-        buf.write(u"\7^\2\2\u02e3\u02e4\7v\2\2\u02e4\u02e5\7h\2\2\u02e5\u02e6")
-        buf.write(u"\7t\2\2\u02e6\u02e7\7c\2\2\u02e7\u02e9\7e\2\2\u02e8\u02d7")
-        buf.write(u"\3\2\2\2\u02e8\u02dc\3\2\2\2\u02e8\u02e2\3\2\2\2\u02e9")
-        buf.write(u"\u0086\3\2\2\2\u02ea\u02eb\7^\2\2\u02eb\u02ec\7d\2\2")
-        buf.write(u"\u02ec\u02ed\7k\2\2\u02ed\u02ee\7p\2\2\u02ee\u02ef\7")
-        buf.write(u"q\2\2\u02ef\u02f0\7o\2\2\u02f0\u0088\3\2\2\2\u02f1\u02f2")
-        buf.write(u"\7^\2\2\u02f2\u02f3\7f\2\2\u02f3\u02f4\7d\2\2\u02f4\u02f5")
-        buf.write(u"\7k\2\2\u02f5\u02f6\7p\2\2\u02f6\u02f7\7q\2\2\u02f7\u02f8")
-        buf.write(u"\7o\2\2\u02f8\u008a\3\2\2\2\u02f9\u02fa\7^\2\2\u02fa")
-        buf.write(u"\u02fb\7v\2\2\u02fb\u02fc\7d\2\2\u02fc\u02fd\7k\2\2\u02fd")
-        buf.write(u"\u02fe\7p\2\2\u02fe\u02ff\7q\2\2\u02ff\u0300\7o\2\2\u0300")
-        buf.write(u"\u008c\3\2\2\2\u0301\u0302\7^\2\2\u0302\u0303\7o\2\2")
-        buf.write(u"\u0303\u0304\7c\2\2\u0304\u0305\7v\2\2\u0305\u0306\7")
-        buf.write(u"j\2\2\u0306\u0307\7k\2\2\u0307\u0308\7v\2\2\u0308\u008e")
-        buf.write(u"\3\2\2\2\u0309\u030a\7a\2\2\u030a\u0090\3\2\2\2\u030b")
-        buf.write(u"\u030c\7`\2\2\u030c\u0092\3\2\2\2\u030d\u030e\7<\2\2")
-        buf.write(u"\u030e\u0094\3\2\2\2\u030f\u0310\t\2\2\2\u0310\u0096")
-        buf.write(u"\3\2\2\2\u0311\u0315\7f\2\2\u0312\u0314\5\u0095K\2\u0313")
-        buf.write(u"\u0312\3\2\2\2\u0314\u0317\3\2\2\2\u0315\u0316\3\2\2")
-        buf.write(u"\2\u0315\u0313\3\2\2\2\u0316\u031f\3\2\2\2\u0317\u0315")
-        buf.write(u"\3\2\2\2\u0318\u0320\t\3\2\2\u0319\u031b\7^\2\2\u031a")
-        buf.write(u"\u031c\t\3\2\2\u031b\u031a\3\2\2\2\u031c\u031d\3\2\2")
-        buf.write(u"\2\u031d\u031b\3\2\2\2\u031d\u031e\3\2\2\2\u031e\u0320")
-        buf.write(u"\3\2\2\2\u031f\u0318\3\2\2\2\u031f\u0319\3\2\2\2\u0320")
-        buf.write(u"\u0098\3\2\2\2\u0321\u0322\t\3\2\2\u0322\u009a\3\2\2")
-        buf.write(u"\2\u0323\u0324\t\4\2\2\u0324\u009c\3\2\2\2\u0325\u0327")
-        buf.write(u"\5\u009bN\2\u0326\u0325\3\2\2\2\u0327\u0328\3\2\2\2\u0328")
-        buf.write(u"\u0326\3\2\2\2\u0328\u0329\3\2\2\2\u0329\u0331\3\2\2")
-        buf.write(u"\2\u032a\u032b\7.\2\2\u032b\u032c\5\u009bN\2\u032c\u032d")
-        buf.write(u"\5\u009bN\2\u032d\u032e\5\u009bN\2\u032e\u0330\3\2\2")
-        buf.write(u"\2\u032f\u032a\3\2\2\2\u0330\u0333\3\2\2\2\u0331\u032f")
-        buf.write(u"\3\2\2\2\u0331\u0332\3\2\2\2\u0332\u034b\3\2\2\2\u0333")
-        buf.write(u"\u0331\3\2\2\2\u0334\u0336\5\u009bN\2\u0335\u0334\3\2")
-        buf.write(u"\2\2\u0336\u0339\3\2\2\2\u0337\u0335\3\2\2\2\u0337\u0338")
-        buf.write(u"\3\2\2\2\u0338\u0341\3\2\2\2\u0339\u0337\3\2\2\2\u033a")
-        buf.write(u"\u033b\7.\2\2\u033b\u033c\5\u009bN\2\u033c\u033d\5\u009b")
-        buf.write(u"N\2\u033d\u033e\5\u009bN\2\u033e\u0340\3\2\2\2\u033f")
-        buf.write(u"\u033a\3\2\2\2\u0340\u0343\3\2\2\2\u0341\u033f\3\2\2")
-        buf.write(u"\2\u0341\u0342\3\2\2\2\u0342\u0344\3\2\2\2\u0343\u0341")
-        buf.write(u"\3\2\2\2\u0344\u0346\7\60\2\2\u0345\u0347\5\u009bN\2")
-        buf.write(u"\u0346\u0345\3\2\2\2\u0347\u0348\3\2\2\2\u0348\u0346")
-        buf.write(u"\3\2\2\2\u0348\u0349\3\2\2\2\u0349\u034b\3\2\2\2\u034a")
-        buf.write(u"\u0326\3\2\2\2\u034a\u0337\3\2\2\2\u034b\u009e\3\2\2")
-        buf.write(u"\2\u034c\u0350\7(\2\2\u034d\u034f\5\u0095K\2\u034e\u034d")
-        buf.write(u"\3\2\2\2\u034f\u0352\3\2\2\2\u0350\u0351\3\2\2\2\u0350")
-        buf.write(u"\u034e\3\2\2\2\u0351\u0354\3\2\2\2\u0352\u0350\3\2\2")
-        buf.write(u"\2\u0353\u034c\3\2\2\2\u0353\u0354\3\2\2\2\u0354\u0355")
-        buf.write(u"\3\2\2\2\u0355\u0361\7?\2\2\u0356\u035e\7?\2\2\u0357")
-        buf.write(u"\u0359\5\u0095K\2\u0358\u0357\3\2\2\2\u0359\u035c\3\2")
-        buf.write(u"\2\2\u035a\u035b\3\2\2\2\u035a\u0358\3\2\2\2\u035b\u035d")
-        buf.write(u"\3\2\2\2\u035c\u035a\3\2\2\2\u035d\u035f\7(\2\2\u035e")
-        buf.write(u"\u035a\3\2\2\2\u035e\u035f\3\2\2\2\u035f\u0361\3\2\2")
-        buf.write(u"\2\u0360\u0353\3\2\2\2\u0360\u0356\3\2\2\2\u0361\u00a0")
-        buf.write(u"\3\2\2\2\u0362\u0363\7^\2\2\u0363\u0364\7p\2\2\u0364")
-        buf.write(u"\u0365\7g\2\2\u0365\u0366\7s\2\2\u0366\u00a2\3\2\2\2")
-        buf.write(u"\u0367\u0368\7>\2\2\u0368\u00a4\3\2\2\2\u0369\u036a\7")
-        buf.write(u"^\2\2\u036a\u036b\7n\2\2\u036b\u036c\7g\2\2\u036c\u0373")
-        buf.write(u"\7s\2\2\u036d\u036e\7^\2\2\u036e\u036f\7n\2\2\u036f\u0373")
-        buf.write(u"\7g\2\2\u0370\u0373\5\u00a7T\2\u0371\u0373\5\u00a9U\2")
-        buf.write(u"\u0372\u0369\3\2\2\2\u0372\u036d\3\2\2\2\u0372\u0370")
-        buf.write(u"\3\2\2\2\u0372\u0371\3\2\2\2\u0373\u00a6\3\2\2\2\u0374")
-        buf.write(u"\u0375\7^\2\2\u0375\u0376\7n\2\2\u0376\u0377\7g\2\2\u0377")
-        buf.write(u"\u0378\7s\2\2\u0378\u0379\7s\2\2\u0379\u00a8\3\2\2\2")
-        buf.write(u"\u037a\u037b\7^\2\2\u037b\u037c\7n\2\2\u037c\u037d\7")
-        buf.write(u"g\2\2\u037d\u037e\7s\2\2\u037e\u037f\7u\2\2\u037f\u0380")
-        buf.write(u"\7n\2\2\u0380\u0381\7c\2\2\u0381\u0382\7p\2\2\u0382\u0383")
-        buf.write(u"\7v\2\2\u0383\u00aa\3\2\2\2\u0384\u0385\7@\2\2\u0385")
-        buf.write(u"\u00ac\3\2\2\2\u0386\u0387\7^\2\2\u0387\u0388\7i\2\2")
-        buf.write(u"\u0388\u0389\7g\2\2\u0389\u0390\7s\2\2\u038a\u038b\7")
-        buf.write(u"^\2\2\u038b\u038c\7i\2\2\u038c\u0390\7g\2\2\u038d\u0390")
-        buf.write(u"\5\u00afX\2\u038e\u0390\5\u00b1Y\2\u038f\u0386\3\2\2")
-        buf.write(u"\2\u038f\u038a\3\2\2\2\u038f\u038d\3\2\2\2\u038f\u038e")
-        buf.write(u"\3\2\2\2\u0390\u00ae\3\2\2\2\u0391\u0392\7^\2\2\u0392")
-        buf.write(u"\u0393\7i\2\2\u0393\u0394\7g\2\2\u0394\u0395\7s\2\2\u0395")
-        buf.write(u"\u0396\7s\2\2\u0396\u00b0\3\2\2\2\u0397\u0398\7^\2\2")
-        buf.write(u"\u0398\u0399\7i\2\2\u0399\u039a\7g\2\2\u039a\u039b\7")
-        buf.write(u"s\2\2\u039b\u039c\7u\2\2\u039c\u039d\7n\2\2\u039d\u039e")
-        buf.write(u"\7c\2\2\u039e\u039f\7p\2\2\u039f\u03a0\7v\2\2\u03a0\u00b2")
-        buf.write(u"\3\2\2\2\u03a1\u03a2\7#\2\2\u03a2\u00b4\3\2\2\2\u03a3")
-        buf.write(u"\u03a5\7^\2\2\u03a4\u03a6\t\3\2\2\u03a5\u03a4\3\2\2\2")
-        buf.write(u"\u03a6\u03a7\3\2\2\2\u03a7\u03a5\3\2\2\2\u03a7\u03a8")
-        buf.write(u"\3\2\2\2\u03a8\u00b6\3\2\2\2\35\2\u00bc\u00cc\u00db\u00ec")
-        buf.write(u"\u0110\u0178\u01f3\u0204\u02e8\u0315\u031d\u031f\u0328")
-        buf.write(u"\u0331\u0337\u0341\u0348\u034a\u0350\u0353\u035a\u035e")
-        buf.write(u"\u0360\u0372\u038f\u03a7\3\b\2\2")
+        buf.write(u"t\2\2\u02da\u02db\7c\2\2\u02db\u02dc\7e\2\2\u02dc\u0086")
+        buf.write(u"\3\2\2\2\u02dd\u02de\7^\2\2\u02de\u02df\7d\2\2\u02df")
+        buf.write(u"\u02e0\7k\2\2\u02e0\u02e1\7p\2\2\u02e1\u02e2\7q\2\2\u02e2")
+        buf.write(u"\u02e3\7o\2\2\u02e3\u0088\3\2\2\2\u02e4\u02e5\7^\2\2")
+        buf.write(u"\u02e5\u02e6\7f\2\2\u02e6\u02e7\7d\2\2\u02e7\u02e8\7")
+        buf.write(u"k\2\2\u02e8\u02e9\7p\2\2\u02e9\u02ea\7q\2\2\u02ea\u02eb")
+        buf.write(u"\7o\2\2\u02eb\u008a\3\2\2\2\u02ec\u02ed\7^\2\2\u02ed")
+        buf.write(u"\u02ee\7v\2\2\u02ee\u02ef\7d\2\2\u02ef\u02f0\7k\2\2\u02f0")
+        buf.write(u"\u02f1\7p\2\2\u02f1\u02f2\7q\2\2\u02f2\u02f3\7o\2\2\u02f3")
+        buf.write(u"\u008c\3\2\2\2\u02f4\u02f5\7^\2\2\u02f5\u02f6\7o\2\2")
+        buf.write(u"\u02f6\u02f7\7c\2\2\u02f7\u02f8\7v\2\2\u02f8\u02f9\7")
+        buf.write(u"j\2\2\u02f9\u02fa\7k\2\2\u02fa\u02fb\7v\2\2\u02fb\u008e")
+        buf.write(u"\3\2\2\2\u02fc\u02fd\7a\2\2\u02fd\u0090\3\2\2\2\u02fe")
+        buf.write(u"\u02ff\7`\2\2\u02ff\u0092\3\2\2\2\u0300\u0301\7<\2\2")
+        buf.write(u"\u0301\u0094\3\2\2\2\u0302\u0303\t\2\2\2\u0303\u0096")
+        buf.write(u"\3\2\2\2\u0304\u0308\7f\2\2\u0305\u0307\5\u0095K\2\u0306")
+        buf.write(u"\u0305\3\2\2\2\u0307\u030a\3\2\2\2\u0308\u0309\3\2\2")
+        buf.write(u"\2\u0308\u0306\3\2\2\2\u0309\u0312\3\2\2\2\u030a\u0308")
+        buf.write(u"\3\2\2\2\u030b\u0313\t\3\2\2\u030c\u030e\7^\2\2\u030d")
+        buf.write(u"\u030f\t\3\2\2\u030e\u030d\3\2\2\2\u030f\u0310\3\2\2")
+        buf.write(u"\2\u0310\u030e\3\2\2\2\u0310\u0311\3\2\2\2\u0311\u0313")
+        buf.write(u"\3\2\2\2\u0312\u030b\3\2\2\2\u0312\u030c\3\2\2\2\u0313")
+        buf.write(u"\u0098\3\2\2\2\u0314\u0315\t\3\2\2\u0315\u009a\3\2\2")
+        buf.write(u"\2\u0316\u0317\t\4\2\2\u0317\u009c\3\2\2\2\u0318\u031a")
+        buf.write(u"\5\u009bN\2\u0319\u0318\3\2\2\2\u031a\u031b\3\2\2\2\u031b")
+        buf.write(u"\u0319\3\2\2\2\u031b\u031c\3\2\2\2\u031c\u0324\3\2\2")
+        buf.write(u"\2\u031d\u031e\7.\2\2\u031e\u031f\5\u009bN\2\u031f\u0320")
+        buf.write(u"\5\u009bN\2\u0320\u0321\5\u009bN\2\u0321\u0323\3\2\2")
+        buf.write(u"\2\u0322\u031d\3\2\2\2\u0323\u0326\3\2\2\2\u0324\u0322")
+        buf.write(u"\3\2\2\2\u0324\u0325\3\2\2\2\u0325\u033e\3\2\2\2\u0326")
+        buf.write(u"\u0324\3\2\2\2\u0327\u0329\5\u009bN\2\u0328\u0327\3\2")
+        buf.write(u"\2\2\u0329\u032c\3\2\2\2\u032a\u0328\3\2\2\2\u032a\u032b")
+        buf.write(u"\3\2\2\2\u032b\u0334\3\2\2\2\u032c\u032a\3\2\2\2\u032d")
+        buf.write(u"\u032e\7.\2\2\u032e\u032f\5\u009bN\2\u032f\u0330\5\u009b")
+        buf.write(u"N\2\u0330\u0331\5\u009bN\2\u0331\u0333\3\2\2\2\u0332")
+        buf.write(u"\u032d\3\2\2\2\u0333\u0336\3\2\2\2\u0334\u0332\3\2\2")
+        buf.write(u"\2\u0334\u0335\3\2\2\2\u0335\u0337\3\2\2\2\u0336\u0334")
+        buf.write(u"\3\2\2\2\u0337\u0339\7\60\2\2\u0338\u033a\5\u009bN\2")
+        buf.write(u"\u0339\u0338\3\2\2\2\u033a\u033b\3\2\2\2\u033b\u0339")
+        buf.write(u"\3\2\2\2\u033b\u033c\3\2\2\2\u033c\u033e\3\2\2\2\u033d")
+        buf.write(u"\u0319\3\2\2\2\u033d\u032a\3\2\2\2\u033e\u009e\3\2\2")
+        buf.write(u"\2\u033f\u0343\7(\2\2\u0340\u0342\5\u0095K\2\u0341\u0340")
+        buf.write(u"\3\2\2\2\u0342\u0345\3\2\2\2\u0343\u0344\3\2\2\2\u0343")
+        buf.write(u"\u0341\3\2\2\2\u0344\u0347\3\2\2\2\u0345\u0343\3\2\2")
+        buf.write(u"\2\u0346\u033f\3\2\2\2\u0346\u0347\3\2\2\2\u0347\u0348")
+        buf.write(u"\3\2\2\2\u0348\u0354\7?\2\2\u0349\u0351\7?\2\2\u034a")
+        buf.write(u"\u034c\5\u0095K\2\u034b\u034a\3\2\2\2\u034c\u034f\3\2")
+        buf.write(u"\2\2\u034d\u034e\3\2\2\2\u034d\u034b\3\2\2\2\u034e\u0350")
+        buf.write(u"\3\2\2\2\u034f\u034d\3\2\2\2\u0350\u0352\7(\2\2\u0351")
+        buf.write(u"\u034d\3\2\2\2\u0351\u0352\3\2\2\2\u0352\u0354\3\2\2")
+        buf.write(u"\2\u0353\u0346\3\2\2\2\u0353\u0349\3\2\2\2\u0354\u00a0")
+        buf.write(u"\3\2\2\2\u0355\u0356\7^\2\2\u0356\u0357\7p\2\2\u0357")
+        buf.write(u"\u0358\7g\2\2\u0358\u0359\7s\2\2\u0359\u00a2\3\2\2\2")
+        buf.write(u"\u035a\u035b\7>\2\2\u035b\u00a4\3\2\2\2\u035c\u035d\7")
+        buf.write(u"^\2\2\u035d\u035e\7n\2\2\u035e\u035f\7g\2\2\u035f\u0366")
+        buf.write(u"\7s\2\2\u0360\u0361\7^\2\2\u0361\u0362\7n\2\2\u0362\u0366")
+        buf.write(u"\7g\2\2\u0363\u0366\5\u00a7T\2\u0364\u0366\5\u00a9U\2")
+        buf.write(u"\u0365\u035c\3\2\2\2\u0365\u0360\3\2\2\2\u0365\u0363")
+        buf.write(u"\3\2\2\2\u0365\u0364\3\2\2\2\u0366\u00a6\3\2\2\2\u0367")
+        buf.write(u"\u0368\7^\2\2\u0368\u0369\7n\2\2\u0369\u036a\7g\2\2\u036a")
+        buf.write(u"\u036b\7s\2\2\u036b\u036c\7s\2\2\u036c\u00a8\3\2\2\2")
+        buf.write(u"\u036d\u036e\7^\2\2\u036e\u036f\7n\2\2\u036f\u0370\7")
+        buf.write(u"g\2\2\u0370\u0371\7s\2\2\u0371\u0372\7u\2\2\u0372\u0373")
+        buf.write(u"\7n\2\2\u0373\u0374\7c\2\2\u0374\u0375\7p\2\2\u0375\u0376")
+        buf.write(u"\7v\2\2\u0376\u00aa\3\2\2\2\u0377\u0378\7@\2\2\u0378")
+        buf.write(u"\u00ac\3\2\2\2\u0379\u037a\7^\2\2\u037a\u037b\7i\2\2")
+        buf.write(u"\u037b\u037c\7g\2\2\u037c\u0383\7s\2\2\u037d\u037e\7")
+        buf.write(u"^\2\2\u037e\u037f\7i\2\2\u037f\u0383\7g\2\2\u0380\u0383")
+        buf.write(u"\5\u00afX\2\u0381\u0383\5\u00b1Y\2\u0382\u0379\3\2\2")
+        buf.write(u"\2\u0382\u037d\3\2\2\2\u0382\u0380\3\2\2\2\u0382\u0381")
+        buf.write(u"\3\2\2\2\u0383\u00ae\3\2\2\2\u0384\u0385\7^\2\2\u0385")
+        buf.write(u"\u0386\7i\2\2\u0386\u0387\7g\2\2\u0387\u0388\7s\2\2\u0388")
+        buf.write(u"\u0389\7s\2\2\u0389\u00b0\3\2\2\2\u038a\u038b\7^\2\2")
+        buf.write(u"\u038b\u038c\7i\2\2\u038c\u038d\7g\2\2\u038d\u038e\7")
+        buf.write(u"s\2\2\u038e\u038f\7u\2\2\u038f\u0390\7n\2\2\u0390\u0391")
+        buf.write(u"\7c\2\2\u0391\u0392\7p\2\2\u0392\u0393\7v\2\2\u0393\u00b2")
+        buf.write(u"\3\2\2\2\u0394\u0395\7#\2\2\u0395\u00b4\3\2\2\2\u0396")
+        buf.write(u"\u0398\7^\2\2\u0397\u0399\t\3\2\2\u0398\u0397\3\2\2\2")
+        buf.write(u"\u0399\u039a\3\2\2\2\u039a\u0398\3\2\2\2\u039a\u039b")
+        buf.write(u"\3\2\2\2\u039b\u00b6\3\2\2\2\34\2\u00bc\u00cc\u00db\u00ec")
+        buf.write(u"\u0110\u0178\u01f3\u0204\u0308\u0310\u0312\u031b\u0324")
+        buf.write(u"\u032a\u0334\u033b\u033d\u0343\u0346\u034d\u0351\u0353")
+        buf.write(u"\u0365\u0382\u039a\3\b\2\2")
         return buf.getvalue()
 
 
@@ -544,10 +538,10 @@ class LaTeXLexer(Lexer):
             u"'\\arcsec'", u"'\\arccot'", u"'\\sinh'", u"'\\cosh'", u"'\\tanh'",
             u"'\\arsinh'", u"'\\arcosh'", u"'\\artanh'", u"'\\lfloor'",
             u"'\\rfloor'", u"'\\lceil'", u"'\\rceil'", u"'\\sqrt'", u"'\\overline'",
-            u"'\\times'", u"'\\cdot'", u"'\\div'", u"'\\binom'", u"'\\dbinom'",
-            u"'\\tbinom'", u"'\\mathit'", u"'_'", u"'^'", u"':'", u"'\\neq'",
-            u"'<'", u"'\\leqq'", u"'\\leqslant'", u"'>'", u"'\\geqq'", u"'\\geqslant'",
-            u"'!'" ]
+            u"'\\times'", u"'\\cdot'", u"'\\div'", u"'\\frac'", u"'\\binom'",
+            u"'\\dbinom'", u"'\\tbinom'", u"'\\mathit'", u"'_'", u"'^'",
+            u"':'", u"'\\neq'", u"'<'", u"'\\leqq'", u"'\\leqslant'", u"'>'",
+            u"'\\geqq'", u"'\\geqslant'", u"'!'" ]
 
     symbolicNames = [ u"<INVALID>",
             u"WS", u"THINSPACE", u"MEDSPACE", u"THICKSPACE", u"QUAD", u"QQUAD",
diff --git a/sympy/parsing/latex/_antlr/latexparser.py b/sympy/parsing/latex/_antlr/latexparser.py
index d1b9bc523c..89a38ac827 100644
--- a/sympy/parsing/latex/_antlr/latexparser.py
+++ b/sympy/parsing/latex/_antlr/latexparser.py
@@ -19,7 +19,7 @@
 def serializedATN():
     with StringIO() as buf:
         buf.write(u"\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3")
-        buf.write(u"Z\u01d3\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t")
+        buf.write(u"Z\u01d5\4\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t")
         buf.write(u"\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t\13\4\f\t\f\4\r\t\r")
         buf.write(u"\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22\4")
         buf.write(u"\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30")
@@ -42,202 +42,204 @@ def serializedATN():
         buf.write(u"\f\21\16\21\u00d7\13\21\3\22\3\22\3\22\3\22\3\22\3\22")
         buf.write(u"\3\22\3\22\3\22\3\22\5\22\u00e3\n\22\3\22\5\22\u00e6")
         buf.write(u"\n\22\7\22\u00e8\n\22\f\22\16\22\u00eb\13\22\3\23\3\23")
-        buf.write(u"\3\23\3\23\3\23\3\23\5\23\u00f3\n\23\3\24\3\24\3\24\3")
-        buf.write(u"\24\3\24\5\24\u00fa\n\24\3\25\3\25\3\25\3\25\3\25\3\25")
-        buf.write(u"\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\5")
-        buf.write(u"\25\u010c\n\25\3\26\3\26\3\26\3\26\3\27\3\27\5\27\u0114")
-        buf.write(u"\n\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\5\27\u011d\n")
-        buf.write(u"\27\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31\3\32\3\32")
-        buf.write(u"\3\32\3\32\3\32\3\33\7\33\u012d\n\33\f\33\16\33\u0130")
-        buf.write(u"\13\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3\35\3")
-        buf.write(u"\35\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\36")
-        buf.write(u"\3\37\3\37\3\37\3\37\3 \3 \3!\3!\5!\u014e\n!\3!\5!\u0151")
-        buf.write(u"\n!\3!\5!\u0154\n!\3!\5!\u0157\n!\5!\u0159\n!\3!\3!\3")
-        buf.write(u"!\3!\3!\5!\u0160\n!\3!\3!\5!\u0164\n!\3!\3!\3!\3!\3!")
-        buf.write(u"\3!\3!\3!\3!\3!\3!\5!\u0171\n!\3!\5!\u0174\n!\3!\3!\3")
-        buf.write(u"!\5!\u0179\n!\3!\3!\3!\3!\3!\5!\u0180\n!\3!\3!\3!\3!")
-        buf.write(u"\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u0192\n!\3!\3")
-        buf.write(u"!\3!\3!\3!\3!\5!\u019a\n!\3\"\3\"\3\"\3\"\3\"\5\"\u01a1")
-        buf.write(u"\n\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\5#\u01ac\n#\3#\3#\3$")
-        buf.write(u"\3$\3$\3$\3$\5$\u01b5\n$\3%\3%\3&\3&\3&\3&\3&\3&\5&\u01bf")
-        buf.write(u"\n&\3\'\3\'\3\'\3\'\3\'\3\'\5\'\u01c7\n\'\3(\3(\3(\3")
-        buf.write(u"(\3(\3)\3)\3)\3)\3)\3)\2\b\4\n\f\16 \"*\2\4\6\b\n\f\16")
-        buf.write(u"\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BD")
-        buf.write(u"FHJLNP\2\13\4\2ORUV\3\2\20\21\5\2\22\23ACKK\4\2MMZZ\3")
-        buf.write(u"\2\34\35\4\2\34\34\36\36\3\2EG\3\2&:\3\2$%\2\u01ed\2")
-        buf.write(u"R\3\2\2\2\4T\3\2\2\2\6_\3\2\2\2\bc\3\2\2\2\ne\3\2\2\2")
-        buf.write(u"\fp\3\2\2\2\16{\3\2\2\2\20\u008d\3\2\2\2\22\u0098\3\2")
-        buf.write(u"\2\2\24\u009a\3\2\2\2\26\u00a1\3\2\2\2\30\u00aa\3\2\2")
-        buf.write(u"\2\32\u00ac\3\2\2\2\34\u00b4\3\2\2\2\36\u00bc\3\2\2\2")
-        buf.write(u" \u00c4\3\2\2\2\"\u00d8\3\2\2\2$\u00f2\3\2\2\2&\u00f9")
-        buf.write(u"\3\2\2\2(\u010b\3\2\2\2*\u010d\3\2\2\2,\u011c\3\2\2\2")
-        buf.write(u".\u011e\3\2\2\2\60\u0122\3\2\2\2\62\u0126\3\2\2\2\64")
-        buf.write(u"\u012e\3\2\2\2\66\u0131\3\2\2\28\u0139\3\2\2\2:\u0141")
-        buf.write(u"\3\2\2\2<\u0145\3\2\2\2>\u0149\3\2\2\2@\u0199\3\2\2\2")
-        buf.write(u"B\u01a0\3\2\2\2D\u01a2\3\2\2\2F\u01b4\3\2\2\2H\u01b6")
-        buf.write(u"\3\2\2\2J\u01b8\3\2\2\2L\u01c0\3\2\2\2N\u01c8\3\2\2\2")
-        buf.write(u"P\u01cd\3\2\2\2RS\5\4\3\2S\3\3\2\2\2TU\b\3\1\2UV\5\b")
-        buf.write(u"\5\2V\\\3\2\2\2WX\f\4\2\2XY\t\2\2\2Y[\5\4\3\5ZW\3\2\2")
-        buf.write(u"\2[^\3\2\2\2\\Z\3\2\2\2\\]\3\2\2\2]\5\3\2\2\2^\\\3\2")
-        buf.write(u"\2\2_`\5\b\5\2`a\7O\2\2ab\5\b\5\2b\7\3\2\2\2cd\5\n\6")
-        buf.write(u"\2d\t\3\2\2\2ef\b\6\1\2fg\5\f\7\2gm\3\2\2\2hi\f\4\2\2")
-        buf.write(u"ij\t\3\2\2jl\5\n\6\5kh\3\2\2\2lo\3\2\2\2mk\3\2\2\2mn")
-        buf.write(u"\3\2\2\2n\13\3\2\2\2om\3\2\2\2pq\b\7\1\2qr\5\20\t\2r")
-        buf.write(u"x\3\2\2\2st\f\4\2\2tu\t\4\2\2uw\5\f\7\5vs\3\2\2\2wz\3")
-        buf.write(u"\2\2\2xv\3\2\2\2xy\3\2\2\2y\r\3\2\2\2zx\3\2\2\2{|\b\b")
-        buf.write(u"\1\2|}\5\22\n\2}\u0083\3\2\2\2~\177\f\4\2\2\177\u0080")
-        buf.write(u"\t\4\2\2\u0080\u0082\5\16\b\5\u0081~\3\2\2\2\u0082\u0085")
-        buf.write(u"\3\2\2\2\u0083\u0081\3\2\2\2\u0083\u0084\3\2\2\2\u0084")
-        buf.write(u"\17\3\2\2\2\u0085\u0083\3\2\2\2\u0086\u0087\t\3\2\2\u0087")
-        buf.write(u"\u008e\5\20\t\2\u0088\u008a\5\24\13\2\u0089\u0088\3\2")
-        buf.write(u"\2\2\u008a\u008b\3\2\2\2\u008b\u0089\3\2\2\2\u008b\u008c")
-        buf.write(u"\3\2\2\2\u008c\u008e\3\2\2\2\u008d\u0086\3\2\2\2\u008d")
-        buf.write(u"\u0089\3\2\2\2\u008e\21\3\2\2\2\u008f\u0090\t\3\2\2\u0090")
-        buf.write(u"\u0099\5\22\n\2\u0091\u0095\5\24\13\2\u0092\u0094\5\26")
-        buf.write(u"\f\2\u0093\u0092\3\2\2\2\u0094\u0097\3\2\2\2\u0095\u0093")
-        buf.write(u"\3\2\2\2\u0095\u0096\3\2\2\2\u0096\u0099\3\2\2\2\u0097")
-        buf.write(u"\u0095\3\2\2\2\u0098\u008f\3\2\2\2\u0098\u0091\3\2\2")
-        buf.write(u"\2\u0099\23\3\2\2\2\u009a\u009e\5 \21\2\u009b\u009d\5")
-        buf.write(u"\30\r\2\u009c\u009b\3\2\2\2\u009d\u00a0\3\2\2\2\u009e")
-        buf.write(u"\u009c\3\2\2\2\u009e\u009f\3\2\2\2\u009f\25\3\2\2\2\u00a0")
-        buf.write(u"\u009e\3\2\2\2\u00a1\u00a5\5\"\22\2\u00a2\u00a4\5\30")
-        buf.write(u"\r\2\u00a3\u00a2\3\2\2\2\u00a4\u00a7\3\2\2\2\u00a5\u00a3")
-        buf.write(u"\3\2\2\2\u00a5\u00a6\3\2\2\2\u00a6\27\3\2\2\2\u00a7\u00a5")
-        buf.write(u"\3\2\2\2\u00a8\u00ab\7Y\2\2\u00a9\u00ab\5\32\16\2\u00aa")
-        buf.write(u"\u00a8\3\2\2\2\u00aa\u00a9\3\2\2\2\u00ab\31\3\2\2\2\u00ac")
-        buf.write(u"\u00b2\7\34\2\2\u00ad\u00b3\5\36\20\2\u00ae\u00b3\5\34")
-        buf.write(u"\17\2\u00af\u00b0\5\36\20\2\u00b0\u00b1\5\34\17\2\u00b1")
-        buf.write(u"\u00b3\3\2\2\2\u00b2\u00ad\3\2\2\2\u00b2\u00ae\3\2\2")
-        buf.write(u"\2\u00b2\u00af\3\2\2\2\u00b3\33\3\2\2\2\u00b4\u00b5\7")
-        buf.write(u"I\2\2\u00b5\u00b8\7\26\2\2\u00b6\u00b9\5\b\5\2\u00b7")
-        buf.write(u"\u00b9\5\6\4\2\u00b8\u00b6\3\2\2\2\u00b8\u00b7\3\2\2")
-        buf.write(u"\2\u00b9\u00ba\3\2\2\2\u00ba\u00bb\7\27\2\2\u00bb\35")
-        buf.write(u"\3\2\2\2\u00bc\u00bd\7J\2\2\u00bd\u00c0\7\26\2\2\u00be")
-        buf.write(u"\u00c1\5\b\5\2\u00bf\u00c1\5\6\4\2\u00c0\u00be\3\2\2")
-        buf.write(u"\2\u00c0\u00bf\3\2\2\2\u00c1\u00c2\3\2\2\2\u00c2\u00c3")
-        buf.write(u"\7\27\2\2\u00c3\37\3\2\2\2\u00c4\u00c5\b\21\1\2\u00c5")
-        buf.write(u"\u00c6\5$\23\2\u00c6\u00d5\3\2\2\2\u00c7\u00c8\f\4\2")
-        buf.write(u"\2\u00c8\u00ce\7J\2\2\u00c9\u00cf\5,\27\2\u00ca\u00cb")
-        buf.write(u"\7\26\2\2\u00cb\u00cc\5\b\5\2\u00cc\u00cd\7\27\2\2\u00cd")
-        buf.write(u"\u00cf\3\2\2\2\u00ce\u00c9\3\2\2\2\u00ce\u00ca\3\2\2")
-        buf.write(u"\2\u00cf\u00d1\3\2\2\2\u00d0\u00d2\5J&\2\u00d1\u00d0")
-        buf.write(u"\3\2\2\2\u00d1\u00d2\3\2\2\2\u00d2\u00d4\3\2\2\2\u00d3")
-        buf.write(u"\u00c7\3\2\2\2\u00d4\u00d7\3\2\2\2\u00d5\u00d3\3\2\2")
-        buf.write(u"\2\u00d5\u00d6\3\2\2\2\u00d6!\3\2\2\2\u00d7\u00d5\3\2")
-        buf.write(u"\2\2\u00d8\u00d9\b\22\1\2\u00d9\u00da\5&\24\2\u00da\u00e9")
-        buf.write(u"\3\2\2\2\u00db\u00dc\f\4\2\2\u00dc\u00e2\7J\2\2\u00dd")
-        buf.write(u"\u00e3\5,\27\2\u00de\u00df\7\26\2\2\u00df\u00e0\5\b\5")
-        buf.write(u"\2\u00e0\u00e1\7\27\2\2\u00e1\u00e3\3\2\2\2\u00e2\u00dd")
-        buf.write(u"\3\2\2\2\u00e2\u00de\3\2\2\2\u00e3\u00e5\3\2\2\2\u00e4")
-        buf.write(u"\u00e6\5J&\2\u00e5\u00e4\3\2\2\2\u00e5\u00e6\3\2\2\2")
-        buf.write(u"\u00e6\u00e8\3\2\2\2\u00e7\u00db\3\2\2\2\u00e8\u00eb")
-        buf.write(u"\3\2\2\2\u00e9\u00e7\3\2\2\2\u00e9\u00ea\3\2\2\2\u00ea")
-        buf.write(u"#\3\2\2\2\u00eb\u00e9\3\2\2\2\u00ec\u00f3\5(\25\2\u00ed")
-        buf.write(u"\u00f3\5*\26\2\u00ee\u00f3\5@!\2\u00ef\u00f3\5,\27\2")
-        buf.write(u"\u00f0\u00f3\5:\36\2\u00f1\u00f3\5<\37\2\u00f2\u00ec")
-        buf.write(u"\3\2\2\2\u00f2\u00ed\3\2\2\2\u00f2\u00ee\3\2\2\2\u00f2")
-        buf.write(u"\u00ef\3\2\2\2\u00f2\u00f0\3\2\2\2\u00f2\u00f1\3\2\2")
-        buf.write(u"\2\u00f3%\3\2\2\2\u00f4\u00fa\5(\25\2\u00f5\u00fa\5*")
-        buf.write(u"\26\2\u00f6\u00fa\5,\27\2\u00f7\u00fa\5:\36\2\u00f8\u00fa")
-        buf.write(u"\5<\37\2\u00f9\u00f4\3\2\2\2\u00f9\u00f5\3\2\2\2\u00f9")
-        buf.write(u"\u00f6\3\2\2\2\u00f9\u00f7\3\2\2\2\u00f9\u00f8\3\2\2")
-        buf.write(u"\2\u00fa\'\3\2\2\2\u00fb\u00fc\7\24\2\2\u00fc\u00fd\5")
-        buf.write(u"\b\5\2\u00fd\u00fe\7\25\2\2\u00fe\u010c\3\2\2\2\u00ff")
-        buf.write(u"\u0100\7\32\2\2\u0100\u0101\5\b\5\2\u0101\u0102\7\33")
-        buf.write(u"\2\2\u0102\u010c\3\2\2\2\u0103\u0104\7\26\2\2\u0104\u0105")
-        buf.write(u"\5\b\5\2\u0105\u0106\7\27\2\2\u0106\u010c\3\2\2\2\u0107")
-        buf.write(u"\u0108\7\30\2\2\u0108\u0109\5\b\5\2\u0109\u010a\7\31")
-        buf.write(u"\2\2\u010a\u010c\3\2\2\2\u010b\u00fb\3\2\2\2\u010b\u00ff")
-        buf.write(u"\3\2\2\2\u010b\u0103\3\2\2\2\u010b\u0107\3\2\2\2\u010c")
-        buf.write(u")\3\2\2\2\u010d\u010e\7\34\2\2\u010e\u010f\5\b\5\2\u010f")
-        buf.write(u"\u0110\7\34\2\2\u0110+\3\2\2\2\u0111\u0113\t\5\2\2\u0112")
-        buf.write(u"\u0114\5J&\2\u0113\u0112\3\2\2\2\u0113\u0114\3\2\2\2")
-        buf.write(u"\u0114\u011d\3\2\2\2\u0115\u011d\7N\2\2\u0116\u011d\7")
-        buf.write(u"L\2\2\u0117\u011d\5\62\32\2\u0118\u011d\5\66\34\2\u0119")
-        buf.write(u"\u011d\58\35\2\u011a\u011d\5.\30\2\u011b\u011d\5\60\31")
-        buf.write(u"\2\u011c\u0111\3\2\2\2\u011c\u0115\3\2\2\2\u011c\u0116")
-        buf.write(u"\3\2\2\2\u011c\u0117\3\2\2\2\u011c\u0118\3\2\2\2\u011c")
-        buf.write(u"\u0119\3\2\2\2\u011c\u011a\3\2\2\2\u011c\u011b\3\2\2")
-        buf.write(u"\2\u011d-\3\2\2\2\u011e\u011f\7\37\2\2\u011f\u0120\5")
-        buf.write(u"\b\5\2\u0120\u0121\t\6\2\2\u0121/\3\2\2\2\u0122\u0123")
-        buf.write(u"\t\7\2\2\u0123\u0124\5\b\5\2\u0124\u0125\7 \2\2\u0125")
-        buf.write(u"\61\3\2\2\2\u0126\u0127\7H\2\2\u0127\u0128\7\26\2\2\u0128")
-        buf.write(u"\u0129\5\64\33\2\u0129\u012a\7\27\2\2\u012a\63\3\2\2")
-        buf.write(u"\2\u012b\u012d\7M\2\2\u012c\u012b\3\2\2\2\u012d\u0130")
-        buf.write(u"\3\2\2\2\u012e\u012c\3\2\2\2\u012e\u012f\3\2\2\2\u012f")
-        buf.write(u"\65\3\2\2\2\u0130\u012e\3\2\2\2\u0131\u0132\7D\2\2\u0132")
-        buf.write(u"\u0133\7\26\2\2\u0133\u0134\5\b\5\2\u0134\u0135\7\27")
-        buf.write(u"\2\2\u0135\u0136\7\26\2\2\u0136\u0137\5\b\5\2\u0137\u0138")
-        buf.write(u"\7\27\2\2\u0138\67\3\2\2\2\u0139\u013a\t\b\2\2\u013a")
-        buf.write(u"\u013b\7\26\2\2\u013b\u013c\5\b\5\2\u013c\u013d\7\27")
-        buf.write(u"\2\2\u013d\u013e\7\26\2\2\u013e\u013f\5\b\5\2\u013f\u0140")
-        buf.write(u"\7\27\2\2\u01409\3\2\2\2\u0141\u0142\7;\2\2\u0142\u0143")
-        buf.write(u"\5\b\5\2\u0143\u0144\7<\2\2\u0144;\3\2\2\2\u0145\u0146")
-        buf.write(u"\7=\2\2\u0146\u0147\5\b\5\2\u0147\u0148\7>\2\2\u0148")
-        buf.write(u"=\3\2\2\2\u0149\u014a\t\t\2\2\u014a?\3\2\2\2\u014b\u0158")
-        buf.write(u"\5> \2\u014c\u014e\5J&\2\u014d\u014c\3\2\2\2\u014d\u014e")
-        buf.write(u"\3\2\2\2\u014e\u0150\3\2\2\2\u014f\u0151\5L\'\2\u0150")
-        buf.write(u"\u014f\3\2\2\2\u0150\u0151\3\2\2\2\u0151\u0159\3\2\2")
-        buf.write(u"\2\u0152\u0154\5L\'\2\u0153\u0152\3\2\2\2\u0153\u0154")
-        buf.write(u"\3\2\2\2\u0154\u0156\3\2\2\2\u0155\u0157\5J&\2\u0156")
-        buf.write(u"\u0155\3\2\2\2\u0156\u0157\3\2\2\2\u0157\u0159\3\2\2")
-        buf.write(u"\2\u0158\u014d\3\2\2\2\u0158\u0153\3\2\2\2\u0159\u015f")
-        buf.write(u"\3\2\2\2\u015a\u015b\7\24\2\2\u015b\u015c\5F$\2\u015c")
-        buf.write(u"\u015d\7\25\2\2\u015d\u0160\3\2\2\2\u015e\u0160\5H%\2")
-        buf.write(u"\u015f\u015a\3\2\2\2\u015f\u015e\3\2\2\2\u0160\u019a")
-        buf.write(u"\3\2\2\2\u0161\u0163\t\5\2\2\u0162\u0164\5J&\2\u0163")
-        buf.write(u"\u0162\3\2\2\2\u0163\u0164\3\2\2\2\u0164\u0165\3\2\2")
-        buf.write(u"\2\u0165\u0166\7\24\2\2\u0166\u0167\5B\"\2\u0167\u0168")
-        buf.write(u"\7\25\2\2\u0168\u019a\3\2\2\2\u0169\u0170\7#\2\2\u016a")
-        buf.write(u"\u016b\5J&\2\u016b\u016c\5L\'\2\u016c\u0171\3\2\2\2\u016d")
-        buf.write(u"\u016e\5L\'\2\u016e\u016f\5J&\2\u016f\u0171\3\2\2\2\u0170")
-        buf.write(u"\u016a\3\2\2\2\u0170\u016d\3\2\2\2\u0170\u0171\3\2\2")
-        buf.write(u"\2\u0171\u0178\3\2\2\2\u0172\u0174\5\n\6\2\u0173\u0172")
-        buf.write(u"\3\2\2\2\u0173\u0174\3\2\2\2\u0174\u0175\3\2\2\2\u0175")
-        buf.write(u"\u0179\7L\2\2\u0176\u0179\5\66\34\2\u0177\u0179\5\n\6")
-        buf.write(u"\2\u0178\u0173\3\2\2\2\u0178\u0176\3\2\2\2\u0178\u0177")
-        buf.write(u"\3\2\2\2\u0179\u019a\3\2\2\2\u017a\u017f\7?\2\2\u017b")
-        buf.write(u"\u017c\7\32\2\2\u017c\u017d\5\b\5\2\u017d\u017e\7\33")
-        buf.write(u"\2\2\u017e\u0180\3\2\2\2\u017f\u017b\3\2\2\2\u017f\u0180")
-        buf.write(u"\3\2\2\2\u0180\u0181\3\2\2\2\u0181\u0182\7\26\2\2\u0182")
-        buf.write(u"\u0183\5\b\5\2\u0183\u0184\7\27\2\2\u0184\u019a\3\2\2")
-        buf.write(u"\2\u0185\u0186\7@\2\2\u0186\u0187\7\26\2\2\u0187\u0188")
-        buf.write(u"\5\b\5\2\u0188\u0189\7\27\2\2\u0189\u019a\3\2\2\2\u018a")
-        buf.write(u"\u0191\t\n\2\2\u018b\u018c\5N(\2\u018c\u018d\5L\'\2\u018d")
-        buf.write(u"\u0192\3\2\2\2\u018e\u018f\5L\'\2\u018f\u0190\5N(\2\u0190")
-        buf.write(u"\u0192\3\2\2\2\u0191\u018b\3\2\2\2\u0191\u018e\3\2\2")
-        buf.write(u"\2\u0192\u0193\3\2\2\2\u0193\u0194\5\f\7\2\u0194\u019a")
-        buf.write(u"\3\2\2\2\u0195\u0196\7!\2\2\u0196\u0197\5D#\2\u0197\u0198")
-        buf.write(u"\5\f\7\2\u0198\u019a\3\2\2\2\u0199\u014b\3\2\2\2\u0199")
-        buf.write(u"\u0161\3\2\2\2\u0199\u0169\3\2\2\2\u0199\u017a\3\2\2")
-        buf.write(u"\2\u0199\u0185\3\2\2\2\u0199\u018a\3\2\2\2\u0199\u0195")
-        buf.write(u"\3\2\2\2\u019aA\3\2\2\2\u019b\u019c\5\b\5\2\u019c\u019d")
-        buf.write(u"\7\3\2\2\u019d\u019e\5B\"\2\u019e\u01a1\3\2\2\2\u019f")
-        buf.write(u"\u01a1\5\b\5\2\u01a0\u019b\3\2\2\2\u01a0\u019f\3\2\2")
-        buf.write(u"\2\u01a1C\3\2\2\2\u01a2\u01a3\7I\2\2\u01a3\u01a4\7\26")
-        buf.write(u"\2\2\u01a4\u01a5\t\5\2\2\u01a5\u01a6\7\"\2\2\u01a6\u01ab")
-        buf.write(u"\5\b\5\2\u01a7\u01a8\7J\2\2\u01a8\u01a9\7\26\2\2\u01a9")
-        buf.write(u"\u01aa\t\3\2\2\u01aa\u01ac\7\27\2\2\u01ab\u01a7\3\2\2")
-        buf.write(u"\2\u01ab\u01ac\3\2\2\2\u01ac\u01ad\3\2\2\2\u01ad\u01ae")
-        buf.write(u"\7\27\2\2\u01aeE\3\2\2\2\u01af\u01b5\5\b\5\2\u01b0\u01b1")
-        buf.write(u"\5\b\5\2\u01b1\u01b2\7\3\2\2\u01b2\u01b3\5F$\2\u01b3")
-        buf.write(u"\u01b5\3\2\2\2\u01b4\u01af\3\2\2\2\u01b4\u01b0\3\2\2")
-        buf.write(u"\2\u01b5G\3\2\2\2\u01b6\u01b7\5\16\b\2\u01b7I\3\2\2\2")
-        buf.write(u"\u01b8\u01be\7I\2\2\u01b9\u01bf\5,\27\2\u01ba\u01bb\7")
-        buf.write(u"\26\2\2\u01bb\u01bc\5\b\5\2\u01bc\u01bd\7\27\2\2\u01bd")
-        buf.write(u"\u01bf\3\2\2\2\u01be\u01b9\3\2\2\2\u01be\u01ba\3\2\2")
-        buf.write(u"\2\u01bfK\3\2\2\2\u01c0\u01c6\7J\2\2\u01c1\u01c7\5,\27")
-        buf.write(u"\2\u01c2\u01c3\7\26\2\2\u01c3\u01c4\5\b\5\2\u01c4\u01c5")
-        buf.write(u"\7\27\2\2\u01c5\u01c7\3\2\2\2\u01c6\u01c1\3\2\2\2\u01c6")
-        buf.write(u"\u01c2\3\2\2\2\u01c7M\3\2\2\2\u01c8\u01c9\7I\2\2\u01c9")
-        buf.write(u"\u01ca\7\26\2\2\u01ca\u01cb\5\6\4\2\u01cb\u01cc\7\27")
-        buf.write(u"\2\2\u01ccO\3\2\2\2\u01cd\u01ce\7I\2\2\u01ce\u01cf\7")
-        buf.write(u"\26\2\2\u01cf\u01d0\5\6\4\2\u01d0\u01d1\7\27\2\2\u01d1")
+        buf.write(u"\3\23\3\23\3\23\3\23\3\23\3\23\5\23\u00f5\n\23\3\24\3")
+        buf.write(u"\24\3\24\3\24\3\24\3\24\3\24\5\24\u00fe\n\24\3\25\3\25")
+        buf.write(u"\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3\25\3")
+        buf.write(u"\25\3\25\3\25\3\25\5\25\u0110\n\25\3\26\3\26\3\26\3\26")
+        buf.write(u"\3\27\3\27\5\27\u0118\n\27\3\27\3\27\3\27\3\27\3\27\5")
+        buf.write(u"\27\u011f\n\27\3\30\3\30\3\30\3\30\3\31\3\31\3\31\3\31")
+        buf.write(u"\3\32\3\32\3\32\3\32\3\32\3\33\7\33\u012f\n\33\f\33\16")
+        buf.write(u"\33\u0132\13\33\3\34\3\34\3\34\3\34\3\34\3\34\3\34\3")
+        buf.write(u"\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3\36\3\36")
+        buf.write(u"\3\36\3\36\3\37\3\37\3\37\3\37\3 \3 \3!\3!\5!\u0150\n")
+        buf.write(u"!\3!\5!\u0153\n!\3!\5!\u0156\n!\3!\5!\u0159\n!\5!\u015b")
+        buf.write(u"\n!\3!\3!\3!\3!\3!\5!\u0162\n!\3!\3!\5!\u0166\n!\3!\3")
+        buf.write(u"!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u0173\n!\3!\5!\u0176")
+        buf.write(u"\n!\3!\3!\3!\5!\u017b\n!\3!\3!\3!\3!\3!\5!\u0182\n!\3")
+        buf.write(u"!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\3!\5!\u0194")
+        buf.write(u"\n!\3!\3!\3!\3!\3!\3!\5!\u019c\n!\3\"\3\"\3\"\3\"\3\"")
+        buf.write(u"\5\"\u01a3\n\"\3#\3#\3#\3#\3#\3#\3#\3#\3#\5#\u01ae\n")
+        buf.write(u"#\3#\3#\3$\3$\3$\3$\3$\5$\u01b7\n$\3%\3%\3&\3&\3&\3&")
+        buf.write(u"\3&\3&\5&\u01c1\n&\3\'\3\'\3\'\3\'\3\'\3\'\5\'\u01c9")
+        buf.write(u"\n\'\3(\3(\3(\3(\3(\3)\3)\3)\3)\3)\3)\2\b\4\n\f\16 \"")
+        buf.write(u"*\2\4\6\b\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60")
+        buf.write(u"\62\64\668:<>@BDFHJLNP\2\13\4\2ORUV\3\2\20\21\5\2\22")
+        buf.write(u"\23ACKK\4\2MMZZ\3\2\34\35\4\2\34\34\36\36\3\2EG\3\2&")
+        buf.write(u":\3\2$%\2\u01f1\2R\3\2\2\2\4T\3\2\2\2\6_\3\2\2\2\bc\3")
+        buf.write(u"\2\2\2\ne\3\2\2\2\fp\3\2\2\2\16{\3\2\2\2\20\u008d\3\2")
+        buf.write(u"\2\2\22\u0098\3\2\2\2\24\u009a\3\2\2\2\26\u00a1\3\2\2")
+        buf.write(u"\2\30\u00aa\3\2\2\2\32\u00ac\3\2\2\2\34\u00b4\3\2\2\2")
+        buf.write(u"\36\u00bc\3\2\2\2 \u00c4\3\2\2\2\"\u00d8\3\2\2\2$\u00f4")
+        buf.write(u"\3\2\2\2&\u00fd\3\2\2\2(\u010f\3\2\2\2*\u0111\3\2\2\2")
+        buf.write(u",\u011e\3\2\2\2.\u0120\3\2\2\2\60\u0124\3\2\2\2\62\u0128")
+        buf.write(u"\3\2\2\2\64\u0130\3\2\2\2\66\u0133\3\2\2\28\u013b\3\2")
+        buf.write(u"\2\2:\u0143\3\2\2\2<\u0147\3\2\2\2>\u014b\3\2\2\2@\u019b")
+        buf.write(u"\3\2\2\2B\u01a2\3\2\2\2D\u01a4\3\2\2\2F\u01b6\3\2\2\2")
+        buf.write(u"H\u01b8\3\2\2\2J\u01ba\3\2\2\2L\u01c2\3\2\2\2N\u01ca")
+        buf.write(u"\3\2\2\2P\u01cf\3\2\2\2RS\5\4\3\2S\3\3\2\2\2TU\b\3\1")
+        buf.write(u"\2UV\5\b\5\2V\\\3\2\2\2WX\f\4\2\2XY\t\2\2\2Y[\5\4\3\5")
+        buf.write(u"ZW\3\2\2\2[^\3\2\2\2\\Z\3\2\2\2\\]\3\2\2\2]\5\3\2\2\2")
+        buf.write(u"^\\\3\2\2\2_`\5\b\5\2`a\7O\2\2ab\5\b\5\2b\7\3\2\2\2c")
+        buf.write(u"d\5\n\6\2d\t\3\2\2\2ef\b\6\1\2fg\5\f\7\2gm\3\2\2\2hi")
+        buf.write(u"\f\4\2\2ij\t\3\2\2jl\5\n\6\5kh\3\2\2\2lo\3\2\2\2mk\3")
+        buf.write(u"\2\2\2mn\3\2\2\2n\13\3\2\2\2om\3\2\2\2pq\b\7\1\2qr\5")
+        buf.write(u"\20\t\2rx\3\2\2\2st\f\4\2\2tu\t\4\2\2uw\5\f\7\5vs\3\2")
+        buf.write(u"\2\2wz\3\2\2\2xv\3\2\2\2xy\3\2\2\2y\r\3\2\2\2zx\3\2\2")
+        buf.write(u"\2{|\b\b\1\2|}\5\22\n\2}\u0083\3\2\2\2~\177\f\4\2\2\177")
+        buf.write(u"\u0080\t\4\2\2\u0080\u0082\5\16\b\5\u0081~\3\2\2\2\u0082")
+        buf.write(u"\u0085\3\2\2\2\u0083\u0081\3\2\2\2\u0083\u0084\3\2\2")
+        buf.write(u"\2\u0084\17\3\2\2\2\u0085\u0083\3\2\2\2\u0086\u0087\t")
+        buf.write(u"\3\2\2\u0087\u008e\5\20\t\2\u0088\u008a\5\24\13\2\u0089")
+        buf.write(u"\u0088\3\2\2\2\u008a\u008b\3\2\2\2\u008b\u0089\3\2\2")
+        buf.write(u"\2\u008b\u008c\3\2\2\2\u008c\u008e\3\2\2\2\u008d\u0086")
+        buf.write(u"\3\2\2\2\u008d\u0089\3\2\2\2\u008e\21\3\2\2\2\u008f\u0090")
+        buf.write(u"\t\3\2\2\u0090\u0099\5\22\n\2\u0091\u0095\5\24\13\2\u0092")
+        buf.write(u"\u0094\5\26\f\2\u0093\u0092\3\2\2\2\u0094\u0097\3\2\2")
+        buf.write(u"\2\u0095\u0093\3\2\2\2\u0095\u0096\3\2\2\2\u0096\u0099")
+        buf.write(u"\3\2\2\2\u0097\u0095\3\2\2\2\u0098\u008f\3\2\2\2\u0098")
+        buf.write(u"\u0091\3\2\2\2\u0099\23\3\2\2\2\u009a\u009e\5 \21\2\u009b")
+        buf.write(u"\u009d\5\30\r\2\u009c\u009b\3\2\2\2\u009d\u00a0\3\2\2")
+        buf.write(u"\2\u009e\u009c\3\2\2\2\u009e\u009f\3\2\2\2\u009f\25\3")
+        buf.write(u"\2\2\2\u00a0\u009e\3\2\2\2\u00a1\u00a5\5\"\22\2\u00a2")
+        buf.write(u"\u00a4\5\30\r\2\u00a3\u00a2\3\2\2\2\u00a4\u00a7\3\2\2")
+        buf.write(u"\2\u00a5\u00a3\3\2\2\2\u00a5\u00a6\3\2\2\2\u00a6\27\3")
+        buf.write(u"\2\2\2\u00a7\u00a5\3\2\2\2\u00a8\u00ab\7Y\2\2\u00a9\u00ab")
+        buf.write(u"\5\32\16\2\u00aa\u00a8\3\2\2\2\u00aa\u00a9\3\2\2\2\u00ab")
+        buf.write(u"\31\3\2\2\2\u00ac\u00b2\7\34\2\2\u00ad\u00b3\5\36\20")
+        buf.write(u"\2\u00ae\u00b3\5\34\17\2\u00af\u00b0\5\36\20\2\u00b0")
+        buf.write(u"\u00b1\5\34\17\2\u00b1\u00b3\3\2\2\2\u00b2\u00ad\3\2")
+        buf.write(u"\2\2\u00b2\u00ae\3\2\2\2\u00b2\u00af\3\2\2\2\u00b3\33")
+        buf.write(u"\3\2\2\2\u00b4\u00b5\7I\2\2\u00b5\u00b8\7\26\2\2\u00b6")
+        buf.write(u"\u00b9\5\b\5\2\u00b7\u00b9\5\6\4\2\u00b8\u00b6\3\2\2")
+        buf.write(u"\2\u00b8\u00b7\3\2\2\2\u00b9\u00ba\3\2\2\2\u00ba\u00bb")
+        buf.write(u"\7\27\2\2\u00bb\35\3\2\2\2\u00bc\u00bd\7J\2\2\u00bd\u00c0")
+        buf.write(u"\7\26\2\2\u00be\u00c1\5\b\5\2\u00bf\u00c1\5\6\4\2\u00c0")
+        buf.write(u"\u00be\3\2\2\2\u00c0\u00bf\3\2\2\2\u00c1\u00c2\3\2\2")
+        buf.write(u"\2\u00c2\u00c3\7\27\2\2\u00c3\37\3\2\2\2\u00c4\u00c5")
+        buf.write(u"\b\21\1\2\u00c5\u00c6\5$\23\2\u00c6\u00d5\3\2\2\2\u00c7")
+        buf.write(u"\u00c8\f\4\2\2\u00c8\u00ce\7J\2\2\u00c9\u00cf\5,\27\2")
+        buf.write(u"\u00ca\u00cb\7\26\2\2\u00cb\u00cc\5\b\5\2\u00cc\u00cd")
+        buf.write(u"\7\27\2\2\u00cd\u00cf\3\2\2\2\u00ce\u00c9\3\2\2\2\u00ce")
+        buf.write(u"\u00ca\3\2\2\2\u00cf\u00d1\3\2\2\2\u00d0\u00d2\5J&\2")
+        buf.write(u"\u00d1\u00d0\3\2\2\2\u00d1\u00d2\3\2\2\2\u00d2\u00d4")
+        buf.write(u"\3\2\2\2\u00d3\u00c7\3\2\2\2\u00d4\u00d7\3\2\2\2\u00d5")
+        buf.write(u"\u00d3\3\2\2\2\u00d5\u00d6\3\2\2\2\u00d6!\3\2\2\2\u00d7")
+        buf.write(u"\u00d5\3\2\2\2\u00d8\u00d9\b\22\1\2\u00d9\u00da\5&\24")
+        buf.write(u"\2\u00da\u00e9\3\2\2\2\u00db\u00dc\f\4\2\2\u00dc\u00e2")
+        buf.write(u"\7J\2\2\u00dd\u00e3\5,\27\2\u00de\u00df\7\26\2\2\u00df")
+        buf.write(u"\u00e0\5\b\5\2\u00e0\u00e1\7\27\2\2\u00e1\u00e3\3\2\2")
+        buf.write(u"\2\u00e2\u00dd\3\2\2\2\u00e2\u00de\3\2\2\2\u00e3\u00e5")
+        buf.write(u"\3\2\2\2\u00e4\u00e6\5J&\2\u00e5\u00e4\3\2\2\2\u00e5")
+        buf.write(u"\u00e6\3\2\2\2\u00e6\u00e8\3\2\2\2\u00e7\u00db\3\2\2")
+        buf.write(u"\2\u00e8\u00eb\3\2\2\2\u00e9\u00e7\3\2\2\2\u00e9\u00ea")
+        buf.write(u"\3\2\2\2\u00ea#\3\2\2\2\u00eb\u00e9\3\2\2\2\u00ec\u00f5")
+        buf.write(u"\5(\25\2\u00ed\u00f5\5*\26\2\u00ee\u00f5\5@!\2\u00ef")
+        buf.write(u"\u00f5\5,\27\2\u00f0\u00f5\5\66\34\2\u00f1\u00f5\58\35")
+        buf.write(u"\2\u00f2\u00f5\5:\36\2\u00f3\u00f5\5<\37\2\u00f4\u00ec")
+        buf.write(u"\3\2\2\2\u00f4\u00ed\3\2\2\2\u00f4\u00ee\3\2\2\2\u00f4")
+        buf.write(u"\u00ef\3\2\2\2\u00f4\u00f0\3\2\2\2\u00f4\u00f1\3\2\2")
+        buf.write(u"\2\u00f4\u00f2\3\2\2\2\u00f4\u00f3\3\2\2\2\u00f5%\3\2")
+        buf.write(u"\2\2\u00f6\u00fe\5(\25\2\u00f7\u00fe\5*\26\2\u00f8\u00fe")
+        buf.write(u"\5,\27\2\u00f9\u00fe\5\66\34\2\u00fa\u00fe\58\35\2\u00fb")
+        buf.write(u"\u00fe\5:\36\2\u00fc\u00fe\5<\37\2\u00fd\u00f6\3\2\2")
+        buf.write(u"\2\u00fd\u00f7\3\2\2\2\u00fd\u00f8\3\2\2\2\u00fd\u00f9")
+        buf.write(u"\3\2\2\2\u00fd\u00fa\3\2\2\2\u00fd\u00fb\3\2\2\2\u00fd")
+        buf.write(u"\u00fc\3\2\2\2\u00fe\'\3\2\2\2\u00ff\u0100\7\24\2\2\u0100")
+        buf.write(u"\u0101\5\b\5\2\u0101\u0102\7\25\2\2\u0102\u0110\3\2\2")
+        buf.write(u"\2\u0103\u0104\7\32\2\2\u0104\u0105\5\b\5\2\u0105\u0106")
+        buf.write(u"\7\33\2\2\u0106\u0110\3\2\2\2\u0107\u0108\7\26\2\2\u0108")
+        buf.write(u"\u0109\5\b\5\2\u0109\u010a\7\27\2\2\u010a\u0110\3\2\2")
+        buf.write(u"\2\u010b\u010c\7\30\2\2\u010c\u010d\5\b\5\2\u010d\u010e")
+        buf.write(u"\7\31\2\2\u010e\u0110\3\2\2\2\u010f\u00ff\3\2\2\2\u010f")
+        buf.write(u"\u0103\3\2\2\2\u010f\u0107\3\2\2\2\u010f\u010b\3\2\2")
+        buf.write(u"\2\u0110)\3\2\2\2\u0111\u0112\7\34\2\2\u0112\u0113\5")
+        buf.write(u"\b\5\2\u0113\u0114\7\34\2\2\u0114+\3\2\2\2\u0115\u0117")
+        buf.write(u"\t\5\2\2\u0116\u0118\5J&\2\u0117\u0116\3\2\2\2\u0117")
+        buf.write(u"\u0118\3\2\2\2\u0118\u011f\3\2\2\2\u0119\u011f\7N\2\2")
+        buf.write(u"\u011a\u011f\7L\2\2\u011b\u011f\5\62\32\2\u011c\u011f")
+        buf.write(u"\5.\30\2\u011d\u011f\5\60\31\2\u011e\u0115\3\2\2\2\u011e")
+        buf.write(u"\u0119\3\2\2\2\u011e\u011a\3\2\2\2\u011e\u011b\3\2\2")
+        buf.write(u"\2\u011e\u011c\3\2\2\2\u011e\u011d\3\2\2\2\u011f-\3\2")
+        buf.write(u"\2\2\u0120\u0121\7\37\2\2\u0121\u0122\5\b\5\2\u0122\u0123")
+        buf.write(u"\t\6\2\2\u0123/\3\2\2\2\u0124\u0125\t\7\2\2\u0125\u0126")
+        buf.write(u"\5\b\5\2\u0126\u0127\7 \2\2\u0127\61\3\2\2\2\u0128\u0129")
+        buf.write(u"\7H\2\2\u0129\u012a\7\26\2\2\u012a\u012b\5\64\33\2\u012b")
+        buf.write(u"\u012c\7\27\2\2\u012c\63\3\2\2\2\u012d\u012f\7M\2\2\u012e")
+        buf.write(u"\u012d\3\2\2\2\u012f\u0132\3\2\2\2\u0130\u012e\3\2\2")
+        buf.write(u"\2\u0130\u0131\3\2\2\2\u0131\65\3\2\2\2\u0132\u0130\3")
+        buf.write(u"\2\2\2\u0133\u0134\7D\2\2\u0134\u0135\7\26\2\2\u0135")
+        buf.write(u"\u0136\5\b\5\2\u0136\u0137\7\27\2\2\u0137\u0138\7\26")
+        buf.write(u"\2\2\u0138\u0139\5\b\5\2\u0139\u013a\7\27\2\2\u013a\67")
+        buf.write(u"\3\2\2\2\u013b\u013c\t\b\2\2\u013c\u013d\7\26\2\2\u013d")
+        buf.write(u"\u013e\5\b\5\2\u013e\u013f\7\27\2\2\u013f\u0140\7\26")
+        buf.write(u"\2\2\u0140\u0141\5\b\5\2\u0141\u0142\7\27\2\2\u01429")
+        buf.write(u"\3\2\2\2\u0143\u0144\7;\2\2\u0144\u0145\5\b\5\2\u0145")
+        buf.write(u"\u0146\7<\2\2\u0146;\3\2\2\2\u0147\u0148\7=\2\2\u0148")
+        buf.write(u"\u0149\5\b\5\2\u0149\u014a\7>\2\2\u014a=\3\2\2\2\u014b")
+        buf.write(u"\u014c\t\t\2\2\u014c?\3\2\2\2\u014d\u015a\5> \2\u014e")
+        buf.write(u"\u0150\5J&\2\u014f\u014e\3\2\2\2\u014f\u0150\3\2\2\2")
+        buf.write(u"\u0150\u0152\3\2\2\2\u0151\u0153\5L\'\2\u0152\u0151\3")
+        buf.write(u"\2\2\2\u0152\u0153\3\2\2\2\u0153\u015b\3\2\2\2\u0154")
+        buf.write(u"\u0156\5L\'\2\u0155\u0154\3\2\2\2\u0155\u0156\3\2\2\2")
+        buf.write(u"\u0156\u0158\3\2\2\2\u0157\u0159\5J&\2\u0158\u0157\3")
+        buf.write(u"\2\2\2\u0158\u0159\3\2\2\2\u0159\u015b\3\2\2\2\u015a")
+        buf.write(u"\u014f\3\2\2\2\u015a\u0155\3\2\2\2\u015b\u0161\3\2\2")
+        buf.write(u"\2\u015c\u015d\7\24\2\2\u015d\u015e\5F$\2\u015e\u015f")
+        buf.write(u"\7\25\2\2\u015f\u0162\3\2\2\2\u0160\u0162\5H%\2\u0161")
+        buf.write(u"\u015c\3\2\2\2\u0161\u0160\3\2\2\2\u0162\u019c\3\2\2")
+        buf.write(u"\2\u0163\u0165\t\5\2\2\u0164\u0166\5J&\2\u0165\u0164")
+        buf.write(u"\3\2\2\2\u0165\u0166\3\2\2\2\u0166\u0167\3\2\2\2\u0167")
+        buf.write(u"\u0168\7\24\2\2\u0168\u0169\5B\"\2\u0169\u016a\7\25\2")
+        buf.write(u"\2\u016a\u019c\3\2\2\2\u016b\u0172\7#\2\2\u016c\u016d")
+        buf.write(u"\5J&\2\u016d\u016e\5L\'\2\u016e\u0173\3\2\2\2\u016f\u0170")
+        buf.write(u"\5L\'\2\u0170\u0171\5J&\2\u0171\u0173\3\2\2\2\u0172\u016c")
+        buf.write(u"\3\2\2\2\u0172\u016f\3\2\2\2\u0172\u0173\3\2\2\2\u0173")
+        buf.write(u"\u017a\3\2\2\2\u0174\u0176\5\n\6\2\u0175\u0174\3\2\2")
+        buf.write(u"\2\u0175\u0176\3\2\2\2\u0176\u0177\3\2\2\2\u0177\u017b")
+        buf.write(u"\7L\2\2\u0178\u017b\5\66\34\2\u0179\u017b\5\n\6\2\u017a")
+        buf.write(u"\u0175\3\2\2\2\u017a\u0178\3\2\2\2\u017a\u0179\3\2\2")
+        buf.write(u"\2\u017b\u019c\3\2\2\2\u017c\u0181\7?\2\2\u017d\u017e")
+        buf.write(u"\7\32\2\2\u017e\u017f\5\b\5\2\u017f\u0180\7\33\2\2\u0180")
+        buf.write(u"\u0182\3\2\2\2\u0181\u017d\3\2\2\2\u0181\u0182\3\2\2")
+        buf.write(u"\2\u0182\u0183\3\2\2\2\u0183\u0184\7\26\2\2\u0184\u0185")
+        buf.write(u"\5\b\5\2\u0185\u0186\7\27\2\2\u0186\u019c\3\2\2\2\u0187")
+        buf.write(u"\u0188\7@\2\2\u0188\u0189\7\26\2\2\u0189\u018a\5\b\5")
+        buf.write(u"\2\u018a\u018b\7\27\2\2\u018b\u019c\3\2\2\2\u018c\u0193")
+        buf.write(u"\t\n\2\2\u018d\u018e\5N(\2\u018e\u018f\5L\'\2\u018f\u0194")
+        buf.write(u"\3\2\2\2\u0190\u0191\5L\'\2\u0191\u0192\5N(\2\u0192\u0194")
+        buf.write(u"\3\2\2\2\u0193\u018d\3\2\2\2\u0193\u0190\3\2\2\2\u0194")
+        buf.write(u"\u0195\3\2\2\2\u0195\u0196\5\f\7\2\u0196\u019c\3\2\2")
+        buf.write(u"\2\u0197\u0198\7!\2\2\u0198\u0199\5D#\2\u0199\u019a\5")
+        buf.write(u"\f\7\2\u019a\u019c\3\2\2\2\u019b\u014d\3\2\2\2\u019b")
+        buf.write(u"\u0163\3\2\2\2\u019b\u016b\3\2\2\2\u019b\u017c\3\2\2")
+        buf.write(u"\2\u019b\u0187\3\2\2\2\u019b\u018c\3\2\2\2\u019b\u0197")
+        buf.write(u"\3\2\2\2\u019cA\3\2\2\2\u019d\u019e\5\b\5\2\u019e\u019f")
+        buf.write(u"\7\3\2\2\u019f\u01a0\5B\"\2\u01a0\u01a3\3\2\2\2\u01a1")
+        buf.write(u"\u01a3\5\b\5\2\u01a2\u019d\3\2\2\2\u01a2\u01a1\3\2\2")
+        buf.write(u"\2\u01a3C\3\2\2\2\u01a4\u01a5\7I\2\2\u01a5\u01a6\7\26")
+        buf.write(u"\2\2\u01a6\u01a7\t\5\2\2\u01a7\u01a8\7\"\2\2\u01a8\u01ad")
+        buf.write(u"\5\b\5\2\u01a9\u01aa\7J\2\2\u01aa\u01ab\7\26\2\2\u01ab")
+        buf.write(u"\u01ac\t\3\2\2\u01ac\u01ae\7\27\2\2\u01ad\u01a9\3\2\2")
+        buf.write(u"\2\u01ad\u01ae\3\2\2\2\u01ae\u01af\3\2\2\2\u01af\u01b0")
+        buf.write(u"\7\27\2\2\u01b0E\3\2\2\2\u01b1\u01b7\5\b\5\2\u01b2\u01b3")
+        buf.write(u"\5\b\5\2\u01b3\u01b4\7\3\2\2\u01b4\u01b5\5F$\2\u01b5")
+        buf.write(u"\u01b7\3\2\2\2\u01b6\u01b1\3\2\2\2\u01b6\u01b2\3\2\2")
+        buf.write(u"\2\u01b7G\3\2\2\2\u01b8\u01b9\5\16\b\2\u01b9I\3\2\2\2")
+        buf.write(u"\u01ba\u01c0\7I\2\2\u01bb\u01c1\5,\27\2\u01bc\u01bd\7")
+        buf.write(u"\26\2\2\u01bd\u01be\5\b\5\2\u01be\u01bf\7\27\2\2\u01bf")
+        buf.write(u"\u01c1\3\2\2\2\u01c0\u01bb\3\2\2\2\u01c0\u01bc\3\2\2")
+        buf.write(u"\2\u01c1K\3\2\2\2\u01c2\u01c8\7J\2\2\u01c3\u01c9\5,\27")
+        buf.write(u"\2\u01c4\u01c5\7\26\2\2\u01c5\u01c6\5\b\5\2\u01c6\u01c7")
+        buf.write(u"\7\27\2\2\u01c7\u01c9\3\2\2\2\u01c8\u01c3\3\2\2\2\u01c8")
+        buf.write(u"\u01c4\3\2\2\2\u01c9M\3\2\2\2\u01ca\u01cb\7I\2\2\u01cb")
+        buf.write(u"\u01cc\7\26\2\2\u01cc\u01cd\5\6\4\2\u01cd\u01ce\7\27")
+        buf.write(u"\2\2\u01ceO\3\2\2\2\u01cf\u01d0\7I\2\2\u01d0\u01d1\7")
+        buf.write(u"\26\2\2\u01d1\u01d2\5\6\4\2\u01d2\u01d3\7\27\2\2\u01d3")
         buf.write(u"Q\3\2\2\2.\\mx\u0083\u008b\u008d\u0095\u0098\u009e\u00a5")
         buf.write(u"\u00aa\u00b2\u00b8\u00c0\u00ce\u00d1\u00d5\u00e2\u00e5")
-        buf.write(u"\u00e9\u00f2\u00f9\u010b\u0113\u011c\u012e\u014d\u0150")
-        buf.write(u"\u0153\u0156\u0158\u015f\u0163\u0170\u0173\u0178\u017f")
-        buf.write(u"\u0191\u0199\u01a0\u01ab\u01b4\u01be\u01c6")
+        buf.write(u"\u00e9\u00f4\u00fd\u010f\u0117\u011e\u0130\u014f\u0152")
+        buf.write(u"\u0155\u0158\u015a\u0161\u0165\u0172\u0175\u017a\u0181")
+        buf.write(u"\u0193\u019b\u01a2\u01ad\u01b6\u01c0\u01c8")
         return buf.getvalue()
 
 
@@ -266,7 +268,7 @@ class LaTeXParser ( Parser ):
                      u"'\\arsinh'", u"'\\arcosh'", u"'\\artanh'", u"'\\lfloor'",
                      u"'\\rfloor'", u"'\\lceil'", u"'\\rceil'", u"'\\sqrt'",
                      u"'\\overline'", u"'\\times'", u"'\\cdot'", u"'\\div'",
-                     u"<INVALID>", u"'\\binom'", u"'\\dbinom'", u"'\\tbinom'",
+                     u"'\\frac'", u"'\\binom'", u"'\\dbinom'", u"'\\tbinom'",
                      u"'\\mathit'", u"'_'", u"'^'", u"':'", u"<INVALID>",
                      u"<INVALID>", u"<INVALID>", u"<INVALID>", u"'\\neq'",
                      u"'<'", u"<INVALID>", u"'\\leqq'", u"'\\leqslant'",
@@ -1469,7 +1471,7 @@ def exp(self, _p=0):
                     self.state = 204
                     self._errHandler.sync(self)
                     token = self._input.LA(1)
-                    if token in [LaTeXParser.BAR, LaTeXParser.L_BAR, LaTeXParser.L_ANGLE, LaTeXParser.CMD_FRAC, LaTeXParser.CMD_BINOM, LaTeXParser.CMD_DBINOM, LaTeXParser.CMD_TBINOM, LaTeXParser.CMD_MATHIT, LaTeXParser.DIFFERENTIAL, LaTeXParser.LETTER, LaTeXParser.NUMBER, LaTeXParser.SYMBOL]:
+                    if token in [LaTeXParser.BAR, LaTeXParser.L_BAR, LaTeXParser.L_ANGLE, LaTeXParser.CMD_MATHIT, LaTeXParser.DIFFERENTIAL, LaTeXParser.LETTER, LaTeXParser.NUMBER, LaTeXParser.SYMBOL]:
                         self.state = 199
                         self.atom()
                         pass
@@ -1576,7 +1578,7 @@ def exp_nofunc(self, _p=0):
                     self.state = 224
                     self._errHandler.sync(self)
                     token = self._input.LA(1)
-                    if token in [LaTeXParser.BAR, LaTeXParser.L_BAR, LaTeXParser.L_ANGLE, LaTeXParser.CMD_FRAC, LaTeXParser.CMD_BINOM, LaTeXParser.CMD_DBINOM, LaTeXParser.CMD_TBINOM, LaTeXParser.CMD_MATHIT, LaTeXParser.DIFFERENTIAL, LaTeXParser.LETTER, LaTeXParser.NUMBER, LaTeXParser.SYMBOL]:
+                    if token in [LaTeXParser.BAR, LaTeXParser.L_BAR, LaTeXParser.L_ANGLE, LaTeXParser.CMD_MATHIT, LaTeXParser.DIFFERENTIAL, LaTeXParser.LETTER, LaTeXParser.NUMBER, LaTeXParser.SYMBOL]:
                         self.state = 219
                         self.atom()
                         pass
@@ -1634,6 +1636,14 @@ def atom(self):
             return self.getTypedRuleContext(LaTeXParser.AtomContext,0)
 
 
+        def frac(self):
+            return self.getTypedRuleContext(LaTeXParser.FracContext,0)
+
+
+        def binom(self):
+            return self.getTypedRuleContext(LaTeXParser.BinomContext,0)
+
+
         def floor(self):
             return self.getTypedRuleContext(LaTeXParser.FloorContext,0)
 
@@ -1653,7 +1663,7 @@ def comp(self):
         localctx = LaTeXParser.CompContext(self, self._ctx, self.state)
         self.enterRule(localctx, 34, self.RULE_comp)
         try:
-            self.state = 240
+            self.state = 242
             self._errHandler.sync(self)
             la_ = self._interp.adaptivePredict(self._input,20,self._ctx)
             if la_ == 1:
@@ -1683,12 +1693,24 @@ def comp(self):
             elif la_ == 5:
                 self.enterOuterAlt(localctx, 5)
                 self.state = 238
-                self.floor()
+                self.frac()
                 pass
 
             elif la_ == 6:
                 self.enterOuterAlt(localctx, 6)
                 self.state = 239
+                self.binom()
+                pass
+
+            elif la_ == 7:
+                self.enterOuterAlt(localctx, 7)
+                self.state = 240
+                self.floor()
+                pass
+
+            elif la_ == 8:
+                self.enterOuterAlt(localctx, 8)
+                self.state = 241
                 self.ceil()
                 pass
 
@@ -1720,6 +1742,14 @@ def atom(self):
             return self.getTypedRuleContext(LaTeXParser.AtomContext,0)
 
 
+        def frac(self):
+            return self.getTypedRuleContext(LaTeXParser.FracContext,0)
+
+
+        def binom(self):
+            return self.getTypedRuleContext(LaTeXParser.BinomContext,0)
+
+
         def floor(self):
             return self.getTypedRuleContext(LaTeXParser.FloorContext,0)
 
@@ -1739,36 +1769,48 @@ def comp_nofunc(self):
         localctx = LaTeXParser.Comp_nofuncContext(self, self._ctx, self.state)
         self.enterRule(localctx, 36, self.RULE_comp_nofunc)
         try:
-            self.state = 247
+            self.state = 251
             self._errHandler.sync(self)
             la_ = self._interp.adaptivePredict(self._input,21,self._ctx)
             if la_ == 1:
                 self.enterOuterAlt(localctx, 1)
-                self.state = 242
+                self.state = 244
                 self.group()
                 pass
 
             elif la_ == 2:
                 self.enterOuterAlt(localctx, 2)
-                self.state = 243
+                self.state = 245
                 self.abs_group()
                 pass
 
             elif la_ == 3:
                 self.enterOuterAlt(localctx, 3)
-                self.state = 244
+                self.state = 246
                 self.atom()
                 pass
 
             elif la_ == 4:
                 self.enterOuterAlt(localctx, 4)
-                self.state = 245
-                self.floor()
+                self.state = 247
+                self.frac()
                 pass
 
             elif la_ == 5:
                 self.enterOuterAlt(localctx, 5)
-                self.state = 246
+                self.state = 248
+                self.binom()
+                pass
+
+            elif la_ == 6:
+                self.enterOuterAlt(localctx, 6)
+                self.state = 249
+                self.floor()
+                pass
+
+            elif la_ == 7:
+                self.enterOuterAlt(localctx, 7)
+                self.state = 250
                 self.ceil()
                 pass
 
@@ -1827,43 +1869,43 @@ def group(self):
         localctx = LaTeXParser.GroupContext(self, self._ctx, self.state)
         self.enterRule(localctx, 38, self.RULE_group)
         try:
-            self.state = 265
+            self.state = 269
             self._errHandler.sync(self)
             token = self._input.LA(1)
             if token in [LaTeXParser.L_PAREN]:
                 self.enterOuterAlt(localctx, 1)
-                self.state = 249
+                self.state = 253
                 self.match(LaTeXParser.L_PAREN)
-                self.state = 250
+                self.state = 254
                 self.expr()
-                self.state = 251
+                self.state = 255
                 self.match(LaTeXParser.R_PAREN)
                 pass
             elif token in [LaTeXParser.L_BRACKET]:
                 self.enterOuterAlt(localctx, 2)
-                self.state = 253
+                self.state = 257
                 self.match(LaTeXParser.L_BRACKET)
-                self.state = 254
+                self.state = 258
                 self.expr()
-                self.state = 255
+                self.state = 259
                 self.match(LaTeXParser.R_BRACKET)
                 pass
             elif token in [LaTeXParser.L_BRACE]:
                 self.enterOuterAlt(localctx, 3)
-                self.state = 257
+                self.state = 261
                 self.match(LaTeXParser.L_BRACE)
-                self.state = 258
+                self.state = 262
                 self.expr()
-                self.state = 259
+                self.state = 263
                 self.match(LaTeXParser.R_BRACE)
                 pass
             elif token in [LaTeXParser.L_BRACE_LITERAL]:
                 self.enterOuterAlt(localctx, 4)
-                self.state = 261
+                self.state = 265
                 self.match(LaTeXParser.L_BRACE_LITERAL)
-                self.state = 262
+                self.state = 266
                 self.expr()
-                self.state = 263
+                self.state = 267
                 self.match(LaTeXParser.R_BRACE_LITERAL)
                 pass
             else:
@@ -1906,11 +1948,11 @@ def abs_group(self):
         self.enterRule(localctx, 40, self.RULE_abs_group)
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 267
+            self.state = 271
             self.match(LaTeXParser.BAR)
-            self.state = 268
+            self.state = 272
             self.expr()
-            self.state = 269
+            self.state = 273
             self.match(LaTeXParser.BAR)
         except RecognitionException as re:
             localctx.exception = re
@@ -1947,14 +1989,6 @@ def mathit(self):
             return self.getTypedRuleContext(LaTeXParser.MathitContext,0)
 
 
-        def frac(self):
-            return self.getTypedRuleContext(LaTeXParser.FracContext,0)
-
-
-        def binom(self):
-            return self.getTypedRuleContext(LaTeXParser.BinomContext,0)
-
-
         def bra(self):
             return self.getTypedRuleContext(LaTeXParser.BraContext,0)
 
@@ -1975,60 +2009,50 @@ def atom(self):
         self.enterRule(localctx, 42, self.RULE_atom)
         self._la = 0 # Token type
         try:
-            self.state = 282
+            self.state = 284
             self._errHandler.sync(self)
             token = self._input.LA(1)
             if token in [LaTeXParser.LETTER, LaTeXParser.SYMBOL]:
                 self.enterOuterAlt(localctx, 1)
-                self.state = 271
+                self.state = 275
                 _la = self._input.LA(1)
                 if not(_la==LaTeXParser.LETTER or _la==LaTeXParser.SYMBOL):
                     self._errHandler.recoverInline(self)
                 else:
                     self._errHandler.reportMatch(self)
                     self.consume()
-                self.state = 273
+                self.state = 277
                 self._errHandler.sync(self)
                 la_ = self._interp.adaptivePredict(self._input,23,self._ctx)
                 if la_ == 1:
-                    self.state = 272
+                    self.state = 276
                     self.subexpr()
 
 
                 pass
             elif token in [LaTeXParser.NUMBER]:
                 self.enterOuterAlt(localctx, 2)
-                self.state = 275
+                self.state = 279
                 self.match(LaTeXParser.NUMBER)
                 pass
             elif token in [LaTeXParser.DIFFERENTIAL]:
                 self.enterOuterAlt(localctx, 3)
-                self.state = 276
+                self.state = 280
                 self.match(LaTeXParser.DIFFERENTIAL)
                 pass
             elif token in [LaTeXParser.CMD_MATHIT]:
                 self.enterOuterAlt(localctx, 4)
-                self.state = 277
+                self.state = 281
                 self.mathit()
                 pass
-            elif token in [LaTeXParser.CMD_FRAC]:
-                self.enterOuterAlt(localctx, 5)
-                self.state = 278
-                self.frac()
-                pass
-            elif token in [LaTeXParser.CMD_BINOM, LaTeXParser.CMD_DBINOM, LaTeXParser.CMD_TBINOM]:
-                self.enterOuterAlt(localctx, 6)
-                self.state = 279
-                self.binom()
-                pass
             elif token in [LaTeXParser.L_ANGLE]:
-                self.enterOuterAlt(localctx, 7)
-                self.state = 280
+                self.enterOuterAlt(localctx, 5)
+                self.state = 282
                 self.bra()
                 pass
             elif token in [LaTeXParser.BAR, LaTeXParser.L_BAR]:
-                self.enterOuterAlt(localctx, 8)
-                self.state = 281
+                self.enterOuterAlt(localctx, 6)
+                self.state = 283
                 self.ket()
                 pass
             else:
@@ -2075,11 +2099,11 @@ def bra(self):
         self._la = 0 # Token type
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 284
+            self.state = 286
             self.match(LaTeXParser.L_ANGLE)
-            self.state = 285
+            self.state = 287
             self.expr()
-            self.state = 286
+            self.state = 288
             _la = self._input.LA(1)
             if not(_la==LaTeXParser.BAR or _la==LaTeXParser.R_BAR):
                 self._errHandler.recoverInline(self)
@@ -2127,16 +2151,16 @@ def ket(self):
         self._la = 0 # Token type
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 288
+            self.state = 290
             _la = self._input.LA(1)
             if not(_la==LaTeXParser.BAR or _la==LaTeXParser.L_BAR):
                 self._errHandler.recoverInline(self)
             else:
                 self._errHandler.reportMatch(self)
                 self.consume()
-            self.state = 289
+            self.state = 291
             self.expr()
-            self.state = 290
+            self.state = 292
             self.match(LaTeXParser.R_ANGLE)
         except RecognitionException as re:
             localctx.exception = re
@@ -2178,13 +2202,13 @@ def mathit(self):
         self.enterRule(localctx, 48, self.RULE_mathit)
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 292
+            self.state = 294
             self.match(LaTeXParser.CMD_MATHIT)
-            self.state = 293
+            self.state = 295
             self.match(LaTeXParser.L_BRACE)
-            self.state = 294
+            self.state = 296
             self.mathit_text()
-            self.state = 295
+            self.state = 297
             self.match(LaTeXParser.R_BRACE)
         except RecognitionException as re:
             localctx.exception = re
@@ -2220,13 +2244,13 @@ def mathit_text(self):
         self._la = 0 # Token type
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 300
+            self.state = 302
             self._errHandler.sync(self)
             _la = self._input.LA(1)
             while _la==LaTeXParser.LETTER:
-                self.state = 297
+                self.state = 299
                 self.match(LaTeXParser.LETTER)
-                self.state = 302
+                self.state = 304
                 self._errHandler.sync(self)
                 _la = self._input.LA(1)
 
@@ -2281,19 +2305,19 @@ def frac(self):
         self.enterRule(localctx, 52, self.RULE_frac)
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 303
+            self.state = 305
             self.match(LaTeXParser.CMD_FRAC)
-            self.state = 304
+            self.state = 306
             self.match(LaTeXParser.L_BRACE)
-            self.state = 305
+            self.state = 307
             localctx.upper = self.expr()
-            self.state = 306
+            self.state = 308
             self.match(LaTeXParser.R_BRACE)
-            self.state = 307
+            self.state = 309
             self.match(LaTeXParser.L_BRACE)
-            self.state = 308
+            self.state = 310
             localctx.lower = self.expr()
-            self.state = 309
+            self.state = 311
             self.match(LaTeXParser.R_BRACE)
         except RecognitionException as re:
             localctx.exception = re
@@ -2353,24 +2377,24 @@ def binom(self):
         self._la = 0 # Token type
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 311
+            self.state = 313
             _la = self._input.LA(1)
             if not(((((_la - 67)) & ~0x3f) == 0 and ((1 << (_la - 67)) & ((1 << (LaTeXParser.CMD_BINOM - 67)) | (1 << (LaTeXParser.CMD_DBINOM - 67)) | (1 << (LaTeXParser.CMD_TBINOM - 67)))) != 0)):
                 self._errHandler.recoverInline(self)
             else:
                 self._errHandler.reportMatch(self)
                 self.consume()
-            self.state = 312
+            self.state = 314
             self.match(LaTeXParser.L_BRACE)
-            self.state = 313
+            self.state = 315
             localctx.n = self.expr()
-            self.state = 314
+            self.state = 316
             self.match(LaTeXParser.R_BRACE)
-            self.state = 315
+            self.state = 317
             self.match(LaTeXParser.L_BRACE)
-            self.state = 316
+            self.state = 318
             localctx.k = self.expr()
-            self.state = 317
+            self.state = 319
             self.match(LaTeXParser.R_BRACE)
         except RecognitionException as re:
             localctx.exception = re
@@ -2410,11 +2434,11 @@ def floor(self):
         self.enterRule(localctx, 56, self.RULE_floor)
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 319
+            self.state = 321
             self.match(LaTeXParser.L_FLOOR)
-            self.state = 320
+            self.state = 322
             localctx.val = self.expr()
-            self.state = 321
+            self.state = 323
             self.match(LaTeXParser.R_FLOOR)
         except RecognitionException as re:
             localctx.exception = re
@@ -2454,11 +2478,11 @@ def ceil(self):
         self.enterRule(localctx, 58, self.RULE_ceil)
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 323
+            self.state = 325
             self.match(LaTeXParser.L_CEIL)
-            self.state = 324
+            self.state = 326
             localctx.val = self.expr()
-            self.state = 325
+            self.state = 327
             self.match(LaTeXParser.R_CEIL)
         except RecognitionException as re:
             localctx.exception = re
@@ -2551,7 +2575,7 @@ def func_normal(self):
         self._la = 0 # Token type
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 327
+            self.state = 329
             _la = self._input.LA(1)
             if not((((_la) & ~0x3f) == 0 and ((1 << _la) & ((1 << LaTeXParser.FUNC_EXP) | (1 << LaTeXParser.FUNC_LOG) | (1 << LaTeXParser.FUNC_LN) | (1 << LaTeXParser.FUNC_SIN) | (1 << LaTeXParser.FUNC_COS) | (1 << LaTeXParser.FUNC_TAN) | (1 << LaTeXParser.FUNC_CSC) | (1 << LaTeXParser.FUNC_SEC) | (1 << LaTeXParser.FUNC_COT) | (1 << LaTeXParser.FUNC_ARCSIN) | (1 << LaTeXParser.FUNC_ARCCOS) | (1 << LaTeXParser.FUNC_ARCTAN) | (1 << LaTeXParser.FUNC_ARCCSC) | (1 << LaTeXParser.FUNC_ARCSEC) | (1 << LaTeXParser.FUNC_ARCCOT) | (1 << LaTeXParser.FUNC_SINH) | (1 << LaTeXParser.FUNC_COSH) | (1 << LaTeXParser.FUNC_TANH) | (1 << LaTeXParser.FUNC_ARSINH) | (1 << LaTeXParser.FUNC_ARCOSH) | (1 << LaTeXParser.FUNC_ARTANH))) != 0)):
                 self._errHandler.recoverInline(self)
@@ -2683,69 +2707,69 @@ def func(self):
         self.enterRule(localctx, 62, self.RULE_func)
         self._la = 0 # Token type
         try:
-            self.state = 407
+            self.state = 409
             self._errHandler.sync(self)
             token = self._input.LA(1)
             if token in [LaTeXParser.FUNC_EXP, LaTeXParser.FUNC_LOG, LaTeXParser.FUNC_LN, LaTeXParser.FUNC_SIN, LaTeXParser.FUNC_COS, LaTeXParser.FUNC_TAN, LaTeXParser.FUNC_CSC, LaTeXParser.FUNC_SEC, LaTeXParser.FUNC_COT, LaTeXParser.FUNC_ARCSIN, LaTeXParser.FUNC_ARCCOS, LaTeXParser.FUNC_ARCTAN, LaTeXParser.FUNC_ARCCSC, LaTeXParser.FUNC_ARCSEC, LaTeXParser.FUNC_ARCCOT, LaTeXParser.FUNC_SINH, LaTeXParser.FUNC_COSH, LaTeXParser.FUNC_TANH, LaTeXParser.FUNC_ARSINH, LaTeXParser.FUNC_ARCOSH, LaTeXParser.FUNC_ARTANH]:
                 self.enterOuterAlt(localctx, 1)
-                self.state = 329
+                self.state = 331
                 self.func_normal()
-                self.state = 342
+                self.state = 344
                 self._errHandler.sync(self)
                 la_ = self._interp.adaptivePredict(self._input,30,self._ctx)
                 if la_ == 1:
-                    self.state = 331
+                    self.state = 333
                     self._errHandler.sync(self)
                     _la = self._input.LA(1)
                     if _la==LaTeXParser.UNDERSCORE:
-                        self.state = 330
+                        self.state = 332
                         self.subexpr()
 
 
-                    self.state = 334
+                    self.state = 336
                     self._errHandler.sync(self)
                     _la = self._input.LA(1)
                     if _la==LaTeXParser.CARET:
-                        self.state = 333
+                        self.state = 335
                         self.supexpr()
 
 
                     pass
 
                 elif la_ == 2:
-                    self.state = 337
+                    self.state = 339
                     self._errHandler.sync(self)
                     _la = self._input.LA(1)
                     if _la==LaTeXParser.CARET:
-                        self.state = 336
+                        self.state = 338
                         self.supexpr()
 
 
-                    self.state = 340
+                    self.state = 342
                     self._errHandler.sync(self)
                     _la = self._input.LA(1)
                     if _la==LaTeXParser.UNDERSCORE:
-                        self.state = 339
+                        self.state = 341
                         self.subexpr()
 
 
                     pass
 
 
-                self.state = 349
+                self.state = 351
                 self._errHandler.sync(self)
                 la_ = self._interp.adaptivePredict(self._input,31,self._ctx)
                 if la_ == 1:
-                    self.state = 344
+                    self.state = 346
                     self.match(LaTeXParser.L_PAREN)
-                    self.state = 345
+                    self.state = 347
                     self.func_arg()
-                    self.state = 346
+                    self.state = 348
                     self.match(LaTeXParser.R_PAREN)
                     pass
 
                 elif la_ == 2:
-                    self.state = 348
+                    self.state = 350
                     self.func_arg_noparens()
                     pass
 
@@ -2753,74 +2777,74 @@ def func(self):
                 pass
             elif token in [LaTeXParser.LETTER, LaTeXParser.SYMBOL]:
                 self.enterOuterAlt(localctx, 2)
-                self.state = 351
+                self.state = 353
                 _la = self._input.LA(1)
                 if not(_la==LaTeXParser.LETTER or _la==LaTeXParser.SYMBOL):
                     self._errHandler.recoverInline(self)
                 else:
                     self._errHandler.reportMatch(self)
                     self.consume()
-                self.state = 353
+                self.state = 355
                 self._errHandler.sync(self)
                 _la = self._input.LA(1)
                 if _la==LaTeXParser.UNDERSCORE:
-                    self.state = 352
+                    self.state = 354
                     self.subexpr()
 
 
-                self.state = 355
+                self.state = 357
                 self.match(LaTeXParser.L_PAREN)
-                self.state = 356
+                self.state = 358
                 self.args()
-                self.state = 357
+                self.state = 359
                 self.match(LaTeXParser.R_PAREN)
                 pass
             elif token in [LaTeXParser.FUNC_INT]:
                 self.enterOuterAlt(localctx, 3)
-                self.state = 359
+                self.state = 361
                 self.match(LaTeXParser.FUNC_INT)
-                self.state = 366
+                self.state = 368
                 self._errHandler.sync(self)
                 token = self._input.LA(1)
                 if token in [LaTeXParser.UNDERSCORE]:
-                    self.state = 360
+                    self.state = 362
                     self.subexpr()
-                    self.state = 361
+                    self.state = 363
                     self.supexpr()
                     pass
                 elif token in [LaTeXParser.CARET]:
-                    self.state = 363
+                    self.state = 365
                     self.supexpr()
-                    self.state = 364
+                    self.state = 366
                     self.subexpr()
                     pass
                 elif token in [LaTeXParser.ADD, LaTeXParser.SUB, LaTeXParser.L_PAREN, LaTeXParser.L_BRACE, LaTeXParser.L_BRACE_LITERAL, LaTeXParser.L_BRACKET, LaTeXParser.BAR, LaTeXParser.L_BAR, LaTeXParser.L_ANGLE, LaTeXParser.FUNC_LIM, LaTeXParser.FUNC_INT, LaTeXParser.FUNC_SUM, LaTeXParser.FUNC_PROD, LaTeXParser.FUNC_EXP, LaTeXParser.FUNC_LOG, LaTeXParser.FUNC_LN, LaTeXParser.FUNC_SIN, LaTeXParser.FUNC_COS, LaTeXParser.FUNC_TAN, LaTeXParser.FUNC_CSC, LaTeXParser.FUNC_SEC, LaTeXParser.FUNC_COT, LaTeXParser.FUNC_ARCSIN, LaTeXParser.FUNC_ARCCOS, LaTeXParser.FUNC_ARCTAN, LaTeXParser.FUNC_ARCCSC, LaTeXParser.FUNC_ARCSEC, LaTeXParser.FUNC_ARCCOT, LaTeXParser.FUNC_SINH, LaTeXParser.FUNC_COSH, LaTeXParser.FUNC_TANH, LaTeXParser.FUNC_ARSINH, LaTeXParser.FUNC_ARCOSH, LaTeXParser.FUNC_ARTANH, LaTeXParser.L_FLOOR, LaTeXParser.L_CEIL, LaTeXParser.FUNC_SQRT, LaTeXParser.FUNC_OVERLINE, LaTeXParser.CMD_FRAC, LaTeXParser.CMD_BINOM, LaTeXParser.CMD_DBINOM, LaTeXParser.CMD_TBINOM, LaTeXParser.CMD_MATHIT, LaTeXParser.DIFFERENTIAL, LaTeXParser.LETTER, LaTeXParser.NUMBER, LaTeXParser.SYMBOL]:
                     pass
                 else:
                     pass
-                self.state = 374
+                self.state = 376
                 self._errHandler.sync(self)
                 la_ = self._interp.adaptivePredict(self._input,35,self._ctx)
                 if la_ == 1:
-                    self.state = 369
+                    self.state = 371
                     self._errHandler.sync(self)
                     la_ = self._interp.adaptivePredict(self._input,34,self._ctx)
                     if la_ == 1:
-                        self.state = 368
+                        self.state = 370
                         self.additive(0)
 
 
-                    self.state = 371
+                    self.state = 373
                     self.match(LaTeXParser.DIFFERENTIAL)
                     pass
 
                 elif la_ == 2:
-                    self.state = 372
+                    self.state = 374
                     self.frac()
                     pass
 
                 elif la_ == 3:
-                    self.state = 373
+                    self.state = 375
                     self.additive(0)
                     pass
 
@@ -2828,75 +2852,75 @@ def func(self):
                 pass
             elif token in [LaTeXParser.FUNC_SQRT]:
                 self.enterOuterAlt(localctx, 4)
-                self.state = 376
+                self.state = 378
                 self.match(LaTeXParser.FUNC_SQRT)
-                self.state = 381
+                self.state = 383
                 self._errHandler.sync(self)
                 _la = self._input.LA(1)
                 if _la==LaTeXParser.L_BRACKET:
-                    self.state = 377
+                    self.state = 379
                     self.match(LaTeXParser.L_BRACKET)
-                    self.state = 378
+                    self.state = 380
                     localctx.root = self.expr()
-                    self.state = 379
+                    self.state = 381
                     self.match(LaTeXParser.R_BRACKET)
 
 
-                self.state = 383
+                self.state = 385
                 self.match(LaTeXParser.L_BRACE)
-                self.state = 384
+                self.state = 386
                 localctx.base = self.expr()
-                self.state = 385
+                self.state = 387
                 self.match(LaTeXParser.R_BRACE)
                 pass
             elif token in [LaTeXParser.FUNC_OVERLINE]:
                 self.enterOuterAlt(localctx, 5)
-                self.state = 387
+                self.state = 389
                 self.match(LaTeXParser.FUNC_OVERLINE)
-                self.state = 388
+                self.state = 390
                 self.match(LaTeXParser.L_BRACE)
-                self.state = 389
+                self.state = 391
                 localctx.base = self.expr()
-                self.state = 390
+                self.state = 392
                 self.match(LaTeXParser.R_BRACE)
                 pass
             elif token in [LaTeXParser.FUNC_SUM, LaTeXParser.FUNC_PROD]:
                 self.enterOuterAlt(localctx, 6)
-                self.state = 392
+                self.state = 394
                 _la = self._input.LA(1)
                 if not(_la==LaTeXParser.FUNC_SUM or _la==LaTeXParser.FUNC_PROD):
                     self._errHandler.recoverInline(self)
                 else:
                     self._errHandler.reportMatch(self)
                     self.consume()
-                self.state = 399
+                self.state = 401
                 self._errHandler.sync(self)
                 token = self._input.LA(1)
                 if token in [LaTeXParser.UNDERSCORE]:
-                    self.state = 393
+                    self.state = 395
                     self.subeq()
-                    self.state = 394
+                    self.state = 396
                     self.supexpr()
                     pass
                 elif token in [LaTeXParser.CARET]:
-                    self.state = 396
+                    self.state = 398
                     self.supexpr()
-                    self.state = 397
+                    self.state = 399
                     self.subeq()
                     pass
                 else:
                     raise NoViableAltException(self)
 
-                self.state = 401
+                self.state = 403
                 self.mp(0)
                 pass
             elif token in [LaTeXParser.FUNC_LIM]:
                 self.enterOuterAlt(localctx, 7)
-                self.state = 403
+                self.state = 405
                 self.match(LaTeXParser.FUNC_LIM)
-                self.state = 404
+                self.state = 406
                 self.limit_sub()
-                self.state = 405
+                self.state = 407
                 self.mp(0)
                 pass
             else:
@@ -2936,22 +2960,22 @@ def args(self):
         localctx = LaTeXParser.ArgsContext(self, self._ctx, self.state)
         self.enterRule(localctx, 64, self.RULE_args)
         try:
-            self.state = 414
+            self.state = 416
             self._errHandler.sync(self)
             la_ = self._interp.adaptivePredict(self._input,39,self._ctx)
             if la_ == 1:
                 self.enterOuterAlt(localctx, 1)
-                self.state = 409
+                self.state = 411
                 self.expr()
-                self.state = 410
+                self.state = 412
                 self.match(LaTeXParser.T__0)
-                self.state = 411
+                self.state = 413
                 self.args()
                 pass
 
             elif la_ == 2:
                 self.enterOuterAlt(localctx, 2)
-                self.state = 413
+                self.state = 415
                 self.expr()
                 pass
 
@@ -3021,41 +3045,41 @@ def limit_sub(self):
         self._la = 0 # Token type
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 416
+            self.state = 418
             self.match(LaTeXParser.UNDERSCORE)
-            self.state = 417
+            self.state = 419
             self.match(LaTeXParser.L_BRACE)
-            self.state = 418
+            self.state = 420
             _la = self._input.LA(1)
             if not(_la==LaTeXParser.LETTER or _la==LaTeXParser.SYMBOL):
                 self._errHandler.recoverInline(self)
             else:
                 self._errHandler.reportMatch(self)
                 self.consume()
-            self.state = 419
+            self.state = 421
             self.match(LaTeXParser.LIM_APPROACH_SYM)
-            self.state = 420
+            self.state = 422
             self.expr()
-            self.state = 425
+            self.state = 427
             self._errHandler.sync(self)
             _la = self._input.LA(1)
             if _la==LaTeXParser.CARET:
-                self.state = 421
+                self.state = 423
                 self.match(LaTeXParser.CARET)
-                self.state = 422
+                self.state = 424
                 self.match(LaTeXParser.L_BRACE)
-                self.state = 423
+                self.state = 425
                 _la = self._input.LA(1)
                 if not(_la==LaTeXParser.ADD or _la==LaTeXParser.SUB):
                     self._errHandler.recoverInline(self)
                 else:
                     self._errHandler.reportMatch(self)
                     self.consume()
-                self.state = 424
+                self.state = 426
                 self.match(LaTeXParser.R_BRACE)
 
 
-            self.state = 427
+            self.state = 429
             self.match(LaTeXParser.R_BRACE)
         except RecognitionException as re:
             localctx.exception = re
@@ -3091,22 +3115,22 @@ def func_arg(self):
         localctx = LaTeXParser.Func_argContext(self, self._ctx, self.state)
         self.enterRule(localctx, 68, self.RULE_func_arg)
         try:
-            self.state = 434
+            self.state = 436
             self._errHandler.sync(self)
             la_ = self._interp.adaptivePredict(self._input,41,self._ctx)
             if la_ == 1:
                 self.enterOuterAlt(localctx, 1)
-                self.state = 429
+                self.state = 431
                 self.expr()
                 pass
 
             elif la_ == 2:
                 self.enterOuterAlt(localctx, 2)
-                self.state = 430
+                self.state = 432
                 self.expr()
-                self.state = 431
+                self.state = 433
                 self.match(LaTeXParser.T__0)
-                self.state = 432
+                self.state = 434
                 self.func_arg()
                 pass
 
@@ -3142,7 +3166,7 @@ def func_arg_noparens(self):
         self.enterRule(localctx, 70, self.RULE_func_arg_noparens)
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 436
+            self.state = 438
             self.mp_nofunc(0)
         except RecognitionException as re:
             localctx.exception = re
@@ -3188,21 +3212,21 @@ def subexpr(self):
         self.enterRule(localctx, 72, self.RULE_subexpr)
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 438
+            self.state = 440
             self.match(LaTeXParser.UNDERSCORE)
-            self.state = 444
+            self.state = 446
             self._errHandler.sync(self)
             token = self._input.LA(1)
-            if token in [LaTeXParser.BAR, LaTeXParser.L_BAR, LaTeXParser.L_ANGLE, LaTeXParser.CMD_FRAC, LaTeXParser.CMD_BINOM, LaTeXParser.CMD_DBINOM, LaTeXParser.CMD_TBINOM, LaTeXParser.CMD_MATHIT, LaTeXParser.DIFFERENTIAL, LaTeXParser.LETTER, LaTeXParser.NUMBER, LaTeXParser.SYMBOL]:
-                self.state = 439
+            if token in [LaTeXParser.BAR, LaTeXParser.L_BAR, LaTeXParser.L_ANGLE, LaTeXParser.CMD_MATHIT, LaTeXParser.DIFFERENTIAL, LaTeXParser.LETTER, LaTeXParser.NUMBER, LaTeXParser.SYMBOL]:
+                self.state = 441
                 self.atom()
                 pass
             elif token in [LaTeXParser.L_BRACE]:
-                self.state = 440
+                self.state = 442
                 self.match(LaTeXParser.L_BRACE)
-                self.state = 441
+                self.state = 443
                 self.expr()
-                self.state = 442
+                self.state = 444
                 self.match(LaTeXParser.R_BRACE)
                 pass
             else:
@@ -3252,21 +3276,21 @@ def supexpr(self):
         self.enterRule(localctx, 74, self.RULE_supexpr)
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 446
+            self.state = 448
             self.match(LaTeXParser.CARET)
-            self.state = 452
+            self.state = 454
             self._errHandler.sync(self)
             token = self._input.LA(1)
-            if token in [LaTeXParser.BAR, LaTeXParser.L_BAR, LaTeXParser.L_ANGLE, LaTeXParser.CMD_FRAC, LaTeXParser.CMD_BINOM, LaTeXParser.CMD_DBINOM, LaTeXParser.CMD_TBINOM, LaTeXParser.CMD_MATHIT, LaTeXParser.DIFFERENTIAL, LaTeXParser.LETTER, LaTeXParser.NUMBER, LaTeXParser.SYMBOL]:
-                self.state = 447
+            if token in [LaTeXParser.BAR, LaTeXParser.L_BAR, LaTeXParser.L_ANGLE, LaTeXParser.CMD_MATHIT, LaTeXParser.DIFFERENTIAL, LaTeXParser.LETTER, LaTeXParser.NUMBER, LaTeXParser.SYMBOL]:
+                self.state = 449
                 self.atom()
                 pass
             elif token in [LaTeXParser.L_BRACE]:
-                self.state = 448
+                self.state = 450
                 self.match(LaTeXParser.L_BRACE)
-                self.state = 449
+                self.state = 451
                 self.expr()
-                self.state = 450
+                self.state = 452
                 self.match(LaTeXParser.R_BRACE)
                 pass
             else:
@@ -3312,13 +3336,13 @@ def subeq(self):
         self.enterRule(localctx, 76, self.RULE_subeq)
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 454
+            self.state = 456
             self.match(LaTeXParser.UNDERSCORE)
-            self.state = 455
+            self.state = 457
             self.match(LaTeXParser.L_BRACE)
-            self.state = 456
+            self.state = 458
             self.equality()
-            self.state = 457
+            self.state = 459
             self.match(LaTeXParser.R_BRACE)
         except RecognitionException as re:
             localctx.exception = re
@@ -3360,13 +3384,13 @@ def supeq(self):
         self.enterRule(localctx, 78, self.RULE_supeq)
         try:
             self.enterOuterAlt(localctx, 1)
-            self.state = 459
+            self.state = 461
             self.match(LaTeXParser.UNDERSCORE)
-            self.state = 460
+            self.state = 462
             self.match(LaTeXParser.L_BRACE)
-            self.state = 461
+            self.state = 463
             self.equality()
-            self.state = 462
+            self.state = 464
             self.match(LaTeXParser.R_BRACE)
         except RecognitionException as re:
             localctx.exception = re
diff --git a/sympy/parsing/latex/_parse_latex_antlr.py b/sympy/parsing/latex/_parse_latex_antlr.py
index a532573ccd..a4d4764907 100644
--- a/sympy/parsing/latex/_parse_latex_antlr.py
+++ b/sympy/parsing/latex/_parse_latex_antlr.py
@@ -277,6 +277,10 @@ def convert_comp(comp):
         return sympy.Abs(convert_expr(comp.abs_group().expr()), evaluate=False)
     elif comp.atom():
         return convert_atom(comp.atom())
+    elif comp.frac():
+        return convert_frac(comp.frac())
+    elif comp.binom():
+        return convert_binom(comp.binom())
     elif comp.floor():
         return convert_floor(comp.floor())
     elif comp.ceil():
@@ -319,10 +323,6 @@ def convert_atom(atom):
     elif atom.mathit():
         text = rule2text(atom.mathit().mathit_text())
         return sympy.Symbol(text)
-    elif atom.frac():
-        return convert_frac(atom.frac())
-    elif atom.binom():
-        return convert_binom(atom.binom())
     elif atom.bra():
         val = convert_expr(atom.bra().expr())
         return Bra(val)
diff --git a/sympy/solvers/ode/hypergeometric.py b/sympy/solvers/ode/hypergeometric.py
index 51a40b1cba..b159053048 100644
--- a/sympy/solvers/ode/hypergeometric.py
+++ b/sympy/solvers/ode/hypergeometric.py
@@ -97,14 +97,6 @@ def _power_counting(num):
     # computing I0 of the given equation
     I0 = powdenest(simplify(factor(((J1/k**2) - S(1)/4)/((x**k)**2))), force=True)
     I0 = factor(cancel(powdenest(I0.subs(x, x**(S(1)/k)), force=True)))
-
-    # Before this point I0, J1 might be functions of e.g. sqrt(x) but replacing
-    # x with x**(1/k) should result in I0 being a rational function of x or
-    # otherwise the hypergeometric solver cannot be used. Note that k can be a
-    # non-integer rational such as 2/7.
-    if not I0.is_rational_function(x):
-        return None
-
     num, dem = I0.as_numer_denom()
 
     max_num_pow = max(_power_counting((num, )))


Test patch:
diff --git a/sympy/core/tests/test_expr.py b/sympy/core/tests/test_expr.py
index b1517422f5..60d96bad25 100644
--- a/sympy/core/tests/test_expr.py
+++ b/sympy/core/tests/test_expr.py
@@ -2216,3 +2216,10 @@ def test_21494():
 
 def test_Expr__eq__iterable_handling():
     assert x != range(3)
+
+
+def test_format():
+    assert '{:1.2f}'.format(S.Zero) == '0.00'
+    assert '{:+3.0f}'.format(S(3)) == ' +3'
+    assert '{:23.20f}'.format(pi) == ' 3.14159265358979323846'
+    assert '{:50.48f}'.format(exp(sin(1))) == '2.319776824715853173956590377503266813254904772376'
diff --git a/sympy/parsing/tests/test_latex.py b/sympy/parsing/tests/test_latex.py
index bd059461be..d8717f0a60 100644
--- a/sympy/parsing/tests/test_latex.py
+++ b/sympy/parsing/tests/test_latex.py
@@ -92,7 +92,6 @@ def test_import():
     (r"x", x),
     (r"2x", 2*x),
     (r"x^2", x**2),
-    (r"x^\frac{1}{2}", _Pow(x, _Pow(2, -1))),
     (r"x^{3 + 1}", x**_Add(3, 1)),
     (r"-c", -c),
     (r"a \cdot b", a * b),
@@ -111,7 +110,6 @@ def test_import():
     (r"0+1", _Add(0, 1)),
     (r"1*2", _Mul(1, 2)),
     (r"0*1", _Mul(0, 1)),
-    (r"1 \times 2 ", _Mul(1, 2)),
     (r"x = y", Eq(x, y)),
     (r"x \neq y", Ne(x, y)),
     (r"x < y", Lt(x, y)),
@@ -131,8 +129,6 @@ def test_import():
     (r"\sin \cos \theta", sin(cos(theta))),
     (r"\sin(\cos \theta)", sin(cos(theta))),
     (r"\frac{a}{b}", a / b),
-    (r"\dfrac{a}{b}", a / b),
-    (r"\tfrac{a}{b}", a / b),
     (r"\frac{a + b}{c}", _Mul(a + b, _Pow(c, -1))),
     (r"\frac{7}{3}", _Mul(7, _Pow(3, -1))),
     (r"(\csc x)(\sec y)", csc(x)*sec(y)),
@@ -243,7 +239,6 @@ def test_import():
     (r"\tbinom{n}{k}", _binomial(n, k)),
     (r"\dbinom{n}{k}", _binomial(n, k)),
     (r"\binom{n}{0}", _binomial(n, 0)),
-    (r"x^\binom{n}{k}", _Pow(x, _binomial(n, k))),
     (r"a \, b", _Mul(a, b)),
     (r"a \thinspace b", _Mul(a, b)),
     (r"a \: b", _Mul(a, b)),
diff --git a/sympy/solvers/ode/tests/test_ode.py b/sympy/solvers/ode/tests/test_ode.py
index eb0b0c77e1..fe3faf1c0d 100644
--- a/sympy/solvers/ode/tests/test_ode.py
+++ b/sympy/solvers/ode/tests/test_ode.py
@@ -1,5 +1,5 @@
 from sympy.core.function import (Derivative, Function, Subs, diff)
-from sympy.core.numbers import (E, I, Rational, pi)
+from sympy.core.numbers import (I, Rational, pi)
 from sympy.core.relational import Eq
 from sympy.core.singleton import S
 from sympy.core.symbol import (Symbol, symbols)
@@ -1069,12 +1069,3 @@ def test_issue_22462():
             Eq(f(x).diff(x), -20*f(x)**2 - 500*f(x)/7200),
             Eq(f(x).diff(x), -2*f(x)**2 - 5*f(x)/7)]:
         assert 'Bernoulli' in classify_ode(de, f(x))
-
-
-def test_issue_23425():
-    x = symbols('x')
-    y = Function('y')
-    eq = Eq(-E**x*y(x).diff().diff() + y(x).diff(), 0)
-    assert classify_ode(eq) == \
-        ('Liouville', 'nth_order_reducible', \
-        '2nd_power_series_ordinary', 'Liouville_Integral')