summaryrefslogtreecommitdiff
path: root/Qwen2.5-Eval/evaluation/latex2sympy/PS.g4
diff options
context:
space:
mode:
authorYuren Hao <yurenh2@timan108.cs.illinois.edu>2025-09-04 22:16:22 -0500
committerYuren Hao <yurenh2@timan108.cs.illinois.edu>2025-09-04 22:16:22 -0500
commitfc6d57ffb8d5ddb5820fcc00b5491a585c259ebc (patch)
treee9841f93a353e2107225cfc721d1ce57c0e594dc /Qwen2.5-Eval/evaluation/latex2sympy/PS.g4
Initial commit
Diffstat (limited to 'Qwen2.5-Eval/evaluation/latex2sympy/PS.g4')
-rwxr-xr-xQwen2.5-Eval/evaluation/latex2sympy/PS.g4638
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;