depager 0.2.3 → 0.3.0.b20160729

Sign up to get free protection for your applications and to get access to all the features.
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