depager 0.2.3 → 0.3.0.b20160729

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 (91) hide show
  1. checksums.yaml +7 -0
  2. data/README.en +4 -19
  3. data/README.ja +42 -79
  4. data/bin/depager +42 -45
  5. data/examples/action_pl0d/pl0d.action.dr +421 -0
  6. data/examples/action_pl0d/test.pl0ds +49 -0
  7. data/examples/c89/c89.dr +493 -496
  8. data/examples/c89/test.c89 +10 -10
  9. data/examples/extension/astdf.rb +10 -0
  10. data/examples/extension/atree.dr +55 -0
  11. data/examples/{sample_calc → extension}/calc.atree.dr +42 -43
  12. data/examples/extension/calc.simple_action.dr +33 -0
  13. data/examples/extension/paction.dr +16 -15
  14. data/examples/extension/pactiontest.dr +14 -14
  15. data/examples/extension/simple_action.rb +44 -0
  16. data/examples/pl0d/pl0ds.dr +337 -334
  17. data/examples/pl0d/test.pl0ds +33 -33
  18. data/examples/rie_calc/calc.rie.dr +57 -0
  19. data/examples/rie_calc/test.calc +4 -0
  20. data/examples/rie_dcuse/dcuse.rie.dr +71 -0
  21. data/examples/rie_dcuse/test.dcuse +1 -0
  22. data/examples/rie_pl0/orig_ex/exerrdg.pl0 +44 -0
  23. data/examples/rie_pl0/orig_ex/exerrm.pl0 +19 -0
  24. data/examples/rie_pl0/orig_ex/exerrmre.pl0 +20 -0
  25. data/examples/rie_pl0/orig_ex/exerrtok.pl0 +18 -0
  26. data/examples/rie_pl0/orig_ex/exmdg.pl0 +40 -0
  27. data/examples/rie_pl0/orig_ex/exmdgwwl.pl0 +43 -0
  28. data/examples/rie_pl0/orig_ex/exmrw.pl0 +22 -0
  29. data/examples/rie_pl0/orig_ex/exmwwl.pl0 +18 -0
  30. data/examples/rie_pl0/orig_ex/exnorw.pl0 +17 -0
  31. data/examples/rie_pl0/pl0.rie.dr +450 -0
  32. data/examples/rie_pl0/test.pl0 +10 -0
  33. data/examples/sample_calc/calc.action.dr +33 -33
  34. data/examples/sample_calc/calc.ast.action.dr +65 -66
  35. data/examples/sample_calc/calc.ast.dr +55 -55
  36. data/examples/sample_calc/calc.cst.dr +45 -45
  37. data/examples/sample_calc/calc.dr +43 -43
  38. data/examples/sample_calc/calc.lex.dr +29 -29
  39. data/examples/sample_calc/{calc_prec.nvaction.dr → calc_prec.action.dr} +31 -31
  40. data/examples/slex_test/divreg.slex.dr +29 -29
  41. data/examples/slex_test/ljoin.slex.dr +36 -36
  42. data/examples/slex_test/test.divreg +1 -1
  43. data/examples/slex_test/test.ljoin +3 -3
  44. data/lib/depager.rb +582 -670
  45. data/lib/depager/grammar.rb +256 -291
  46. data/lib/depager/lr.rb +574 -579
  47. data/lib/depager/parser.rb +282 -277
  48. data/lib/depager/ruby/plugins/_rie_debug.rb +35 -0
  49. data/lib/depager/ruby/plugins/action.rb +53 -43
  50. data/lib/depager/ruby/plugins/ast.dr +364 -269
  51. data/lib/depager/ruby/plugins/ast.rb +1367 -1308
  52. data/lib/depager/ruby/plugins/cst.dr +172 -180
  53. data/lib/depager/ruby/plugins/cst.rb +587 -626
  54. data/lib/depager/ruby/plugins/lex.dr +85 -89
  55. data/lib/depager/ruby/plugins/lex.rb +310 -336
  56. data/lib/depager/ruby/plugins/rie.dr +723 -0
  57. data/lib/depager/ruby/plugins/rie.rb +1653 -0
  58. data/lib/depager/ruby/plugins/slex.dr +202 -200
  59. data/lib/depager/ruby/plugins/slex.rb +780 -817
  60. data/lib/depager/ruby/plugins/srp.rb +56 -51
  61. data/lib/depager/ruby/templates/extension_lalr_master.erb +46 -51
  62. data/lib/depager/ruby/templates/extension_lalr_slave.erb +99 -107
  63. data/lib/depager/ruby/templates/single_lalr_parser.erb +115 -117
  64. data/lib/depager/utils.rb +148 -318
  65. data/lib/depager/version.rb +4 -3
  66. metadata +52 -60
  67. data/ChangeLog +0 -16
  68. data/data/depager/pre-setup.rb +0 -3
  69. data/examples/c89/c89.tab.rb +0 -7127
  70. data/examples/pl0d/pl0ds.tab.rb +0 -2698
  71. data/examples/sample_calc/calc.action.tab.rb +0 -457
  72. data/examples/sample_calc/calc.ast.action.tab.rb +0 -749
  73. data/examples/sample_calc/calc.ast.tab.rb +0 -665
  74. data/examples/sample_calc/calc.astdf.dr +0 -54
  75. data/examples/sample_calc/calc.astdf.tab.rb +0 -672
  76. data/examples/sample_calc/calc.atree.tab.rb +0 -451
  77. data/examples/sample_calc/calc.cst.tab.rb +0 -644
  78. data/examples/sample_calc/calc.lex.tab.rb +0 -374
  79. data/examples/sample_calc/calc.nvaction.dr +0 -33
  80. data/examples/sample_calc/calc.nvaction.tab.rb +0 -465
  81. data/examples/sample_calc/calc.tab.rb +0 -365
  82. data/examples/sample_calc/calc_prec.nvaction.tab.rb +0 -431
  83. data/examples/slex_test/divreg.slex.tab.rb +0 -303
  84. data/examples/slex_test/ljoin.slex.tab.rb +0 -370
  85. data/lib/depager/ruby/plugins/_ast_tmpl.rb +0 -73
  86. data/lib/depager/ruby/plugins/astdf.rb +0 -6
  87. data/lib/depager/ruby/plugins/atree.dr +0 -55
  88. data/lib/depager/ruby/plugins/atree.rb +0 -347
  89. data/lib/depager/ruby/plugins/nvaction.rb +0 -19
  90. data/lib/depager/ruby/templates/simple.erb +0 -23
  91. data/setup.rb +0 -1585
@@ -1,291 +1,256 @@
1
- module Depager::ParsingMethod
2
- class Grammar
3
- attr_accessor :rulelist, :lhs_to_rule, :syms, :nonterms, :terms
4
- attr_accessor :precs, :f0e, :first1
5
- Eps = 0x3fffffff #epsilon #Eps = []
6
- def initialize_depend ; end # template method for inheritance
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)
12
-
13
- @rulelist = rulelist
14
- @lhs_to_rule = []; @nonterms.size.times{|i| @lhs_to_rule[i] = []}
15
- @empty_rules = {}
16
- @rulelist.each_with_index do |rule, rx|
17
- rule.grammar = self
18
- rule.n = rx
19
- @lhs_to_rule[rule.lhs] << rule
20
- if rule.rhs.empty?
21
- @empty_rules[rule.lhs] = rule.n
22
- end
23
- end
24
- make_sym_mask
25
- make_sym_first
26
- initialize_depend
27
- end
28
-
29
- def make_sym_mask
30
- @sym_mask, @mask_sym = {}, []
31
- @terms.sort_by{|a, b| a}.each_with_index do |i,x|
32
- @sym_mask[i[0]] = 1 << x
33
- @mask_sym[x] = i[0]
34
- end
35
-
36
- @sym_mask[Eps] = (1 << @sym_mask.size)
37
- @mask_sym << Eps
38
- end
39
-
40
- def symset syms=nil
41
- ss = SymbolSet.new(self)
42
- syms ? ss.concat_array(syms) : ss
43
- end
44
- def sym_mask sym
45
- @sym_mask[sym]
46
- end
47
- def mask_size
48
- @mask_sym.size
49
- end
50
- def mask_sym
51
- @mask_sym
52
- end
53
-
54
- def make_sym_first
55
- @first1 = { }
56
- @syms.each_key do |s|
57
- @first1[s] = symset()
58
-
59
- @first1[s] << s if terms? s
60
- @first1[s] << Eps if @empty_rules[s]
61
- end
62
-
63
- begin
64
- changed = false
65
- @nonterms.size.times do |lhs|
66
- @lhs_to_rule[lhs].each do |rule|
67
- rule.rhs.each do |s|
68
- unless @first1[s].subset_of?(@first1[lhs])
69
- # warn "%b\n%b" % [@first1[s].set, @first1[lhs].set]
70
- #warn "update{"
71
- #warn " R:#{symname(s)}:#{@first1[s].inspect}"
72
- #warn " L:#{symname(lhs)}:#{@first1[lhs].inspect}"
73
- @first1[lhs].merge! @first1[s]
74
- #warn " L:#{symname(lhs)}:#{@first1[lhs].inspect}"
75
- #warn "}"
76
- changed = true
77
- end
78
- break unless @first1[s].include? Eps
79
- end
80
- unless @first1[lhs].include? Eps
81
- if rule.rhs.all?{|i| @first1[i].include? Eps }
82
- @first1[lhs] << Eps
83
- changed = true
84
- end
85
- end
86
- end
87
- end
88
- end while changed
89
-
90
- =begin
91
- old_make_sym_first
92
- warn "check.."
93
- @first1.each do |k,v|
94
- old = @old_first1[k].sort
95
- new = v.to_a.sort
96
- unless new == old
97
- warn "#{symname(k)}:#{old.join(',')}:#{new.join(',')}"
98
- end
99
- end
100
- warn "ok?"
101
- =end
102
- end
103
-
104
- def first p
105
- return symset([Eps]) if p.empty?
106
- r, x = symset(), 0
107
- p.each do |i|
108
- unless i == Eps
109
- r.merge! @first1[i]
110
- break unless @first1[i].include? Eps
111
- end
112
- x += 1
113
- end
114
- r.delete Eps
115
- r << Eps if x == p.size
116
-
117
- # check
118
- #old = old_first(p).sort
119
- #new = r.to_a.sort
120
- #warn "???:#{old.join(',')}:#{new.join(',')}" unless new == old
121
-
122
- return r
123
- end
124
-
125
- def old_make_sym_first
126
- first1 = { }
127
- @syms.each_key do |s|
128
- if terms? s
129
- first1[s] = [s]
130
- else
131
- first1[s] = []
132
- first1[s] << Eps if @empty_rules[s]
133
- end
134
- end
135
- begin
136
- changed = false
137
- @nonterms.size.times do |lhs|
138
- @lhs_to_rule[lhs].each do |rule|
139
- rule.rhs.each do |s|
140
- ss = first1[s] - first1[lhs]
141
- unless ss.empty?
142
- first1[lhs] |= ss
143
- changed = true
144
- end
145
- break unless first1[s].include? Eps
146
- end
147
- unless first1[lhs].include? Eps
148
- if rule.rhs.all?{|i| first1[i].include? Eps }
149
- first1[lhs] << Eps
150
- changed = true
151
- end
152
- end
153
- end
154
- end
155
- end while changed
156
- @old_first1 = first1
157
- end
158
-
159
- def old_first p
160
- return [Eps] if p.empty?
161
- first1 = @old_first1
162
- r = []
163
- x = 0
164
- p.each do |i|
165
- unless i == Eps
166
- r.concat first1[i]
167
- break unless first1[i].include? Eps
168
- end
169
- x += 1
170
- end
171
- r.uniq! ; r.delete Eps
172
- r << Eps if x == p.size
173
- return r
174
- end
175
-
176
- def terms? i
177
- i && i >= @nonterms.size
178
- end
179
-
180
- def nonterms? i
181
- i && i < @nonterms.size
182
- end
183
-
184
- def [](n)
185
- @rulelist[n]
186
- end
187
-
188
- def symname sym
189
- name = @syms[sym]
190
- return '$start' if sym == 0
191
- return '$empty' if sym == Eps
192
- return '$end' if name == nil
193
- return '$error' if name == false
194
- return "#{name}" if name.is_a? Symbol
195
- return "'#{name}'"
196
- end
197
-
198
- class SymbolSet
199
- include Enumerable
200
- attr_accessor :set
201
- def initialize g, set=0
202
- raise g.class.name unless g.is_a? Depager::LALR::Grammar
203
- @grammar = g
204
- @set = set
205
- end
206
- def concat_array set
207
- set.each do |i|
208
- self << i
209
- end
210
- self
211
- end
212
- def << sym
213
- @set |= @grammar.sym_mask(sym)
214
- self
215
- end
216
- def & symset
217
- SymbolSet.new(@grammar, @set & symset.set)
218
- end
219
- def | symset
220
- SymbolSet.new(@grammar, @set | symset.set)
221
- end
222
- def merge! symset
223
- @set |= symset.set
224
- self
225
- end
226
- def - symset
227
- SymbolSet.new(@grammar, @set ^ symset.set & @set)
228
- end
229
- def subset_of? symset
230
- # "a is a subset of b" is a-b={}
231
- d = (@set ^ symset.set & @set)
232
- d == 0 ? true : false
233
- end
234
- def empty?
235
- @set == 0
236
- end
237
- def include? sym
238
- (@set & @grammar.sym_mask(sym) != 0) ? true : false
239
- end
240
- def delete sym
241
- old = @set
242
- @set = @set & ~@grammar.sym_mask(sym)
243
- old != @set ? sym : nil
244
- end
245
- def each &block
246
- mask_sym = @grammar.mask_sym
247
- @grammar.mask_size.times do |x|
248
- @set[x] == 1 and yield mask_sym[x]
249
- end
250
- end
251
- def inspect
252
- self.map{|i| @grammar.symname(i)}.inspect
253
- end
254
- end
255
- end
256
-
257
- class Rule
258
- def self.[] l, r, prec = nil
259
- self.new l, r, prec
260
- end
261
-
262
- attr_accessor :lhs, :rhs, :grammar, :n, :prec
263
- def initialize lhs, rhs, prec = nil
264
- @lhs = lhs
265
- @rhs = rhs
266
- @prec = prec
267
-
268
- @grammar = nil
269
- @n = 0
270
-
271
- initialize_depend
272
- end
273
- def initialize_depend
274
- end
275
-
276
- def to_s
277
- lhs = grammar.symname @lhs
278
- rhs = @rhs.map{|i| grammar.symname i}.join(' ')
279
-
280
- "(#{'%03s' % @n}) #{lhs} : #{rhs}"
281
- end
282
-
283
- def hash
284
- 1117 * @rhs.hash + @lhs.hash % 3037
285
- end
286
- def eql? i
287
- @lhs == i.lhs && @rhs == i.rhs
288
- end
289
- alias == eql?
290
- end
291
- end
1
+ # -*- coding: utf-8 -*-
2
+ module Depager
3
+ EPS = 0x3fffffff #epsilon
4
+
5
+ class Grammar
6
+ attr_accessor :rulelist, :lhs_to_rule, :syms, :nonterms, :terms
7
+ attr_accessor :precs, :f0e, :first1
8
+
9
+ def initialize rulelist, terms, nonterms, precs = nil
10
+ @precs = precs
11
+ @nonterms = nonterms.invert
12
+ @terms = terms.invert
13
+ @syms = nonterms.invert.merge(terms.invert)
14
+
15
+ @rulelist = rulelist
16
+ @lhs_to_rule = []; @nonterms.size.times{|i| @lhs_to_rule[i] = []}
17
+ @empty_rules = {}
18
+ @rulelist.each_with_index do |rule, rx|
19
+ rule.grammar = self
20
+ rule.n = rx
21
+ @lhs_to_rule[rule.lhs] << rule
22
+ if rule.rhs.empty?
23
+ @empty_rules[rule.lhs] = rule.n
24
+ end
25
+ end
26
+ make_sym_mask
27
+ make_sym_first
28
+ initialize_depend
29
+ end
30
+
31
+ def initialize_depend
32
+ end
33
+
34
+ def make_sym_mask
35
+ @sym_mask, @mask_sym = {}, []
36
+ @terms.sort_by{|a, b| a}.each_with_index do |i,x|
37
+ @sym_mask[i[0]] = 1 << x
38
+ @mask_sym[x] = i[0]
39
+ end
40
+
41
+ @sym_mask[EPS] = (1 << @sym_mask.size)
42
+ @mask_sym << EPS
43
+ end
44
+
45
+ def symset syms=nil
46
+ ss = SymbolSet.new(self)
47
+ syms ? ss.concat_array(syms) : ss
48
+ end
49
+
50
+ def sym_mask sym
51
+ @sym_mask[sym]
52
+ end
53
+
54
+ def mask_size
55
+ @mask_sym.size
56
+ end
57
+
58
+ def mask_sym
59
+ @mask_sym
60
+ end
61
+
62
+ def make_sym_first
63
+ @first1 = { }
64
+ @syms.each_key do |s|
65
+ @first1[s] = symset()
66
+
67
+ @first1[s] << s if term? s
68
+ @first1[s] << EPS if @empty_rules[s]
69
+ end
70
+
71
+ begin
72
+ changed = false
73
+ @nonterms.size.times do |lhs|
74
+ @lhs_to_rule[lhs].each do |rule|
75
+ rule.rhs.each do |s|
76
+ unless @first1[s].subset_of?(@first1[lhs])
77
+ # warn "%b\n%b" % [@first1[s].set, @first1[lhs].set]
78
+ #warn "update{"
79
+ #warn " R:#{symname(s)}:#{@first1[s].inspect}"
80
+ #warn " L:#{symname(lhs)}:#{@first1[lhs].inspect}"
81
+ @first1[lhs].merge! @first1[s]
82
+ #warn " L:#{symname(lhs)}:#{@first1[lhs].inspect}"
83
+ #warn "}"
84
+ changed = true
85
+ end
86
+ break unless @first1[s].include? EPS
87
+ end
88
+ unless @first1[lhs].include? EPS
89
+ if rule.rhs.all?{|i| @first1[i].include? EPS }
90
+ @first1[lhs] << EPS
91
+ changed = true
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end while changed
97
+ end
98
+
99
+ def first p
100
+ return symset([EPS]) if p.empty?
101
+ r, x = symset(), 0
102
+ p.each do |i|
103
+ unless i == EPS
104
+ r.merge! @first1[i]
105
+ break unless @first1[i].include? EPS
106
+ end
107
+ x += 1
108
+ end
109
+ r.delete EPS
110
+ r << EPS if x == p.size
111
+
112
+ return r
113
+ end
114
+
115
+ def term? i
116
+ i && i >= @nonterms.size
117
+ end
118
+
119
+ def nonterm? i
120
+ i && i < @nonterms.size
121
+ end
122
+
123
+ def [](n)
124
+ @rulelist[n]
125
+ end
126
+
127
+ def symname sym
128
+ name = @syms[sym]
129
+ return nil unless sym.is_a? Integer
130
+ return '$start' if sym == 0
131
+ return '$empty' if sym == EPS
132
+ return '$end' if name == nil
133
+ return '$error' if name == false
134
+ return "#{name}" if name.is_a? Symbol
135
+ return "'#{name}'"
136
+ end
137
+
138
+ class SymbolSet
139
+ include Enumerable
140
+ attr_accessor :set
141
+
142
+ def initialize g, set=0
143
+ raise g.class.name unless g.is_a? Depager::Grammar
144
+ @grammar = g
145
+ @set = set
146
+ end
147
+
148
+ def concat_array set
149
+ set.each do |i|
150
+ self << i
151
+ end
152
+ self
153
+ end
154
+
155
+ def << sym
156
+ @set |= @grammar.sym_mask(sym)
157
+ self
158
+ end
159
+
160
+ def & symset
161
+ SymbolSet.new(@grammar, @set & symset.set)
162
+ end
163
+
164
+ def | symset
165
+ SymbolSet.new(@grammar, @set | symset.set)
166
+ end
167
+
168
+ def merge! symset
169
+ @set |= symset.set
170
+ self
171
+ end
172
+
173
+ def - symset
174
+ SymbolSet.new(@grammar, @set ^ symset.set & @set)
175
+ end
176
+
177
+ def subset_of? symset
178
+ # "a is a subset of b" is a-b={}
179
+ d = (@set ^ symset.set & @set)
180
+ d == 0 ? true : false
181
+ end
182
+
183
+ def empty?
184
+ @set == 0
185
+ end
186
+
187
+ def include? sym
188
+ (@set & @grammar.sym_mask(sym) != 0) ? true : false
189
+ end
190
+
191
+ def delete sym
192
+ old = @set
193
+ @set = @set & ~@grammar.sym_mask(sym)
194
+ old != @set ? sym : nil
195
+ end
196
+
197
+ def each &block
198
+ mask_sym = @grammar.mask_sym
199
+ @grammar.mask_size.times do |x|
200
+ @set[x] == 1 and yield mask_sym[x]
201
+ end
202
+ end
203
+
204
+ def inspect
205
+ self.map{|i| @grammar.symname(i)}.inspect
206
+ end
207
+ end
208
+ end
209
+
210
+ class Rule
211
+ def self.[] *args
212
+ self.new *args
213
+ end
214
+
215
+ attr_accessor :lhs, :rhs, :grammar, :n, :prec, :rhs_names
216
+
217
+ def initialize lhs, rhs, prec = nil, rhs_names = nil
218
+ @lhs = lhs
219
+ @rhs = rhs
220
+ @prec = prec
221
+ @rhs_names = rhs_names
222
+
223
+ @grammar = nil
224
+ @n = 0
225
+
226
+ initialize_depend
227
+ end
228
+
229
+ def initialize_depend
230
+ end
231
+
232
+ def lhs_name
233
+ grammar.symname @lhs
234
+ end
235
+
236
+ def rhs_name_to_sym name
237
+ @rhs and @rhs[@rhs_names.index(name)] rescue nil
238
+ end
239
+
240
+ def to_s
241
+ lhs = grammar.symname @lhs
242
+ rhs = @rhs.map{|i| grammar.symname i}.join(' ')
243
+
244
+ "(#{'%03s' % @n}) #{lhs_name} : #{rhs}"
245
+ end
246
+
247
+ def hash
248
+ 1117 * @rhs.hash + @lhs.hash % 3037
249
+ end
250
+
251
+ def eql? i
252
+ @lhs == i.lhs && @rhs == i.rhs
253
+ end
254
+ alias == eql?
255
+ end
256
+ end