xref: /aosp_15_r20/external/antlr/runtime/JavaScript/tests/functional/t015calc.g (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
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