MEC参考MMA的文法。MMA并没有形式定义的文法,但是在官方网站的文档中定义了一下关于文法的信息:
里面字符的名称使用Unicode的名称。
grammar MEC;
/* lexer */
OSO : '\&' ; // OVERSCRIPT OPERATOR
USO : '\+' ; // UNDERSCRIPT OPERATOR
SOP : '\%' ; // SCRIPT OPERATOR PART
POP : '\^' ; // POWER OPERATOR PART
SSO : '\&' ; // SUBSCRIPT OPERATOR
SQRTO : '\@' ; // SQRT OPERATOR
LCO : '@*' ; // LEFT COMPOSITION OPERATOR
RCO : '/*' ; // RIGHT COMPOSITION OPERATOR
MAO : '//@' ; // MAP ALL OPERATOR
MO : '/@' ; // MAP OPERATOR
TAT : '@@@' ; // TRIPLE AT
DAT : '@@' ; // DOUBLE AT
DECLM : '!!' ; // DOUBLE EXCLAMATION MARK
ECLM : '!' ; // EXCLAMATION MARK
CJGO : '\uF3C8' ; // CONJUGATE OPERATOR
TSPO : '\uF3C7' ; // TRANSPOSE OPERATOR
CTO : '\uF3C9' | '\uF3CE' ; // CONJUGATE TRANSPOSE OPERATOR
APSTP : '\'' ; // APOSTROPHE
// keep this over '['
DLSB : '[[' ; // DOUBLE LEFT SQUARE BRACKET
// keep this over ']'
DRSB : ']]' ; // DOUBLE RIGHT SQUARE BRACKET
LWSB : '\u301A' ; // LEFT WHITE SQUARE BRACKET
RWSB : '\u301B' ; // RIGHT WHITE SQUARE BRACKET
PART_L : DLSB | LWSB ;
PART_R : DRSB | RWSB ;
LSB : '[' ; // LEFT SQUARE BRACKET
RSB : ']' ; // RIGHT SQUARE BRACKET
TLTS : '<<<' ;="" TRIPLE="" LESS-THAN="" SIGN="" TGTS="" :="" '="">>>' ; // TRIPLE GREATER-THAN SIGN
DLTS : '<<' ;="" DOUBLE="" LESS-THAN="" SIGN="" DGTS="" :="" '="">>' ; // DOUBLE GREATER-THAN SIGN
SJO : '<>' ; // STRING JOIN OPERATOR
LTS : '<' ;="" LESS-THAN="" SIGN="" GTS="" :="" '="">' ; // GREATER-THAN SIGN
CCFA : '^' ; // CIRCUMFLEX ACCENT
LP : '(' ; // LEFT PARENTHESIS
RP : ')' ; // RIGHT PARENTHESIS
QTM : '"' ; // QUOTATION MARK
QSM : '?' ; // QUESTION MARK
INC : '++' ; // INCREMENT
DEC : '--' ; // DECREMENT
AT : '@' ; // COMMERCIAL AT
TILDE : '~' ; // TILDE
INTG : '\u222B' ; // INTEGRAL
DIFF : '\uF74C' ; // DIFFERENTIAL
PDIFF : '\u2202' ; // PARTIAL DIFFERENTIAL
/* parser */
grammar MEC;
LS_BRACKET : '[' ; // LEFT SQUARE BRACKET
RS_BRACKET : ']' ; // RIGHT SQUARE BRACKET
LC_BRACKET : '{' ; // LEFT CURLY BRACKET
RC_BRACKET : '}' ; // RIGHT CURLY BRACKET
L_PAREN : '(' ; // LEFT PARENTHESIS
R_PAREN : ')' ; // RIGHT PARENTHESIS
COMMA : ',' ;
SEMICOLON : ';' ;
COLON : ':' ;
AMPERSAND : '&' ;
NEWLINE : '\r\n' | '\n' | '\r';
R_SHIFT3 : '>>>' ;
R_SHIFT2 : '>>' ;
OP_SET_DELAYED : ':=' ;
OP_SET : '=' ;
statement : compoundExpr NEWLINE;
compoundExpr
: putExpr (SEMICOLON putExpr)* SEMICOLON? ;
putExpr
: funcExpr R_SHIFT3 STRING # putAppendExpression
| funcExpr R_SHIFT2 STRING # putExpression
;
funcExpr
: reasonExpr OP_SET reasonExpr
| reasonExpr OP_SET_DELAYED reasonExpr
;
/*
* Grammar MEC
* Meta-Expression Calculator
*/
grammar MEC;
statement : expr ;
SYMBOL : [A-Za-z][A-Za-z0-9]* ;
STRING : '"' (~('"'))* '"' ;
INTEGER : [1-9][0-9]*
| '0'
;
LS_BRACKET : '[' ; // LEFT SQUARE BRACKET
RS_BRACKET : ']' ; // RIGHT SQUARE BRACKET
LC_BRACKET : '{' ; // LEFT CURLY BRACKET
RC_BRACKET : '}' ; // RIGHT CURLY BRACKET
COMMA : ',' ;
WS : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines
expr : atomExpr elementList* ;
atomExpr : (SYMBOL | STRING | INTEGER)
| list
;
elementList : LS_BRACKET RS_BRACKET
| LS_BRACKET expr (COMMA expr)* RS_BRACKET
;
list : LC_BRACKET expr (COMMA expr)* RC_BRACKET ;