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