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