/* 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 = Python2; } 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'; FUNC_SUM: '\\sum'; FUNC_PROD: '\\prod'; FUNC_EXP: '\\exp'; FUNC_LOG: '\\log'; 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'; 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]; fragment DIGIT: [0-9]; NUMBER: DIGIT+ (',' DIGIT DIGIT DIGIT)* | DIGIT* (',' DIGIT DIGIT DIGIT)* '.' DIGIT+; 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: '!'; 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 | frac | binom | floor | ceil; comp_nofunc: group | abs_group | atom | frac | binom | 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; atom: (LETTER | SYMBOL) subexpr? | NUMBER | DIFFERENTIAL | mathit | 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 L_BRACE upper = expr R_BRACE 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_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? // e.g. f(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 )? 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;