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
@@ -0,0 +1,1329 @@
1
+ ###
2
+ ### Depager::ASTBuilderExtension - Depager Extension (master)
3
+ ###
4
+ require 'depager/parser.rb'
5
+
6
+
7
+ module Depager ; end
8
+
9
+ class Depager::ASTBuilderExtension < Depager::Extension
10
+
11
+ def initialize
12
+ super
13
+ @master = self
14
+ @slaves = []
15
+ end
16
+
17
+ def extension_registered g_parser
18
+ super g_parser
19
+
20
+ @slaves << Depager::ASTBuilderExtension::PreRuleList0::Parser.new(g_parser, self)
21
+ g_parser.hooks[:pre_rule_list].push [@slaves.last, :do_parse]
22
+ @slaves << Depager::ASTBuilderExtension::PostRhs1::Parser.new(g_parser, self)
23
+ g_parser.hooks[:post_rhs].push [@slaves.last, :do_parse]
24
+ end
25
+
26
+ module_eval <<'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 7
27
+ attr_accessor :action_code, :on_reduce, :visitors
28
+ def init_extension
29
+ @visitors = Hash.new{|hash, key| hash[key] = []}
30
+ @action_code = ''
31
+ @on_reduce = []
32
+ @output_file_name = nil
33
+ end
34
+ def term_extension
35
+ g_parser.outer_code <<
36
+ generate_action_decorator_code(@on_reduce, @action_code)
37
+ end
38
+
39
+ def modify_action_code code, nodes=[]
40
+ code = code.gsub(/\$\.([a-z_])/, 'node.\1')
41
+ code << <<-CODE
42
+ rescue
43
+ warn "raise at src:\#{node.lineno}/\#{node.class.name}"
44
+ raise
45
+ CODE
46
+ end
47
+
48
+ def gen_accept_code sym
49
+ return ''
50
+ end
51
+
52
+ def node_name name
53
+ name = name == '@List' ? "NodeList" : "Node_#{name}"
54
+ "#{target_namespace}::#{name}"
55
+ end
56
+
57
+ attr_reader :output_file_name
58
+ def output_file_name= name
59
+ name = name.match(/'(.+)'/) ? $1 : name
60
+ @output_file_name = name
61
+ end
62
+
63
+ DEPAGER_EXPANDED_CODE
64
+
65
+ end
66
+
67
+ ###
68
+ ### Depager::ASTBuilderExtension::PreRuleList0 - Part of Depager Extension (slave)
69
+ ###
70
+
71
+ module Depager::ASTBuilderExtension::PreRuleList0 #:nodoc:all
72
+ class Parser < Depager::LALR::Basis #:nodoc:all
73
+ include Depager::Utils::ExtensionSlaveMethods
74
+
75
+ ### Reduce Table
76
+ REDUCE_TABLE = [
77
+ [ -1, 1 ],
78
+ [ 0, 3 ],
79
+ [ 1, 0 ],
80
+ [ 1, 3 ],
81
+ [ 2, 0 ],
82
+ [ 2, 2 ],
83
+ [ 3, 1 ],
84
+ [ 3, 2 ],
85
+ [ 6, 3 ],
86
+ [ 7, 3 ],
87
+ [ 7, 4 ],
88
+ [ 4, 0 ],
89
+ [ 4, 2 ],
90
+ [ 4, 3 ],
91
+ [ 8, 1 ],
92
+ [ 8, 3 ],
93
+ [ 10, 1 ],
94
+ [ 10, 2 ],
95
+ [ 9, 1 ],
96
+ [ 9, 3 ],
97
+ [ 5, 0 ],
98
+ [ 5, 1 ],
99
+ [ 5, 1 ],
100
+ [ 11, 1 ],
101
+ [ 11, 2 ],
102
+ [ 12, 4 ],
103
+ ]
104
+ def reduce_table; REDUCE_TABLE; end
105
+
106
+ ### Term to Int
107
+ TERM_TO_INT = {
108
+ nil => 0,
109
+ false => 1,
110
+ :NODE => 2,
111
+ :ACTION => 3,
112
+ :VISITOR => 4,
113
+ :ID => 5,
114
+ "(" => 6,
115
+ ")" => 7,
116
+ "[" => 8,
117
+ "]" => 9,
118
+ "," => 10,
119
+ "-" => 11,
120
+ "<" => 12,
121
+ ">" => 13,
122
+ }
123
+ def term_to_int; TERM_TO_INT; end
124
+
125
+ ### Int to Term
126
+ INT_TO_TERM = [
127
+ nil,
128
+ false,
129
+ :NODE,
130
+ :ACTION,
131
+ :VISITOR,
132
+ :ID,
133
+ "(",
134
+ ")",
135
+ "[",
136
+ "]",
137
+ ",",
138
+ "-",
139
+ "<",
140
+ ">",
141
+ ]
142
+ def int_to_term; INT_TO_TERM; end
143
+
144
+ ### Action Table
145
+ ACTION_TABLE = [
146
+ [ nil, nil, 3, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
147
+ [ ACC, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
148
+ [ nil, nil, nil, nil, 5, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
149
+ [ nil, nil, nil, nil, nil, nil, nil, nil, 7, nil, nil, nil, nil, nil, ],
150
+ [ nil, nil, nil, nil, nil, 11, nil, nil, nil, nil, nil, nil, nil, nil, ],
151
+ [ nil, nil, nil, 13, nil, nil, nil, nil, nil, nil, nil, nil, 16, nil, ],
152
+ [ nil, nil, nil, 17, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
153
+ [ nil, nil, nil, nil, nil, 20, nil, nil, nil, 18, nil, nil, nil, nil, ],
154
+ [ nil, nil, nil, nil, nil, 11, nil, nil, nil, nil, nil, nil, nil, nil, ],
155
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
156
+ [ nil, nil, nil, nil, nil, nil, nil, nil, 7, nil, nil, nil, nil, nil, ],
157
+ [ nil, nil, nil, nil, nil, nil, 23, nil, nil, nil, nil, nil, nil, nil, ],
158
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
159
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
160
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 16, nil, ],
161
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
162
+ [ nil, nil, nil, nil, nil, 25, nil, nil, nil, nil, nil, nil, nil, nil, ],
163
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
164
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
165
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, 26, 27, nil, nil, nil, ],
166
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
167
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
168
+ [ nil, nil, nil, 13, nil, nil, nil, nil, nil, nil, nil, nil, 16, nil, ],
169
+ [ nil, nil, nil, nil, nil, 32, nil, 29, nil, nil, nil, 33, nil, nil, ],
170
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
171
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 34, ],
172
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
173
+ [ nil, nil, nil, nil, nil, 35, nil, nil, nil, nil, nil, nil, nil, nil, ],
174
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
175
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
176
+ [ nil, nil, nil, nil, nil, nil, nil, 36, nil, nil, 37, nil, nil, nil, ],
177
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
178
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
179
+ [ nil, nil, nil, nil, nil, 38, nil, nil, nil, nil, nil, nil, nil, nil, ],
180
+ [ nil, nil, nil, 39, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
181
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
182
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
183
+ [ nil, nil, nil, nil, nil, 32, nil, nil, nil, nil, nil, 33, nil, nil, ],
184
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
185
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
186
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
187
+ ]
188
+ def action_table; ACTION_TABLE; end
189
+
190
+ ### Default Reduce Table
191
+ DEFRED_TABLE = [
192
+ -2,
193
+ nil,
194
+ -4,
195
+ -11,
196
+ nil,
197
+ -20,
198
+ nil,
199
+ nil,
200
+ -1,
201
+ -6,
202
+ -11,
203
+ nil,
204
+ -5,
205
+ -21,
206
+ -22,
207
+ -23,
208
+ nil,
209
+ -3,
210
+ -12,
211
+ nil,
212
+ -18,
213
+ -7,
214
+ -20,
215
+ nil,
216
+ -24,
217
+ nil,
218
+ -13,
219
+ nil,
220
+ -8,
221
+ -9,
222
+ nil,
223
+ -14,
224
+ -16,
225
+ nil,
226
+ nil,
227
+ -19,
228
+ -10,
229
+ nil,
230
+ -17,
231
+ -25,
232
+ -15,
233
+ ]
234
+ def defred_table; DEFRED_TABLE; end
235
+
236
+ DEFRED_AFTER_SHIFT_TABLE = [
237
+ nil,
238
+ nil,
239
+ nil,
240
+ nil,
241
+ nil,
242
+ nil,
243
+ nil,
244
+ nil,
245
+ nil,
246
+ -6,
247
+ nil,
248
+ nil,
249
+ -5,
250
+ -21,
251
+ nil,
252
+ -23,
253
+ nil,
254
+ -3,
255
+ -12,
256
+ nil,
257
+ -18,
258
+ -7,
259
+ nil,
260
+ nil,
261
+ -24,
262
+ nil,
263
+ -13,
264
+ nil,
265
+ -8,
266
+ -9,
267
+ nil,
268
+ -14,
269
+ -16,
270
+ nil,
271
+ nil,
272
+ -19,
273
+ -10,
274
+ nil,
275
+ -17,
276
+ -25,
277
+ -15,
278
+ ]
279
+ def defred_after_shift_table; DEFRED_AFTER_SHIFT_TABLE; end
280
+
281
+ ### Nonterm to Int
282
+ NONTERM_TO_INT = {
283
+ :start => 0,
284
+ :opt_defnode => 1,
285
+ :opt_defvis => 2,
286
+ :defnode_list => 3,
287
+ :opt_attr => 4,
288
+ :opt_action => 5,
289
+ :defnode => 6,
290
+ :defnode_header => 7,
291
+ :fact_list => 8,
292
+ :id_list => 9,
293
+ :fact => 10,
294
+ :pass_action_list => 11,
295
+ :pass_action => 12,
296
+ }
297
+ def nonterm_to_int; NONTERM_TO_INT; end
298
+
299
+ ### Int to Nonterm
300
+ INT_TO_NONTERM = [
301
+ :start,
302
+ :opt_defnode,
303
+ :opt_defvis,
304
+ :defnode_list,
305
+ :opt_attr,
306
+ :opt_action,
307
+ :defnode,
308
+ :defnode_header,
309
+ :fact_list,
310
+ :id_list,
311
+ :fact,
312
+ :pass_action_list,
313
+ :pass_action,
314
+ ]
315
+ def int_to_nonterm; INT_TO_NONTERM; end
316
+
317
+ ### Goto Table
318
+ GOTO_TABLE = [
319
+ [ 1, 2, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
320
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
321
+ [ nil, nil, 4, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
322
+ [ nil, nil, nil, nil, 6, nil, nil, nil, nil, nil, nil, nil, nil, ],
323
+ [ nil, nil, nil, 8, nil, nil, 9, 10, nil, nil, nil, nil, nil, ],
324
+ [ nil, nil, nil, nil, nil, 12, nil, nil, nil, nil, nil, 14, 15, ],
325
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
326
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, 19, nil, nil, nil, ],
327
+ [ nil, nil, nil, nil, nil, nil, 21, 10, nil, nil, nil, nil, nil, ],
328
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
329
+ [ nil, nil, nil, nil, 22, nil, nil, nil, nil, nil, nil, nil, nil, ],
330
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
331
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
332
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
333
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 24, ],
334
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
335
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
336
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
337
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
338
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
339
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
340
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
341
+ [ nil, nil, nil, nil, nil, 28, nil, nil, nil, nil, nil, 14, 15, ],
342
+ [ nil, nil, nil, nil, nil, nil, nil, nil, 30, nil, 31, nil, nil, ],
343
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
344
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
345
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
346
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
347
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
348
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
349
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
350
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
351
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
352
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
353
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
354
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
355
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
356
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 40, nil, nil, ],
357
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
358
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
359
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
360
+ ]
361
+ def goto_table; GOTO_TABLE; end
362
+
363
+ def initialize g_parser, master
364
+ super()
365
+ @g_parser = g_parser
366
+ @d_parser = g_parser.d_parser
367
+ @master = master
368
+ @decorated = Action.new(self)
369
+ end
370
+
371
+
372
+ def do_parse?
373
+ if @line.match(/^\s*%AST\{\s*\Z/)
374
+ @line = $'
375
+ true
376
+ else
377
+ false
378
+ end
379
+ end
380
+
381
+
382
+ def banner
383
+ "%AST{ ... } / Depager::ASTBuilderExtension"
384
+ end
385
+
386
+ def lex
387
+ begin
388
+ until @line.empty?
389
+ case @line
390
+ when /\A\s+/, /\A#.*/
391
+ @line = $'
392
+
393
+
394
+ when /\A%\}\s*\Z/
395
+ @line = $'
396
+ @line = $'; yield nil,nil
397
+
398
+ when /\ANode/
399
+ @line = $'
400
+ yield token(:NODE, $&)
401
+
402
+ when /\AVisitor/
403
+ @line = $'
404
+ yield token(:VISITOR, $&)
405
+
406
+ when /\A[a-zA-Z][a-zA-Z0-9_]*/
407
+ @line = $'
408
+ yield token(:ID, $&)
409
+
410
+ when /\A\{/
411
+ #
412
+ lineno = file.lineno; yield token(:ACTION, parse_block, lineno)
413
+
414
+ when /\A./
415
+ @line = $'
416
+ yield token($&, $&)
417
+
418
+
419
+ else
420
+ raise RuntimeError, "must not happen #{@line}"
421
+ end
422
+ end
423
+ end while @original_line = @line = file.gets
424
+ yield nil, nil
425
+ end
426
+
427
+ end
428
+ end
429
+
430
+ class Depager::ASTBuilderExtension::PreRuleList0::Action < Depager::LALR::Action #:nodoc:all
431
+ include Depager::Utils::ExtensionSlaveDecoratorMethods
432
+ ON_REDUCE = [
433
+ nil,
434
+ :_act_1,
435
+ :_act_2,
436
+ :_act_3,
437
+ :_act_4,
438
+ :_act_5,
439
+ :_act_6,
440
+ :_act_7,
441
+ :_act_8,
442
+ :_act_9,
443
+ :_act_10,
444
+ :_act_11,
445
+ :_act_12,
446
+ :_act_13,
447
+ :_act_14,
448
+ :_act_15,
449
+ :_act_16,
450
+ :_act_17,
451
+ :_act_18,
452
+ :_act_19,
453
+ :_act_20,
454
+ :_act_21,
455
+ :_act_22,
456
+ :_act_23,
457
+ :_act_24,
458
+ :_act_25,
459
+
460
+ ]
461
+ def on_reduce; ON_REDUCE; end
462
+
463
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 58
464
+ def _act_1 val
465
+ _opt_defnode, _opt_defvis, _defnode_list, = *val
466
+
467
+ code = "module #{target_namespace}\n"
468
+ code << _opt_defnode
469
+ code << val[2]
470
+ master.visitors.each do |name, body|
471
+ code << ERB.new(master.class::VISITOR_TEMPLATE, nil, '-').result(binding)
472
+ end
473
+ code << "end\n"
474
+ if master.output_file_name
475
+ File.open(master.output_file_name, 'w') do |f|
476
+ f.write code
477
+ end
478
+ g_parser.outer_code << %!require '#{master.output_file_name}'\n!
479
+ else
480
+ g_parser.outer_code << code
481
+ end
482
+
483
+ end
484
+ DEPAGER_EXPANDED_CODE
485
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 77
486
+ def _act_2 val
487
+ # empty rule
488
+ ""
489
+
490
+ end
491
+ DEPAGER_EXPANDED_CODE
492
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 79
493
+ def _act_3 val
494
+ _NODE, _opt_attr, _ACTION, = *val
495
+
496
+ ini = <<-CODE
497
+ def initialize
498
+ #{_ACTION.value}
499
+ end
500
+ CODE
501
+ ERB.new(master.class::BASE_NODE_TEMPLATE, nil, '-').result(binding)
502
+
503
+ end
504
+ DEPAGER_EXPANDED_CODE
505
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 89
506
+ def _act_4 val
507
+ # empty rule
508
+ []
509
+
510
+ end
511
+ DEPAGER_EXPANDED_CODE
512
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 91
513
+ def _act_5 val
514
+ _VISITOR, _opt_action, = *val
515
+
516
+ _opt_action[nil] ||= Token.new('', 0)
517
+ _opt_action.each do |pass, act|
518
+ master.visitors[pass].unshift(
519
+ master.expand_inline_code(act.value.to_s, act.lineno))
520
+ end
521
+
522
+ end
523
+ DEPAGER_EXPANDED_CODE
524
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 100
525
+ def _act_6 val
526
+ _defnode, = *val
527
+ _defnode
528
+
529
+ end
530
+ DEPAGER_EXPANDED_CODE
531
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 101
532
+ def _act_7 val
533
+ _defnode_list, _defnode, = *val
534
+ _defnode_list << _defnode
535
+
536
+ end
537
+ DEPAGER_EXPANDED_CODE
538
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 105
539
+ def _act_8 val
540
+ _defnode_header, _opt_attr, _opt_action, = *val
541
+
542
+ name, args = _defnode_header
543
+ nodes, accept, attrs = [], '', _opt_attr
544
+ args.each do |i|
545
+ if i =~ /\-(.*)/
546
+ nodes.push $1
547
+ attrs.push $1
548
+ else
549
+ nodes.push i
550
+ accept << master.gen_accept_code(i)
551
+ end
552
+ end
553
+ _opt_action[nil] = Token.new('', 0) unless _opt_action[nil]
554
+ _opt_action.each do |pass, act|
555
+ vis_code = master.modify_action_code(act.value, nodes - attrs)
556
+ master.visitors[pass] <<
557
+ master.expand_inline_code(vis_code, act.lineno, :wrap => "def visit_Node_#{name} node")
558
+ end
559
+ ERB.new(master.class::NODE_TEMPLATE, nil, '-').result(binding)
560
+
561
+ end
562
+ DEPAGER_EXPANDED_CODE
563
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 127
564
+ def _act_9 val
565
+ _ID, _, _, = *val
566
+ [_ID.value, []]
567
+
568
+ end
569
+ DEPAGER_EXPANDED_CODE
570
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 128
571
+ def _act_10 val
572
+ _ID, _, _fact_list, _, = *val
573
+ [_ID.value, _fact_list]
574
+
575
+ end
576
+ DEPAGER_EXPANDED_CODE
577
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 131
578
+ def _act_11 val
579
+ # empty rule
580
+ []
581
+
582
+ end
583
+ DEPAGER_EXPANDED_CODE
584
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 132
585
+ def _act_12 val
586
+ _, _, = *val
587
+ []
588
+
589
+ end
590
+ DEPAGER_EXPANDED_CODE
591
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 133
592
+ def _act_13 val
593
+ _, _id_list, _, = *val
594
+ _id_list
595
+
596
+ end
597
+ DEPAGER_EXPANDED_CODE
598
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 136
599
+ def _act_14 val
600
+ _fact, = *val
601
+ [_fact]
602
+
603
+ end
604
+ DEPAGER_EXPANDED_CODE
605
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 137
606
+ def _act_15 val
607
+ _fact_list, _, _fact, = *val
608
+ _fact_list.push _fact
609
+
610
+ end
611
+ DEPAGER_EXPANDED_CODE
612
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 140
613
+ def _act_16 val
614
+ _ID, = *val
615
+ _ID.value
616
+
617
+ end
618
+ DEPAGER_EXPANDED_CODE
619
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 141
620
+ def _act_17 val
621
+ _, _ID, = *val
622
+ '-' + _ID.value
623
+
624
+ end
625
+ DEPAGER_EXPANDED_CODE
626
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 144
627
+ def _act_18 val
628
+ _ID, = *val
629
+ [ _ID.value ]
630
+
631
+ end
632
+ DEPAGER_EXPANDED_CODE
633
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 145
634
+ def _act_19 val
635
+ _id_list, _, _ID, = *val
636
+ _id_list.push _ID.value
637
+
638
+ end
639
+ DEPAGER_EXPANDED_CODE
640
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 148
641
+ def _act_20 val
642
+ # empty rule
643
+ {nil => Token.new('', 0)}
644
+
645
+ end
646
+ DEPAGER_EXPANDED_CODE
647
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 149
648
+ def _act_21 val
649
+ _ACTION, = *val
650
+ {nil => _ACTION}
651
+
652
+ end
653
+ DEPAGER_EXPANDED_CODE
654
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 151
655
+ def _act_22 val
656
+ _pass_action_list, = *val
657
+
658
+ Hash[ *_pass_action_list.flatten ].merge({nil => Token.new('', 0)})
659
+
660
+ end
661
+ DEPAGER_EXPANDED_CODE
662
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 156
663
+ def _act_23 val
664
+ _pass_action, = *val
665
+ [ _pass_action ]
666
+
667
+ end
668
+ DEPAGER_EXPANDED_CODE
669
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 157
670
+ def _act_24 val
671
+ _pass_action_list, _pass_action, = *val
672
+ _pass_action_list << _pass_action
673
+
674
+ end
675
+ DEPAGER_EXPANDED_CODE
676
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 161
677
+ def _act_25 val
678
+ _, _ID, _, _ACTION, = *val
679
+ [_ID.value, _ACTION]
680
+
681
+ end
682
+ DEPAGER_EXPANDED_CODE
683
+
684
+
685
+ end
686
+
687
+ ###
688
+ ### Depager::ASTBuilderExtension::PostRhs1 - Part of Depager Extension (slave)
689
+ ###
690
+
691
+ module Depager::ASTBuilderExtension::PostRhs1 #:nodoc:all
692
+ class Parser < Depager::LALR::Basis #:nodoc:all
693
+ include Depager::Utils::ExtensionSlaveMethods
694
+
695
+ ### Reduce Table
696
+ REDUCE_TABLE = [
697
+ [ -1, 1 ],
698
+ [ 0, 1 ],
699
+ [ 2, 3 ],
700
+ [ 2, 4 ],
701
+ [ 3, 1 ],
702
+ [ 3, 3 ],
703
+ [ 1, 1 ],
704
+ [ 1, 1 ],
705
+ [ 1, 1 ],
706
+ [ 4, 2 ],
707
+ [ 4, 1 ],
708
+ [ 4, 1 ],
709
+ [ 4, 1 ],
710
+ [ 4, 1 ],
711
+ [ 4, 1 ],
712
+ [ 4, 1 ],
713
+ [ 6, 0 ],
714
+ [ 6, 1 ],
715
+ [ 5, 2 ],
716
+ [ 5, 3 ],
717
+ [ 5, 3 ],
718
+ [ 5, 3 ],
719
+ ]
720
+ def reduce_table; REDUCE_TABLE; end
721
+
722
+ ### Term to Int
723
+ TERM_TO_INT = {
724
+ nil => 0,
725
+ false => 1,
726
+ :ID => 2,
727
+ "(" => 3,
728
+ ")" => 4,
729
+ "," => 5,
730
+ :CONST => 6,
731
+ :SYMBOL => 7,
732
+ :STR => 8,
733
+ :NILNODE => 9,
734
+ :NUMBER => 10,
735
+ :NIL => 11,
736
+ :EMBED => 12,
737
+ "[" => 13,
738
+ "]" => 14,
739
+ :LL => 15,
740
+ "@" => 16,
741
+ }
742
+ def term_to_int; TERM_TO_INT; end
743
+
744
+ ### Int to Term
745
+ INT_TO_TERM = [
746
+ nil,
747
+ false,
748
+ :ID,
749
+ "(",
750
+ ")",
751
+ ",",
752
+ :CONST,
753
+ :SYMBOL,
754
+ :STR,
755
+ :NILNODE,
756
+ :NUMBER,
757
+ :NIL,
758
+ :EMBED,
759
+ "[",
760
+ "]",
761
+ :LL,
762
+ "@",
763
+ ]
764
+ def int_to_term; INT_TO_TERM; end
765
+
766
+ ### Action Table
767
+ ACTION_TABLE = [
768
+ [ nil, nil, 6, nil, nil, nil, 7, 8, 9, 10, 11, 12, nil, 13, nil, nil, nil, ],
769
+ [ ACC, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
770
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 14, 15, ],
771
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
772
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
773
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
774
+ [ nil, nil, nil, 16, nil, nil, nil, nil, nil, nil, nil, nil, 18, nil, nil, nil, nil, ],
775
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
776
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
777
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
778
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
779
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
780
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
781
+ [ nil, nil, 6, nil, nil, nil, 7, 8, 9, 10, 11, 12, nil, 13, 19, nil, nil, ],
782
+ [ nil, nil, 6, nil, nil, nil, 7, 8, 9, 10, 11, 12, nil, 13, nil, nil, nil, ],
783
+ [ nil, nil, 6, nil, nil, nil, 7, 8, 9, 10, 11, 12, nil, 13, nil, nil, nil, ],
784
+ [ nil, nil, 6, nil, 24, nil, 7, 8, 9, 10, 11, 12, nil, 13, nil, nil, nil, ],
785
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
786
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
787
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
788
+ [ nil, nil, nil, nil, nil, 26, nil, nil, nil, nil, nil, nil, nil, nil, 27, nil, nil, ],
789
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 14, 15, ],
790
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 14, 15, ],
791
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 14, 15, ],
792
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
793
+ [ nil, nil, nil, nil, 28, 26, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
794
+ [ nil, nil, 6, nil, nil, nil, 7, 8, 9, 10, 11, 12, nil, 13, nil, nil, nil, ],
795
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
796
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
797
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, 14, 15, ],
798
+ ]
799
+ def action_table; ACTION_TABLE; end
800
+
801
+ ### Default Reduce Table
802
+ DEFRED_TABLE = [
803
+ nil,
804
+ nil,
805
+ -1,
806
+ -6,
807
+ -7,
808
+ -8,
809
+ -16,
810
+ -10,
811
+ -11,
812
+ -12,
813
+ -13,
814
+ -14,
815
+ -15,
816
+ nil,
817
+ nil,
818
+ nil,
819
+ nil,
820
+ -9,
821
+ -17,
822
+ -18,
823
+ nil,
824
+ -4,
825
+ -20,
826
+ -21,
827
+ -2,
828
+ nil,
829
+ nil,
830
+ -19,
831
+ -3,
832
+ -5,
833
+ ]
834
+ def defred_table; DEFRED_TABLE; end
835
+
836
+ DEFRED_AFTER_SHIFT_TABLE = [
837
+ nil,
838
+ nil,
839
+ nil,
840
+ -6,
841
+ -7,
842
+ -8,
843
+ nil,
844
+ -10,
845
+ -11,
846
+ -12,
847
+ -13,
848
+ -14,
849
+ -15,
850
+ nil,
851
+ nil,
852
+ nil,
853
+ nil,
854
+ -9,
855
+ -17,
856
+ -18,
857
+ nil,
858
+ nil,
859
+ nil,
860
+ nil,
861
+ -2,
862
+ nil,
863
+ nil,
864
+ -19,
865
+ -3,
866
+ nil,
867
+ ]
868
+ def defred_after_shift_table; DEFRED_AFTER_SHIFT_TABLE; end
869
+
870
+ ### Nonterm to Int
871
+ NONTERM_TO_INT = {
872
+ :start => 0,
873
+ :fnl => 1,
874
+ :node => 2,
875
+ :fnlpair => 3,
876
+ :fact => 4,
877
+ :list => 5,
878
+ :opt_embed => 6,
879
+ }
880
+ def nonterm_to_int; NONTERM_TO_INT; end
881
+
882
+ ### Int to Nonterm
883
+ INT_TO_NONTERM = [
884
+ :start,
885
+ :fnl,
886
+ :node,
887
+ :fnlpair,
888
+ :fact,
889
+ :list,
890
+ :opt_embed,
891
+ ]
892
+ def int_to_nonterm; INT_TO_NONTERM; end
893
+
894
+ ### Goto Table
895
+ GOTO_TABLE = [
896
+ [ 1, 2, 4, nil, 3, 5, nil, ],
897
+ [ nil, nil, nil, nil, nil, nil, nil, ],
898
+ [ nil, nil, nil, nil, nil, nil, nil, ],
899
+ [ nil, nil, nil, nil, nil, nil, nil, ],
900
+ [ nil, nil, nil, nil, nil, nil, nil, ],
901
+ [ nil, nil, nil, nil, nil, nil, nil, ],
902
+ [ nil, nil, nil, nil, nil, nil, 17, ],
903
+ [ nil, nil, nil, nil, nil, nil, nil, ],
904
+ [ nil, nil, nil, nil, nil, nil, nil, ],
905
+ [ nil, nil, nil, nil, nil, nil, nil, ],
906
+ [ nil, nil, nil, nil, nil, nil, nil, ],
907
+ [ nil, nil, nil, nil, nil, nil, nil, ],
908
+ [ nil, nil, nil, nil, nil, nil, nil, ],
909
+ [ nil, 21, 4, 20, 3, 5, nil, ],
910
+ [ nil, 22, 4, nil, 3, 5, nil, ],
911
+ [ nil, 23, 4, nil, 3, 5, nil, ],
912
+ [ nil, 21, 4, 25, 3, 5, nil, ],
913
+ [ nil, nil, nil, nil, nil, nil, nil, ],
914
+ [ nil, nil, nil, nil, nil, nil, nil, ],
915
+ [ nil, nil, nil, nil, nil, nil, nil, ],
916
+ [ nil, nil, nil, nil, nil, nil, nil, ],
917
+ [ nil, nil, nil, nil, nil, nil, nil, ],
918
+ [ nil, nil, nil, nil, nil, nil, nil, ],
919
+ [ nil, nil, nil, nil, nil, nil, nil, ],
920
+ [ nil, nil, nil, nil, nil, nil, nil, ],
921
+ [ nil, nil, nil, nil, nil, nil, nil, ],
922
+ [ nil, 29, 4, nil, 3, 5, nil, ],
923
+ [ nil, nil, nil, nil, nil, nil, nil, ],
924
+ [ nil, nil, nil, nil, nil, nil, nil, ],
925
+ [ nil, nil, nil, nil, nil, nil, nil, ],
926
+ ]
927
+ def goto_table; GOTO_TABLE; end
928
+
929
+ def initialize g_parser, master
930
+ super()
931
+ @g_parser = g_parser
932
+ @d_parser = g_parser.d_parser
933
+ @master = master
934
+ @decorated = Action.new(self)
935
+ end
936
+
937
+
938
+ def do_parse?
939
+ if @line.match(/^\s*=>/)
940
+ @line = $'
941
+ true
942
+ else
943
+ false
944
+ end
945
+ end
946
+
947
+
948
+ def banner
949
+ "=>... / Depager::ASTBuilderExtension"
950
+ end
951
+
952
+ def lex
953
+ begin
954
+ until @line.empty?
955
+ case @line
956
+ when /\A[ \t]+/
957
+ @line = $'
958
+
959
+
960
+ when /\A\r?\n/
961
+ @line = $'
962
+ yield nil, nil
963
+
964
+ when /\A<</
965
+ @line = $'
966
+ yield token(:LL, $&)
967
+
968
+ when /\A%([a-zA-Z0-9_]+)((::[a-zA-Z0-9_]+)*)/
969
+ @line = $'
970
+ yield token(:CONST, $1+$2)
971
+
972
+ when /\A%\((.+)\)%/
973
+ @line = $'
974
+ yield token(:EMBED, $1)
975
+
976
+ when /\Anil/
977
+ @line = $'
978
+ yield token(:NIL, $&)
979
+
980
+ when /\ANilNode/
981
+ @line = $'
982
+ yield token(:NILNODE, $&)
983
+
984
+ when /\A[0-9]+/
985
+ @line = $'
986
+ yield token(:NUMBER, $&.to_i)
987
+
988
+ when /\A:[a-zA-Z0-9_]+/
989
+ @line = $'
990
+ yield token(:SYMBOL, $&)
991
+
992
+ when /\A[a-zA-Z][a-zA-Z0-9_]*/
993
+ @line = $'
994
+ yield token(:ID, $&)
995
+
996
+ when /\A'(.+)'/
997
+ @line = $'
998
+ yield token(:STR, $1)
999
+
1000
+ when /\A./
1001
+ @line = $'
1002
+ yield token($&, $&)
1003
+
1004
+
1005
+ else
1006
+ raise RuntimeError, "must not happen #{@line}"
1007
+ end
1008
+ end
1009
+ end while @original_line = @line = file.gets
1010
+ yield nil, nil
1011
+ end
1012
+ module_eval <<'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 173
1013
+ def do_default
1014
+ n = g_parser.rules.size-1
1015
+ master.action_code << <<~CODE
1016
+ def _ast_#{n} val
1017
+ NilNode.new(basis.file.lineno)
1018
+ end
1019
+ CODE
1020
+ master.on_reduce[n] = ":_ast_#{n}"
1021
+ end
1022
+
1023
+ DEPAGER_EXPANDED_CODE
1024
+
1025
+ end
1026
+ end
1027
+
1028
+ class Depager::ASTBuilderExtension::PostRhs1::Action < Depager::LALR::Action #:nodoc:all
1029
+ include Depager::Utils::ExtensionSlaveDecoratorMethods
1030
+ ON_REDUCE = [
1031
+ nil,
1032
+ :_act_1,
1033
+ :_act_2,
1034
+ :_act_3,
1035
+ :_act_4,
1036
+ :_act_5,
1037
+ :_act_6,
1038
+ :_act_7,
1039
+ :_act_8,
1040
+ :_act_9,
1041
+ :_act_10,
1042
+ :_act_11,
1043
+ :_act_12,
1044
+ :_act_13,
1045
+ :_act_14,
1046
+ :_act_15,
1047
+ :_act_16,
1048
+ :_act_17,
1049
+ :_act_18,
1050
+ :_act_19,
1051
+ :_act_20,
1052
+ :_act_21,
1053
+
1054
+ ]
1055
+ def on_reduce; ON_REDUCE; end
1056
+
1057
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 201
1058
+ def _act_1 val
1059
+ _fnl, = *val
1060
+
1061
+ n = g_parser.rules.size-1
1062
+ master.action_code <<
1063
+ master.expand_inline_code(_fnl, basis.file.lineno, :wrap => "def _ast_#{n} val")
1064
+ master.on_reduce[n] = ":_ast_#{n}"
1065
+
1066
+ end
1067
+ DEPAGER_EXPANDED_CODE
1068
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 209
1069
+ def _act_2 val
1070
+ _ID, _, _, = *val
1071
+ "#{master.node_name _ID.value}.new(basis.file.lineno)"
1072
+
1073
+ end
1074
+ DEPAGER_EXPANDED_CODE
1075
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 211
1076
+ def _act_3 val
1077
+ _ID, _, _fnlpair, _, = *val
1078
+
1079
+ if g_parser.rhs.size > 0
1080
+ "#{master.node_name _ID.value}.new(val[0].lineno, #{_fnlpair.join(', ')})"
1081
+ else
1082
+ "#{master.node_name _ID.value}.new(basis.file.lineno, #{_fnlpair.join(', ')})"
1083
+ end
1084
+
1085
+ end
1086
+ DEPAGER_EXPANDED_CODE
1087
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 220
1088
+ def _act_4 val
1089
+ _fnl, = *val
1090
+ [_fnl]
1091
+
1092
+ end
1093
+ DEPAGER_EXPANDED_CODE
1094
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 221
1095
+ def _act_5 val
1096
+ _fnlpair, _, _fnl, = *val
1097
+ _fnlpair << _fnl
1098
+
1099
+ end
1100
+ DEPAGER_EXPANDED_CODE
1101
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 224
1102
+ def _act_6 val
1103
+ _fact, = *val
1104
+ _fact
1105
+
1106
+ end
1107
+ DEPAGER_EXPANDED_CODE
1108
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 225
1109
+ def _act_7 val
1110
+ _node, = *val
1111
+ _node
1112
+
1113
+ end
1114
+ DEPAGER_EXPANDED_CODE
1115
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 226
1116
+ def _act_8 val
1117
+ _list, = *val
1118
+ _list
1119
+
1120
+ end
1121
+ DEPAGER_EXPANDED_CODE
1122
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 230
1123
+ def _act_9 val
1124
+ _ID, _opt_embed, = *val
1125
+
1126
+ unless i = g_parser.name_to_rhs_index(_ID.value)
1127
+ warn "#{g_parser.lineno}: ?#{_ID.value}"
1128
+ raise
1129
+ end
1130
+ "val[#{i}]#{val[1]}"
1131
+
1132
+ end
1133
+ DEPAGER_EXPANDED_CODE
1134
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 237
1135
+ def _act_10 val
1136
+ _CONST, = *val
1137
+ "Depager::Token.new(#{_CONST.value})"
1138
+
1139
+ end
1140
+ DEPAGER_EXPANDED_CODE
1141
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 238
1142
+ def _act_11 val
1143
+ _SYMBOL, = *val
1144
+ "Depager::Token.new(#{_SYMBOL.value})"
1145
+
1146
+ end
1147
+ DEPAGER_EXPANDED_CODE
1148
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 239
1149
+ def _act_12 val
1150
+ _STR, = *val
1151
+ "Depager::Token.new('#{_STR.value}')"
1152
+
1153
+ end
1154
+ DEPAGER_EXPANDED_CODE
1155
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 240
1156
+ def _act_13 val
1157
+ _NILNODE, = *val
1158
+ "NilNode.new(basis.file.lineno)"
1159
+
1160
+ end
1161
+ DEPAGER_EXPANDED_CODE
1162
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 241
1163
+ def _act_14 val
1164
+ _NUMBER, = *val
1165
+ "Depager::Token.new(#{_NUMBER.value})"
1166
+
1167
+ end
1168
+ DEPAGER_EXPANDED_CODE
1169
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 242
1170
+ def _act_15 val
1171
+ _NIL, = *val
1172
+ "nil"
1173
+
1174
+ end
1175
+ DEPAGER_EXPANDED_CODE
1176
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 245
1177
+ def _act_16 val
1178
+ # empty rule
1179
+ ''
1180
+
1181
+ end
1182
+ DEPAGER_EXPANDED_CODE
1183
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 246
1184
+ def _act_17 val
1185
+ _EMBED, = *val
1186
+ _EMBED.value
1187
+
1188
+ end
1189
+ DEPAGER_EXPANDED_CODE
1190
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 249
1191
+ def _act_18 val
1192
+ _, _, = *val
1193
+ "#{master.node_name '@List'}.new(basis.file.lineno, [])"
1194
+
1195
+ end
1196
+ DEPAGER_EXPANDED_CODE
1197
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 251
1198
+ def _act_19 val
1199
+ _, _fnlpair, _, = *val
1200
+
1201
+ if g_parser.rhs.size > 0
1202
+ "#{master.node_name '@List'}.new(val[0].lineno, [#{_fnlpair.join(', ')}])"
1203
+ else
1204
+ "#{master.node_name '@List'}.new(basis.file.lineno, #{_fnlpair.join(', ')})"
1205
+ end
1206
+
1207
+ end
1208
+ DEPAGER_EXPANDED_CODE
1209
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 258
1210
+ def _act_20 val
1211
+ _l, _LL, _r, = *val
1212
+ "#{_l}.push(#{_r})"
1213
+
1214
+ end
1215
+ DEPAGER_EXPANDED_CODE
1216
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/ast.dr', 259
1217
+ def _act_21 val
1218
+ _l, _, _r, = *val
1219
+ "#{_l}.concat(#{_r})"
1220
+
1221
+ end
1222
+ DEPAGER_EXPANDED_CODE
1223
+
1224
+
1225
+ end
1226
+
1227
+
1228
+ class Depager::ASTBuilderExtension
1229
+ BASE_NODE_TEMPLATE = <<-'CODE'
1230
+ class Node
1231
+ attr_accessor :lineno
1232
+ attr_accessor <%= _opt_attr.map{|i| ":#{i}" }.join(', ') %>
1233
+ <%= ini %>
1234
+
1235
+ def self.[] lineno, *args
1236
+ self.new lineno, *args
1237
+ end
1238
+
1239
+ def accept v
1240
+ end
1241
+ end
1242
+
1243
+ class NodeList < Node
1244
+ attr_accessor :lineno
1245
+ def initialize(lineno, lst=[])
1246
+ @lineno = lineno
1247
+ @lst = lst.to_a.select{|i| ! i.is_a?(NilNode)}
1248
+ end
1249
+
1250
+ <%- _opt_attr.each do |i| -%>
1251
+ def all_<%= i %>
1252
+ @lst.map{|i| i.<%= i %>}
1253
+ end
1254
+ <%- end -%>
1255
+
1256
+ def size
1257
+ @lst.size
1258
+ end
1259
+ alias length size
1260
+
1261
+ def push(i)
1262
+ @lst.push i unless i.is_a? NilNode
1263
+ self
1264
+ end
1265
+
1266
+ def concat(i)
1267
+ @lst.concat i
1268
+ self
1269
+ end
1270
+
1271
+ def to_ary()
1272
+ @lst
1273
+ end
1274
+
1275
+ alias to_a to_ary
1276
+ alias list to_ary
1277
+
1278
+ def accept(v)
1279
+ @lst.each{|i| i.accept(v) }
1280
+ end
1281
+ end
1282
+
1283
+ class NilNode
1284
+ attr_accessor :lineno
1285
+ attr_accessor <%= _opt_attr.map{|i| ":#{i}" }.join(', ') %>
1286
+
1287
+ def initialize(lineno, *args)
1288
+ @lineno = lineno
1289
+ end
1290
+
1291
+ def accept v
1292
+ end
1293
+ end
1294
+ CODE
1295
+
1296
+ NODE_TEMPLATE = <<-'CODE'
1297
+ class Node_<%= name %> < Node
1298
+ attr_accessor <%= nodes.map{|i| ":#{i}" }.join(', ') %>
1299
+ attr_accessor <%= attrs.map{|i| ":#{i}" }.join(', ') %>
1300
+
1301
+ def initialize <%= ['lineno', *nodes].join(', ') %>
1302
+ super()
1303
+ @lineno = lineno
1304
+ <%= nodes.inject(''){|r,i| r << " @#{i} = #{i}\n"} %>
1305
+ end
1306
+
1307
+ def accept v
1308
+ warn @lineno.to_s+':'+self.class.to_s if $DEBUG
1309
+ <%= accept %>
1310
+ v.visit_Node_<%= name %>(self)
1311
+ self
1312
+ end
1313
+
1314
+ def attributes
1315
+ { <%= (nodes + attrs).uniq.map{|i| "#{i}: #{i}" }.join(', ') %>, lineno: lineno }
1316
+ end
1317
+ end
1318
+ CODE
1319
+
1320
+ VISITOR_TEMPLATE = <<-'CODE'
1321
+ class Visitor<%= name ? '_' + name : '' %>
1322
+ def visit node
1323
+ node.accept(self)
1324
+ end
1325
+ <%= body.join %>
1326
+ end # Visitor<%= name ? '_' + name : '' %>
1327
+ CODE
1328
+ end
1329
+