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.
- checksums.yaml +5 -5
- data/.rubocop.yml +44 -0
- data/.simplecov +5 -0
- data/Gemfile +12 -0
- data/LICENSE.gpl +339 -0
- data/Manifest.txt +73 -0
- data/README.en +4 -3
- data/README.ja +4 -47
- data/Rakefile +31 -0
- data/bin/depager +3 -38
- data/examples/action_pl0d/pl0d.action.dr +4 -4
- data/examples/action_pl0d/test.pl0ds +2 -3
- data/examples/c89/c89.dr +4 -4
- data/examples/c89/test.c89 +1 -1
- data/examples/extension/astdf.rb +4 -5
- data/examples/extension/atree.dr +3 -3
- data/examples/extension/calc.atree.dr +4 -4
- data/examples/extension/calc.simple_action.dr +3 -3
- data/examples/extension/paction.dr +3 -3
- data/examples/extension/pactiontest.dr +3 -3
- data/examples/extension/simple_action.rb +26 -24
- data/examples/pl0d/pl0ds.dr +5 -5
- data/examples/pl0d/test.pl0ds +2 -2
- data/examples/rie_calc/calc.rie.dr +4 -4
- data/examples/rie_dcuse/dcuse.rie.dr +4 -4
- data/examples/rie_pl0/pl0.rie.dr +3 -3
- data/examples/slex_test/divreg.slex.dr +5 -5
- data/examples/slex_test/ljoin.slex.dr +5 -5
- data/examples/{sample_calc → tiny_calc}/calc.action.dr +4 -4
- data/examples/{sample_calc → tiny_calc}/calc.ast.action.dr +20 -9
- data/examples/{sample_calc → tiny_calc}/calc.ast.dr +19 -7
- data/examples/{sample_calc → tiny_calc}/calc.cst.dr +12 -7
- data/examples/{sample_calc → tiny_calc}/calc.dr +1 -1
- data/examples/{sample_calc → tiny_calc}/calc.lex.dr +2 -2
- data/examples/{sample_calc → tiny_calc}/calc_prec.action.dr +4 -4
- data/lib/depager/cli.rb +44 -0
- data/lib/depager/grammar.rb +72 -75
- data/lib/depager/lr.rb +169 -154
- data/lib/depager/parser.rb +90 -103
- data/lib/depager/plugins/_rie_debug.rb +63 -0
- data/lib/depager/plugins/action.rb +47 -0
- data/lib/depager/{ruby/plugins → plugins}/ast.dr +20 -17
- data/lib/depager/{ruby/plugins → plugins}/ast.rb +266 -304
- data/lib/depager/{ruby/plugins → plugins}/cst.dr +18 -16
- data/lib/depager/{ruby/plugins → plugins}/cst.rb +152 -148
- data/lib/depager/{ruby/plugins → plugins}/lex.dr +7 -7
- data/lib/depager/{ruby/plugins → plugins}/lex.rb +72 -69
- data/lib/depager/{ruby/plugins → plugins}/rie.dr +12 -10
- data/lib/depager/{ruby/plugins → plugins}/rie.rb +224 -263
- data/lib/depager/{ruby/plugins → plugins}/slex.dr +13 -14
- data/lib/depager/{ruby/plugins → plugins}/slex.rb +183 -194
- data/lib/depager/plugins/srp.rb +46 -0
- data/lib/depager/ruby/templates/extension_lalr_master.erb +6 -12
- data/lib/depager/ruby/templates/extension_lalr_slave.erb +31 -17
- data/lib/depager/ruby/templates/single_lalr_parser.erb +35 -26
- data/lib/depager/utils.rb +56 -46
- data/lib/depager/version.rb +1 -2
- data/lib/depager.rb +166 -176
- metadata +38 -33
- data/lib/depager/ruby/plugins/_rie_debug.rb +0 -35
- data/lib/depager/ruby/plugins/action.rb +0 -53
- data/lib/depager/ruby/plugins/srp.rb +0 -56
- /data/examples/{sample_calc → tiny_calc}/test.calc +0 -0
data/lib/depager/grammar.rb
CHANGED
@@ -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
|
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 = []
|
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
|
36
|
-
@
|
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
|
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
|
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
|
-
|
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
|
-
|
89
|
-
|
90
|
-
|
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
|
92
|
+
def first(p)
|
100
93
|
return symset([EPS]) if p.empty?
|
101
|
-
|
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
|
-
|
107
|
+
r
|
113
108
|
end
|
114
109
|
|
115
|
-
def term?
|
110
|
+
def term?(i)
|
116
111
|
i && i >= @nonterms.size
|
117
112
|
end
|
118
113
|
|
119
|
-
def nonterm?
|
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
|
122
|
+
def symname(sym)
|
128
123
|
name = @syms[sym]
|
129
124
|
return nil unless sym.is_a? Integer
|
130
|
-
return
|
131
|
-
return
|
132
|
-
return
|
133
|
-
return
|
134
|
-
return
|
135
|
-
|
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
|
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
|
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 <<
|
152
|
+
def <<(sym)
|
156
153
|
@set |= @grammar.sym_mask(sym)
|
157
154
|
self
|
158
155
|
end
|
159
156
|
|
160
|
-
def &
|
161
|
-
SymbolSet.new(@grammar, @set &
|
157
|
+
def &(other)
|
158
|
+
SymbolSet.new(@grammar, @set & other.set)
|
162
159
|
end
|
163
160
|
|
164
|
-
def |
|
165
|
-
SymbolSet.new(@grammar, @set |
|
161
|
+
def |(other)
|
162
|
+
SymbolSet.new(@grammar, @set | other.set)
|
166
163
|
end
|
167
164
|
|
168
|
-
def merge!
|
165
|
+
def merge!(symset)
|
169
166
|
@set |= symset.set
|
170
167
|
self
|
171
168
|
end
|
172
169
|
|
173
|
-
def -
|
174
|
-
SymbolSet.new(@grammar, @set ^
|
170
|
+
def -(other)
|
171
|
+
SymbolSet.new(@grammar, @set ^ (other.set & @set))
|
175
172
|
end
|
176
173
|
|
177
|
-
def subset_of?
|
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
|
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?
|
188
|
-
(@set & @grammar.sym_mask(sym) != 0)
|
184
|
+
def include?(sym)
|
185
|
+
(@set & @grammar.sym_mask(sym) != 0)
|
189
186
|
end
|
190
187
|
|
191
|
-
def delete
|
188
|
+
def delete(sym)
|
192
189
|
old = @set
|
193
|
-
@set
|
194
|
-
old
|
190
|
+
@set &= ~@grammar.sym_mask(sym)
|
191
|
+
old == @set ? nil : sym
|
195
192
|
end
|
196
193
|
|
197
|
-
def each
|
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
|
-
|
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.[]
|
212
|
-
|
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
|
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
|
237
|
-
@rhs and @rhs[@rhs_names.index(name)]
|
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
|
-
|
242
|
-
rhs = @rhs.map{|i| grammar.symname i}.join(' ')
|
239
|
+
rhs = @rhs.map { |i| grammar.symname i }.join(" ")
|
243
240
|
|
244
|
-
"(#{'%03s'
|
241
|
+
"(#{format('%03s', @n)}) #{lhs_name} : #{rhs}"
|
245
242
|
end
|
246
243
|
|
247
244
|
def hash
|
248
|
-
|
245
|
+
[@rhs, @lhs].hash
|
249
246
|
end
|
250
247
|
|
251
|
-
def eql?
|
252
|
-
@lhs ==
|
248
|
+
def eql?(other)
|
249
|
+
@lhs == other.lhs && @rhs == other.rhs
|
253
250
|
end
|
254
251
|
alias == eql?
|
255
252
|
end
|