depager 0.1.9

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 (53) hide show
  1. data/ChangeLog +4 -0
  2. data/Manifest.txt +52 -0
  3. data/README.en +64 -0
  4. data/README.ja +128 -0
  5. data/bin/depager +47 -0
  6. data/data/depager/misc/depager-mode.el +209 -0
  7. data/data/depager/sample/extension/paction.dr +15 -0
  8. data/data/depager/sample/extension/pactiontest.dr +14 -0
  9. data/data/depager/sample/pl0d/pl0ds.dr +334 -0
  10. data/data/depager/sample/pl0d/pl0test.pl0 +34 -0
  11. data/data/depager/sample/sample_calc/calc.action.dr +33 -0
  12. data/data/depager/sample/sample_calc/calc.astdf.dr +54 -0
  13. data/data/depager/sample/sample_calc/calc.astl.action.dr +66 -0
  14. data/data/depager/sample/sample_calc/calc.astl.dr +55 -0
  15. data/data/depager/sample/sample_calc/calc.atree.dr +43 -0
  16. data/data/depager/sample/sample_calc/calc.cst.dr +45 -0
  17. data/data/depager/sample/sample_calc/calc.dr +43 -0
  18. data/data/depager/sample/sample_calc/calc.lex.dr +29 -0
  19. data/data/depager/sample/sample_calc/calc.nvaction.dr +33 -0
  20. data/data/depager/sample/sample_calc/calc_prec.nvaction.dr +31 -0
  21. data/data/depager/sample/slex_test/slextest1.dr +37 -0
  22. data/data/depager/sample/slex_test/slextest2.dr +33 -0
  23. data/lib/depager.rb +608 -0
  24. data/lib/depager/Rakefile +30 -0
  25. data/lib/depager/action.rb +47 -0
  26. data/lib/depager/ast_base.dr +232 -0
  27. data/lib/depager/ast_base.rb +1249 -0
  28. data/lib/depager/astdf.rb +10 -0
  29. data/lib/depager/astl.rb +14 -0
  30. data/lib/depager/atree.dr +55 -0
  31. data/lib/depager/atree.rb +336 -0
  32. data/lib/depager/cst.dr +182 -0
  33. data/lib/depager/cst.rb +625 -0
  34. data/lib/depager/lex.dr +76 -0
  35. data/lib/depager/lex.rb +306 -0
  36. data/lib/depager/lr.rb +604 -0
  37. data/lib/depager/nvaction.rb +21 -0
  38. data/lib/depager/parse_action.rb +24 -0
  39. data/lib/depager/parser.rb +248 -0
  40. data/lib/depager/psrtmpl.rb +33 -0
  41. data/lib/depager/slex.dr +161 -0
  42. data/lib/depager/slex.rb +646 -0
  43. data/lib/depager/srp.rb +50 -0
  44. data/lib/depager/template/astdf.erbs +57 -0
  45. data/lib/depager/template/astl.erbs +57 -0
  46. data/lib/depager/template/extension_lalr_master.erb +51 -0
  47. data/lib/depager/template/extension_lalr_slave.erb +107 -0
  48. data/lib/depager/template/simple.erb +21 -0
  49. data/lib/depager/template/single_lalr_parser.erb +97 -0
  50. data/lib/depager/utils.rb +355 -0
  51. data/lib/depager/version.rb +9 -0
  52. data/setup.rb +1585 -0
  53. metadata +103 -0
@@ -0,0 +1,625 @@
1
+
2
+ ###
3
+ ### CSTBuilderExtension - Depager Extension (master)
4
+ ###
5
+ require 'pp.rb'
6
+ require 'depager/parser.rb'
7
+ require 'depager/parse_action'
8
+
9
+
10
+ module D4CSTBuilderExtension #:nodoc:all
11
+ end
12
+
13
+ class CSTBuilderExtension #:nodoc:all
14
+ include Depager::ExtensionUtils
15
+
16
+ include ActionParser
17
+ attr_accessor :h2p
18
+
19
+ def initialize
20
+ @master = self
21
+ @hook = []
22
+ @h2p = {}
23
+ init_parser
24
+ end
25
+
26
+ def __regext__ p
27
+ super p, :default, nil
28
+
29
+ @hook[0] = CSTBuilderExtension_prerulelist.new(p, @nparam, self)
30
+ @h2p['prerulelist'] = @hook[0]
31
+ p.prerulelist.push [@hook[0], :do_parse]
32
+
33
+ @hook[1] = CSTBuilderExtension_postlhs.new(p, @nparam, self)
34
+ @h2p['postlhs'] = @hook[1]
35
+ p.postlhs.push [@hook[1], :do_parse]
36
+
37
+ regext p
38
+ end
39
+
40
+ ### Inner Code
41
+ attr_accessor :optouter, :nodes_code
42
+ def init_parser
43
+ super
44
+ @n = 0
45
+ @visitor_code = []
46
+ @nodes_code = []
47
+ @optouter = []
48
+ @on_reduce = []
49
+ end
50
+ def modify_action_code code
51
+ code.gsub(/~([a-z_])/, 'node.\1')
52
+ end
53
+ def postRhs
54
+ code = ''
55
+ lineno = g_parser.lineno
56
+ if token[0] == '{'
57
+ @line0, @line = g_parser.line0, g_parser.oldline
58
+ code = parse_action
59
+
60
+ fixline @line
61
+ gettoken
62
+ end
63
+
64
+ node_name = "#{lhs_name}_#{nrhs}"
65
+ accept = ""
66
+ nodes = g_parser.rhs.map do |i|
67
+ x = g_parser.int_to_sym(i)
68
+ if x.class == String
69
+ "tx#{x[0].to_s(16)}"
70
+ else
71
+ x = x.to_s
72
+ accept << "#{x}.accept(v); " if x =~ /\A[a-z_]+\Z/
73
+ x.downcase
74
+ end
75
+ end
76
+ attrc = nodes.map{|i| ":#{i}" }.join(', ')
77
+ inic = nodes.map{|i| "@#{i} = #{i}"}.join('; ')
78
+ @nodes_code << %{
79
+ class Node_#{node_name} < Node_#{lhs_name}
80
+ attr_accessor #{attrc}
81
+ def initialize #{nodes.join(', ')}
82
+ super()
83
+ #{inic}
84
+ end
85
+ def accept v
86
+ #{accept}
87
+ v.visit_Node_#{node_name}(self)
88
+ end
89
+ end
90
+ }; #code
91
+
92
+ @visitor_code <<
93
+ gen_defm_code("visit_Node_#{node_name} node",
94
+ modify_action_code(code), lineno)
95
+
96
+ args = nodes.inject([]){|r, i| r << "val[#{r.size}]"}
97
+ code = "Node_#{node_name}.new(#{args.join(', ')})"
98
+ @optouter <<
99
+ gen_defm_code("_cst_#{nrules} val", code, lineno)
100
+
101
+ @on_reduce[nrules] = ":_cst_#{nrules}"
102
+ end
103
+ def postRuleList
104
+ code = unindent %{
105
+ class Node
106
+ def accept
107
+ end
108
+ end
109
+ }; #code
110
+ g_parser.optouter << code
111
+
112
+ code = unindent %{
113
+ class Visitor
114
+ $$!!@ CST @!!$$
115
+ end
116
+ }; #code
117
+ g_parser.optouter <<
118
+ code.sub!('$$!!@ CST @!!$$', @visitor_code.to_s) <<
119
+ unindent(@nodes_code) <<
120
+ gen_action_decorator_code(target_name, paramkey,
121
+ @on_reduce, @optouter)
122
+ end
123
+
124
+ end
125
+
126
+ ### Outer Code
127
+
128
+ ###
129
+ ### CSTBuilderExtension_prerulelist - Part of Depager Extension (slave)
130
+ ###
131
+ module D4CSTBuilderExtension_prerulelist #:nodoc:all
132
+ end
133
+
134
+ class CSTBuilderExtension_prerulelist < Basis #:nodoc:all
135
+ include Depager::ExtensionUtils
136
+
137
+ include ActionParser
138
+
139
+ ### Reduce Table
140
+ reduce_table = [
141
+ [ -1, 1 ],
142
+ [ 0, 2 ],
143
+ [ 1, 0 ],
144
+ [ 1, 2 ],
145
+ [ 2, 0 ],
146
+ [ 2, 2 ],
147
+ ]
148
+ ### Extension Params
149
+ nparams = {
150
+ 'NVAction' => 2,
151
+ }
152
+ ### Term to Int
153
+ t2i = {
154
+ nil => 0,
155
+ false => 1,
156
+ :NODE => 2,
157
+ :ACTION => 3,
158
+ :VISITOR => 4,
159
+ }
160
+ ### Int to Term
161
+ i2t = [
162
+ nil,
163
+ false,
164
+ :NODE,
165
+ :ACTION,
166
+ :VISITOR,
167
+ ]
168
+ ### Action Table
169
+ action_table = [
170
+ [ nil, nil, 1, nil, nil, ],
171
+ [ nil, nil, nil, 4, nil, ],
172
+ [ ACC, nil, nil, nil, nil, ],
173
+ [ nil, nil, nil, nil, 5, ],
174
+ [ nil, nil, nil, nil, nil, ],
175
+ [ nil, nil, nil, 7, nil, ],
176
+ [ nil, nil, nil, nil, nil, ],
177
+ [ nil, nil, nil, nil, nil, ],
178
+ ]
179
+ ### Default Reduce Table
180
+ defred_table = [
181
+ -2,
182
+ nil,
183
+ nil,
184
+ -4,
185
+ -3,
186
+ nil,
187
+ -1,
188
+ -5,
189
+ ]
190
+ defred_after_shift_table = [
191
+ nil,
192
+ nil,
193
+ nil,
194
+ nil,
195
+ -3,
196
+ nil,
197
+ -1,
198
+ -5,
199
+ ]
200
+ ### Nonterm to Int
201
+ nt2i = {
202
+ :start => 0,
203
+ :opt_node => 1,
204
+ :opt_visitor => 2,
205
+ }
206
+ ### Int to Nonterm
207
+ i2nt = [
208
+ :start,
209
+ :opt_node,
210
+ :opt_visitor,
211
+ ]
212
+ ### Goto Table
213
+ goto_table = [
214
+ [ 2, 3, nil, ],
215
+ [ nil, nil, nil, ],
216
+ [ nil, nil, nil, ],
217
+ [ nil, nil, 6, ],
218
+ [ nil, nil, nil, ],
219
+ [ nil, nil, nil, ],
220
+ [ nil, nil, nil, ],
221
+ [ nil, nil, nil, ],
222
+ ]
223
+
224
+ Tables = [ reduce_table, nparams, action_table,
225
+ defred_table, defred_after_shift_table, goto_table,
226
+ t2i, i2t, nt2i, i2nt ]
227
+
228
+ attr_accessor :p, :m
229
+ def initialize p, nparam, master = nil
230
+ super()
231
+ @g_parser = @p = p
232
+ @master = @m = master
233
+ @nparam = nparam
234
+ @dect = D4CSTBuilderExtension_prerulelist::NVAction.new(self)
235
+ init_parser
236
+ end
237
+
238
+
239
+ def do_parse?
240
+ if @line =~ /^\s*%CST\{\s*\Z/
241
+ @line = $'
242
+ true
243
+ else
244
+ false
245
+ end
246
+ end
247
+
248
+
249
+ def banner
250
+ "%CST{ ... } / #{@master.class.name}"
251
+ end
252
+
253
+ ### Inner Code
254
+
255
+ def lex
256
+ begin
257
+ until @line.empty? do
258
+ case @line
259
+ when /\A\s+/, /\A#.*/
260
+
261
+ when /\A%\}\s*\Z/
262
+ @line = $'; yield nil,nil
263
+ when /\ANode/
264
+ yield _Token(:NODE, $&)
265
+ when /\A\{/
266
+ ln = lineno; yield _Token(:ACTION, parse_action, ln); //=~''
267
+
268
+ else
269
+ raise RuntimeError, "must not happen #{@line}"
270
+ end
271
+ @oldline = @line
272
+ @line = $'
273
+ end
274
+ end while @line = getline
275
+ yield nil, nil
276
+ end
277
+
278
+ end
279
+
280
+ ### Outer Code
281
+
282
+ class D4CSTBuilderExtension_prerulelist::NVAction < Depager::Action #:nodoc:all
283
+ include Depager::DecoratorUtils
284
+ include ActionParser
285
+ include ActionParser
286
+
287
+ on_reduce = [
288
+ nil,
289
+ :_act_0,
290
+ :_act_1,
291
+ :_act_2,
292
+ :_act_3,
293
+ :_act_4,
294
+
295
+ ]
296
+ Tables = [on_reduce]
297
+ def initialize inside
298
+ super inside, 'NVAction'
299
+ @on_reduce, = self.class::Tables
300
+ init_parser
301
+ end
302
+
303
+
304
+ module_eval <<-'.,.,118028145930197.,.,', 'cst.dr', 104
305
+ def _act_0 val
306
+ _opt_node, _opt_visitor = *val
307
+
308
+ code = %{
309
+ class Node
310
+ $$!!@ NODE @!!$$
311
+ end
312
+ class Visitor
313
+ $$!!@ VISITOR @!!$$
314
+ end
315
+ }; #code
316
+ master.nodes_code <<
317
+ code.sub!('$$!!@ NODE @!!$$', _opt_node) \
318
+ .sub!('$$!!@ VISITOR @!!$$', _opt_visitor)
319
+
320
+ end
321
+
322
+ .,.,118028145930197.,.,
323
+
324
+ module_eval <<-'.,.,11802814596438.,.,', 'cst.dr', 118
325
+ def _act_1 val
326
+ ''
327
+
328
+ end
329
+
330
+ .,.,11802814596438.,.,
331
+
332
+ module_eval <<-'.,.,118028145919370.,.,', 'cst.dr', 119
333
+ def _act_2 val
334
+ _NODE, _ACTION = *val
335
+ _ACTION.value
336
+
337
+ end
338
+
339
+ .,.,118028145919370.,.,
340
+
341
+ module_eval <<-'.,.,118028145927531.,.,', 'cst.dr', 121
342
+ def _act_3 val
343
+ warn "VIS";''
344
+
345
+ end
346
+
347
+ .,.,118028145927531.,.,
348
+
349
+ module_eval <<-'.,.,118028145925004.,.,', 'cst.dr', 122
350
+ def _act_4 val
351
+ _VISITOR, _ACTION = *val
352
+ _ACTION.value
353
+
354
+ end
355
+
356
+ .,.,118028145925004.,.,
357
+
358
+ end
359
+
360
+
361
+ ###
362
+ ### CSTBuilderExtension_postlhs - Part of Depager Extension (slave)
363
+ ###
364
+ module D4CSTBuilderExtension_postlhs #:nodoc:all
365
+ end
366
+
367
+ class CSTBuilderExtension_postlhs < Basis #:nodoc:all
368
+ include Depager::ExtensionUtils
369
+
370
+ include ActionParser
371
+
372
+ ### Reduce Table
373
+ reduce_table = [
374
+ [ -1, 1 ],
375
+ [ 0, 3 ],
376
+ [ 1, 1 ],
377
+ [ 1, 3 ],
378
+ [ 2, 1 ],
379
+ [ 2, 3 ],
380
+ ]
381
+ ### Extension Params
382
+ nparams = {
383
+ 'NVAction' => 2,
384
+ }
385
+ ### Term to Int
386
+ t2i = {
387
+ nil => 0,
388
+ false => 1,
389
+ "[" => 2,
390
+ "]" => 3,
391
+ "," => 4,
392
+ :ID => 5,
393
+ "=" => 6,
394
+ :LIT => 7,
395
+ }
396
+ ### Int to Term
397
+ i2t = [
398
+ nil,
399
+ false,
400
+ "[",
401
+ "]",
402
+ ",",
403
+ :ID,
404
+ "=",
405
+ :LIT,
406
+ ]
407
+ ### Action Table
408
+ action_table = [
409
+ [ nil, nil, 1, nil, nil, nil, nil, nil, ],
410
+ [ nil, nil, nil, nil, nil, 5, nil, nil, ],
411
+ [ ACC, nil, nil, nil, nil, nil, nil, nil, ],
412
+ [ nil, nil, nil, 6, 7, nil, nil, nil, ],
413
+ [ nil, nil, nil, nil, nil, nil, nil, nil, ],
414
+ [ nil, nil, nil, nil, nil, nil, 8, nil, ],
415
+ [ nil, nil, nil, nil, nil, nil, nil, nil, ],
416
+ [ nil, nil, nil, nil, nil, 5, nil, nil, ],
417
+ [ nil, nil, nil, nil, nil, nil, nil, 10, ],
418
+ [ nil, nil, nil, nil, nil, nil, nil, nil, ],
419
+ [ nil, nil, nil, nil, nil, nil, nil, nil, ],
420
+ ]
421
+ ### Default Reduce Table
422
+ defred_table = [
423
+ nil,
424
+ nil,
425
+ nil,
426
+ nil,
427
+ -2,
428
+ -4,
429
+ -1,
430
+ nil,
431
+ nil,
432
+ -3,
433
+ -5,
434
+ ]
435
+ defred_after_shift_table = [
436
+ nil,
437
+ nil,
438
+ nil,
439
+ nil,
440
+ -2,
441
+ nil,
442
+ -1,
443
+ nil,
444
+ nil,
445
+ -3,
446
+ -5,
447
+ ]
448
+ ### Nonterm to Int
449
+ nt2i = {
450
+ :start => 0,
451
+ :pair => 1,
452
+ :expr => 2,
453
+ }
454
+ ### Int to Nonterm
455
+ i2nt = [
456
+ :start,
457
+ :pair,
458
+ :expr,
459
+ ]
460
+ ### Goto Table
461
+ goto_table = [
462
+ [ 2, nil, nil, ],
463
+ [ nil, 3, 4, ],
464
+ [ nil, nil, nil, ],
465
+ [ nil, nil, nil, ],
466
+ [ nil, nil, nil, ],
467
+ [ nil, nil, nil, ],
468
+ [ nil, nil, nil, ],
469
+ [ nil, nil, 9, ],
470
+ [ nil, nil, nil, ],
471
+ [ nil, nil, nil, ],
472
+ [ nil, nil, nil, ],
473
+ ]
474
+
475
+ Tables = [ reduce_table, nparams, action_table,
476
+ defred_table, defred_after_shift_table, goto_table,
477
+ t2i, i2t, nt2i, i2nt ]
478
+
479
+ attr_accessor :p, :m
480
+ def initialize p, nparam, master = nil
481
+ super()
482
+ @g_parser = @p = p
483
+ @master = @m = master
484
+ @nparam = nparam
485
+ @dect = D4CSTBuilderExtension_postlhs::NVAction.new(self)
486
+ init_parser
487
+ end
488
+
489
+
490
+ def do_parse?
491
+ if @line =~ /^\s*\[/
492
+ @line = $'
493
+ true
494
+ else
495
+ false
496
+ end
497
+ end
498
+
499
+
500
+ def banner
501
+ "[ ... ] / #{@master.class.name}"
502
+ end
503
+
504
+ ### Inner Code
505
+
506
+ def lex
507
+ begin
508
+ until @line.empty? do
509
+ case @line
510
+ when /\A\A\s+/
511
+
512
+ when /\A""/, /\A''/, /\A[0-9]+/, /\A\{\s*\}/, /\A\[\s*\]/, /\Anil/
513
+ yield _Token(:LIT, $&)
514
+ when /\A\A[a-z][a-z_]*/
515
+ yield _Token(:ID, $&)
516
+ when /\A\A(.)/
517
+ yield _Token($&, $&)
518
+
519
+ else
520
+ raise RuntimeError, "must not happen #{@line}"
521
+ end
522
+ @oldline = @line
523
+ @line = $'
524
+ end
525
+ end while @line = getline
526
+ yield nil, nil
527
+ end
528
+ def do_default
529
+ master.nodes_code << %{
530
+ class Node_#{master.lhs_name} < Node
531
+ def initialize
532
+ super()
533
+ end
534
+ end
535
+ }; #code
536
+ end
537
+
538
+ end
539
+
540
+ ### Outer Code
541
+
542
+ class D4CSTBuilderExtension_postlhs::NVAction < Depager::Action #:nodoc:all
543
+ include Depager::DecoratorUtils
544
+ include ActionParser
545
+
546
+ on_reduce = [
547
+ nil,
548
+ :_act_0,
549
+ :_act_1,
550
+ :_act_2,
551
+ :_act_3,
552
+ :_act_4,
553
+
554
+ ]
555
+ Tables = [on_reduce]
556
+ def initialize inside
557
+ super inside, 'NVAction'
558
+ @on_reduce, = self.class::Tables
559
+ init_parser
560
+ end
561
+
562
+
563
+ module_eval <<-'.,.,118028145927473.,.,', 'cst.dr', 153
564
+ def _act_0 val
565
+ _, _pair, _ = *val
566
+
567
+ args = []; code = ''
568
+ _pair.each do |id, lit|
569
+ args << id
570
+ code << "#{id} = #{lit}; " if lit
571
+ end
572
+ attrc = args.map{|i| ":#{i}"}.join(', ')
573
+ master.nodes_code << %{
574
+ class Node_#{master.lhs_name} < Node
575
+ attr_accessor #{attrc}
576
+ def initialize
577
+ super()
578
+ #{code}
579
+ end
580
+ end
581
+ }; #code
582
+
583
+ end
584
+
585
+ .,.,118028145927473.,.,
586
+
587
+ module_eval <<-'.,.,118028145920598.,.,', 'cst.dr', 172
588
+ def _act_1 val
589
+ _expr = *val
590
+ [ _expr ]
591
+
592
+ end
593
+
594
+ .,.,118028145920598.,.,
595
+
596
+ module_eval <<-'.,.,11802814597299.,.,', 'cst.dr', 173
597
+ def _act_2 val
598
+ _pair, _, _expr = *val
599
+ _pair << _expr
600
+
601
+ end
602
+
603
+ .,.,11802814597299.,.,
604
+
605
+ module_eval <<-'.,.,118028145933452.,.,', 'cst.dr', 176
606
+ def _act_3 val
607
+ _ID = *val
608
+ [ _ID.value, nil]
609
+
610
+ end
611
+
612
+ .,.,118028145933452.,.,
613
+
614
+ module_eval <<-'.,.,118028145946002.,.,', 'cst.dr', 177
615
+ def _act_4 val
616
+ _ID, _, _LIT = *val
617
+ [ _ID.value, _LIT.value ]
618
+
619
+ end
620
+
621
+ .,.,118028145946002.,.,
622
+
623
+ end
624
+
625
+