depager 0.2.3 → 0.3.0.b20250423

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