-
Notifications
You must be signed in to change notification settings - Fork 0
/
arithmetic.rby
80 lines (63 loc) · 1.08 KB
/
arithmetic.rby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
%token NUMBER
%token LPAREN
%token RPAREN
%left OP_PLUS OP_MINUS
%left OP_TIMES OP_OVER
%%
arithmetic:
expression[x]
{ self.result = x }
;
expression :
NUMBER
| OP_MINUS expression[x]
{ -x }
| LPAREN expression[x] RPAREN
{ x }
| addition
| subtraction
| multiplication
| division
;
addition :
expression[left] OP_PLUS expression[right]
{ left + right }
;
subtraction :
expression[left] OP_MINUS expression[right]
{ left - right }
;
multiplication:
expression[left] OP_TIMES expression[right]
{ left * right }
;
division:
expression[left] OP_OVER expression[right]
{ left / right }
;
%%
class Arithmetic
def lex
c = read_over_whitespace
case c
when '0'..'9'
number = read_integer(c)
self.lex_value = number.to_i
return Tokens::NUMBER
when '+'
return Tokens::OP_PLUS
when '-'
return Tokens::OP_MINUS
when '*'
return Tokens::OP_TIMES
when '/'
return Tokens::OP_OVER
when '('
return Tokens::LPAREN
when ')'
return Tokens::RPAREN
else
return nil
end
end
end