diff options
| author | zitian-gao <zitian.gao@outlook.com> | 2025-05-27 16:45:31 +0800 |
|---|---|---|
| committer | zitian-gao <zitian.gao@outlook.com> | 2025-05-27 16:45:31 +0800 |
| commit | 7c792461c8e4e4f1f8734fed143630c74e76b27f (patch) | |
| tree | cf6341ff9f2727424751da7a11a3bea6c39015bb /Qwen2.5-Eval/evaluation/latex2sympy/PS.g4 | |
| parent | 16815c8c5ec263c4bd1a0af60030c1c0efa1421e (diff) | |
init eval
Diffstat (limited to 'Qwen2.5-Eval/evaluation/latex2sympy/PS.g4')
| -rwxr-xr-x | Qwen2.5-Eval/evaluation/latex2sympy/PS.g4 | 638 |
1 files changed, 638 insertions, 0 deletions
diff --git a/Qwen2.5-Eval/evaluation/latex2sympy/PS.g4 b/Qwen2.5-Eval/evaluation/latex2sympy/PS.g4 new file mode 100755 index 0000000..51834a2 --- /dev/null +++ b/Qwen2.5-Eval/evaluation/latex2sympy/PS.g4 @@ -0,0 +1,638 @@ +grammar PS; + +options { + language=Python2; +} + +WS: [ \t\r\n]+ -> skip; +DOLLAR_SIGN: '\\$' -> skip; + +ADD: '+'; +SUB: '-'; +MUL: '*'; +DIV: '/' | '\\over'; + +L_PAREN: '('; +R_PAREN: ')'; +L_GROUP: '\\lgroup'; +R_GROUP: '\\rgroup'; +L_BRACE: '{'; +R_BRACE: '}'; +L_BRACE_VISUAL: '\\{'; +R_BRACE_VISUAL: '\\}'; +L_BRACE_CMD: '\\lbrace'; +R_BRACE_CMD: '\\rbrace'; +L_BRACKET: '['; +R_BRACKET: ']'; +L_BRACK: '\\lbrack'; +R_BRACK: '\\rbrack'; + +BAR: '|'; +L_VERT: '\\lvert'; +R_VERT: '\\rvert'; +VERT: '\\vert'; + +NORM: '\\|'; + +L_FLOOR: '\\lfloor'; +R_FLOOR: '\\rfloor'; +LL_CORNER: '\\llcorner'; +LR_CORNER: '\\lrcorner'; + +L_CEIL: '\\lceil'; +R_CEIL: '\\rceil'; +UL_CORNER: '\\ulcorner'; +UR_CORNER: '\\urcorner'; + +L_LEFT: '\\left'; +R_RIGHT: '\\right'; +ML_LEFT: '\\mleft'; +MR_RIGHT: '\\mright'; + +//functions +FUNC_LIM: '\\lim'; +LIM_APPROACH_SYM: '\\to' | '\\rightarrow' | '\\Rightarrow' | '\\longrightarrow' | '\\Longrightarrow'; +FUNC_INT: '\\int'; +FUNC_SUM: '\\sum'; +FUNC_PROD: '\\prod'; + +FUNC_LOG: '\\log'; +FUNC_LN: '\\ln'; +FUNC_EXP: '\\exp'; +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'; +FUNC_ARCSINH: '\\arcsinh'; +FUNC_ARCCOSH: '\\arccosh'; +FUNC_ARCTANH: '\\arctanh'; + +FUNC_ARSINH_NAME: 'arsinh'; +FUNC_ARCSINH_NAME: 'arcsinh'; +FUNC_ARCOSH_NAME: 'arcosh'; +FUNC_ARCCOSH_NAME: 'arccosh'; +FUNC_ARTANH_NAME: 'artanh'; +FUNC_ARCTANH_NAME: 'arctanh'; +FUNC_GCD_NAME: 'gcd'; +FUNC_LCM_NAME: 'lcm'; +FUNC_FLOOR_NAME: 'floor'; +FUNC_CEIL_NAME: 'ceil'; + +FUNC_SQRT: '\\sqrt'; +FUNC_GCD: '\\gcd'; +FUNC_LCM: '\\lcm'; +FUNC_FLOOR: '\\floor'; +FUNC_CEIL: '\\ceil'; +FUNC_MAX: '\\max'; +FUNC_MIN: '\\min'; + +FUNC_DET: '\\det'; + +FUNC_EYE_NAME: 'eye'; +FUNC_ZEROS_NAME: 'zeros'; +FUNC_ONES_NAME: 'ones'; +FUNC_COLS_NAME: 'cols'; +FUNC_ROWS_NAME: 'rows'; +FUNC_DIAG_NAME: 'diag'; +FUNC_NORM_NAME: 'norm'; +FUNC_RANK_NAME: 'rank'; +FUNC_TRACE_NAME: 'trace' | 'tr'; +FUNC_RREF_NAME: 'rref'; +FUNC_HSTACK_NAME: 'hstack'; +FUNC_VSTACK_NAME: 'vstack'; +FUNC_ORTHOGONALIZE_NAME: 'orth' | 'ortho' | 'orthogonal' | 'orthogonalize'; +FUNC_NULLSPACE_NAME: 'nullspace'; +FUNC_DIAGONALIZE_NAME: 'eig' | 'eigen' | 'diagonalize'; +FUNC_EIGENVALS_NAME: 'eigenvals' | 'eigenvalues'; +FUNC_EIGENVECTORS_NAME: 'eigenvects' | 'eigenvectors'; +FUNC_SVD_NAME: 'svd' | 'SVD'; + +//commands +CMD_TIMES: '\\times'; +CMD_CDOT: '\\cdot'; +CMD_DIV: '\\div'; +CMD_FRAC: '\\frac'; +CMD_BINOM: '\\binom' | '\\tbinom' | '\\dbinom'; +CMD_CHOOSE: '\\choose'; +CMD_MOD: '\\mod'; + +CMD_MATHIT: '\\mathit'; + +CMD_OPERATORNAME: '\\operatorname'; + +//matrix test +MATRIX_TYPE_MATRIX: 'matrix'; +MATRIX_TYPE_PMATRIX: 'pmatrix'; +MATRIX_TYPE_BMATRIX: 'bmatrix'; +MATRIX_TYPE_DET: 'vmatrix'; +MATRIX_TYPES: MATRIX_TYPE_MATRIX | MATRIX_TYPE_PMATRIX | MATRIX_TYPE_BMATRIX; +CMD_MATRIX_START: '\\begin' L_BRACE MATRIX_TYPES R_BRACE; +CMD_MATRIX_END: '\\end' L_BRACE MATRIX_TYPES R_BRACE; +CMD_DET_START: '\\begin' L_BRACE MATRIX_TYPE_DET R_BRACE; +CMD_DET_END: '\\end' L_BRACE MATRIX_TYPE_DET R_BRACE; +MATRIX_DEL_COL: '&'; +MATRIX_DEL_ROW: '\\\\'; + +UNDERSCORE: '_'; +CARET: '^'; +COLON: ':'; +SEMICOLON: ';'; +COMMA: ','; +PERIOD: '.'; + +fragment WS_CHAR: [ \t\r\n]; +DIFFERENTIAL: 'd' WS_CHAR*? ([a-zA-Z] | '\\' [a-zA-Z]+); + +EXP_E: 'e' | '\\exponentialE'; +E_NOTATION_E: 'E'; +LETTER_NO_E: [a-df-zA-DF-Z]; // exclude e for exponential function and e notation +fragment LETTER: [a-zA-Z]; +fragment DIGIT: [0-9]; + +MATRIX_XRIGHTARROW: '\\xrightarrow' | '\\xRightarrow'; +TRANSFORM_EXCHANGE: '<->' | '<=>' | '\\leftrightarrow' | '\\Leftrightarrow'; + +NUMBER: + DIGIT+ (COMMA DIGIT DIGIT DIGIT)* + | DIGIT* (COMMA DIGIT DIGIT DIGIT)* PERIOD DIGIT+; + +E_NOTATION: NUMBER E_NOTATION_E (SUB | ADD)? DIGIT+; + +IN: '\\in'; +ASSIGNMENT: '='; +EQUAL: '==' | '\\equiv'; +LT: '<'; +LTE: '\\leq' | '\\le' | '\\leqslant'; +GT: '>'; +GTE: '\\geq' | '\\ge' | '\\geqslant'; +UNEQUAL: '!=' | '!==' | '\\ne' | '\\neq' | '\\not\\equiv'; + +BANG: '!'; + +fragment PERCENT_SIGN: '\\%'; +PERCENT_NUMBER: NUMBER PERCENT_SIGN; + +//Excludes some letters for use as e.g. constants in SYMBOL +fragment GREEK_LETTER: + '\\char"000391' | //Alpha + '\\alpha' | + '\\char"000392' | //Beta + '\\beta' | + '\\Gamma' | + '\\gamma' | + '\\Delta' | + '\\delta' | + '\\char"000190' | //Epsilon + '\\epsilon' | + '\\varepsilon' | + '\\char"000396' | //Zeta + '\\zeta' | + '\\char"000397' | //Eta + '\\eta' | + '\\Theta' | + '\\theta' | + '\\vartheta' | + '\\char"000399' | //Iota + '\\iota' | + '\\char"00039A' | //Kappa + '\\kappa' | + '\\Lambda' | + '\\lambda' | + '\\char"00039C' | //Mu + '\\mu' | + '\\char"00039D' | //Nu + '\\nu' | + '\\Xi' | + '\\xi' | + '\\char"00039F' | //Omicron + '\\omicron' | + '\\Pi' | + '\\varpi' | + '\\char"0003A1' | //Rho + '\\rho' | + '\\varrho' | + '\\Sigma' | + '\\sigma' | + '\\varsigma' | + '\\char"0003A4' | //Tau + '\\tau' | + '\\Upsilon' | + '\\upsilon' | + '\\Phi' | + '\\phi' | + '\\varphi' | + '\\char"0003A7' | //Chi + '\\chi' | + '\\Psi' | + '\\psi' | + '\\Omega' | + '\\omega'; + +GREEK_CMD: GREEK_LETTER [ ]?; + +fragment OTHER_SYMBOL: + '\\Bbbk' | + '\\wp' | + '\\nabla' | + '\\bigstar' | + '\\angle' | + '\\nexists' | + '\\diagdown' | + '\\measuredangle' | + '\\eth' | + '\\emptyset' | + '\\diagup' | + '\\sphericalangle' | + '\\clubsuit' | + '\\varnothing' | + '\\Diamond' | + '\\complement' | + '\\diamondsuit' | + '\\imath' | + '\\Finv' | + '\\triangledown' | + '\\heartsuit' | + '\\jmath' | + '\\Game' | + '\\triangle' | + '\\spadesuit' | + '\\ell' | + '\\hbar' | + '\\vartriangle' | + '\\hslash' | + '\\blacklozenge' | + '\\lozenge' | + '\\blacksquare' | + '\\mho' | + '\\blacktriangle' | + '\\sharp' | + '\\prime' | + '\\Im' | + '\\flat' | + '\\square' | + '\\backprime' | + '\\Re' | + '\\natural' | + '\\surd' | + '\\circledS'; +OTHER_SYMBOL_CMD: OTHER_SYMBOL [ ]?; + +fragment PI: '\\pi'; +fragment INFTY_CMD: '\\infty'; +fragment PARTIAL_CMD: '\\partial'; +fragment INFTY: INFTY_CMD | DOLLAR_SIGN INFTY_CMD | INFTY_CMD PERCENT_SIGN; +fragment EMPTYSET: '\\emptyset'; +SYMBOL: PI | PARTIAL_CMD | INFTY | EMPTYSET; + +fragment VARIABLE_CMD: '\\variable'; +fragment VARIABLE_SYMBOL: (GREEK_CMD | OTHER_SYMBOL_CMD | LETTER | DIGIT)+ (UNDERSCORE ((L_BRACE (GREEK_CMD | OTHER_SYMBOL_CMD | LETTER | DIGIT | COMMA)+ R_BRACE) | (GREEK_CMD | OTHER_SYMBOL_CMD | LETTER | DIGIT)))?; +VARIABLE: VARIABLE_CMD L_BRACE VARIABLE_SYMBOL R_BRACE PERCENT_SIGN?; + +//collection of accents +accent_symbol: + '\\acute' | + '\\bar' | + '\\overline' | + '\\breve' | + '\\check' | + '\\widecheck' | + '\\dot' | + '\\ddot' | + '\\grave' | + '\\hat' | + '\\tilde' | + '\\widetilde' | + '\\vec' | + '\\overrightarrow' | + '\\bm' | + '\\boldsymbol' | + '\\text' | + '\\textit' | + '\\mathbb' | + '\\mathbin' | + '\\mathbf' | + '\\mathcal' | + '\\mathclap' | + '\\mathclose' | + '\\mathellipsis' | + '\\mathfrak' | + '\\mathinner' | + '\\mathit' | + '\\mathnormal' | + '\\mathop' | + '\\mathopen' | + '\\mathord' | + '\\mathpunct' | + '\\mathrel' | + '\\mathring' | + '\\mathrlap' | + '\\mathrm' | + '\\mathscr' | + '\\mathsf' | + '\\mathsterling' | + '\\mathtt'; + +math: relation | relation_list; + +transpose: '^T' | '^{T}' | '^{\\top}' | '\''; + +transform_atom: LETTER_NO_E UNDERSCORE (NUMBER | L_BRACE NUMBER R_BRACE); +transform_scale: (expr | group | ADD | SUB) transform_atom; +transform_swap: transform_atom TRANSFORM_EXCHANGE transform_atom; +transform_assignment: transform_atom transform_scale; +elementary_transform: transform_assignment | transform_scale | transform_swap; +elementary_transforms: elementary_transform (COMMA elementary_transform)*; + +matrix: + CMD_MATRIX_START + matrix_row (MATRIX_DEL_ROW matrix_row)* MATRIX_DEL_ROW? + CMD_MATRIX_END + (MATRIX_XRIGHTARROW (L_BRACKET elementary_transforms R_BRACKET)? L_BRACE elementary_transforms R_BRACE)?; + +det: + CMD_DET_START + matrix_row (MATRIX_DEL_ROW matrix_row)* MATRIX_DEL_ROW? + CMD_DET_END; + +matrix_row: + expr (MATRIX_DEL_COL expr)*; + +relation: + relation (IN | ASSIGNMENT | EQUAL | LT | LTE | GT | GTE | UNEQUAL) relation + | expr; + +relation_list: + relation_list_content + | L_BRACKET relation_list_content R_BRACKET + | L_BRACE relation_list_content R_BRACE + | L_BRACE_VISUAL relation_list_content R_BRACE_VISUAL + | L_LEFT L_BRACKET relation_list_content R_RIGHT R_BRACKET + | L_LEFT L_BRACE_VISUAL relation_list_content R_RIGHT R_BRACE_VISUAL + | ML_LEFT L_BRACKET relation_list_content MR_RIGHT R_BRACKET + | ML_LEFT L_BRACE_VISUAL relation_list_content MR_RIGHT R_BRACE_VISUAL; + +relation_list_content: + relation COMMA relation (COMMA relation)* + | relation SEMICOLON relation (SEMICOLON relation)*; + +equality: + expr (EQUAL | ASSIGNMENT) expr; + +expr: additive; + +additive: + additive (ADD | SUB) additive + | mp; + +// mult part +mp: + mp (MUL | CMD_TIMES | CMD_CDOT | DIV | CMD_DIV | COLON | CMD_MOD) mp + | unary; + +mp_nofunc: + mp_nofunc (MUL | CMD_TIMES | CMD_CDOT | DIV | CMD_DIV | COLON | CMD_MOD) 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 | transpose; + +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 + | norm_group + | abs_group + | floor_group + | ceil_group + | func + | atom + | frac + | binom + | matrix + | det; + +comp_nofunc: + group + | norm_group + | abs_group + | floor_group + | ceil_group + | atom + | frac + | binom + | matrix + | det; + +group: + L_PAREN expr R_PAREN + | L_GROUP expr R_GROUP + | L_BRACE expr R_BRACE + | L_BRACE_VISUAL expr R_BRACE_VISUAL + | L_BRACE_CMD expr R_BRACE_CMD + | L_BRACKET expr R_BRACKET + | L_BRACK expr R_BRACK + | L_LEFT L_PAREN expr R_RIGHT R_PAREN + | L_LEFT L_GROUP expr R_RIGHT R_GROUP + | L_LEFT L_BRACE expr R_RIGHT R_BRACE + | L_LEFT L_BRACE_VISUAL expr R_RIGHT R_BRACE_VISUAL + | L_LEFT L_BRACE_CMD expr R_RIGHT R_BRACE_CMD + | L_LEFT L_BRACKET expr R_RIGHT R_BRACKET + | L_LEFT L_BRACK expr R_RIGHT R_BRACK + | ML_LEFT L_PAREN expr MR_RIGHT R_PAREN + | ML_LEFT L_GROUP expr MR_RIGHT R_GROUP + | ML_LEFT L_BRACE expr MR_RIGHT R_BRACE + | ML_LEFT L_BRACE_VISUAL expr MR_RIGHT R_BRACE_VISUAL + | ML_LEFT L_BRACE_CMD expr MR_RIGHT R_BRACE_CMD + | ML_LEFT L_BRACKET expr MR_RIGHT R_BRACKET + | ML_LEFT L_BRACK expr MR_RIGHT R_BRACK; + + +norm_group: + NORM expr NORM + | L_LEFT NORM expr R_RIGHT NORM + | ML_LEFT NORM expr MR_RIGHT NORM; + + +abs_group: + BAR expr BAR + | L_VERT expr R_VERT + | VERT expr VERT + | L_LEFT BAR expr R_RIGHT BAR + | L_LEFT L_VERT expr R_RIGHT R_VERT + | L_LEFT VERT expr R_RIGHT VERT + | ML_LEFT BAR expr MR_RIGHT BAR + | ML_LEFT L_VERT expr MR_RIGHT R_VERT + | ML_LEFT VERT expr MR_RIGHT VERT; + + +floor_group: + L_FLOOR expr R_FLOOR + | LL_CORNER expr LR_CORNER + | L_LEFT L_FLOOR expr R_RIGHT R_FLOOR + | L_LEFT LL_CORNER expr R_RIGHT LR_CORNER + | ML_LEFT L_FLOOR expr MR_RIGHT R_FLOOR + | ML_LEFT LL_CORNER expr MR_RIGHT LR_CORNER; + + +ceil_group: + L_CEIL expr R_CEIL + | UL_CORNER expr UR_CORNER + | L_LEFT L_CEIL expr R_RIGHT R_CEIL + | L_LEFT UL_CORNER expr R_RIGHT UR_CORNER + | ML_LEFT L_CEIL expr MR_RIGHT R_CEIL + | ML_LEFT UL_CORNER expr MR_RIGHT UR_CORNER; + + +//indicate an accent +accent: + accent_symbol + L_BRACE base=expr R_BRACE; + +atom_expr_no_supexpr: (LETTER_NO_E | GREEK_CMD | OTHER_SYMBOL_CMD | accent) subexpr?; +atom_expr: (LETTER_NO_E | GREEK_CMD | OTHER_SYMBOL_CMD | accent) (supexpr subexpr | subexpr supexpr | subexpr | supexpr)?; +atom: atom_expr | SYMBOL | NUMBER | PERCENT_NUMBER | E_NOTATION | DIFFERENTIAL | mathit | VARIABLE; + +mathit: CMD_MATHIT L_BRACE mathit_text R_BRACE; +mathit_text: (LETTER_NO_E | E_NOTATION_E | EXP_E)+; + +frac: + CMD_FRAC L_BRACE + upper=expr + R_BRACE L_BRACE + lower=expr + R_BRACE; + +//a binomial expression +binom: + L_BRACE upper=expr CMD_CHOOSE lower=expr R_BRACE + | CMD_BINOM L_BRACE upper=expr R_BRACE L_BRACE lower=expr R_BRACE; + +func_normal_functions_single_arg: + FUNC_LOG | FUNC_LN | FUNC_EXP + | 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_ARCSINH | FUNC_ARCCOSH | FUNC_ARCTANH + | FUNC_FLOOR | FUNC_CEIL | FUNC_DET; + +func_normal_functions_multi_arg: + FUNC_GCD | FUNC_LCM | FUNC_MAX | FUNC_MIN; + +func_operator_names_single_arg: + FUNC_ARSINH_NAME | FUNC_ARCOSH_NAME | FUNC_ARTANH_NAME + | FUNC_ARCSINH_NAME | FUNC_ARCCOSH_NAME | FUNC_ARCTANH_NAME + | FUNC_FLOOR_NAME | FUNC_CEIL_NAME | FUNC_EYE_NAME | FUNC_RANK_NAME | FUNC_TRACE_NAME + | FUNC_RREF_NAME | FUNC_NULLSPACE_NAME | FUNC_DIAGONALIZE_NAME | FUNC_NORM_NAME + | FUNC_EIGENVALS_NAME | FUNC_EIGENVECTORS_NAME | FUNC_SVD_NAME | FUNC_COLS_NAME | FUNC_ROWS_NAME; + +func_operator_names_multi_arg: + FUNC_GCD_NAME | FUNC_LCM_NAME | FUNC_ZEROS_NAME | FUNC_ORTHOGONALIZE_NAME + | FUNC_ONES_NAME | FUNC_DIAG_NAME | FUNC_HSTACK_NAME | FUNC_VSTACK_NAME; + +func_normal_single_arg: + (func_normal_functions_single_arg) + | + (CMD_OPERATORNAME L_BRACE func_operator_name=func_operator_names_single_arg R_BRACE); + +func_normal_multi_arg: + (func_normal_functions_multi_arg) + | + (CMD_OPERATORNAME L_BRACE func_operator_name=func_operator_names_multi_arg R_BRACE); + +func: + func_normal_single_arg + (subexpr? supexpr? | supexpr? subexpr?) + (L_LEFT? L_PAREN func_single_arg R_RIGHT? R_PAREN | ML_LEFT? L_PAREN func_single_arg MR_RIGHT? R_PAREN | func_single_arg_noparens) + + | func_normal_multi_arg + (subexpr? supexpr? | supexpr? subexpr?) + (L_LEFT? L_PAREN func_multi_arg R_RIGHT? R_PAREN | ML_LEFT? L_PAREN func_multi_arg MR_RIGHT? R_PAREN | func_multi_arg_noparens) + + | atom_expr_no_supexpr supexpr? + L_LEFT? (L_PAREN | L_BRACKET) func_common_args (R_PAREN | R_BRACKET) R_RIGHT? + | atom_expr_no_supexpr supexpr? + L_BRACE L_LEFT? (L_PAREN | L_BRACKET) func_common_args (R_PAREN | R_BRACKET) R_RIGHT? R_BRACE + + | FUNC_INT + (subexpr supexpr | supexpr subexpr | (UNDERSCORE L_BRACE R_BRACE) (CARET L_BRACE R_BRACE) | (CARET L_BRACE R_BRACE) (UNDERSCORE L_BRACE R_BRACE) )? + (additive? DIFFERENTIAL | frac | additive) + + | FUNC_SQRT + (L_BRACKET root=expr R_BRACKET)? + L_BRACE base=expr R_BRACE + + | (FUNC_SUM | FUNC_PROD) + (subeq supexpr | supexpr subeq) + mp + | FUNC_LIM limit_sub mp + | EXP_E supexpr?; //Exponential function e^x + +args: (expr ',' args) | expr; + +func_common_args: atom | (expr ',') | (expr ',' args); + +limit_sub: + UNDERSCORE L_BRACE + (LETTER_NO_E | GREEK_CMD | OTHER_SYMBOL_CMD) + LIM_APPROACH_SYM + expr (CARET L_BRACE (ADD | SUB) R_BRACE)? + R_BRACE; + +func_single_arg: expr; +func_single_arg_noparens: mp_nofunc; + +func_multi_arg: expr | (expr ',' func_multi_arg); +func_multi_arg_noparens: mp_nofunc; + +subexpr: UNDERSCORE (atom | L_BRACE (expr | args) R_BRACE); +supexpr: CARET (atom | L_BRACE expr R_BRACE); + +subeq: UNDERSCORE L_BRACE equality R_BRACE; +supeq: UNDERSCORE L_BRACE equality R_BRACE; |
