depager 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,29 +1,27 @@
1
- module Depager::ParsingMethodCommon
2
- class G
3
- attr_accessor :rulelist, :gh, :syms, :nonterms, :terms, :closure, :ismap, :nssize, :tla
4
- attr_accessor :precs, :epr, :epr2, :f0e, :first1, :eoi
1
+ module Depager::ParsingMethod
2
+ class Grammar
3
+ attr_accessor :rulelist, :lhs_to_rule, :syms, :nonterms, :terms
4
+ attr_accessor :precs, :f0e, :first1
5
5
  Eps = 0x3fffffff #epsilon
6
6
  #Eps = []
7
- def initialize rulelist, ts, ns, precs = nil
8
- @nssize = ns.size
9
- @precs = precs
10
- @eoi = ts[nil]
11
- @syms = ns.invert.merge(ts.invert)
12
- @tla = @syms.size
7
+ def initialize rulelist, terms, nonterms, precs = nil
8
+ @precs = precs
9
+ @nonterms = nonterms.invert
10
+ @terms = terms.invert
11
+ @syms = nonterms.invert.merge(terms.invert)
13
12
 
14
13
  @rulelist = rulelist
15
- @gh = []; @nssize.times{|i| @gh[i] = []}
16
- @epr = {}
17
- @f0e = {}
14
+ @lhs_to_rule = []; @nonterms.size.times{|i| @lhs_to_rule[i] = []}
15
+ @empty_rules = {}
18
16
  @rulelist.each_with_index do |rule, rx|
19
- rule.g = self
17
+ rule.grammar = self
20
18
  rule.n = rx
21
- @gh[rule.l].push rule
22
- if rule.r.empty?
23
- @epr[rule.l] = rule.n
24
- @f0e[rule.l] = { rule.n => [Eps] }
19
+ @lhs_to_rule[rule.lhs] << rule
20
+ if rule.rhs.empty?
21
+ @empty_rules[rule.lhs] = rule.n
25
22
  end
26
23
  end
24
+ make_sym_mask
27
25
  make_sym_first
28
26
  initialize_depend
29
27
  end
@@ -31,105 +29,266 @@ module Depager::ParsingMethodCommon
31
29
  def initialize_depend
32
30
  end
33
31
 
32
+ def make_sym_mask
33
+ @sym_mask, @mask_sym = {}, []
34
+ @terms.sort_by{|a, b| a}.each_with_index do |i,x|
35
+ @sym_mask[i[0]] = 1 << x
36
+ @mask_sym[x] = i[0]
37
+ end
38
+
39
+ @sym_mask[Eps] = (1 << @sym_mask.size)
40
+ @mask_sym << Eps
41
+ end
42
+
43
+ def symset syms=nil
44
+ ss = SymbolSet.new(self)
45
+ syms ? ss.concat_array(syms) : ss
46
+ end
47
+ def sym_mask sym
48
+ @sym_mask[sym]
49
+ end
50
+ def mask_size
51
+ @mask_sym.size
52
+ end
53
+ def mask_sym
54
+ @mask_sym
55
+ end
56
+
34
57
  def make_sym_first
35
- @first1 = {@tla => [@tla]}
58
+ @first1 = { }
59
+ @syms.each_key do |s|
60
+ @first1[s] = symset()
61
+
62
+ @first1[s] << s if terms? s
63
+ @first1[s] << Eps if @empty_rules[s]
64
+ end
65
+
66
+ begin
67
+ changed = false
68
+ @nonterms.size.times do |lhs|
69
+ @lhs_to_rule[lhs].each do |rule|
70
+ rule.rhs.each do |s|
71
+ unless @first1[s].subset_of?(@first1[lhs])
72
+ # warn "%b\n%b" % [@first1[s].set, @first1[lhs].set]
73
+ #warn "update{"
74
+ #warn " R:#{symname(s)}:#{@first1[s].inspect}"
75
+ #warn " L:#{symname(lhs)}:#{@first1[lhs].inspect}"
76
+ @first1[lhs].merge! @first1[s]
77
+ #warn " L:#{symname(lhs)}:#{@first1[lhs].inspect}"
78
+ #warn "}"
79
+ changed = true
80
+ end
81
+ break unless @first1[s].include? Eps
82
+ end
83
+ unless @first1[lhs].include? Eps
84
+ if rule.rhs.all?{|i| @first1[i].include? Eps }
85
+ @first1[lhs] << Eps
86
+ changed = true
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end while changed
92
+
93
+ old_make_sym_first
94
+ =begin
95
+ warn "check.."
96
+ @first1.each do |k,v|
97
+ old = @old_first1[k].sort
98
+ new = v.to_a.sort
99
+ unless new == old
100
+ warn "#{symname(k)}:#{old.join(',')}:#{new.join(',')}"
101
+ end
102
+ end
103
+ warn "ok?"
104
+ =end
105
+ end
106
+
107
+ def first p
108
+ return symset([Eps]) if p.empty?
109
+ r, x = symset(), 0
110
+ p.each do |i|
111
+ unless i == Eps
112
+ r.merge! @first1[i]
113
+ break unless @first1[i].include? Eps
114
+ end
115
+ x += 1
116
+ end
117
+ r.delete Eps
118
+ r << Eps if x == p.size
119
+
120
+ # check
121
+ #old = old_first(p).sort
122
+ #new = r.to_a.sort
123
+ #warn "???:#{old.join(',')}:#{new.join(',')}" unless new == old
124
+
125
+ return r
126
+ end
127
+
128
+ def old_make_sym_first
129
+ first1 = { }
36
130
  @syms.each_key do |s|
37
131
  if terms? s
38
- @first1[s] = [s]
132
+ first1[s] = [s]
39
133
  else
40
- @first1[s] = []
41
- @first1[s].push Eps if @epr[s]
134
+ first1[s] = []
135
+ first1[s] << Eps if @empty_rules[s]
42
136
  end
43
137
  end
44
138
  begin
45
- cnt = false
46
- @syms.each_key do |s|
47
- @gh[s].each do |rule|
48
- rule.r.each do |es|
49
- ss = @first1[es] - @first1[s]
139
+ changed = false
140
+ @nonterms.size.times do |lhs|
141
+ @lhs_to_rule[lhs].each do |rule|
142
+ rule.rhs.each do |s|
143
+ ss = first1[s] - first1[lhs]
50
144
  unless ss.empty?
51
- @first1[s] |= ss
52
- cnt = true
145
+ first1[lhs] |= ss
146
+ changed = true
53
147
  end
54
- break unless @first1[es].include? Eps
148
+ break unless first1[s].include? Eps
55
149
  end
56
- unless @first1[s].include? Eps
57
- if rule.r.all?{|i| @first1[i].include? Eps }
58
- @first1.push Eps
59
- cnt = true
150
+ unless first1[lhs].include? Eps
151
+ if rule.rhs.all?{|i| first1[i].include? Eps }
152
+ first1[lhs] << Eps
153
+ changed = true
60
154
  end
61
155
  end
62
- end if nonterms? s
156
+ end
63
157
  end
64
- end while cnt
158
+ end while changed
159
+ @old_first1 = first1
65
160
  end
66
161
 
67
- def first p
162
+ def old_first p
163
+ return [Eps] if p.empty?
164
+ first1 = @old_first1
68
165
  r = []
69
166
  x = 0
70
167
  p.each do |i|
71
- if i == Eps
72
- elsif i.class == Array
73
- i.each do |j|
74
- r |= @first1[j]
75
- end
76
- break unless i.any?{|j| @epr[j] || j==Eps }
77
- else
78
- r |= @first1[i]
79
- break unless @epr[i]
168
+ unless i == Eps
169
+ r.concat first1[i]
170
+ break unless first1[i].include? Eps
80
171
  end
81
172
  x += 1
82
173
  end
83
- r -= [Eps]
84
- r |= [Eps] if x == p.size
174
+ r.uniq! ; r.delete Eps
175
+ r << Eps if x == p.size
85
176
  return r
86
177
  end
87
178
 
88
179
  def terms? i
89
- i && i >= @nssize
180
+ i && i >= @nonterms.size
90
181
  end
91
182
 
92
183
  def nonterms? i
93
- i && i < @nssize
184
+ i && i < @nonterms.size
94
185
  end
95
186
 
96
187
  def [](n)
97
188
  @rulelist[n]
98
189
  end
190
+
191
+ def symname sym
192
+ name = @syms[sym]
193
+ return '$start' if sym == 0
194
+ return '$empty' if sym == Eps
195
+ return '$end' if name == nil
196
+ return '$error' if name == false
197
+ return "#{name}" if name.is_a? Symbol
198
+ return "'#{name}'"
199
+ end
200
+
201
+ class SymbolSet
202
+ include Enumerable
203
+ attr_accessor :set
204
+ def initialize g, set=0
205
+ raise g.class.name unless g.is_a? Depager::LALR::Grammar
206
+ @grammar = g
207
+ @set = set
208
+ end
209
+ def concat_array set
210
+ set.each do |i|
211
+ self << i
212
+ end
213
+ self
214
+ end
215
+ def << sym
216
+ @set |= @grammar.sym_mask(sym)
217
+ self
218
+ end
219
+ def & symset
220
+ SymbolSet.new(@grammar, @set & symset.set)
221
+ end
222
+ def | symset
223
+ SymbolSet.new(@grammar, @set | symset.set)
224
+ end
225
+ def merge! symset
226
+ @set |= symset.set
227
+ self
228
+ end
229
+ def - symset
230
+ SymbolSet.new(@grammar, @set ^ symset.set & @set)
231
+ end
232
+ def subset_of? symset
233
+ # "a is a subset of b" is a-b={}
234
+ d = (@set ^ symset.set & @set)
235
+ d == 0 ? true : false
236
+ end
237
+ def empty?
238
+ @set == 0
239
+ end
240
+ def include? sym
241
+ (@set & @grammar.sym_mask(sym) != 0) ? true : false
242
+ end
243
+ def delete sym
244
+ old = @set
245
+ @set = @set & ~@grammar.sym_mask(sym)
246
+ old != @set ? sym : nil
247
+ end
248
+ def each &block
249
+ mask_sym = @grammar.mask_sym
250
+ @grammar.mask_size.times do |x|
251
+ @set[x] == 1 and yield mask_sym[x]
252
+ end
253
+ end
254
+ def inspect
255
+ self.map{|i| @grammar.symname(i)}.inspect
256
+ end
257
+ end
99
258
  end
259
+ G = Grammar
100
260
 
101
261
  class Rule
102
262
  def self.[] l, r, prec = nil
103
- self.new l, r, nil, nil, nil, prec
263
+ self.new l, r, prec
104
264
  end
105
265
 
106
- attr_accessor :l, :r, :g, :n, :act, :epr, :prec
107
- def initialize l, r, g = nil, n = nil, act = nil, prec = nil
108
- @l = l
109
- @r = r
110
- @g = g
111
- @n = n
112
- @act = act
113
- @epr = []
266
+ attr_accessor :lhs, :rhs, :grammar, :n, :prec
267
+ def initialize lhs, rhs, prec = nil
268
+ @lhs = lhs
269
+ @rhs = rhs
114
270
  @prec = prec
271
+
272
+ @grammar = nil
273
+ @n = 0
274
+
115
275
  initialize_depend
116
276
  end
117
277
  def initialize_depend
118
278
  end
119
279
 
120
- alias lhs l
121
- alias rhs r
122
-
123
280
  def to_s
124
- r = @r.map{|i| @g.syms[i]}.join(' ')
125
- "(#{'%03s'%@n}) #{@g.syms[@l]} : #{r}"
281
+ lhs = grammar.symname @lhs
282
+ rhs = @rhs.map{|i| grammar.symname i}.join(' ')
283
+
284
+ "(#{'%03s' % @n}) #{lhs} : #{rhs}"
126
285
  end
127
286
 
128
287
  def hash
129
- (@l.hash % 37) * (@r.hash % 37)
288
+ 1117 * @rhs.hash + @lhs.hash % 3037
130
289
  end
131
290
  def eql? i
132
- @l == i.l && @r == i.r
291
+ @lhs == i.lhs && @rhs == i.rhs
133
292
  end
134
293
  alias == eql?
135
294
  end
@@ -65,7 +65,7 @@
65
65
  }
66
66
  ;
67
67
  lexactlist:
68
- lexact { [ _lexact ] }
68
+ lexact { _lexact }
69
69
  | lexactlist lexact { _lexactlist << _lexact }
70
70
  ;
71
71
  lexact:
@@ -89,12 +89,12 @@ class LexerExtension_prerulelist < Depager::LALR::Basis #:nodoc:all
89
89
  [ ACC, nil, nil, nil, nil, nil, ],
90
90
  [ nil, nil, nil, nil, 5, nil, ],
91
91
  [ nil, nil, nil, nil, nil, nil, ],
92
- [ nil, nil, nil, 9, nil, 8, ],
92
+ [ nil, nil, nil, 8, nil, 9, ],
93
93
  [ nil, nil, nil, nil, nil, nil, ],
94
94
  [ nil, nil, nil, nil, nil, nil, ],
95
95
  [ nil, nil, 10, nil, nil, nil, ],
96
- [ nil, nil, nil, nil, 11, nil, ],
97
96
  [ nil, nil, nil, nil, nil, nil, ],
97
+ [ nil, nil, nil, nil, 11, nil, ],
98
98
  [ nil, nil, nil, nil, nil, nil, ],
99
99
  [ nil, nil, nil, nil, nil, nil, ],
100
100
  ]
@@ -108,8 +108,8 @@ class LexerExtension_prerulelist < Depager::LALR::Basis #:nodoc:all
108
108
  -7,
109
109
  -3,
110
110
  nil,
111
- nil,
112
111
  -6,
112
+ nil,
113
113
  -4,
114
114
  -8,
115
115
  ]
@@ -122,8 +122,8 @@ class LexerExtension_prerulelist < Depager::LALR::Basis #:nodoc:all
122
122
  -7,
123
123
  -3,
124
124
  nil,
125
- nil,
126
125
  -6,
126
+ nil,
127
127
  -4,
128
128
  -8,
129
129
  ]
@@ -230,8 +230,7 @@ end
230
230
 
231
231
  class D4LexerExtension_prerulelist::NVAction < Depager::LALR::Action #:nodoc:all
232
232
  include Depager::DecoratorUtils
233
- include ActionParser
234
-
233
+ [" include ActionParser\n"]
235
234
  on_reduce = [
236
235
  nil,
237
236
  :_act_0,
@@ -252,9 +251,9 @@ class D4LexerExtension_prerulelist::NVAction < Depager::LALR::Action #:nodoc:all
252
251
  end
253
252
 
254
253
 
255
- module_eval <<-'.,.,118754107729449.,.,', 'lex.dr', 48
256
- def _act_0 val
257
- _lexactlist = *val
254
+ module_eval <<-'.,.,12099829229538.,.,', 'lex.dr', 48
255
+ def _act_0 val
256
+ _lexactlist, = *val
258
257
 
259
258
  g_parser.optinner << %{
260
259
  def lex
@@ -271,31 +270,28 @@ module_eval <<-'.,.,118754107729449.,.,', 'lex.dr', 48
271
270
  end
272
271
  }; #code
273
272
 
274
- end
275
-
276
- .,.,118754107729449.,.,
273
+ end
274
+ .,.,12099829229538.,.,
277
275
 
278
- module_eval <<-'.,.,118754107760430.,.,', 'lex.dr', 66
279
- def _act_1 val
280
- _lexact = *val
281
- [ _lexact ]
282
-
283
- end
276
+ module_eval <<-'.,.,12099829229930.,.,', 'lex.dr', 66
277
+ def _act_1 val
278
+ _lexact, = *val
279
+ _lexact
284
280
 
285
- .,.,118754107760430.,.,
281
+ end
282
+ .,.,12099829229930.,.,
286
283
 
287
- module_eval <<-'.,.,118754107730115.,.,', 'lex.dr', 67
288
- def _act_2 val
289
- _lexactlist, _lexact = *val
284
+ module_eval <<-'.,.,120998292251446.,.,', 'lex.dr', 67
285
+ def _act_2 val
286
+ _lexactlist, _lexact, = *val
290
287
  _lexactlist << _lexact
291
288
 
292
- end
293
-
294
- .,.,118754107730115.,.,
289
+ end
290
+ .,.,120998292251446.,.,
295
291
 
296
- module_eval <<-'.,.,118754107747000.,.,', 'lex.dr', 71
297
- def _act_3 val
298
- _lexlist, _opt_noskip, _ACTION = *val
292
+ module_eval <<-'.,.,12099829229876.,.,', 'lex.dr', 71
293
+ def _act_3 val
294
+ _lexlist, _opt_noskip, _ACTION, = *val
299
295
 
300
296
  %{
301
297
  when #{_lexlist.join(', ')}
@@ -303,44 +299,39 @@ module_eval <<-'.,.,118754107747000.,.,', 'lex.dr', 71
303
299
  #{ _ACTION }
304
300
  }; #code
305
301
 
306
- end
307
-
308
- .,.,118754107747000.,.,
302
+ end
303
+ .,.,12099829229876.,.,
309
304
 
310
- module_eval <<-'.,.,118754107727512.,.,', 'lex.dr', 80
311
- def _act_4 val
305
+ module_eval <<-'.,.,120998292261886.,.,', 'lex.dr', 80
306
+ def _act_4 val
312
307
  false
313
308
 
314
- end
315
-
316
- .,.,118754107727512.,.,
309
+ end
310
+ .,.,120998292261886.,.,
317
311
 
318
- module_eval <<-'.,.,118754107710888.,.,', 'lex.dr', 81
319
- def _act_5 val
320
- _ = *val
312
+ module_eval <<-'.,.,120998292263869.,.,', 'lex.dr', 81
313
+ def _act_5 val
314
+ _, = *val
321
315
  true
322
316
 
323
- end
324
-
325
- .,.,118754107710888.,.,
317
+ end
318
+ .,.,120998292263869.,.,
326
319
 
327
- module_eval <<-'.,.,118754107743010.,.,', 'lex.dr', 84
328
- def _act_6 val
329
- _LEX = *val
320
+ module_eval <<-'.,.,120998292217015.,.,', 'lex.dr', 84
321
+ def _act_6 val
322
+ _LEX, = *val
330
323
  [ _LEX ]
331
324
 
332
- end
333
-
334
- .,.,118754107743010.,.,
325
+ end
326
+ .,.,120998292217015.,.,
335
327
 
336
- module_eval <<-'.,.,118754107718606.,.,', 'lex.dr', 85
337
- def _act_7 val
338
- _lexlist, _, _LEX = *val
328
+ module_eval <<-'.,.,120998292239616.,.,', 'lex.dr', 85
329
+ def _act_7 val
330
+ _lexlist, _, _LEX, = *val
339
331
  _lexlist << _LEX
340
332
 
341
- end
342
-
343
- .,.,118754107718606.,.,
333
+ end
334
+ .,.,120998292239616.,.,
344
335
 
345
336
  end
346
337