1/*
2 ANTLR4 LaTeX Math Grammar
3
4 Ported from latex2sympy by @augustt198 https://github.com/augustt198/latex2sympy See license in
5 LICENSE.txt
6 */
7
8/*
9 After changing this file, it is necessary to run `python setup.py antlr` in the root directory of
10 the repository. This will regenerate the code in `sympy/parsing/latex/_antlr/*.py`.
11 */
12
13grammar LaTeX;
14
15options {
16	language = Python2;
17}
18
19WS: [ \t\r\n]+ -> skip;
20THINSPACE: ('\\,' | '\\thinspace') -> skip;
21MEDSPACE: ('\\:' | '\\medspace') -> skip;
22THICKSPACE: ('\\;' | '\\thickspace') -> skip;
23QUAD: '\\quad' -> skip;
24QQUAD: '\\qquad' -> skip;
25NEGTHINSPACE: ('\\!' | '\\negthinspace') -> skip;
26NEGMEDSPACE: '\\negmedspace' -> skip;
27NEGTHICKSPACE: '\\negthickspace' -> skip;
28CMD_LEFT: '\\left' -> skip;
29CMD_RIGHT: '\\right' -> skip;
30
31IGNORE:
32	(
33		'\\vrule'
34		| '\\vcenter'
35		| '\\vbox'
36		| '\\vskip'
37		| '\\vspace'
38		| '\\hfil'
39		| '\\*'
40		| '\\-'
41		| '\\.'
42		| '\\/'
43		| '\\"'
44		| '\\('
45		| '\\='
46	) -> skip;
47
48ADD: '+';
49SUB: '-';
50MUL: '*';
51DIV: '/';
52
53L_PAREN: '(';
54R_PAREN: ')';
55L_BRACE: '{';
56R_BRACE: '}';
57L_BRACE_LITERAL: '\\{';
58R_BRACE_LITERAL: '\\}';
59L_BRACKET: '[';
60R_BRACKET: ']';
61
62BAR: '|';
63
64R_BAR: '\\right|';
65L_BAR: '\\left|';
66
67L_ANGLE: '\\langle';
68R_ANGLE: '\\rangle';
69FUNC_LIM: '\\lim';
70LIM_APPROACH_SYM:
71	'\\to'
72	| '\\rightarrow'
73	| '\\Rightarrow'
74	| '\\longrightarrow'
75	| '\\Longrightarrow';
76FUNC_INT: '\\int';
77FUNC_SUM: '\\sum';
78FUNC_PROD: '\\prod';
79
80FUNC_EXP: '\\exp';
81FUNC_LOG: '\\log';
82FUNC_LN: '\\ln';
83FUNC_SIN: '\\sin';
84FUNC_COS: '\\cos';
85FUNC_TAN: '\\tan';
86FUNC_CSC: '\\csc';
87FUNC_SEC: '\\sec';
88FUNC_COT: '\\cot';
89
90FUNC_ARCSIN: '\\arcsin';
91FUNC_ARCCOS: '\\arccos';
92FUNC_ARCTAN: '\\arctan';
93FUNC_ARCCSC: '\\arccsc';
94FUNC_ARCSEC: '\\arcsec';
95FUNC_ARCCOT: '\\arccot';
96
97FUNC_SINH: '\\sinh';
98FUNC_COSH: '\\cosh';
99FUNC_TANH: '\\tanh';
100FUNC_ARSINH: '\\arsinh';
101FUNC_ARCOSH: '\\arcosh';
102FUNC_ARTANH: '\\artanh';
103
104L_FLOOR: '\\lfloor';
105R_FLOOR: '\\rfloor';
106L_CEIL: '\\lceil';
107R_CEIL: '\\rceil';
108
109FUNC_SQRT: '\\sqrt';
110FUNC_OVERLINE: '\\overline';
111
112CMD_TIMES: '\\times';
113CMD_CDOT: '\\cdot';
114CMD_DIV: '\\div';
115CMD_FRAC: '\\frac';
116CMD_BINOM: '\\binom';
117CMD_DBINOM: '\\dbinom';
118CMD_TBINOM: '\\tbinom';
119
120CMD_MATHIT: '\\mathit';
121
122UNDERSCORE: '_';
123CARET: '^';
124COLON: ':';
125
126fragment WS_CHAR: [ \t\r\n];
127DIFFERENTIAL: 'd' WS_CHAR*? ([a-zA-Z] | '\\' [a-zA-Z]+);
128
129LETTER: [a-zA-Z];
130fragment DIGIT: [0-9];
131NUMBER:
132	DIGIT+ (',' DIGIT DIGIT DIGIT)*
133	| DIGIT* (',' DIGIT DIGIT DIGIT)* '.' DIGIT+;
134
135EQUAL: (('&' WS_CHAR*?)? '=') | ('=' (WS_CHAR*? '&')?);
136NEQ: '\\neq';
137
138LT: '<';
139LTE: ('\\leq' | '\\le' | LTE_Q | LTE_S);
140LTE_Q: '\\leqq';
141LTE_S: '\\leqslant';
142
143GT: '>';
144GTE: ('\\geq' | '\\ge' | GTE_Q | GTE_S);
145GTE_Q: '\\geqq';
146GTE_S: '\\geqslant';
147
148BANG: '!';
149
150SYMBOL: '\\' [a-zA-Z]+;
151
152math: relation;
153
154relation:
155	relation (EQUAL | LT | LTE | GT | GTE | NEQ) relation
156	| expr;
157
158equality: expr EQUAL expr;
159
160expr: additive;
161
162additive: additive (ADD | SUB) additive | mp;
163
164// mult part
165mp:
166	mp (MUL | CMD_TIMES | CMD_CDOT | DIV | CMD_DIV | COLON) mp
167	| unary;
168
169mp_nofunc:
170	mp_nofunc (
171		MUL
172		| CMD_TIMES
173		| CMD_CDOT
174		| DIV
175		| CMD_DIV
176		| COLON
177	) mp_nofunc
178	| unary_nofunc;
179
180unary: (ADD | SUB) unary | postfix+;
181
182unary_nofunc:
183	(ADD | SUB) unary_nofunc
184	| postfix postfix_nofunc*;
185
186postfix: exp postfix_op*;
187postfix_nofunc: exp_nofunc postfix_op*;
188postfix_op: BANG | eval_at;
189
190eval_at:
191	BAR (eval_at_sup | eval_at_sub | eval_at_sup eval_at_sub);
192
193eval_at_sub: UNDERSCORE L_BRACE (expr | equality) R_BRACE;
194
195eval_at_sup: CARET L_BRACE (expr | equality) R_BRACE;
196
197exp: exp CARET (atom | L_BRACE expr R_BRACE) subexpr? | comp;
198
199exp_nofunc:
200	exp_nofunc CARET (atom | L_BRACE expr R_BRACE) subexpr?
201	| comp_nofunc;
202
203comp:
204	group
205	| abs_group
206	| func
207	| atom
208	| frac
209	| binom
210	| floor
211	| ceil;
212
213comp_nofunc:
214	group
215	| abs_group
216	| atom
217	| frac
218	| binom
219	| floor
220	| ceil;
221
222group:
223	L_PAREN expr R_PAREN
224	| L_BRACKET expr R_BRACKET
225	| L_BRACE expr R_BRACE
226	| L_BRACE_LITERAL expr R_BRACE_LITERAL;
227
228abs_group: BAR expr BAR;
229
230atom: (LETTER | SYMBOL) subexpr?
231	| NUMBER
232	| DIFFERENTIAL
233	| mathit
234	| bra
235	| ket;
236
237bra: L_ANGLE expr (R_BAR | BAR);
238ket: (L_BAR | BAR) expr R_ANGLE;
239
240mathit: CMD_MATHIT L_BRACE mathit_text R_BRACE;
241mathit_text: LETTER*;
242
243frac:
244	CMD_FRAC L_BRACE upper = expr R_BRACE L_BRACE lower = expr R_BRACE;
245
246binom:
247	(CMD_BINOM | CMD_DBINOM | CMD_TBINOM) L_BRACE n = expr R_BRACE L_BRACE k = expr R_BRACE;
248
249floor: L_FLOOR val = expr R_FLOOR;
250ceil: L_CEIL val = expr R_CEIL;
251
252func_normal:
253	FUNC_EXP
254	| FUNC_LOG
255	| FUNC_LN
256	| FUNC_SIN
257	| FUNC_COS
258	| FUNC_TAN
259	| FUNC_CSC
260	| FUNC_SEC
261	| FUNC_COT
262	| FUNC_ARCSIN
263	| FUNC_ARCCOS
264	| FUNC_ARCTAN
265	| FUNC_ARCCSC
266	| FUNC_ARCSEC
267	| FUNC_ARCCOT
268	| FUNC_SINH
269	| FUNC_COSH
270	| FUNC_TANH
271	| FUNC_ARSINH
272	| FUNC_ARCOSH
273	| FUNC_ARTANH;
274
275func:
276	func_normal (subexpr? supexpr? | supexpr? subexpr?) (
277		L_PAREN func_arg R_PAREN
278		| func_arg_noparens
279	)
280	| (LETTER | SYMBOL) subexpr? // e.g. f(x)
281	L_PAREN args R_PAREN
282	| FUNC_INT (subexpr supexpr | supexpr subexpr)? (
283		additive? DIFFERENTIAL
284		| frac
285		| additive
286	)
287	| FUNC_SQRT (L_BRACKET root = expr R_BRACKET)? L_BRACE base = expr R_BRACE
288	| FUNC_OVERLINE L_BRACE base = expr R_BRACE
289	| (FUNC_SUM | FUNC_PROD) (subeq supexpr | supexpr subeq) mp
290	| FUNC_LIM limit_sub mp;
291
292args: (expr ',' args) | expr;
293
294limit_sub:
295	UNDERSCORE L_BRACE (LETTER | SYMBOL) LIM_APPROACH_SYM expr (
296		CARET L_BRACE (ADD | SUB) R_BRACE
297	)? R_BRACE;
298
299func_arg: expr | (expr ',' func_arg);
300func_arg_noparens: mp_nofunc;
301
302subexpr: UNDERSCORE (atom | L_BRACE expr R_BRACE);
303supexpr: CARET (atom | L_BRACE expr R_BRACE);
304
305subeq: UNDERSCORE L_BRACE equality R_BRACE;
306supeq: UNDERSCORE L_BRACE equality R_BRACE;
307