darklight03's picture
eval (#6)
7f272e4 verified
raw
history blame
16.1 kB
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;