depager 0.2.0 → 0.2.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/ChangeLog +4 -0
  2. data/README.en +5 -10
  3. data/bin/depager +17 -20
  4. data/examples/c89/c89.tab.rb +5632 -702
  5. data/examples/pl0d/pl0ds.dr +41 -41
  6. data/examples/pl0d/pl0ds.tab.rb +1887 -874
  7. data/examples/sample_calc/calc.action.tab.rb +243 -69
  8. data/examples/sample_calc/{calc.astl.action.dr → calc.ast.action.dr} +7 -7
  9. data/examples/sample_calc/calc.ast.action.tab.rb +755 -0
  10. data/examples/sample_calc/{calc.astl.dr → calc.ast.dr} +7 -7
  11. data/examples/sample_calc/calc.ast.tab.rb +672 -0
  12. data/examples/sample_calc/calc.astdf.dr +5 -5
  13. data/examples/sample_calc/calc.astdf.tab.rb +405 -202
  14. data/examples/sample_calc/calc.atree.tab.rb +243 -69
  15. data/examples/sample_calc/calc.cst.tab.rb +275 -109
  16. data/examples/sample_calc/calc.lex.tab.rb +210 -28
  17. data/examples/sample_calc/calc.nvaction.tab.rb +251 -77
  18. data/examples/sample_calc/calc.tab.rb +210 -28
  19. data/examples/sample_calc/calc_prec.nvaction.tab.rb +224 -50
  20. data/examples/slex_test/divreg.slex.tab.rb +97 -21
  21. data/examples/slex_test/ljoin.slex.tab.rb +128 -35
  22. data/lib/depager.rb +77 -44
  23. data/lib/depager/{ast_base.dr → ast.dr} +56 -18
  24. data/lib/depager/{ast_base.rb → ast.rb} +432 -424
  25. data/lib/depager/astdf.rb +3 -6
  26. data/lib/depager/atree.rb +54 -62
  27. data/lib/depager/cst.dr +2 -2
  28. data/lib/depager/cst.rb +64 -77
  29. data/lib/depager/grammar.rb +225 -66
  30. data/lib/depager/lex.dr +1 -1
  31. data/lib/depager/lex.rb +45 -54
  32. data/lib/depager/lr.rb +181 -262
  33. data/lib/depager/lr_put_table.rb +116 -0
  34. data/lib/depager/nvaction.rb +1 -1
  35. data/lib/depager/parser.rb +23 -2
  36. data/lib/depager/slex.dr +3 -3
  37. data/lib/depager/slex.rb +148 -169
  38. data/lib/depager/srp.rb +1 -1
  39. data/lib/depager/template/ast.erbs +69 -0
  40. data/lib/depager/template/extension_lalr_master.erb +3 -3
  41. data/lib/depager/template/extension_lalr_slave.erb +7 -7
  42. data/lib/depager/template/simple.erb +4 -2
  43. data/lib/depager/template/single_lalr_parser.erb +30 -10
  44. data/lib/depager/utils.rb +10 -9
  45. data/lib/depager/version.rb +2 -8
  46. metadata +10 -11
  47. data/examples/sample_calc/calc.astl.action.tab.rb +0 -593
  48. data/examples/sample_calc/calc.astl.tab.rb +0 -501
  49. data/lib/depager/astl.rb +0 -14
  50. data/lib/depager/template/astdf.erbs +0 -57
  51. data/lib/depager/template/astl.erbs +0 -57
@@ -1,4 +1,4 @@
1
- class ShiftReducePrinter < Depager::AdvancedParser
1
+ class ShiftReducePrinter < Depager::LALR::AdvancedParser
2
2
  def initialize inside
3
3
  super
4
4
  @i2nt, @i2t = @basis.i2nt, @basis.i2t
@@ -0,0 +1,69 @@
1
+ ===:defnode
2
+ class Node
3
+ attr_accessor :lineno
4
+ attr_accessor <%= _opt_attr.map{|i| ":#{i}" }.join(', ') %>
5
+ <%= ini %>
6
+ def self.[] lineno, *args
7
+ self.new lineno, *args
8
+ end
9
+ def accept v
10
+ end
11
+ end
12
+ class NodeList < Node
13
+ attr_accessor :lineno
14
+ def initialize(lineno, lst=[])
15
+ @lineno = lineno
16
+ @lst = lst.to_a.select{|i| ! i.is_a?(NilNode)}
17
+ end
18
+ <% _opt_attr.each do |i| %>
19
+ def all_<%= i %>
20
+ @lst.map{|i| i.<%= i %>}
21
+ end
22
+ <% end %>
23
+ def size
24
+ @lst.size
25
+ end
26
+ alias length size
27
+ def push(i)
28
+ @lst.push i unless i.is_a? NilNode
29
+ self
30
+ end
31
+ def concat(i)
32
+ @lst.concat i
33
+ self
34
+ end
35
+ def to_ary()
36
+ @lst
37
+ end
38
+ alias to_a to_ary
39
+ alias list to_ary
40
+ def accept(v)
41
+ @lst.each{|i| i.accept(v) }
42
+ end
43
+ end
44
+ class NilNode
45
+ attr_accessor :lineno
46
+ attr_accessor <%= _opt_attr.map{|i| ":#{i}" }.join(', ') %>
47
+ def initialize(lineno, *args)
48
+ @lineno = lineno
49
+ end
50
+ def accept v
51
+ end
52
+ end
53
+
54
+ ===:node
55
+ class Node_<%= name %> < Node
56
+ attr_accessor <%= nodes.map{|i| ":#{i}" }.join(', ') %>
57
+ attr_accessor <%= attrs.map{|i| ":#{i}" }.join(', ') %>
58
+ def initialize <%= nodes.unshift('lineno').join(', ') %>
59
+ super()
60
+ @lineno = lineno
61
+ <%= nodes.inject(''){|r,i| r << " @#{i} = #{i}\n"} %>
62
+ end
63
+ def accept v
64
+ warn @lineno.to_s+':'+self.class.to_s if $DEBUG
65
+ <%= accept %>
66
+ v.visit_Node_<%= name %>(self)
67
+ self
68
+ end
69
+ end
@@ -1,8 +1,8 @@
1
1
  <%
2
2
  target_name = @d_parser.target_name
3
- optouter = @optouter
4
- optinner = @optinner
5
- optmain = @optmain
3
+ optouter = @optouter.join
4
+ optinner = @optinner.join
5
+ optmain = @optmain.join
6
6
  req = @req.uniq
7
7
  paramkey = @paramkey || ":default"
8
8
  regs = @regs
@@ -1,17 +1,17 @@
1
1
  <%
2
2
  target_name = g_parser.target_name
3
3
  table = g_parser.table
4
- g = table.g
4
+ g = table.grammar
5
5
  rulelist = g.rulelist
6
- t2i = (g.nssize ... g.syms.size).map{|i| [ g.syms[i].inspect, i - g.nssize] }
7
- nt2i = (1 ... g.nssize).map{|i| [ ":#{g.syms[i]}", i-1] }
6
+ t2i = (g.nonterms.size ... g.syms.size).map{|i| [ g.syms[i].inspect, i - g.nonterms.size] }
7
+ nt2i = (1 ... g.nonterms.size).map{|i| [ ":#{g.syms[i]}", i-1] }
8
8
  taction = table.action_table
9
9
  tgoto = table.goto_table
10
10
  tdefred = table.defred_table
11
11
  tdefreds = table.defred_after_shift_table
12
- optouter = g_parser.optouter
13
- optinner = g_parser.optinner
14
- optmain = g_parser.optmain
12
+ optouter = g_parser.optouter.join
13
+ optinner = g_parser.optinner.join
14
+ optmain = g_parser.optmain.join
15
15
  nparams = g_parser.nparams
16
16
  decparser = @deco.inject(@basis_name) { |r, i|
17
17
  "#{i.sub(/^@/, "D4#{target_name}::")}.new(#{r})"
@@ -32,7 +32,7 @@ class <%= target_name %> < Depager::LALR::Basis #:nodoc:all
32
32
 
33
33
  ### Reduce Table
34
34
  reduce_table = [<% rulelist.each do |i| %>
35
- [ <%= i.l - 1%>, <%= i.r.size %> ],<% end %>
35
+ [ <%= i.lhs - 1%>, <%= i.rhs.size %> ],<% end %>
36
36
  ]
37
37
  ### Extension Params
38
38
  nparams = {<% nparams.each do |c, i| %>
@@ -1,6 +1,7 @@
1
1
  <%
2
- optouter = @optouter + g_parser.optouter
3
- optmain = @optmain
2
+ target_name = g_parser.target_name
3
+ optouter = (@optouter + g_parser.optouter).join
4
+ optmain = @optmain.join
4
5
  req = @req.uniq
5
6
  mixin = @mixin
6
7
  %>
@@ -9,6 +10,7 @@ require 'depager/parser.rb'
9
10
  <%req.each do |i|%>require <%=i%>
10
11
  <%end%>
11
12
 
13
+ module Depager::DecoratorUtils; end
12
14
  module D4<%= target_name %> ; end
13
15
 
14
16
  ### Outer Code
@@ -1,31 +1,36 @@
1
1
  <%
2
2
  target_name = g_parser.target_name
3
3
  table = g_parser.table
4
- g = table.g
4
+ g = table.grammar
5
5
  nparams = g_parser.nparams
6
6
  rulelist = g.rulelist
7
- t2i = (g.nssize ... g.syms.size).map{|i| [ g.syms[i].inspect, i - g.nssize] }
8
- nt2i = (1 ... g.nssize).map{|i| [ ":#{g.syms[i]}", i-1] }
7
+ t2i = (g.nonterms.size ... g.syms.size).map{|i| [ g.syms[i].inspect, i - g.nonterms.size] }
8
+ nt2i = (1 ... g.nonterms.size).map{|i| [ ":#{g.syms[i]}", i-1] }
9
9
  taction = table.action_table
10
10
  tgoto = table.goto_table
11
11
  tdefred = table.defred_table
12
12
  tdefreds = table.defred_after_shift_table
13
- optouter = @optouter + g_parser.optouter
14
- optinner = @optinner + g_parser.optinner
15
- optmain = @optmain
13
+ optouter = (@optouter + g_parser.optouter).join
14
+ optinner = (@optinner + g_parser.optinner).join
15
+ optmain = @optmain.join
16
16
  decparser = @deco.inject(@basis_name) { |r, i|
17
17
  "#{i.sub(/^@/, "D4#{target_name}::")}.new(#{r})"
18
18
  }
19
19
  req = @req.uniq
20
20
  mixin = @mixin
21
+ req_rt = if @dr_option['embed_runtime']
22
+ File.read File.expand_path("#{Depager::Tmpldir}/../parser.rb")
23
+ else
24
+ "require 'depager/parser.rb'"
25
+ end
21
26
  %>
22
27
  begin; require 'rubygems'; rescue Exception; end
23
- require 'depager/parser.rb'
28
+ <%= req_rt %>
24
29
  <%req.each do |i|%>require <%=i%>
25
30
  <%end%>
26
31
 
27
- module D4<%= target_name %>
28
- end
32
+ module Depager::DecoratorUtils; end
33
+ module D4<%= target_name %>; end
29
34
 
30
35
  class <%= target_name %> < Depager::LALR::Basis
31
36
  <% mixin.each do |i| %>
@@ -33,7 +38,7 @@ class <%= target_name %> < Depager::LALR::Basis
33
38
 
34
39
  ### Reduce Table
35
40
  reduce_table = [<% rulelist.each do |i| %>
36
- [ <%= '%04s'%(i.l - 1)%>, <%= "%04s"%i.r.size %> ], # <%= i %><% end %>
41
+ [ <%= '%04s'%(i.lhs - 1)%>, <%= "%04s"%i.rhs.size %> ], # <%= i %><% end %>
37
42
  ]
38
43
  ### Extension Params
39
44
  nparams = {<% nparams.each do |c, i| %>
@@ -71,6 +76,21 @@ class <%= target_name %> < Depager::LALR::Basis
71
76
  [ <% i.each do |j| %><%= j ? "#{j}" : 'nil' %>, <% end %>], <% end %>
72
77
  ]
73
78
 
79
+ <% if $MP_DEBUG %>
80
+ alias orig_error error
81
+ def error
82
+ orig_error
83
+ warn "current state: #{StateInfo[@stack.last]}"
84
+ end
85
+
86
+ ### States
87
+ StateInfo = [ <% table.state_info.each do |s| %>
88
+ <<'----------',
89
+ <%=s.chomp%>
90
+ ----------
91
+ <% end %>]
92
+ <% end %>
93
+
74
94
  Tables = [ reduce_table, nparams, action_table,
75
95
  defred_table, defred_after_shift_table, goto_table,
76
96
  t2i, i2t, nt2i, i2nt ]
@@ -78,7 +78,7 @@ module Depager
78
78
  #{mixin_code}
79
79
  on_reduce = [
80
80
  nil,
81
- #{on_reduce_code}
81
+ #{on_reduce_code.join}
82
82
  ]
83
83
  Tables = [on_reduce]
84
84
  def initialize inside
@@ -89,7 +89,8 @@ module Depager
89
89
  \n$$!! @OUTER @!!$$
90
90
  end
91
91
  }; #code
92
- unindent(code).sub!('$$!! @OUTER @!!$$', optouter.to_s)
92
+ optouter = optouter.join if optouter.is_a? Array
93
+ unindent(code).sub!('$$!! @OUTER @!!$$', optouter)
93
94
  end
94
95
 
95
96
  #
@@ -116,10 +117,10 @@ module Depager
116
117
  # lineno:: line no
117
118
  # d:: input line no - output line no
118
119
  #
119
- def gen_defm_code sig, body, lineno, d=0
120
+ def gen_defm_code sig, body, lineno=1, d=0
120
121
  t = Time.now.to_i
121
122
  r = rand(0xffff)
122
- body = " def #{sig}\n#{body}\n end\n"
123
+ body = "def #{sig}\n#{body}\nend"
123
124
  code = %{
124
125
  module_eval <<\-'.,.,#{t}#{r}.,.,', '#{files.path}', #{lineno-d-1}
125
126
  $$!!@ BODY @!!$$
@@ -155,9 +156,9 @@ module Depager
155
156
 
156
157
  # unindent
157
158
  def unindent s
158
- s = s.to_s
159
- ind = s.match(/\n(\s+)/)[1]
160
- s.gsub(/^#{ind}/m, '')
159
+ s = s.join rescue s.to_s
160
+ ind = s.match(/\n(\s+)/)
161
+ s.gsub(/^#{ind[1]}/m, '')
161
162
  end
162
163
  end
163
164
 
@@ -237,7 +238,7 @@ module Depager
237
238
 
238
239
  # get nunber of rules
239
240
  def nrules
240
- @g_parser.g.size - 2
241
+ @g_parser.rules.size - 2
241
242
  end
242
243
 
243
244
  # get nunber of rhs rules
@@ -313,7 +314,7 @@ module Depager
313
314
  else ; @g_parser.getnparam(key)
314
315
  end
315
316
  self.methods.sort.each do |m|
316
- h = m.downcase
317
+ h = m.to_s.downcase
317
318
  if Hooks[h]
318
319
  p.send(h).push [self, m.intern]
319
320
  end
@@ -1,9 +1,3 @@
1
- module Depager #:nodoc:
2
- module VERSION #:nodoc:
3
- MAJOR = 0
4
- MINOR = 2
5
- TINY = 0
6
-
7
- STRING = [MAJOR, MINOR, TINY].join('.')
8
- end
1
+ module Depager
2
+ VERSION = '0.2.2'
9
3
  end
metadata CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
3
3
  specification_version: 1
4
4
  name: depager
5
5
  version: !ruby/object:Gem::Version
6
- version: 0.2.0
7
- date: 2007-08-20 00:00:00 +09:00
6
+ version: 0.2.2
7
+ date: 2008-05-05 00:00:00 +09:00
8
8
  summary: A self extensible parser generator.
9
9
  require_paths:
10
10
  - lib
@@ -46,12 +46,12 @@ files:
46
46
  - examples/pl0d/test.pl0ds
47
47
  - examples/sample_calc/calc.action.dr
48
48
  - examples/sample_calc/calc.action.tab.rb
49
+ - examples/sample_calc/calc.ast.action.dr
50
+ - examples/sample_calc/calc.ast.action.tab.rb
51
+ - examples/sample_calc/calc.ast.dr
52
+ - examples/sample_calc/calc.ast.tab.rb
49
53
  - examples/sample_calc/calc.astdf.dr
50
54
  - examples/sample_calc/calc.astdf.tab.rb
51
- - examples/sample_calc/calc.astl.action.dr
52
- - examples/sample_calc/calc.astl.action.tab.rb
53
- - examples/sample_calc/calc.astl.dr
54
- - examples/sample_calc/calc.astl.tab.rb
55
55
  - examples/sample_calc/calc.atree.dr
56
56
  - examples/sample_calc/calc.atree.tab.rb
57
57
  - examples/sample_calc/calc.cst.dr
@@ -74,10 +74,9 @@ files:
74
74
  - lib/depager.rb
75
75
  - lib/depager/Rakefile
76
76
  - lib/depager/action.rb
77
- - lib/depager/ast_base.dr
78
- - lib/depager/ast_base.rb
77
+ - lib/depager/ast.dr
78
+ - lib/depager/ast.rb
79
79
  - lib/depager/astdf.rb
80
- - lib/depager/astl.rb
81
80
  - lib/depager/atree.dr
82
81
  - lib/depager/atree.rb
83
82
  - lib/depager/cst.dr
@@ -86,14 +85,14 @@ files:
86
85
  - lib/depager/lex.dr
87
86
  - lib/depager/lex.rb
88
87
  - lib/depager/lr.rb
88
+ - lib/depager/lr_put_table.rb
89
89
  - lib/depager/nvaction.rb
90
90
  - lib/depager/parse_action.rb
91
91
  - lib/depager/parser.rb
92
92
  - lib/depager/slex.dr
93
93
  - lib/depager/slex.rb
94
94
  - lib/depager/srp.rb
95
- - lib/depager/template/astdf.erbs
96
- - lib/depager/template/astl.erbs
95
+ - lib/depager/template/ast.erbs
97
96
  - lib/depager/template/extension_lalr_master.erb
98
97
  - lib/depager/template/extension_lalr_slave.erb
99
98
  - lib/depager/template/simple.erb
@@ -1,593 +0,0 @@
1
-
2
- begin; require 'rubygems'; rescue Exception; end
3
- require 'depager/parser.rb'
4
-
5
-
6
- module D4TinyCalc
7
- end
8
-
9
- class TinyCalc < Depager::LALR::Basis
10
-
11
- include Depager
12
-
13
- ### Reduce Table
14
- reduce_table = [
15
- [ -1, 1 ], # ( 0) $start : expr
16
- [ 0, 3 ], # ( 1) expr : expr + term
17
- [ 0, 3 ], # ( 2) expr : expr - term
18
- [ 0, 1 ], # ( 3) expr : term
19
- [ 1, 3 ], # ( 4) term : term * fact
20
- [ 1, 3 ], # ( 5) term : term / fact
21
- [ 1, 1 ], # ( 6) term : fact
22
- [ 2, 1 ], # ( 7) fact : NUM
23
- [ 2, 3 ], # ( 8) fact : ( expr )
24
- ]
25
- ### Extension Params
26
- nparams = {
27
- 'Action' => 3,
28
- 'ASTBuilderLazy' => 2,
29
- }
30
- ### Term to Int
31
- t2i = {
32
- nil => 0,
33
- false => 1,
34
- "+" => 2,
35
- "-" => 3,
36
- "*" => 4,
37
- "/" => 5,
38
- :NUM => 6,
39
- "(" => 7,
40
- ")" => 8,
41
- }
42
- ### Int to Term
43
- i2t = [
44
- nil,
45
- false,
46
- "+",
47
- "-",
48
- "*",
49
- "/",
50
- :NUM,
51
- "(",
52
- ")",
53
- ]
54
- ### Action Table
55
- action_table = [
56
- [ nil, nil, nil, nil, nil, nil, 5, 1, nil, ],
57
- [ nil, nil, nil, nil, nil, nil, 5, 1, nil, ],
58
- [ ACC, nil, 7, 8, nil, nil, nil, nil, nil, ],
59
- [ nil, nil, nil, nil, 9, 10, nil, nil, nil, ],
60
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
61
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
62
- [ nil, nil, 7, 8, nil, nil, nil, nil, 11, ],
63
- [ nil, nil, nil, nil, nil, nil, 5, 1, nil, ],
64
- [ nil, nil, nil, nil, nil, nil, 5, 1, nil, ],
65
- [ nil, nil, nil, nil, nil, nil, 5, 1, nil, ],
66
- [ nil, nil, nil, nil, nil, nil, 5, 1, nil, ],
67
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
68
- [ nil, nil, nil, nil, 9, 10, nil, nil, nil, ],
69
- [ nil, nil, nil, nil, 9, 10, nil, nil, nil, ],
70
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
71
- [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
72
- ]
73
- ### Default Reduce Table
74
- defred_table = [
75
- nil,
76
- nil,
77
- nil,
78
- -3,
79
- -6,
80
- -7,
81
- nil,
82
- nil,
83
- nil,
84
- nil,
85
- nil,
86
- -8,
87
- -1,
88
- -2,
89
- -4,
90
- -5,
91
- ]
92
- defred_after_shift_table = [
93
- nil,
94
- nil,
95
- nil,
96
- nil,
97
- -6,
98
- -7,
99
- nil,
100
- nil,
101
- nil,
102
- nil,
103
- nil,
104
- -8,
105
- nil,
106
- nil,
107
- -4,
108
- -5,
109
- ]
110
- ### Nonterm to Int
111
- nt2i = {
112
- :expr => 0,
113
- :term => 1,
114
- :fact => 2,
115
- }
116
- ### Int to Nonterm
117
- i2nt = [
118
- :expr,
119
- :term,
120
- :fact,
121
- ]
122
- ### Goto Table
123
- goto_table = [
124
- [ 2, 3, 4, ],
125
- [ 6, 3, 4, ],
126
- [ nil, nil, nil, ],
127
- [ nil, nil, nil, ],
128
- [ nil, nil, nil, ],
129
- [ nil, nil, nil, ],
130
- [ nil, nil, nil, ],
131
- [ nil, 12, 4, ],
132
- [ nil, 13, 4, ],
133
- [ nil, nil, 14, ],
134
- [ nil, nil, 15, ],
135
- [ nil, nil, nil, ],
136
- [ nil, nil, nil, ],
137
- [ nil, nil, nil, ],
138
- [ nil, nil, nil, ],
139
- [ nil, nil, nil, ],
140
- ]
141
-
142
- Tables = [ reduce_table, nparams, action_table,
143
- defred_table, defred_after_shift_table, goto_table,
144
- t2i, i2t, nt2i, i2nt ]
145
-
146
- def self.createDecoratedParser
147
- D4TinyCalc::Action.new(D4TinyCalc::ASTBuilderLazy.new(TinyCalc.new()))
148
- end
149
-
150
- ### Inner Code
151
-
152
- def lex
153
- begin
154
- until @line.empty?
155
- case @line
156
-
157
- when /\A\s+/, /\A\#.*/, /\A\n/
158
- @oldline = @line; @line = $'
159
-
160
-
161
-
162
- when /\A[1-9][0-9]*/
163
- @oldline = @line; @line = $'
164
- yield _Token(:NUM, $&.to_i)
165
-
166
-
167
- when /\A./
168
- @oldline = @line; @line = $'
169
- yield _Token($&, $&)
170
-
171
-
172
- else
173
- raise RuntimeError, "must not happen #{@line}"
174
- end
175
- end
176
- end while @line0 = @line = getline
177
- yield nil, nil
178
- end
179
-
180
- end
181
-
182
- ### Outer Code
183
-
184
- class Node
185
- attr_accessor :lineno
186
- attr_accessor :value
187
-
188
- def initialize
189
- @value = nil
190
-
191
- end
192
-
193
- def to_ary
194
- [self]
195
- end
196
- def self.[] lineno, *args
197
- self.new lineno, *args
198
- end
199
- def accept v
200
- end
201
- end
202
- require 'forwardable'
203
- class NodeList < Node
204
- attr_accessor :lineno
205
- extend Forwardable
206
- _methods = Array.instance_methods -
207
- Object.instance_methods -
208
- ['push', 'concat', 'to_ary', 'map']
209
- def_delegators(:@lst, *_methods)
210
- def initialize(lineno, lst=[])
211
- @lineno = lineno
212
- @lst = lst.to_a
213
- end
214
-
215
- def value
216
- @lst.map{|i| "i.value"}
217
- end
218
-
219
- def push(i) @lst.push i; self; end
220
- def concat(i) @lst.concat i; self; end
221
- def map(&b) @lst.map(&b); end
222
- def to_ary() @lst; end
223
- def accept(v)
224
- @lst.each{|i| i.accept(v) }
225
- end
226
- end
227
-
228
- class Node_add < Node
229
- attr_accessor :left, :right
230
- attr_accessor
231
- def initialize lineno, left, right
232
- super()
233
- @lineno = lineno
234
- @lineno = lineno
235
- @left = left
236
- @right = right
237
-
238
- end
239
-
240
- def _left_ v
241
- @left.accept(v); @left
242
- end
243
-
244
- def _right_ v
245
- @right.accept(v); @right
246
- end
247
-
248
- def accept v
249
- warn @lineno.to_s+':'+self.class.to_s if $DEBUG
250
- v.visit_Node_add(self)
251
- self
252
- end
253
- end
254
-
255
- class Node_sub < Node
256
- attr_accessor :left, :right
257
- attr_accessor
258
- def initialize lineno, left, right
259
- super()
260
- @lineno = lineno
261
- @lineno = lineno
262
- @left = left
263
- @right = right
264
-
265
- end
266
-
267
- def _left_ v
268
- @left.accept(v); @left
269
- end
270
-
271
- def _right_ v
272
- @right.accept(v); @right
273
- end
274
-
275
- def accept v
276
- warn @lineno.to_s+':'+self.class.to_s if $DEBUG
277
- v.visit_Node_sub(self)
278
- self
279
- end
280
- end
281
-
282
- class Node_mul < Node
283
- attr_accessor :left, :right
284
- attr_accessor
285
- def initialize lineno, left, right
286
- super()
287
- @lineno = lineno
288
- @lineno = lineno
289
- @left = left
290
- @right = right
291
-
292
- end
293
-
294
- def _left_ v
295
- @left.accept(v); @left
296
- end
297
-
298
- def _right_ v
299
- @right.accept(v); @right
300
- end
301
-
302
- def accept v
303
- warn @lineno.to_s+':'+self.class.to_s if $DEBUG
304
- v.visit_Node_mul(self)
305
- self
306
- end
307
- end
308
-
309
- class Node_div < Node
310
- attr_accessor :left, :right
311
- attr_accessor
312
- def initialize lineno, left, right
313
- super()
314
- @lineno = lineno
315
- @lineno = lineno
316
- @left = left
317
- @right = right
318
-
319
- end
320
-
321
- def _left_ v
322
- @left.accept(v); @left
323
- end
324
-
325
- def _right_ v
326
- @right.accept(v); @right
327
- end
328
-
329
- def accept v
330
- warn @lineno.to_s+':'+self.class.to_s if $DEBUG
331
- v.visit_Node_div(self)
332
- self
333
- end
334
- end
335
-
336
- class Node_literal < Node
337
- attr_accessor :n
338
- attr_accessor :n
339
- def initialize lineno, n
340
- super()
341
- @lineno = lineno
342
- @lineno = lineno
343
- @n = n
344
-
345
- end
346
-
347
- def accept v
348
- warn @lineno.to_s+':'+self.class.to_s if $DEBUG
349
- v.visit_Node_literal(self)
350
- self
351
- end
352
- end
353
-
354
- class Visitor
355
- def visit node
356
- node.accept(self)
357
- end
358
-
359
- module_eval <<-'.,.,118754108857908.,.,', 'sample_calc/calc.astl.action.dr', 19
360
-
361
-
362
- .,.,118754108857908.,.,
363
-
364
- module_eval <<-'.,.,118754108863035.,.,', 'sample_calc/calc.astl.action.dr', 19
365
- def visit_Node_add node
366
- node.value = visit(node.left).value + visit(node.right).value
367
-
368
- end
369
-
370
- .,.,118754108863035.,.,
371
-
372
- module_eval <<-'.,.,11875410891486.,.,', 'sample_calc/calc.astl.action.dr', 20
373
- def visit_Node_sub node
374
- node.value = visit(node.left).value - visit(node.right).value
375
-
376
- end
377
-
378
- .,.,11875410891486.,.,
379
-
380
- module_eval <<-'.,.,118754108931106.,.,', 'sample_calc/calc.astl.action.dr', 21
381
- def visit_Node_mul node
382
- node.value = visit(node.left).value * visit(node.right).value
383
-
384
- end
385
-
386
- .,.,118754108931106.,.,
387
-
388
- module_eval <<-'.,.,118754108926185.,.,', 'sample_calc/calc.astl.action.dr', 22
389
- def visit_Node_div node
390
- node.value = visit(node.left).value / visit(node.right).value
391
-
392
- end
393
-
394
- .,.,118754108926185.,.,
395
-
396
- module_eval <<-'.,.,118754108942617.,.,', 'sample_calc/calc.astl.action.dr', 23
397
- def visit_Node_literal node
398
- node.value = node.n.value
399
-
400
- end
401
-
402
- .,.,118754108942617.,.,
403
-
404
- end
405
-
406
- class D4TinyCalc::ASTBuilderLazy < Depager::LALR::Action #:nodoc:all
407
- include Depager::DecoratorUtils
408
-
409
- on_reduce = [
410
- nil,
411
- :_ast_0,
412
- :_ast_1,
413
- :_ast_2,
414
- :_ast_3,
415
- :_ast_4,
416
- :_ast_5,
417
- :_ast_6,
418
- :_ast_7,
419
-
420
- ]
421
- Tables = [on_reduce]
422
- def initialize inside
423
- super inside, 'ASTBuilderLazy'
424
- @on_reduce, = self.class::Tables
425
- init_parser
426
- end
427
-
428
-
429
- module_eval <<-'.,.,11875410898722.,.,', 'sample_calc/calc.astl.action.dr', 29
430
- def _ast_0 val
431
- Node_add.new(val[0].lineno, val[0], val[2])
432
- end
433
-
434
- .,.,11875410898722.,.,
435
-
436
- module_eval <<-'.,.,118754108942559.,.,', 'sample_calc/calc.astl.action.dr', 32
437
- def _ast_1 val
438
- Node_sub.new(val[0].lineno, val[0], val[2])
439
- end
440
-
441
- .,.,118754108942559.,.,
442
-
443
- module_eval <<-'.,.,11875410893975.,.,', 'sample_calc/calc.astl.action.dr', 35
444
- def _ast_2 val
445
- val[0]
446
- end
447
-
448
- .,.,11875410893975.,.,
449
-
450
- module_eval <<-'.,.,11875410897017.,.,', 'sample_calc/calc.astl.action.dr', 40
451
- def _ast_3 val
452
- Node_mul.new(val[0].lineno, val[0], val[2])
453
- end
454
-
455
- .,.,11875410897017.,.,
456
-
457
- module_eval <<-'.,.,118754108932608.,.,', 'sample_calc/calc.astl.action.dr', 43
458
- def _ast_4 val
459
- Node_div.new(val[0].lineno, val[0], val[2])
460
- end
461
-
462
- .,.,118754108932608.,.,
463
-
464
- module_eval <<-'.,.,11875410897850.,.,', 'sample_calc/calc.astl.action.dr', 46
465
- def _ast_5 val
466
- val[0]
467
- end
468
-
469
- .,.,11875410897850.,.,
470
-
471
- module_eval <<-'.,.,11875410893154.,.,', 'sample_calc/calc.astl.action.dr', 51
472
- def _ast_6 val
473
- Node_literal.new(val[0].lineno, val[0])
474
- end
475
-
476
- .,.,11875410893154.,.,
477
-
478
- module_eval <<-'.,.,118754108961354.,.,', 'sample_calc/calc.astl.action.dr', 54
479
- def _ast_7 val
480
- val[1]
481
- end
482
-
483
- .,.,118754108961354.,.,
484
-
485
- end
486
-
487
- class D4TinyCalc::Action < Depager::LALR::Action #:nodoc:all
488
- include Depager::DecoratorUtils
489
- include Depager
490
-
491
- on_reduce = [
492
- nil,
493
- :_act_0,
494
- :_act_1,
495
- :_act_2,
496
- :_act_3,
497
- :_act_4,
498
- :_act_5,
499
- :_act_6,
500
- :_act_7,
501
-
502
- ]
503
- Tables = [on_reduce]
504
- def initialize inside
505
- super inside, 'Action'
506
- @on_reduce, = self.class::Tables
507
- init_parser
508
- end
509
-
510
-
511
- module_eval <<-'.,.,118754108929417.,.,', 'sample_calc/calc.astl.action.dr', 30
512
- def _act_0 val
513
- val[0] + val[2]
514
-
515
- end
516
-
517
- .,.,118754108929417.,.,
518
-
519
- module_eval <<-'.,.,118754108959230.,.,', 'sample_calc/calc.astl.action.dr', 33
520
- def _act_1 val
521
- val[0] - val[2]
522
-
523
- end
524
-
525
- .,.,118754108959230.,.,
526
-
527
- module_eval <<-'.,.,118754108949805.,.,', 'sample_calc/calc.astl.action.dr', 36
528
- def _act_2 val
529
- val[0]
530
-
531
- end
532
-
533
- .,.,118754108949805.,.,
534
-
535
- module_eval <<-'.,.,118754108963438.,.,', 'sample_calc/calc.astl.action.dr', 41
536
- def _act_3 val
537
- val[0] * val[2]
538
-
539
- end
540
-
541
- .,.,118754108963438.,.,
542
-
543
- module_eval <<-'.,.,118754108920628.,.,', 'sample_calc/calc.astl.action.dr', 44
544
- def _act_4 val
545
- val[0] / val[2]
546
-
547
- end
548
-
549
- .,.,118754108920628.,.,
550
-
551
- module_eval <<-'.,.,11875410896708.,.,', 'sample_calc/calc.astl.action.dr', 47
552
- def _act_5 val
553
- val[0]
554
-
555
- end
556
-
557
- .,.,11875410896708.,.,
558
-
559
- module_eval <<-'.,.,118754108933319.,.,', 'sample_calc/calc.astl.action.dr', 52
560
- def _act_6 val
561
- val[0].value
562
-
563
- end
564
-
565
- .,.,118754108933319.,.,
566
-
567
- module_eval <<-'.,.,118754108926354.,.,', 'sample_calc/calc.astl.action.dr', 55
568
- def _act_7 val
569
- val[1].value
570
-
571
- end
572
-
573
- .,.,118754108926354.,.,
574
-
575
- end
576
-
577
-
578
- def createDecoratedTinyCalc
579
- D4TinyCalc::Action.new(D4TinyCalc::ASTBuilderLazy.new(TinyCalc.new()))
580
- end
581
-
582
- ### main
583
- if __FILE__ == $0
584
- ### Main Code
585
- require 'pp'
586
- parser = createDecoratedTinyCalc()
587
- t, r = parser.yyparse(STDIN)
588
- v = Visitor.new
589
- pp r
590
- pp t.accept(v).value
591
- pp t
592
-
593
- end