grammar Calc;
options
{
output = AST;
// language = Javascript;
}
tokens
{
NEGATE; // used to disambiguate from subtract
}
parse
: (stat ('\n'|EOF))+
-> stat+
;
stat
: REGISTER '='^ expr // assignment
| expr // expression
;
expr // lowest level of precedence
: additionExpr
;
additionExpr // 5th level of precedence
: multiplyExpr (('+'|'-')^ multiplyExpr)*
;
multiplyExpr // 4th level of precedence
: indicyExpr (('*'|'/')^ indicyExpr)*
;
indicyExpr // 3rd level of precedence
: prefixExpr ('**'^ prefixExpr)*
;
prefixExpr // 2nd level of precedence
: prefix^ prefixExpr // prefix rules are right associative
| primaryExpr
;
primaryExpr // highest level of precedence
: '('! expr^ ')'!
| atom^
;
fragment
prefix // a list of allowable prefixes
: '-' -> NEGATE["-"] // rewrite to differentiate from subtract
| 'sqrt'
| 'abs'
;
fragment
atom // unrecursable elements
: ANS
| NUMBER
| REGISTER
;
ANS
: 'ans'
;
REGISTER // a register variable
: CHAR (CHAR | DIGIT | '_')*
;
NUMBER // any double precision number
: DIGIT+ ('.' DIGIT*)? (('e'|'E') '-'? DIGIT+)?
;
fragment
CHAR
: 'A' .. 'Z'
| 'a' .. 'z'
;
fragment
DIGIT
: '0' .. '9'
;
WS // whitespace
: (' '|'\t')+ { $channel = HIDDEN; }
;