1*16467b97STreehugger Robotgrammar t015calc; 2*16467b97STreehugger Robotoptions { 3*16467b97STreehugger Robot language = JavaScript; 4*16467b97STreehugger Robot} 5*16467b97STreehugger Robot 6*16467b97STreehugger Robot@parser::members { 7*16467b97STreehugger Robotthis.emitErrorMessage = function(msg) { 8*16467b97STreehugger Robot if (!this.reportedErrors) { 9*16467b97STreehugger Robot this.reportedErrors = [msg]; 10*16467b97STreehugger Robot } else { 11*16467b97STreehugger Robot this.reportedErrors.push(msg) 12*16467b97STreehugger Robot } 13*16467b97STreehugger Robot}; 14*16467b97STreehugger Robot} 15*16467b97STreehugger Robot 16*16467b97STreehugger Robotevaluate returns [result]: r=expression {result = r;}; 17*16467b97STreehugger Robot 18*16467b97STreehugger Robotexpression returns [result]: r=mult ( 19*16467b97STreehugger Robot '+' r2=mult {r += r2;} 20*16467b97STreehugger Robot | '-' r2=mult {r -= r2;} 21*16467b97STreehugger Robot )* {result = r}; 22*16467b97STreehugger Robot 23*16467b97STreehugger Robotmult returns [result]: r=log ( 24*16467b97STreehugger Robot '*' r2=log {r *= r2;} 25*16467b97STreehugger Robot | '/' r2=log {r /= r2;} 26*16467b97STreehugger Robot )* {result = r}; 27*16467b97STreehugger Robot 28*16467b97STreehugger Robotlog returns [result]: 'ln' r=exp {result = Math.log(r);} 29*16467b97STreehugger Robot | r=exp {result = r;} 30*16467b97STreehugger Robot ; 31*16467b97STreehugger Robot 32*16467b97STreehugger Robotexp returns [result]: r=atom ('^' r2=atom {r = Math.pow(r,r2);} )? {result = r;} 33*16467b97STreehugger Robot ; 34*16467b97STreehugger Robot 35*16467b97STreehugger Robotatom returns [result]: 36*16467b97STreehugger Robot n=INTEGER {result = parseInt($n.text, 10);} 37*16467b97STreehugger Robot | n=DECIMAL {result = parseFloat($n.text);} 38*16467b97STreehugger Robot | '(' r=expression {result = r;} ')' 39*16467b97STreehugger Robot | 'PI' {result = Math.PI;} 40*16467b97STreehugger Robot | 'E' {result = Math.E;} 41*16467b97STreehugger Robot ; 42*16467b97STreehugger Robot 43*16467b97STreehugger RobotINTEGER: DIGIT+; 44*16467b97STreehugger Robot 45*16467b97STreehugger RobotDECIMAL: DIGIT+ '.' DIGIT+; 46*16467b97STreehugger Robot 47*16467b97STreehugger Robotfragment 48*16467b97STreehugger RobotDIGIT: '0'..'9'; 49*16467b97STreehugger Robot 50*16467b97STreehugger RobotWS: (' ' | '\n' | '\t')+ {$channel = HIDDEN;}; 51