You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

51 lines
1.0 KiB

grammar t015calc;
options {
language = JavaScript;
}
@parser::members {
this.emitErrorMessage = function(msg) {
if (!this.reportedErrors) {
this.reportedErrors = [msg];
} else {
this.reportedErrors.push(msg)
}
};
}
evaluate returns [result]: r=expression {result = r;};
expression returns [result]: r=mult (
'+' r2=mult {r += r2;}
| '-' r2=mult {r -= r2;}
)* {result = r};
mult returns [result]: r=log (
'*' r2=log {r *= r2;}
| '/' r2=log {r /= r2;}
)* {result = r};
log returns [result]: 'ln' r=exp {result = Math.log(r);}
| r=exp {result = r;}
;
exp returns [result]: r=atom ('^' r2=atom {r = Math.pow(r,r2);} )? {result = r;}
;
atom returns [result]:
n=INTEGER {result = parseInt($n.text, 10);}
| n=DECIMAL {result = parseFloat($n.text);}
| '(' r=expression {result = r;} ')'
| 'PI' {result = Math.PI;}
| 'E' {result = Math.E;}
;
INTEGER: DIGIT+;
DECIMAL: DIGIT+ '.' DIGIT+;
fragment
DIGIT: '0'..'9';
WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;};