Spaces:
Paused
Paused
| /* | |
| 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; | |