|
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; |
|
|