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