Spaces:
Running
Running
/* | |
ANTLR4 LaTeX Math Grammar | |
Ported from latex2sympy by @augustt198 https://github.com/augustt198/latex2sympy See license in | |
LICENSE.txt | |
*/ | |
/* | |
After changing this file, it is necessary to run `python setup.py antlr` in the root directory of | |
the repository. This will regenerate the code in `sympy/parsing/latex/_antlr/*.py`. | |
*/ | |
grammar LaTeX; | |
options { | |
language = Python3; | |
} | |
WS: [ \t\r\n]+ -> skip; | |
THINSPACE: ('\\,' | '\\thinspace') -> skip; | |
MEDSPACE: ('\\:' | '\\medspace') -> skip; | |
THICKSPACE: ('\\;' | '\\thickspace') -> skip; | |
QUAD: '\\quad' -> skip; | |
QQUAD: '\\qquad' -> skip; | |
NEGTHINSPACE: ('\\!' | '\\negthinspace') -> skip; | |
NEGMEDSPACE: '\\negmedspace' -> skip; | |
NEGTHICKSPACE: '\\negthickspace' -> skip; | |
CMD_LEFT: '\\left' -> skip; | |
CMD_RIGHT: '\\right' -> skip; | |
IGNORE: | |
( | |
'\\vrule' | |
| '\\vcenter' | |
| '\\vbox' | |
| '\\vskip' | |
| '\\vspace' | |
| '\\hfil' | |
| '\\*' | |
| '\\-' | |
| '\\.' | |
| '\\/' | |
| '\\"' | |
| '\\(' | |
| '\\=' | |
) -> skip; | |
ADD: '+'; | |
SUB: '-'; | |
MUL: '*'; | |
DIV: '/'; | |
L_PAREN: '('; | |
R_PAREN: ')'; | |
L_BRACE: '{'; | |
R_BRACE: '}'; | |
L_BRACE_LITERAL: '\\{'; | |
R_BRACE_LITERAL: '\\}'; | |
L_BRACKET: '['; | |
R_BRACKET: ']'; | |
BAR: '|'; | |
R_BAR: '\\right|'; | |
L_BAR: '\\left|'; | |
L_ANGLE: '\\langle'; | |
R_ANGLE: '\\rangle'; | |
FUNC_LIM: '\\lim'; | |
LIM_APPROACH_SYM: | |
'\\to' | |
| '\\rightarrow' | |
| '\\Rightarrow' | |
| '\\longrightarrow' | |
| '\\Longrightarrow'; | |
FUNC_INT: | |
'\\int' | |
| '\\int\\limits'; | |
FUNC_SUM: '\\sum'; | |
FUNC_PROD: '\\prod'; | |
FUNC_EXP: '\\exp'; | |
FUNC_LOG: '\\log'; | |
FUNC_LG: '\\lg'; | |
FUNC_LN: '\\ln'; | |
FUNC_SIN: '\\sin'; | |
FUNC_COS: '\\cos'; | |
FUNC_TAN: '\\tan'; | |
FUNC_CSC: '\\csc'; | |
FUNC_SEC: '\\sec'; | |
FUNC_COT: '\\cot'; | |
FUNC_ARCSIN: '\\arcsin'; | |
FUNC_ARCCOS: '\\arccos'; | |
FUNC_ARCTAN: '\\arctan'; | |
FUNC_ARCCSC: '\\arccsc'; | |
FUNC_ARCSEC: '\\arcsec'; | |
FUNC_ARCCOT: '\\arccot'; | |
FUNC_SINH: '\\sinh'; | |
FUNC_COSH: '\\cosh'; | |
FUNC_TANH: '\\tanh'; | |
FUNC_ARSINH: '\\arsinh'; | |
FUNC_ARCOSH: '\\arcosh'; | |
FUNC_ARTANH: '\\artanh'; | |
L_FLOOR: '\\lfloor'; | |
R_FLOOR: '\\rfloor'; | |
L_CEIL: '\\lceil'; | |
R_CEIL: '\\rceil'; | |
FUNC_SQRT: '\\sqrt'; | |
FUNC_OVERLINE: '\\overline'; | |
CMD_TIMES: '\\times'; | |
CMD_CDOT: '\\cdot'; | |
CMD_DIV: '\\div'; | |
CMD_FRAC: | |
'\\frac' | |
| '\\dfrac' | |
| '\\tfrac'; | |
CMD_BINOM: '\\binom'; | |
CMD_DBINOM: '\\dbinom'; | |
CMD_TBINOM: '\\tbinom'; | |
CMD_MATHIT: '\\mathit'; | |
UNDERSCORE: '_'; | |
CARET: '^'; | |
COLON: ':'; | |
fragment WS_CHAR: [ \t\r\n]; | |
DIFFERENTIAL: 'd' WS_CHAR*? ([a-zA-Z] | '\\' [a-zA-Z]+); | |
LETTER: [a-zA-Z]; | |
DIGIT: [0-9]; | |
EQUAL: (('&' WS_CHAR*?)? '=') | ('=' (WS_CHAR*? '&')?); | |
NEQ: '\\neq'; | |
LT: '<'; | |
LTE: ('\\leq' | '\\le' | LTE_Q | LTE_S); | |
LTE_Q: '\\leqq'; | |
LTE_S: '\\leqslant'; | |
GT: '>'; | |
GTE: ('\\geq' | '\\ge' | GTE_Q | GTE_S); | |
GTE_Q: '\\geqq'; | |
GTE_S: '\\geqslant'; | |
BANG: '!'; | |
SINGLE_QUOTES: '\''+; | |
SYMBOL: '\\' [a-zA-Z]+; | |
math: relation; | |
relation: | |
relation (EQUAL | LT | LTE | GT | GTE | NEQ) relation | |
| expr; | |
equality: expr EQUAL expr; | |
expr: additive; | |
additive: additive (ADD | SUB) additive | mp; | |
// mult part | |
mp: | |
mp (MUL | CMD_TIMES | CMD_CDOT | DIV | CMD_DIV | COLON) mp | |
| unary; | |
mp_nofunc: | |
mp_nofunc ( | |
MUL | |
| CMD_TIMES | |
| CMD_CDOT | |
| DIV | |
| CMD_DIV | |
| COLON | |
) mp_nofunc | |
| unary_nofunc; | |
unary: (ADD | SUB) unary | postfix+; | |
unary_nofunc: | |
(ADD | SUB) unary_nofunc | |
| postfix postfix_nofunc*; | |
postfix: exp postfix_op*; | |
postfix_nofunc: exp_nofunc postfix_op*; | |
postfix_op: BANG | eval_at; | |
eval_at: | |
BAR (eval_at_sup | eval_at_sub | eval_at_sup eval_at_sub); | |
eval_at_sub: UNDERSCORE L_BRACE (expr | equality) R_BRACE; | |
eval_at_sup: CARET L_BRACE (expr | equality) R_BRACE; | |
exp: exp CARET (atom | L_BRACE expr R_BRACE) subexpr? | comp; | |
exp_nofunc: | |
exp_nofunc CARET (atom | L_BRACE expr R_BRACE) subexpr? | |
| comp_nofunc; | |
comp: | |
group | |
| abs_group | |
| func | |
| atom | |
| floor | |
| ceil; | |
comp_nofunc: | |
group | |
| abs_group | |
| atom | |
| floor | |
| ceil; | |
group: | |
L_PAREN expr R_PAREN | |
| L_BRACKET expr R_BRACKET | |
| L_BRACE expr R_BRACE | |
| L_BRACE_LITERAL expr R_BRACE_LITERAL; | |
abs_group: BAR expr BAR; | |
number: DIGIT+ (',' DIGIT DIGIT DIGIT)* ('.' DIGIT+)?; | |
atom: (LETTER | SYMBOL) (subexpr? SINGLE_QUOTES? | SINGLE_QUOTES? subexpr?) | |
| number | |
| DIFFERENTIAL | |
| mathit | |
| frac | |
| binom | |
| bra | |
| ket; | |
bra: L_ANGLE expr (R_BAR | BAR); | |
ket: (L_BAR | BAR) expr R_ANGLE; | |
mathit: CMD_MATHIT L_BRACE mathit_text R_BRACE; | |
mathit_text: LETTER*; | |
frac: CMD_FRAC (upperd = DIGIT | L_BRACE upper = expr R_BRACE) | |
(lowerd = DIGIT | L_BRACE lower = expr R_BRACE); | |
binom: | |
(CMD_BINOM | CMD_DBINOM | CMD_TBINOM) L_BRACE n = expr R_BRACE L_BRACE k = expr R_BRACE; | |
floor: L_FLOOR val = expr R_FLOOR; | |
ceil: L_CEIL val = expr R_CEIL; | |
func_normal: | |
FUNC_EXP | |
| FUNC_LOG | |
| FUNC_LG | |
| FUNC_LN | |
| FUNC_SIN | |
| FUNC_COS | |
| FUNC_TAN | |
| FUNC_CSC | |
| FUNC_SEC | |
| FUNC_COT | |
| FUNC_ARCSIN | |
| FUNC_ARCCOS | |
| FUNC_ARCTAN | |
| FUNC_ARCCSC | |
| FUNC_ARCSEC | |
| FUNC_ARCCOT | |
| FUNC_SINH | |
| FUNC_COSH | |
| FUNC_TANH | |
| FUNC_ARSINH | |
| FUNC_ARCOSH | |
| FUNC_ARTANH; | |
func: | |
func_normal (subexpr? supexpr? | supexpr? subexpr?) ( | |
L_PAREN func_arg R_PAREN | |
| func_arg_noparens | |
) | |
| (LETTER | SYMBOL) (subexpr? SINGLE_QUOTES? | SINGLE_QUOTES? subexpr?) // e.g. f(x), f_1'(x) | |
L_PAREN args R_PAREN | |
| FUNC_INT (subexpr supexpr | supexpr subexpr)? ( | |
additive? DIFFERENTIAL | |
| frac | |
| additive | |
) | |
| FUNC_SQRT (L_BRACKET root = expr R_BRACKET)? L_BRACE base = expr R_BRACE | |
| FUNC_OVERLINE L_BRACE base = expr R_BRACE | |
| (FUNC_SUM | FUNC_PROD) (subeq supexpr | supexpr subeq) mp | |
| FUNC_LIM limit_sub mp; | |
args: (expr ',' args) | expr; | |
limit_sub: | |
UNDERSCORE L_BRACE (LETTER | SYMBOL) LIM_APPROACH_SYM expr ( | |
CARET ((L_BRACE (ADD | SUB) R_BRACE) | ADD | SUB) | |
)? R_BRACE; | |
func_arg: expr | (expr ',' func_arg); | |
func_arg_noparens: mp_nofunc; | |
subexpr: UNDERSCORE (atom | L_BRACE expr R_BRACE); | |
supexpr: CARET (atom | L_BRACE expr R_BRACE); | |
subeq: UNDERSCORE L_BRACE equality R_BRACE; | |
supeq: UNDERSCORE L_BRACE equality R_BRACE; | |