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