xref: /aosp_15_r20/external/antlr/runtime/Python/tests/t015calc.g (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robotgrammar t015calc;
2*16467b97STreehugger Robotoptions {
3*16467b97STreehugger Robot  language = Python;
4*16467b97STreehugger Robot}
5*16467b97STreehugger Robot
6*16467b97STreehugger Robot@header {
7*16467b97STreehugger Robotimport math
8*16467b97STreehugger Robot}
9*16467b97STreehugger Robot
10*16467b97STreehugger Robot@parser::init {
11*16467b97STreehugger Robotself.reportedErrors = []
12*16467b97STreehugger Robot}
13*16467b97STreehugger Robot
14*16467b97STreehugger Robot@parser::members {
15*16467b97STreehugger Robotdef emitErrorMessage(self, msg):
16*16467b97STreehugger Robot    self.reportedErrors.append(msg)
17*16467b97STreehugger Robot}
18*16467b97STreehugger Robot
19*16467b97STreehugger Robotevaluate returns [result]: r=expression {result = r};
20*16467b97STreehugger Robot
21*16467b97STreehugger Robotexpression returns [result]: r=mult (
22*16467b97STreehugger Robot    '+' r2=mult {r += r2}
23*16467b97STreehugger Robot  | '-' r2=mult {r -= r2}
24*16467b97STreehugger Robot  )* {result = r};
25*16467b97STreehugger Robot
26*16467b97STreehugger Robotmult returns [result]: r=log (
27*16467b97STreehugger Robot    '*' r2=log {r *= r2}
28*16467b97STreehugger Robot  | '/' r2=log {r /= r2}
29*16467b97STreehugger Robot//  | '%' r2=log {r %= r2}
30*16467b97STreehugger Robot  )* {result = r};
31*16467b97STreehugger Robot
32*16467b97STreehugger Robotlog returns [result]: 'ln' r=exp {result = math.log(r)}
33*16467b97STreehugger Robot    | r=exp {result = r}
34*16467b97STreehugger Robot    ;
35*16467b97STreehugger Robot
36*16467b97STreehugger Robotexp returns [result]: r=atom ('^' r2=atom {r = math.pow(r,r2)} )? {result = r}
37*16467b97STreehugger Robot    ;
38*16467b97STreehugger Robot
39*16467b97STreehugger Robotatom returns [result]:
40*16467b97STreehugger Robot    n=INTEGER {result = int($n.text)}
41*16467b97STreehugger Robot  | n=DECIMAL {result = float($n.text)}
42*16467b97STreehugger Robot  | '(' r=expression {result = r} ')'
43*16467b97STreehugger Robot  | 'PI' {result = math.pi}
44*16467b97STreehugger Robot  | 'E' {result = math.e}
45*16467b97STreehugger Robot  ;
46*16467b97STreehugger Robot
47*16467b97STreehugger RobotINTEGER: DIGIT+;
48*16467b97STreehugger Robot
49*16467b97STreehugger RobotDECIMAL: DIGIT+ '.' DIGIT+;
50*16467b97STreehugger Robot
51*16467b97STreehugger Robotfragment
52*16467b97STreehugger RobotDIGIT: '0'..'9';
53*16467b97STreehugger Robot
54*16467b97STreehugger RobotWS: (' ' | '\n' | '\t')+ {$channel = HIDDEN};
55