summaryrefslogtreecommitdiff
path: root/test/racc/assets/ichk.y
blob: 1d359df83e283c41d0722a4a0f05030d0b254f15 (plain)
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
class Calculator

  prechigh
    left '*' '/'
    left '+' '-'
  preclow

  convert
    NUMBER 'Number'
  end

rule

  target : exp
         | /* none */ { result = 0 }

  exp    : exp '+' exp { result += val[2]; a = 'plus' }
         | exp '-' exp { result -= val[2]; a = "string test" }
         | exp '*' exp { result *= val[2] }
         | exp '/' exp { result /= val[2] }
         | '(' { $emb = true } exp ')'
             {
               raise 'must not happen' unless $emb
               result = val[2]
             }
         | '-' NUMBER  { result = -val[1] }
         | NUMBER

----header

class Number
end

----inner

  def initialize
    @racc_debug_out = $stdout
    @yydebug = false
  end

  def validate(expected, src)
    result = parse(src)
    unless result == expected
      raise "test #{@test_number} fail"
    end
    @test_number += 1
  end

  def parse(src)
    @src = src
    @test_number = 1
    yyparse self, :scan
  end

  def scan(&block)
    @src.each(&block)
  end

----footer

calc = Calculator.new

calc.validate(9, [[Number, 9], nil])

calc.validate(-3,
    [[Number, 5],
     ['*',   '*'],
     [Number, 1],
     ['-',   '*'],
     [Number, 1],
     ['*',   '*'],
     [Number, 8],
     nil])

calc.validate(-1,
    [[Number, 5],
     ['+',   '+'],
     [Number, 2],
     ['-',   '-'],
     [Number, 5],
     ['+',   '+'],
     [Number, 2],
     ['-',   '-'],
     [Number, 5],
     nil])

calc.validate(-4,
    [['-',    'UMINUS'],
     [Number, 4],
     nil])

calc.validate(40,
    [[Number, 7],
     ['*',   '*'],
     ['(',   '('],
     [Number, 4],
     ['+',   '+'],
     [Number, 3],
     [')',   ')'],
     ['-',   '-'],
     [Number, 9],
     nil])