• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1grammar t015calc;
2options {
3  language =Cpp;
4}
5
6@lexer::includes
7{
8#include "UserTestTraits.hpp"
9}
10@lexer::namespace
11{ Antlr3Test }
12
13@parser::includes {
14#include "UserTestTraits.hpp"
15}
16@parser::namespace
17{ Antlr3Test }
18
19@header {
20import math
21}
22
23@parser::init {
24self.reportedErrors = []
25}
26
27@parser::members {
28def emitErrorMessage(self, msg):
29    self.reportedErrors.append(msg)
30}
31
32evaluate returns [result]: r=expression {result = r};
33
34expression returns [result]: r=mult (
35    '+' r2=mult {r += r2}
36  | '-' r2=mult {r -= r2}
37  )* {result = r};
38
39mult returns [result]: r=log (
40    '*' r2=log {r *= r2}
41  | '/' r2=log {r /= r2}
42//  | '%' r2=log {r %= r2}
43  )* {result = r};
44
45log returns [result]: 'ln' r=exp {result = math.log(r)}
46    | r=exp {result = r}
47    ;
48
49exp returns [result]: r=atom ('^' r2=atom {r = math.pow(r,r2)} )? {result = r}
50    ;
51
52atom returns [result]:
53    n=INTEGER {result = int($n.text)}
54  | n=DECIMAL {result = float($n.text)}
55  | '(' r=expression {result = r} ')'
56  | 'PI' {result = math.pi}
57  | 'E' {result = math.e}
58  ;
59
60INTEGER: DIGIT+;
61
62DECIMAL: DIGIT+ '.' DIGIT+;
63
64fragment
65DIGIT: '0'..'9';
66
67WS: (' ' | '\n' | '\t')+ {$channel = HIDDEN};
68