depager 0.2.0 → 0.2.2
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.
- data/ChangeLog +4 -0
- data/README.en +5 -10
- data/bin/depager +17 -20
- data/examples/c89/c89.tab.rb +5632 -702
- data/examples/pl0d/pl0ds.dr +41 -41
- data/examples/pl0d/pl0ds.tab.rb +1887 -874
- data/examples/sample_calc/calc.action.tab.rb +243 -69
- data/examples/sample_calc/{calc.astl.action.dr → calc.ast.action.dr} +7 -7
- data/examples/sample_calc/calc.ast.action.tab.rb +755 -0
- data/examples/sample_calc/{calc.astl.dr → calc.ast.dr} +7 -7
- data/examples/sample_calc/calc.ast.tab.rb +672 -0
- data/examples/sample_calc/calc.astdf.dr +5 -5
- data/examples/sample_calc/calc.astdf.tab.rb +405 -202
- data/examples/sample_calc/calc.atree.tab.rb +243 -69
- data/examples/sample_calc/calc.cst.tab.rb +275 -109
- data/examples/sample_calc/calc.lex.tab.rb +210 -28
- data/examples/sample_calc/calc.nvaction.tab.rb +251 -77
- data/examples/sample_calc/calc.tab.rb +210 -28
- data/examples/sample_calc/calc_prec.nvaction.tab.rb +224 -50
- data/examples/slex_test/divreg.slex.tab.rb +97 -21
- data/examples/slex_test/ljoin.slex.tab.rb +128 -35
- data/lib/depager.rb +77 -44
- data/lib/depager/{ast_base.dr → ast.dr} +56 -18
- data/lib/depager/{ast_base.rb → ast.rb} +432 -424
- data/lib/depager/astdf.rb +3 -6
- data/lib/depager/atree.rb +54 -62
- data/lib/depager/cst.dr +2 -2
- data/lib/depager/cst.rb +64 -77
- data/lib/depager/grammar.rb +225 -66
- data/lib/depager/lex.dr +1 -1
- data/lib/depager/lex.rb +45 -54
- data/lib/depager/lr.rb +181 -262
- data/lib/depager/lr_put_table.rb +116 -0
- data/lib/depager/nvaction.rb +1 -1
- data/lib/depager/parser.rb +23 -2
- data/lib/depager/slex.dr +3 -3
- data/lib/depager/slex.rb +148 -169
- data/lib/depager/srp.rb +1 -1
- data/lib/depager/template/ast.erbs +69 -0
- data/lib/depager/template/extension_lalr_master.erb +3 -3
- data/lib/depager/template/extension_lalr_slave.erb +7 -7
- data/lib/depager/template/simple.erb +4 -2
- data/lib/depager/template/single_lalr_parser.erb +30 -10
- data/lib/depager/utils.rb +10 -9
- data/lib/depager/version.rb +2 -8
- metadata +10 -11
- data/examples/sample_calc/calc.astl.action.tab.rb +0 -593
- data/examples/sample_calc/calc.astl.tab.rb +0 -501
- data/lib/depager/astl.rb +0 -14
- data/lib/depager/template/astdf.erbs +0 -57
- data/lib/depager/template/astl.erbs +0 -57
data/lib/depager/grammar.rb
CHANGED
@@ -1,29 +1,27 @@
|
|
1
|
-
module Depager::
|
2
|
-
class
|
3
|
-
attr_accessor :rulelist, :
|
4
|
-
attr_accessor :precs, :
|
1
|
+
module Depager::ParsingMethod
|
2
|
+
class Grammar
|
3
|
+
attr_accessor :rulelist, :lhs_to_rule, :syms, :nonterms, :terms
|
4
|
+
attr_accessor :precs, :f0e, :first1
|
5
5
|
Eps = 0x3fffffff #epsilon
|
6
6
|
#Eps = []
|
7
|
-
def initialize rulelist,
|
8
|
-
@
|
9
|
-
@
|
10
|
-
@
|
11
|
-
@syms
|
12
|
-
@tla = @syms.size
|
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)
|
13
12
|
|
14
13
|
@rulelist = rulelist
|
15
|
-
@
|
16
|
-
@
|
17
|
-
@f0e = {}
|
14
|
+
@lhs_to_rule = []; @nonterms.size.times{|i| @lhs_to_rule[i] = []}
|
15
|
+
@empty_rules = {}
|
18
16
|
@rulelist.each_with_index do |rule, rx|
|
19
|
-
rule.
|
17
|
+
rule.grammar = self
|
20
18
|
rule.n = rx
|
21
|
-
@
|
22
|
-
if rule.
|
23
|
-
@
|
24
|
-
@f0e[rule.l] = { rule.n => [Eps] }
|
19
|
+
@lhs_to_rule[rule.lhs] << rule
|
20
|
+
if rule.rhs.empty?
|
21
|
+
@empty_rules[rule.lhs] = rule.n
|
25
22
|
end
|
26
23
|
end
|
24
|
+
make_sym_mask
|
27
25
|
make_sym_first
|
28
26
|
initialize_depend
|
29
27
|
end
|
@@ -31,105 +29,266 @@ module Depager::ParsingMethodCommon
|
|
31
29
|
def initialize_depend
|
32
30
|
end
|
33
31
|
|
32
|
+
def make_sym_mask
|
33
|
+
@sym_mask, @mask_sym = {}, []
|
34
|
+
@terms.sort_by{|a, b| a}.each_with_index do |i,x|
|
35
|
+
@sym_mask[i[0]] = 1 << x
|
36
|
+
@mask_sym[x] = i[0]
|
37
|
+
end
|
38
|
+
|
39
|
+
@sym_mask[Eps] = (1 << @sym_mask.size)
|
40
|
+
@mask_sym << Eps
|
41
|
+
end
|
42
|
+
|
43
|
+
def symset syms=nil
|
44
|
+
ss = SymbolSet.new(self)
|
45
|
+
syms ? ss.concat_array(syms) : ss
|
46
|
+
end
|
47
|
+
def sym_mask sym
|
48
|
+
@sym_mask[sym]
|
49
|
+
end
|
50
|
+
def mask_size
|
51
|
+
@mask_sym.size
|
52
|
+
end
|
53
|
+
def mask_sym
|
54
|
+
@mask_sym
|
55
|
+
end
|
56
|
+
|
34
57
|
def make_sym_first
|
35
|
-
@first1 = {
|
58
|
+
@first1 = { }
|
59
|
+
@syms.each_key do |s|
|
60
|
+
@first1[s] = symset()
|
61
|
+
|
62
|
+
@first1[s] << s if terms? 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
|
+
unless @first1[lhs].include? Eps
|
84
|
+
if rule.rhs.all?{|i| @first1[i].include? Eps }
|
85
|
+
@first1[lhs] << Eps
|
86
|
+
changed = true
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end while changed
|
92
|
+
|
93
|
+
old_make_sym_first
|
94
|
+
=begin
|
95
|
+
warn "check.."
|
96
|
+
@first1.each do |k,v|
|
97
|
+
old = @old_first1[k].sort
|
98
|
+
new = v.to_a.sort
|
99
|
+
unless new == old
|
100
|
+
warn "#{symname(k)}:#{old.join(',')}:#{new.join(',')}"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
warn "ok?"
|
104
|
+
=end
|
105
|
+
end
|
106
|
+
|
107
|
+
def first p
|
108
|
+
return symset([Eps]) if p.empty?
|
109
|
+
r, x = symset(), 0
|
110
|
+
p.each do |i|
|
111
|
+
unless i == Eps
|
112
|
+
r.merge! @first1[i]
|
113
|
+
break unless @first1[i].include? Eps
|
114
|
+
end
|
115
|
+
x += 1
|
116
|
+
end
|
117
|
+
r.delete Eps
|
118
|
+
r << Eps if x == p.size
|
119
|
+
|
120
|
+
# check
|
121
|
+
#old = old_first(p).sort
|
122
|
+
#new = r.to_a.sort
|
123
|
+
#warn "???:#{old.join(',')}:#{new.join(',')}" unless new == old
|
124
|
+
|
125
|
+
return r
|
126
|
+
end
|
127
|
+
|
128
|
+
def old_make_sym_first
|
129
|
+
first1 = { }
|
36
130
|
@syms.each_key do |s|
|
37
131
|
if terms? s
|
38
|
-
|
132
|
+
first1[s] = [s]
|
39
133
|
else
|
40
|
-
|
41
|
-
|
134
|
+
first1[s] = []
|
135
|
+
first1[s] << Eps if @empty_rules[s]
|
42
136
|
end
|
43
137
|
end
|
44
138
|
begin
|
45
|
-
|
46
|
-
@
|
47
|
-
@
|
48
|
-
rule.
|
49
|
-
ss =
|
139
|
+
changed = false
|
140
|
+
@nonterms.size.times do |lhs|
|
141
|
+
@lhs_to_rule[lhs].each do |rule|
|
142
|
+
rule.rhs.each do |s|
|
143
|
+
ss = first1[s] - first1[lhs]
|
50
144
|
unless ss.empty?
|
51
|
-
|
52
|
-
|
145
|
+
first1[lhs] |= ss
|
146
|
+
changed = true
|
53
147
|
end
|
54
|
-
break unless
|
148
|
+
break unless first1[s].include? Eps
|
55
149
|
end
|
56
|
-
unless
|
57
|
-
if rule.
|
58
|
-
|
59
|
-
|
150
|
+
unless first1[lhs].include? Eps
|
151
|
+
if rule.rhs.all?{|i| first1[i].include? Eps }
|
152
|
+
first1[lhs] << Eps
|
153
|
+
changed = true
|
60
154
|
end
|
61
155
|
end
|
62
|
-
end
|
156
|
+
end
|
63
157
|
end
|
64
|
-
end while
|
158
|
+
end while changed
|
159
|
+
@old_first1 = first1
|
65
160
|
end
|
66
161
|
|
67
|
-
def
|
162
|
+
def old_first p
|
163
|
+
return [Eps] if p.empty?
|
164
|
+
first1 = @old_first1
|
68
165
|
r = []
|
69
166
|
x = 0
|
70
167
|
p.each do |i|
|
71
|
-
|
72
|
-
|
73
|
-
i.
|
74
|
-
r |= @first1[j]
|
75
|
-
end
|
76
|
-
break unless i.any?{|j| @epr[j] || j==Eps }
|
77
|
-
else
|
78
|
-
r |= @first1[i]
|
79
|
-
break unless @epr[i]
|
168
|
+
unless i == Eps
|
169
|
+
r.concat first1[i]
|
170
|
+
break unless first1[i].include? Eps
|
80
171
|
end
|
81
172
|
x += 1
|
82
173
|
end
|
83
|
-
r
|
84
|
-
r
|
174
|
+
r.uniq! ; r.delete Eps
|
175
|
+
r << Eps if x == p.size
|
85
176
|
return r
|
86
177
|
end
|
87
178
|
|
88
179
|
def terms? i
|
89
|
-
i && i >= @
|
180
|
+
i && i >= @nonterms.size
|
90
181
|
end
|
91
182
|
|
92
183
|
def nonterms? i
|
93
|
-
i && i < @
|
184
|
+
i && i < @nonterms.size
|
94
185
|
end
|
95
186
|
|
96
187
|
def [](n)
|
97
188
|
@rulelist[n]
|
98
189
|
end
|
190
|
+
|
191
|
+
def symname sym
|
192
|
+
name = @syms[sym]
|
193
|
+
return '$start' if sym == 0
|
194
|
+
return '$empty' if sym == Eps
|
195
|
+
return '$end' if name == nil
|
196
|
+
return '$error' if name == false
|
197
|
+
return "#{name}" if name.is_a? Symbol
|
198
|
+
return "'#{name}'"
|
199
|
+
end
|
200
|
+
|
201
|
+
class SymbolSet
|
202
|
+
include Enumerable
|
203
|
+
attr_accessor :set
|
204
|
+
def initialize g, set=0
|
205
|
+
raise g.class.name unless g.is_a? Depager::LALR::Grammar
|
206
|
+
@grammar = g
|
207
|
+
@set = set
|
208
|
+
end
|
209
|
+
def concat_array set
|
210
|
+
set.each do |i|
|
211
|
+
self << i
|
212
|
+
end
|
213
|
+
self
|
214
|
+
end
|
215
|
+
def << sym
|
216
|
+
@set |= @grammar.sym_mask(sym)
|
217
|
+
self
|
218
|
+
end
|
219
|
+
def & symset
|
220
|
+
SymbolSet.new(@grammar, @set & symset.set)
|
221
|
+
end
|
222
|
+
def | symset
|
223
|
+
SymbolSet.new(@grammar, @set | symset.set)
|
224
|
+
end
|
225
|
+
def merge! symset
|
226
|
+
@set |= symset.set
|
227
|
+
self
|
228
|
+
end
|
229
|
+
def - symset
|
230
|
+
SymbolSet.new(@grammar, @set ^ symset.set & @set)
|
231
|
+
end
|
232
|
+
def subset_of? symset
|
233
|
+
# "a is a subset of b" is a-b={}
|
234
|
+
d = (@set ^ symset.set & @set)
|
235
|
+
d == 0 ? true : false
|
236
|
+
end
|
237
|
+
def empty?
|
238
|
+
@set == 0
|
239
|
+
end
|
240
|
+
def include? sym
|
241
|
+
(@set & @grammar.sym_mask(sym) != 0) ? true : false
|
242
|
+
end
|
243
|
+
def delete sym
|
244
|
+
old = @set
|
245
|
+
@set = @set & ~@grammar.sym_mask(sym)
|
246
|
+
old != @set ? sym : nil
|
247
|
+
end
|
248
|
+
def each &block
|
249
|
+
mask_sym = @grammar.mask_sym
|
250
|
+
@grammar.mask_size.times do |x|
|
251
|
+
@set[x] == 1 and yield mask_sym[x]
|
252
|
+
end
|
253
|
+
end
|
254
|
+
def inspect
|
255
|
+
self.map{|i| @grammar.symname(i)}.inspect
|
256
|
+
end
|
257
|
+
end
|
99
258
|
end
|
259
|
+
G = Grammar
|
100
260
|
|
101
261
|
class Rule
|
102
262
|
def self.[] l, r, prec = nil
|
103
|
-
self.new l, r,
|
263
|
+
self.new l, r, prec
|
104
264
|
end
|
105
265
|
|
106
|
-
attr_accessor :
|
107
|
-
def initialize
|
108
|
-
@
|
109
|
-
@
|
110
|
-
@g = g
|
111
|
-
@n = n
|
112
|
-
@act = act
|
113
|
-
@epr = []
|
266
|
+
attr_accessor :lhs, :rhs, :grammar, :n, :prec
|
267
|
+
def initialize lhs, rhs, prec = nil
|
268
|
+
@lhs = lhs
|
269
|
+
@rhs = rhs
|
114
270
|
@prec = prec
|
271
|
+
|
272
|
+
@grammar = nil
|
273
|
+
@n = 0
|
274
|
+
|
115
275
|
initialize_depend
|
116
276
|
end
|
117
277
|
def initialize_depend
|
118
278
|
end
|
119
279
|
|
120
|
-
alias lhs l
|
121
|
-
alias rhs r
|
122
|
-
|
123
280
|
def to_s
|
124
|
-
|
125
|
-
|
281
|
+
lhs = grammar.symname @lhs
|
282
|
+
rhs = @rhs.map{|i| grammar.symname i}.join(' ')
|
283
|
+
|
284
|
+
"(#{'%03s' % @n}) #{lhs} : #{rhs}"
|
126
285
|
end
|
127
286
|
|
128
287
|
def hash
|
129
|
-
|
288
|
+
1117 * @rhs.hash + @lhs.hash % 3037
|
130
289
|
end
|
131
290
|
def eql? i
|
132
|
-
@
|
291
|
+
@lhs == i.lhs && @rhs == i.rhs
|
133
292
|
end
|
134
293
|
alias == eql?
|
135
294
|
end
|
data/lib/depager/lex.dr
CHANGED
data/lib/depager/lex.rb
CHANGED
@@ -89,12 +89,12 @@ class LexerExtension_prerulelist < Depager::LALR::Basis #:nodoc:all
|
|
89
89
|
[ ACC, nil, nil, nil, nil, nil, ],
|
90
90
|
[ nil, nil, nil, nil, 5, nil, ],
|
91
91
|
[ nil, nil, nil, nil, nil, nil, ],
|
92
|
-
[ nil, nil, nil,
|
92
|
+
[ nil, nil, nil, 8, nil, 9, ],
|
93
93
|
[ nil, nil, nil, nil, nil, nil, ],
|
94
94
|
[ nil, nil, nil, nil, nil, nil, ],
|
95
95
|
[ nil, nil, 10, nil, nil, nil, ],
|
96
|
-
[ nil, nil, nil, nil, 11, nil, ],
|
97
96
|
[ nil, nil, nil, nil, nil, nil, ],
|
97
|
+
[ nil, nil, nil, nil, 11, nil, ],
|
98
98
|
[ nil, nil, nil, nil, nil, nil, ],
|
99
99
|
[ nil, nil, nil, nil, nil, nil, ],
|
100
100
|
]
|
@@ -108,8 +108,8 @@ class LexerExtension_prerulelist < Depager::LALR::Basis #:nodoc:all
|
|
108
108
|
-7,
|
109
109
|
-3,
|
110
110
|
nil,
|
111
|
-
nil,
|
112
111
|
-6,
|
112
|
+
nil,
|
113
113
|
-4,
|
114
114
|
-8,
|
115
115
|
]
|
@@ -122,8 +122,8 @@ class LexerExtension_prerulelist < Depager::LALR::Basis #:nodoc:all
|
|
122
122
|
-7,
|
123
123
|
-3,
|
124
124
|
nil,
|
125
|
-
nil,
|
126
125
|
-6,
|
126
|
+
nil,
|
127
127
|
-4,
|
128
128
|
-8,
|
129
129
|
]
|
@@ -230,8 +230,7 @@ end
|
|
230
230
|
|
231
231
|
class D4LexerExtension_prerulelist::NVAction < Depager::LALR::Action #:nodoc:all
|
232
232
|
include Depager::DecoratorUtils
|
233
|
-
|
234
|
-
|
233
|
+
[" include ActionParser\n"]
|
235
234
|
on_reduce = [
|
236
235
|
nil,
|
237
236
|
:_act_0,
|
@@ -252,9 +251,9 @@ class D4LexerExtension_prerulelist::NVAction < Depager::LALR::Action #:nodoc:all
|
|
252
251
|
end
|
253
252
|
|
254
253
|
|
255
|
-
module_eval <<-'.,.,
|
256
|
-
|
257
|
-
_lexactlist = *val
|
254
|
+
module_eval <<-'.,.,12099829229538.,.,', 'lex.dr', 48
|
255
|
+
def _act_0 val
|
256
|
+
_lexactlist, = *val
|
258
257
|
|
259
258
|
g_parser.optinner << %{
|
260
259
|
def lex
|
@@ -271,31 +270,28 @@ module_eval <<-'.,.,118754107729449.,.,', 'lex.dr', 48
|
|
271
270
|
end
|
272
271
|
}; #code
|
273
272
|
|
274
|
-
|
275
|
-
|
276
|
-
.,.,118754107729449.,.,
|
273
|
+
end
|
274
|
+
.,.,12099829229538.,.,
|
277
275
|
|
278
|
-
module_eval <<-'.,.,
|
279
|
-
|
280
|
-
_lexact = *val
|
281
|
-
|
282
|
-
|
283
|
-
end
|
276
|
+
module_eval <<-'.,.,12099829229930.,.,', 'lex.dr', 66
|
277
|
+
def _act_1 val
|
278
|
+
_lexact, = *val
|
279
|
+
_lexact
|
284
280
|
|
285
|
-
|
281
|
+
end
|
282
|
+
.,.,12099829229930.,.,
|
286
283
|
|
287
|
-
module_eval <<-'.,.,
|
288
|
-
|
289
|
-
_lexactlist, _lexact = *val
|
284
|
+
module_eval <<-'.,.,120998292251446.,.,', 'lex.dr', 67
|
285
|
+
def _act_2 val
|
286
|
+
_lexactlist, _lexact, = *val
|
290
287
|
_lexactlist << _lexact
|
291
288
|
|
292
|
-
|
293
|
-
|
294
|
-
.,.,118754107730115.,.,
|
289
|
+
end
|
290
|
+
.,.,120998292251446.,.,
|
295
291
|
|
296
|
-
module_eval <<-'.,.,
|
297
|
-
|
298
|
-
_lexlist, _opt_noskip, _ACTION = *val
|
292
|
+
module_eval <<-'.,.,12099829229876.,.,', 'lex.dr', 71
|
293
|
+
def _act_3 val
|
294
|
+
_lexlist, _opt_noskip, _ACTION, = *val
|
299
295
|
|
300
296
|
%{
|
301
297
|
when #{_lexlist.join(', ')}
|
@@ -303,44 +299,39 @@ module_eval <<-'.,.,118754107747000.,.,', 'lex.dr', 71
|
|
303
299
|
#{ _ACTION }
|
304
300
|
}; #code
|
305
301
|
|
306
|
-
|
307
|
-
|
308
|
-
.,.,118754107747000.,.,
|
302
|
+
end
|
303
|
+
.,.,12099829229876.,.,
|
309
304
|
|
310
|
-
module_eval <<-'.,.,
|
311
|
-
|
305
|
+
module_eval <<-'.,.,120998292261886.,.,', 'lex.dr', 80
|
306
|
+
def _act_4 val
|
312
307
|
false
|
313
308
|
|
314
|
-
|
315
|
-
|
316
|
-
.,.,118754107727512.,.,
|
309
|
+
end
|
310
|
+
.,.,120998292261886.,.,
|
317
311
|
|
318
|
-
module_eval <<-'.,.,
|
319
|
-
|
320
|
-
_ = *val
|
312
|
+
module_eval <<-'.,.,120998292263869.,.,', 'lex.dr', 81
|
313
|
+
def _act_5 val
|
314
|
+
_, = *val
|
321
315
|
true
|
322
316
|
|
323
|
-
|
324
|
-
|
325
|
-
.,.,118754107710888.,.,
|
317
|
+
end
|
318
|
+
.,.,120998292263869.,.,
|
326
319
|
|
327
|
-
module_eval <<-'.,.,
|
328
|
-
|
329
|
-
_LEX = *val
|
320
|
+
module_eval <<-'.,.,120998292217015.,.,', 'lex.dr', 84
|
321
|
+
def _act_6 val
|
322
|
+
_LEX, = *val
|
330
323
|
[ _LEX ]
|
331
324
|
|
332
|
-
|
333
|
-
|
334
|
-
.,.,118754107743010.,.,
|
325
|
+
end
|
326
|
+
.,.,120998292217015.,.,
|
335
327
|
|
336
|
-
module_eval <<-'.,.,
|
337
|
-
|
338
|
-
_lexlist, _, _LEX = *val
|
328
|
+
module_eval <<-'.,.,120998292239616.,.,', 'lex.dr', 85
|
329
|
+
def _act_7 val
|
330
|
+
_lexlist, _, _LEX, = *val
|
339
331
|
_lexlist << _LEX
|
340
332
|
|
341
|
-
|
342
|
-
|
343
|
-
.,.,118754107718606.,.,
|
333
|
+
end
|
334
|
+
.,.,120998292239616.,.,
|
344
335
|
|
345
336
|
end
|
346
337
|
|