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,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