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.
Files changed (51) hide show
  1. data/ChangeLog +4 -0
  2. data/README.en +5 -10
  3. data/bin/depager +17 -20
  4. data/examples/c89/c89.tab.rb +5632 -702
  5. data/examples/pl0d/pl0ds.dr +41 -41
  6. data/examples/pl0d/pl0ds.tab.rb +1887 -874
  7. data/examples/sample_calc/calc.action.tab.rb +243 -69
  8. data/examples/sample_calc/{calc.astl.action.dr → calc.ast.action.dr} +7 -7
  9. data/examples/sample_calc/calc.ast.action.tab.rb +755 -0
  10. data/examples/sample_calc/{calc.astl.dr → calc.ast.dr} +7 -7
  11. data/examples/sample_calc/calc.ast.tab.rb +672 -0
  12. data/examples/sample_calc/calc.astdf.dr +5 -5
  13. data/examples/sample_calc/calc.astdf.tab.rb +405 -202
  14. data/examples/sample_calc/calc.atree.tab.rb +243 -69
  15. data/examples/sample_calc/calc.cst.tab.rb +275 -109
  16. data/examples/sample_calc/calc.lex.tab.rb +210 -28
  17. data/examples/sample_calc/calc.nvaction.tab.rb +251 -77
  18. data/examples/sample_calc/calc.tab.rb +210 -28
  19. data/examples/sample_calc/calc_prec.nvaction.tab.rb +224 -50
  20. data/examples/slex_test/divreg.slex.tab.rb +97 -21
  21. data/examples/slex_test/ljoin.slex.tab.rb +128 -35
  22. data/lib/depager.rb +77 -44
  23. data/lib/depager/{ast_base.dr → ast.dr} +56 -18
  24. data/lib/depager/{ast_base.rb → ast.rb} +432 -424
  25. data/lib/depager/astdf.rb +3 -6
  26. data/lib/depager/atree.rb +54 -62
  27. data/lib/depager/cst.dr +2 -2
  28. data/lib/depager/cst.rb +64 -77
  29. data/lib/depager/grammar.rb +225 -66
  30. data/lib/depager/lex.dr +1 -1
  31. data/lib/depager/lex.rb +45 -54
  32. data/lib/depager/lr.rb +181 -262
  33. data/lib/depager/lr_put_table.rb +116 -0
  34. data/lib/depager/nvaction.rb +1 -1
  35. data/lib/depager/parser.rb +23 -2
  36. data/lib/depager/slex.dr +3 -3
  37. data/lib/depager/slex.rb +148 -169
  38. data/lib/depager/srp.rb +1 -1
  39. data/lib/depager/template/ast.erbs +69 -0
  40. data/lib/depager/template/extension_lalr_master.erb +3 -3
  41. data/lib/depager/template/extension_lalr_slave.erb +7 -7
  42. data/lib/depager/template/simple.erb +4 -2
  43. data/lib/depager/template/single_lalr_parser.erb +30 -10
  44. data/lib/depager/utils.rb +10 -9
  45. data/lib/depager/version.rb +2 -8
  46. metadata +10 -11
  47. data/examples/sample_calc/calc.astl.action.tab.rb +0 -593
  48. data/examples/sample_calc/calc.astl.tab.rb +0 -501
  49. data/lib/depager/astl.rb +0 -14
  50. data/lib/depager/template/astdf.erbs +0 -57
  51. data/lib/depager/template/astl.erbs +0 -57
@@ -3,8 +3,8 @@ begin; require 'rubygems'; rescue Exception; end
3
3
  require 'depager/parser.rb'
4
4
 
5
5
 
6
- module D4TinyCalc
7
- end
6
+ module Depager::DecoratorUtils; end
7
+ module D4TinyCalc; end
8
8
 
9
9
  class TinyCalc < Depager::LALR::Basis
10
10
 
@@ -12,14 +12,14 @@ class TinyCalc < Depager::LALR::Basis
12
12
  ### Reduce Table
13
13
  reduce_table = [
14
14
  [ -1, 1 ], # ( 0) $start : expr
15
- [ 0, 3 ], # ( 1) expr : expr + term
16
- [ 0, 3 ], # ( 2) expr : expr - term
15
+ [ 0, 3 ], # ( 1) expr : expr '+' term
16
+ [ 0, 3 ], # ( 2) expr : expr '-' term
17
17
  [ 0, 1 ], # ( 3) expr : term
18
- [ 1, 3 ], # ( 4) term : term * fact
19
- [ 1, 3 ], # ( 5) term : term / fact
18
+ [ 1, 3 ], # ( 4) term : term '*' fact
19
+ [ 1, 3 ], # ( 5) term : term '/' fact
20
20
  [ 1, 1 ], # ( 6) term : fact
21
21
  [ 2, 1 ], # ( 7) fact : NUM
22
- [ 2, 3 ], # ( 8) fact : ( expr )
22
+ [ 2, 3 ], # ( 8) fact : '(' expr ')'
23
23
  ]
24
24
  ### Extension Params
25
25
  nparams = {
@@ -51,26 +51,25 @@ class TinyCalc < Depager::LALR::Basis
51
51
  ]
52
52
  ### Action Table
53
53
  action_table = [
54
- [ nil, nil, nil, nil, nil, nil, 5, 1, nil, ],
55
- [ nil, nil, nil, nil, nil, nil, 5, 1, nil, ],
56
- [ ACC, nil, 7, 8, nil, nil, nil, nil, nil, ],
57
- [ nil, nil, nil, nil, 9, 10, nil, nil, nil, ],
54
+ [ nil, nil, nil, nil, nil, nil, 4, 5, nil, ],
55
+ [ ACC, nil, 6, 7, nil, nil, nil, nil, nil, ],
56
+ [ nil, nil, nil, nil, 8, 9, nil, nil, nil, ],
58
57
  [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
59
58
  [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
60
- [ nil, nil, 7, 8, nil, nil, nil, nil, 11, ],
61
- [ nil, nil, nil, nil, nil, nil, 5, 1, nil, ],
62
- [ nil, nil, nil, nil, nil, nil, 5, 1, nil, ],
63
- [ nil, nil, nil, nil, nil, nil, 5, 1, nil, ],
64
- [ nil, nil, nil, nil, nil, nil, 5, 1, nil, ],
59
+ [ nil, nil, nil, nil, nil, nil, 4, 5, nil, ],
60
+ [ nil, nil, nil, nil, nil, nil, 4, 5, nil, ],
61
+ [ nil, nil, nil, nil, nil, nil, 4, 5, nil, ],
62
+ [ nil, nil, nil, nil, nil, nil, 4, 5, nil, ],
63
+ [ nil, nil, nil, nil, nil, nil, 4, 5, nil, ],
64
+ [ nil, nil, 6, 7, nil, nil, nil, nil, 15, ],
65
+ [ nil, nil, nil, nil, 8, 9, nil, nil, nil, ],
66
+ [ nil, nil, nil, nil, 8, 9, nil, nil, nil, ],
65
67
  [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
66
- [ nil, nil, nil, nil, 9, 10, nil, nil, nil, ],
67
- [ nil, nil, nil, nil, 9, 10, nil, nil, nil, ],
68
68
  [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
69
69
  [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
70
70
  ]
71
71
  ### Default Reduce Table
72
72
  defred_table = [
73
- nil,
74
73
  nil,
75
74
  nil,
76
75
  -3,
@@ -81,17 +80,17 @@ class TinyCalc < Depager::LALR::Basis
81
80
  nil,
82
81
  nil,
83
82
  nil,
84
- -8,
83
+ nil,
85
84
  -1,
86
85
  -2,
87
86
  -4,
88
87
  -5,
88
+ -8,
89
89
  ]
90
90
  defred_after_shift_table = [
91
91
  nil,
92
92
  nil,
93
93
  nil,
94
- nil,
95
94
  -6,
96
95
  -7,
97
96
  nil,
@@ -99,11 +98,12 @@ class TinyCalc < Depager::LALR::Basis
99
98
  nil,
100
99
  nil,
101
100
  nil,
102
- -8,
101
+ nil,
103
102
  nil,
104
103
  nil,
105
104
  -4,
106
105
  -5,
106
+ -8,
107
107
  ]
108
108
  ### Nonterm to Int
109
109
  nt2i = {
@@ -119,24 +119,206 @@ class TinyCalc < Depager::LALR::Basis
119
119
  ]
120
120
  ### Goto Table
121
121
  goto_table = [
122
- [ 2, 3, 4, ],
123
- [ 6, 3, 4, ],
122
+ [ 1, 2, 3, ],
124
123
  [ nil, nil, nil, ],
125
124
  [ nil, nil, nil, ],
126
125
  [ nil, nil, nil, ],
127
126
  [ nil, nil, nil, ],
128
- [ nil, nil, nil, ],
129
- [ nil, 12, 4, ],
130
- [ nil, 13, 4, ],
127
+ [ 10, 2, 3, ],
128
+ [ nil, 11, 3, ],
129
+ [ nil, 12, 3, ],
130
+ [ nil, nil, 13, ],
131
131
  [ nil, nil, 14, ],
132
- [ nil, nil, 15, ],
133
132
  [ nil, nil, nil, ],
134
133
  [ nil, nil, nil, ],
135
134
  [ nil, nil, nil, ],
136
135
  [ nil, nil, nil, ],
137
136
  [ nil, nil, nil, ],
137
+ [ nil, nil, nil, ],
138
+ ]
139
+
140
+
141
+ alias orig_error error
142
+ def error
143
+ orig_error
144
+ warn "current state: #{StateInfo[@stack.last]}"
145
+ end
146
+
147
+ ### States
148
+ StateInfo = [
149
+ <<'----------',
150
+ I000 =
151
+ ( 0) $start : _ expr
152
+
153
+ NUM shift, and goto to state 4
154
+ '(' shift, and goto to state 5
155
+
156
+
157
+ ----------
158
+
159
+ <<'----------',
160
+ I001 =
161
+ ( 0) $start : expr _
162
+ ( 1) expr : expr _ '+' term
163
+ ( 2) expr : expr _ '-' term
164
+
165
+ '+' shift, and goto to state 6
166
+ '-' shift, and goto to state 7
167
+
168
+
169
+ $end accept
170
+
171
+ ----------
172
+
173
+ <<'----------',
174
+ I002 =
175
+ ( 3) expr : term _
176
+ ( 4) term : term _ '*' fact
177
+ ( 5) term : term _ '/' fact
178
+
179
+ '*' shift, and goto to state 8
180
+ '/' shift, and goto to state 9
181
+
182
+ $default reduce using rule 3 (expr)
183
+
184
+ ----------
185
+
186
+ <<'----------',
187
+ I003 =
188
+ ( 6) term : fact _
189
+
190
+
191
+ $default reduce using rule 6 (term) [after shift]
192
+
193
+ ----------
194
+
195
+ <<'----------',
196
+ I004 =
197
+ ( 7) fact : NUM _
198
+
199
+
200
+ $default reduce using rule 7 (fact) [after shift]
201
+
202
+ ----------
203
+
204
+ <<'----------',
205
+ I005 =
206
+ ( 8) fact : '(' _ expr ')'
207
+
208
+ NUM shift, and goto to state 4
209
+ '(' shift, and goto to state 5
210
+
211
+
212
+ ----------
213
+
214
+ <<'----------',
215
+ I006 =
216
+ ( 1) expr : expr '+' _ term
217
+
218
+ NUM shift, and goto to state 4
219
+ '(' shift, and goto to state 5
220
+
221
+
222
+ ----------
223
+
224
+ <<'----------',
225
+ I007 =
226
+ ( 2) expr : expr '-' _ term
227
+
228
+ NUM shift, and goto to state 4
229
+ '(' shift, and goto to state 5
230
+
231
+
232
+ ----------
233
+
234
+ <<'----------',
235
+ I008 =
236
+ ( 4) term : term '*' _ fact
237
+
238
+ NUM shift, and goto to state 4
239
+ '(' shift, and goto to state 5
240
+
241
+
242
+ ----------
243
+
244
+ <<'----------',
245
+ I009 =
246
+ ( 5) term : term '/' _ fact
247
+
248
+ NUM shift, and goto to state 4
249
+ '(' shift, and goto to state 5
250
+
251
+
252
+ ----------
253
+
254
+ <<'----------',
255
+ I010 =
256
+ ( 8) fact : '(' expr _ ')'
257
+ ( 1) expr : expr _ '+' term
258
+ ( 2) expr : expr _ '-' term
259
+
260
+ '+' shift, and goto to state 6
261
+ '-' shift, and goto to state 7
262
+ ')' shift, and goto to state 15
263
+
264
+
265
+ ----------
266
+
267
+ <<'----------',
268
+ I011 =
269
+ ( 1) expr : expr '+' term _
270
+ ( 4) term : term _ '*' fact
271
+ ( 5) term : term _ '/' fact
272
+
273
+ '*' shift, and goto to state 8
274
+ '/' shift, and goto to state 9
275
+
276
+ $default reduce using rule 1 (expr)
277
+
278
+ ----------
279
+
280
+ <<'----------',
281
+ I012 =
282
+ ( 2) expr : expr '-' term _
283
+ ( 4) term : term _ '*' fact
284
+ ( 5) term : term _ '/' fact
285
+
286
+ '*' shift, and goto to state 8
287
+ '/' shift, and goto to state 9
288
+
289
+ $default reduce using rule 2 (expr)
290
+
291
+ ----------
292
+
293
+ <<'----------',
294
+ I013 =
295
+ ( 4) term : term '*' fact _
296
+
297
+
298
+ $default reduce using rule 4 (term) [after shift]
299
+
300
+ ----------
301
+
302
+ <<'----------',
303
+ I014 =
304
+ ( 5) term : term '/' fact _
305
+
306
+
307
+ $default reduce using rule 5 (term) [after shift]
308
+
309
+ ----------
310
+
311
+ <<'----------',
312
+ I015 =
313
+ ( 8) fact : '(' expr ')' _
314
+
315
+
316
+ $default reduce using rule 8 (fact) [after shift]
317
+
318
+ ----------
138
319
  ]
139
320
 
321
+
140
322
  Tables = [ reduce_table, nparams, action_table,
141
323
  defred_table, defred_after_shift_table, goto_table,
142
324
  t2i, i2t, nt2i, i2nt ]
@@ -181,7 +363,7 @@ end
181
363
 
182
364
  class D4TinyCalc::Action < Depager::LALR::Action #:nodoc:all
183
365
  include Depager::DecoratorUtils
184
-
366
+ []
185
367
  on_reduce = [
186
368
  nil,
187
369
  :_act_0,
@@ -202,69 +384,61 @@ class D4TinyCalc::Action < Depager::LALR::Action #:nodoc:all
202
384
  end
203
385
 
204
386
 
205
- module_eval <<-'.,.,118754108827289.,.,', 'sample_calc/calc.action.dr', 15
206
- def _act_0 val
387
+ module_eval <<-'.,.,120998293115109.,.,', 'sample_calc/calc.action.dr', 15
388
+ def _act_0 val
207
389
  val[0] + val[2]
208
390
 
209
- end
210
-
211
- .,.,118754108827289.,.,
391
+ end
392
+ .,.,120998293115109.,.,
212
393
 
213
- module_eval <<-'.,.,118754108850101.,.,', 'sample_calc/calc.action.dr', 16
214
- def _act_1 val
394
+ module_eval <<-'.,.,12099829312650.,.,', 'sample_calc/calc.action.dr', 16
395
+ def _act_1 val
215
396
  val[0] - val[2]
216
397
 
217
- end
218
-
219
- .,.,118754108850101.,.,
398
+ end
399
+ .,.,12099829312650.,.,
220
400
 
221
- module_eval <<-'.,.,118754108859938.,.,', 'sample_calc/calc.action.dr', 17
222
- def _act_2 val
401
+ module_eval <<-'.,.,12099829313489.,.,', 'sample_calc/calc.action.dr', 17
402
+ def _act_2 val
223
403
  val[0]
224
404
 
225
- end
226
-
227
- .,.,118754108859938.,.,
405
+ end
406
+ .,.,12099829313489.,.,
228
407
 
229
- module_eval <<-'.,.,118754108817909.,.,', 'sample_calc/calc.action.dr', 20
230
- def _act_3 val
408
+ module_eval <<-'.,.,120998293125343.,.,', 'sample_calc/calc.action.dr', 20
409
+ def _act_3 val
231
410
  val[0] * val[2]
232
411
 
233
- end
234
-
235
- .,.,118754108817909.,.,
412
+ end
413
+ .,.,120998293125343.,.,
236
414
 
237
- module_eval <<-'.,.,11875410886381.,.,', 'sample_calc/calc.action.dr', 21
238
- def _act_4 val
415
+ module_eval <<-'.,.,120998293141013.,.,', 'sample_calc/calc.action.dr', 21
416
+ def _act_4 val
239
417
  val[0] / val[2]
240
418
 
241
- end
242
-
243
- .,.,11875410886381.,.,
419
+ end
420
+ .,.,120998293141013.,.,
244
421
 
245
- module_eval <<-'.,.,118754108815401.,.,', 'sample_calc/calc.action.dr', 22
246
- def _act_5 val
422
+ module_eval <<-'.,.,120998293143307.,.,', 'sample_calc/calc.action.dr', 22
423
+ def _act_5 val
247
424
  val[0]
248
425
 
249
- end
250
-
251
- .,.,118754108815401.,.,
426
+ end
427
+ .,.,120998293143307.,.,
252
428
 
253
- module_eval <<-'.,.,118754108820197.,.,', 'sample_calc/calc.action.dr', 25
254
- def _act_6 val
429
+ module_eval <<-'.,.,120998293124180.,.,', 'sample_calc/calc.action.dr', 25
430
+ def _act_6 val
255
431
  val[0].value
256
432
 
257
- end
258
-
259
- .,.,118754108820197.,.,
433
+ end
434
+ .,.,120998293124180.,.,
260
435
 
261
- module_eval <<-'.,.,11875410882848.,.,', 'sample_calc/calc.action.dr', 26
262
- def _act_7 val
436
+ module_eval <<-'.,.,120998293127174.,.,', 'sample_calc/calc.action.dr', 26
437
+ def _act_7 val
263
438
  val[1]
264
439
 
265
- end
266
-
267
- .,.,11875410882848.,.,
440
+ end
441
+ .,.,120998293127174.,.,
268
442
 
269
443
  end
270
444
 
@@ -1,8 +1,8 @@
1
1
  %class TinyCalc
2
2
  %extend Lexer ('depager/lex.rb')
3
- %extend ASTBuilderLazy ('depager/astl.rb')
3
+ %extend ASTBuilder ('depager/ast.rb')
4
4
  %extend Action ('depager/action.rb')
5
- %decorate @ASTBuilderLazy
5
+ %decorate @ASTBuilder
6
6
  %decorate @Action
7
7
  #%decorate ShiftReducePrinter ('depager/srp.rb')
8
8
  %mixin Depager
@@ -17,11 +17,11 @@
17
17
  %AST{
18
18
  Node [value] { @value = nil }
19
19
  Visitor { }
20
- add(left, right) { ~value = visit(~left).value + visit(~right).value }
21
- sub(left, right) { ~value = visit(~left).value - visit(~right).value }
22
- mul(left, right) { ~value = visit(~left).value * visit(~right).value }
23
- div(left, right) { ~value = visit(~left).value / visit(~right).value }
24
- literal(-n) { ~value = ~n.value }
20
+ add(left, right) { $.value = visit($.left).value + visit($.right).value }
21
+ sub(left, right) { $.value = visit($.left).value - visit($.right).value }
22
+ mul(left, right) { $.value = visit($.left).value * visit($.right).value }
23
+ div(left, right) { $.value = visit($.left).value / visit($.right).value }
24
+ literal(-n) { $.value = $.n.value }
25
25
  %}
26
26
 
27
27
  #begin-rule
@@ -0,0 +1,755 @@
1
+
2
+ begin; require 'rubygems'; rescue Exception; end
3
+ require 'depager/parser.rb'
4
+
5
+
6
+ module Depager::DecoratorUtils; end
7
+ module D4TinyCalc; end
8
+
9
+ class TinyCalc < Depager::LALR::Basis
10
+
11
+ include Depager
12
+
13
+ ### Reduce Table
14
+ reduce_table = [
15
+ [ -1, 1 ], # ( 0) $start : expr
16
+ [ 0, 3 ], # ( 1) expr : expr '+' term
17
+ [ 0, 3 ], # ( 2) expr : expr '-' term
18
+ [ 0, 1 ], # ( 3) expr : term
19
+ [ 1, 3 ], # ( 4) term : term '*' fact
20
+ [ 1, 3 ], # ( 5) term : term '/' fact
21
+ [ 1, 1 ], # ( 6) term : fact
22
+ [ 2, 1 ], # ( 7) fact : NUM
23
+ [ 2, 3 ], # ( 8) fact : '(' expr ')'
24
+ ]
25
+ ### Extension Params
26
+ nparams = {
27
+ 'ASTBuilder' => 2,
28
+ 'Action' => 3,
29
+ }
30
+ ### Term to Int
31
+ t2i = {
32
+ nil => 0,
33
+ false => 1,
34
+ "+" => 2,
35
+ "-" => 3,
36
+ "*" => 4,
37
+ "/" => 5,
38
+ :NUM => 6,
39
+ "(" => 7,
40
+ ")" => 8,
41
+ }
42
+ ### Int to Term
43
+ i2t = [
44
+ nil,
45
+ false,
46
+ "+",
47
+ "-",
48
+ "*",
49
+ "/",
50
+ :NUM,
51
+ "(",
52
+ ")",
53
+ ]
54
+ ### Action Table
55
+ action_table = [
56
+ [ nil, nil, nil, nil, nil, nil, 4, 5, nil, ],
57
+ [ ACC, nil, 6, 7, nil, nil, nil, nil, nil, ],
58
+ [ nil, nil, nil, nil, 8, 9, nil, nil, nil, ],
59
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
60
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
61
+ [ nil, nil, nil, nil, nil, nil, 4, 5, nil, ],
62
+ [ nil, nil, nil, nil, nil, nil, 4, 5, nil, ],
63
+ [ nil, nil, nil, nil, nil, nil, 4, 5, nil, ],
64
+ [ nil, nil, nil, nil, nil, nil, 4, 5, nil, ],
65
+ [ nil, nil, nil, nil, nil, nil, 4, 5, nil, ],
66
+ [ nil, nil, 6, 7, nil, nil, nil, nil, 15, ],
67
+ [ nil, nil, nil, nil, 8, 9, nil, nil, nil, ],
68
+ [ nil, nil, nil, nil, 8, 9, nil, nil, nil, ],
69
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
70
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
71
+ [ nil, nil, nil, nil, nil, nil, nil, nil, nil, ],
72
+ ]
73
+ ### Default Reduce Table
74
+ defred_table = [
75
+ nil,
76
+ nil,
77
+ -3,
78
+ -6,
79
+ -7,
80
+ nil,
81
+ nil,
82
+ nil,
83
+ nil,
84
+ nil,
85
+ nil,
86
+ -1,
87
+ -2,
88
+ -4,
89
+ -5,
90
+ -8,
91
+ ]
92
+ defred_after_shift_table = [
93
+ nil,
94
+ nil,
95
+ nil,
96
+ -6,
97
+ -7,
98
+ nil,
99
+ nil,
100
+ nil,
101
+ nil,
102
+ nil,
103
+ nil,
104
+ nil,
105
+ nil,
106
+ -4,
107
+ -5,
108
+ -8,
109
+ ]
110
+ ### Nonterm to Int
111
+ nt2i = {
112
+ :expr => 0,
113
+ :term => 1,
114
+ :fact => 2,
115
+ }
116
+ ### Int to Nonterm
117
+ i2nt = [
118
+ :expr,
119
+ :term,
120
+ :fact,
121
+ ]
122
+ ### Goto Table
123
+ goto_table = [
124
+ [ 1, 2, 3, ],
125
+ [ nil, nil, nil, ],
126
+ [ nil, nil, nil, ],
127
+ [ nil, nil, nil, ],
128
+ [ nil, nil, nil, ],
129
+ [ 10, 2, 3, ],
130
+ [ nil, 11, 3, ],
131
+ [ nil, 12, 3, ],
132
+ [ nil, nil, 13, ],
133
+ [ nil, nil, 14, ],
134
+ [ nil, nil, nil, ],
135
+ [ nil, nil, nil, ],
136
+ [ nil, nil, nil, ],
137
+ [ nil, nil, nil, ],
138
+ [ nil, nil, nil, ],
139
+ [ nil, nil, nil, ],
140
+ ]
141
+
142
+
143
+ alias orig_error error
144
+ def error
145
+ orig_error
146
+ warn "current state: #{StateInfo[@stack.last]}"
147
+ end
148
+
149
+ ### States
150
+ StateInfo = [
151
+ <<'----------',
152
+ I000 =
153
+ ( 0) $start : _ expr
154
+
155
+ NUM shift, and goto to state 4
156
+ '(' shift, and goto to state 5
157
+
158
+
159
+ ----------
160
+
161
+ <<'----------',
162
+ I001 =
163
+ ( 0) $start : expr _
164
+ ( 1) expr : expr _ '+' term
165
+ ( 2) expr : expr _ '-' term
166
+
167
+ '+' shift, and goto to state 6
168
+ '-' shift, and goto to state 7
169
+
170
+
171
+ $end accept
172
+
173
+ ----------
174
+
175
+ <<'----------',
176
+ I002 =
177
+ ( 3) expr : term _
178
+ ( 4) term : term _ '*' fact
179
+ ( 5) term : term _ '/' fact
180
+
181
+ '*' shift, and goto to state 8
182
+ '/' shift, and goto to state 9
183
+
184
+ $default reduce using rule 3 (expr)
185
+
186
+ ----------
187
+
188
+ <<'----------',
189
+ I003 =
190
+ ( 6) term : fact _
191
+
192
+
193
+ $default reduce using rule 6 (term) [after shift]
194
+
195
+ ----------
196
+
197
+ <<'----------',
198
+ I004 =
199
+ ( 7) fact : NUM _
200
+
201
+
202
+ $default reduce using rule 7 (fact) [after shift]
203
+
204
+ ----------
205
+
206
+ <<'----------',
207
+ I005 =
208
+ ( 8) fact : '(' _ expr ')'
209
+
210
+ NUM shift, and goto to state 4
211
+ '(' shift, and goto to state 5
212
+
213
+
214
+ ----------
215
+
216
+ <<'----------',
217
+ I006 =
218
+ ( 1) expr : expr '+' _ term
219
+
220
+ NUM shift, and goto to state 4
221
+ '(' shift, and goto to state 5
222
+
223
+
224
+ ----------
225
+
226
+ <<'----------',
227
+ I007 =
228
+ ( 2) expr : expr '-' _ term
229
+
230
+ NUM shift, and goto to state 4
231
+ '(' shift, and goto to state 5
232
+
233
+
234
+ ----------
235
+
236
+ <<'----------',
237
+ I008 =
238
+ ( 4) term : term '*' _ fact
239
+
240
+ NUM shift, and goto to state 4
241
+ '(' shift, and goto to state 5
242
+
243
+
244
+ ----------
245
+
246
+ <<'----------',
247
+ I009 =
248
+ ( 5) term : term '/' _ fact
249
+
250
+ NUM shift, and goto to state 4
251
+ '(' shift, and goto to state 5
252
+
253
+
254
+ ----------
255
+
256
+ <<'----------',
257
+ I010 =
258
+ ( 8) fact : '(' expr _ ')'
259
+ ( 1) expr : expr _ '+' term
260
+ ( 2) expr : expr _ '-' term
261
+
262
+ '+' shift, and goto to state 6
263
+ '-' shift, and goto to state 7
264
+ ')' shift, and goto to state 15
265
+
266
+
267
+ ----------
268
+
269
+ <<'----------',
270
+ I011 =
271
+ ( 1) expr : expr '+' term _
272
+ ( 4) term : term _ '*' fact
273
+ ( 5) term : term _ '/' fact
274
+
275
+ '*' shift, and goto to state 8
276
+ '/' shift, and goto to state 9
277
+
278
+ $default reduce using rule 1 (expr)
279
+
280
+ ----------
281
+
282
+ <<'----------',
283
+ I012 =
284
+ ( 2) expr : expr '-' term _
285
+ ( 4) term : term _ '*' fact
286
+ ( 5) term : term _ '/' fact
287
+
288
+ '*' shift, and goto to state 8
289
+ '/' shift, and goto to state 9
290
+
291
+ $default reduce using rule 2 (expr)
292
+
293
+ ----------
294
+
295
+ <<'----------',
296
+ I013 =
297
+ ( 4) term : term '*' fact _
298
+
299
+
300
+ $default reduce using rule 4 (term) [after shift]
301
+
302
+ ----------
303
+
304
+ <<'----------',
305
+ I014 =
306
+ ( 5) term : term '/' fact _
307
+
308
+
309
+ $default reduce using rule 5 (term) [after shift]
310
+
311
+ ----------
312
+
313
+ <<'----------',
314
+ I015 =
315
+ ( 8) fact : '(' expr ')' _
316
+
317
+
318
+ $default reduce using rule 8 (fact) [after shift]
319
+
320
+ ----------
321
+ ]
322
+
323
+
324
+ Tables = [ reduce_table, nparams, action_table,
325
+ defred_table, defred_after_shift_table, goto_table,
326
+ t2i, i2t, nt2i, i2nt ]
327
+
328
+ def self.createDecoratedParser
329
+ D4TinyCalc::Action.new(D4TinyCalc::ASTBuilder.new(TinyCalc.new()))
330
+ end
331
+
332
+ ### Inner Code
333
+
334
+ def lex
335
+ begin
336
+ until @line.empty?
337
+ case @line
338
+
339
+ when /\A\s+/, /\A\#.*/, /\A\n/
340
+ @oldline = @line; @line = $'
341
+
342
+
343
+
344
+ when /\A[1-9][0-9]*/
345
+ @oldline = @line; @line = $'
346
+ yield _Token(:NUM, $&.to_i)
347
+
348
+
349
+ when /\A./
350
+ @oldline = @line; @line = $'
351
+ yield _Token($&, $&)
352
+
353
+
354
+ else
355
+ raise RuntimeError, "must not happen #{@line}"
356
+ end
357
+ end
358
+ end while @line0 = @line = getline
359
+ yield nil, nil
360
+ end
361
+
362
+ end
363
+
364
+ ### Outer Code
365
+
366
+ class Node
367
+ attr_accessor :lineno
368
+ attr_accessor :value
369
+
370
+ def initialize
371
+ @value = nil
372
+
373
+ end
374
+
375
+ def self.[] lineno, *args
376
+ self.new lineno, *args
377
+ end
378
+ def accept v
379
+ end
380
+ end
381
+ class NodeList < Node
382
+ attr_accessor :lineno
383
+ def initialize(lineno, lst=[])
384
+ @lineno = lineno
385
+ @lst = lst.to_a.select{|i| ! i.is_a?(NilNode)}
386
+ end
387
+
388
+ def all_value
389
+ @lst.map{|i| i.value}
390
+ end
391
+
392
+ def size
393
+ @lst.size
394
+ end
395
+ alias length size
396
+ def push(i)
397
+ @lst.push i unless i.is_a? NilNode
398
+ self
399
+ end
400
+ def concat(i)
401
+ @lst.concat i
402
+ self
403
+ end
404
+ def to_ary()
405
+ @lst
406
+ end
407
+ alias to_a to_ary
408
+ alias list to_ary
409
+ def accept(v)
410
+ @lst.each{|i| i.accept(v) }
411
+ end
412
+ end
413
+ class NilNode
414
+ attr_accessor :lineno
415
+ attr_accessor :value
416
+ def initialize(lineno, *args)
417
+ @lineno = lineno
418
+ end
419
+ def accept v
420
+ end
421
+ end
422
+
423
+
424
+ class Node_add < Node
425
+ attr_accessor :left, :right
426
+ attr_accessor
427
+ def initialize lineno, left, right
428
+ super()
429
+ @lineno = lineno
430
+ @lineno = lineno
431
+ @left = left
432
+ @right = right
433
+
434
+ end
435
+ def accept v
436
+ warn @lineno.to_s+':'+self.class.to_s if $DEBUG
437
+
438
+ v.visit_Node_add(self)
439
+ self
440
+ end
441
+ end
442
+
443
+ class Node_sub < Node
444
+ attr_accessor :left, :right
445
+ attr_accessor
446
+ def initialize lineno, left, right
447
+ super()
448
+ @lineno = lineno
449
+ @lineno = lineno
450
+ @left = left
451
+ @right = right
452
+
453
+ end
454
+ def accept v
455
+ warn @lineno.to_s+':'+self.class.to_s if $DEBUG
456
+
457
+ v.visit_Node_sub(self)
458
+ self
459
+ end
460
+ end
461
+
462
+ class Node_mul < Node
463
+ attr_accessor :left, :right
464
+ attr_accessor
465
+ def initialize lineno, left, right
466
+ super()
467
+ @lineno = lineno
468
+ @lineno = lineno
469
+ @left = left
470
+ @right = right
471
+
472
+ end
473
+ def accept v
474
+ warn @lineno.to_s+':'+self.class.to_s if $DEBUG
475
+
476
+ v.visit_Node_mul(self)
477
+ self
478
+ end
479
+ end
480
+
481
+ class Node_div < Node
482
+ attr_accessor :left, :right
483
+ attr_accessor
484
+ def initialize lineno, left, right
485
+ super()
486
+ @lineno = lineno
487
+ @lineno = lineno
488
+ @left = left
489
+ @right = right
490
+
491
+ end
492
+ def accept v
493
+ warn @lineno.to_s+':'+self.class.to_s if $DEBUG
494
+
495
+ v.visit_Node_div(self)
496
+ self
497
+ end
498
+ end
499
+
500
+ class Node_literal < Node
501
+ attr_accessor :n
502
+ attr_accessor :n
503
+ def initialize lineno, n
504
+ super()
505
+ @lineno = lineno
506
+ @lineno = lineno
507
+ @n = n
508
+
509
+ end
510
+ def accept v
511
+ warn @lineno.to_s+':'+self.class.to_s if $DEBUG
512
+
513
+ v.visit_Node_literal(self)
514
+ self
515
+ end
516
+ end
517
+
518
+ class Visitor
519
+ def visit node
520
+ node.accept(self)
521
+ end
522
+
523
+ module_eval <<-'.,.,120998293133008.,.,', 'sample_calc/calc.ast.action.dr', 19
524
+
525
+
526
+ .,.,120998293133008.,.,
527
+
528
+ module_eval <<-'.,.,120998293117496.,.,', 'sample_calc/calc.ast.action.dr', 19
529
+ def visit_Node_add node
530
+ node.value = visit(node.left).value + visit(node.right).value
531
+
532
+ rescue
533
+ warn "raise at src:#{node.lineno}/#{node.class.name}"
534
+ raise
535
+
536
+ end
537
+ .,.,120998293117496.,.,
538
+
539
+ module_eval <<-'.,.,120998293117798.,.,', 'sample_calc/calc.ast.action.dr', 20
540
+ def visit_Node_sub node
541
+ node.value = visit(node.left).value - visit(node.right).value
542
+
543
+ rescue
544
+ warn "raise at src:#{node.lineno}/#{node.class.name}"
545
+ raise
546
+
547
+ end
548
+ .,.,120998293117798.,.,
549
+
550
+ module_eval <<-'.,.,120998293122558.,.,', 'sample_calc/calc.ast.action.dr', 21
551
+ def visit_Node_mul node
552
+ node.value = visit(node.left).value * visit(node.right).value
553
+
554
+ rescue
555
+ warn "raise at src:#{node.lineno}/#{node.class.name}"
556
+ raise
557
+
558
+ end
559
+ .,.,120998293122558.,.,
560
+
561
+ module_eval <<-'.,.,120998293153267.,.,', 'sample_calc/calc.ast.action.dr', 22
562
+ def visit_Node_div node
563
+ node.value = visit(node.left).value / visit(node.right).value
564
+
565
+ rescue
566
+ warn "raise at src:#{node.lineno}/#{node.class.name}"
567
+ raise
568
+
569
+ end
570
+ .,.,120998293153267.,.,
571
+
572
+ module_eval <<-'.,.,12099829314264.,.,', 'sample_calc/calc.ast.action.dr', 23
573
+ def visit_Node_literal node
574
+ node.value = node.n.value
575
+
576
+ rescue
577
+ warn "raise at src:#{node.lineno}/#{node.class.name}"
578
+ raise
579
+
580
+ end
581
+ .,.,12099829314264.,.,
582
+
583
+ end
584
+
585
+ class D4TinyCalc::ASTBuilder < Depager::LALR::Action #:nodoc:all
586
+ include Depager::DecoratorUtils
587
+ []
588
+ on_reduce = [
589
+ nil,
590
+ :_ast_0,
591
+ :_ast_1,
592
+ :_ast_2,
593
+ :_ast_3,
594
+ :_ast_4,
595
+ :_ast_5,
596
+ :_ast_6,
597
+ :_ast_7,
598
+
599
+ ]
600
+ Tables = [on_reduce]
601
+ def initialize inside
602
+ super inside, 'ASTBuilder'
603
+ @on_reduce, = self.class::Tables
604
+ init_parser
605
+ end
606
+
607
+
608
+ module_eval <<-'.,.,120998293152228.,.,', 'sample_calc/calc.ast.action.dr', 29
609
+ def _ast_0 val
610
+ Node_add.new(val[0].lineno, val[0], val[2])
611
+ end
612
+ .,.,120998293152228.,.,
613
+
614
+ module_eval <<-'.,.,120998293150297.,.,', 'sample_calc/calc.ast.action.dr', 32
615
+ def _ast_1 val
616
+ Node_sub.new(val[0].lineno, val[0], val[2])
617
+ end
618
+ .,.,120998293150297.,.,
619
+
620
+ module_eval <<-'.,.,120998293136559.,.,', 'sample_calc/calc.ast.action.dr', 35
621
+ def _ast_2 val
622
+ val[0]
623
+ end
624
+ .,.,120998293136559.,.,
625
+
626
+ module_eval <<-'.,.,120998293148223.,.,', 'sample_calc/calc.ast.action.dr', 40
627
+ def _ast_3 val
628
+ Node_mul.new(val[0].lineno, val[0], val[2])
629
+ end
630
+ .,.,120998293148223.,.,
631
+
632
+ module_eval <<-'.,.,120998293116882.,.,', 'sample_calc/calc.ast.action.dr', 43
633
+ def _ast_4 val
634
+ Node_div.new(val[0].lineno, val[0], val[2])
635
+ end
636
+ .,.,120998293116882.,.,
637
+
638
+ module_eval <<-'.,.,120998293121576.,.,', 'sample_calc/calc.ast.action.dr', 46
639
+ def _ast_5 val
640
+ val[0]
641
+ end
642
+ .,.,120998293121576.,.,
643
+
644
+ module_eval <<-'.,.,120998293134763.,.,', 'sample_calc/calc.ast.action.dr', 51
645
+ def _ast_6 val
646
+ Node_literal.new(val[0].lineno, val[0])
647
+ end
648
+ .,.,120998293134763.,.,
649
+
650
+ module_eval <<-'.,.,120998293114095.,.,', 'sample_calc/calc.ast.action.dr', 54
651
+ def _ast_7 val
652
+ val[1]
653
+ end
654
+ .,.,120998293114095.,.,
655
+
656
+ end
657
+
658
+ class D4TinyCalc::Action < Depager::LALR::Action #:nodoc:all
659
+ include Depager::DecoratorUtils
660
+ [" include Depager\n"]
661
+ on_reduce = [
662
+ nil,
663
+ :_act_0,
664
+ :_act_1,
665
+ :_act_2,
666
+ :_act_3,
667
+ :_act_4,
668
+ :_act_5,
669
+ :_act_6,
670
+ :_act_7,
671
+
672
+ ]
673
+ Tables = [on_reduce]
674
+ def initialize inside
675
+ super inside, 'Action'
676
+ @on_reduce, = self.class::Tables
677
+ init_parser
678
+ end
679
+
680
+
681
+ module_eval <<-'.,.,120998293112277.,.,', 'sample_calc/calc.ast.action.dr', 30
682
+ def _act_0 val
683
+ val[0] + val[2]
684
+
685
+ end
686
+ .,.,120998293112277.,.,
687
+
688
+ module_eval <<-'.,.,12099829311590.,.,', 'sample_calc/calc.ast.action.dr', 33
689
+ def _act_1 val
690
+ val[0] - val[2]
691
+
692
+ end
693
+ .,.,12099829311590.,.,
694
+
695
+ module_eval <<-'.,.,120998293160717.,.,', 'sample_calc/calc.ast.action.dr', 36
696
+ def _act_2 val
697
+ val[0]
698
+
699
+ end
700
+ .,.,120998293160717.,.,
701
+
702
+ module_eval <<-'.,.,120998293161791.,.,', 'sample_calc/calc.ast.action.dr', 41
703
+ def _act_3 val
704
+ val[0] * val[2]
705
+
706
+ end
707
+ .,.,120998293161791.,.,
708
+
709
+ module_eval <<-'.,.,120998293126570.,.,', 'sample_calc/calc.ast.action.dr', 44
710
+ def _act_4 val
711
+ val[0] / val[2]
712
+
713
+ end
714
+ .,.,120998293126570.,.,
715
+
716
+ module_eval <<-'.,.,120998293164676.,.,', 'sample_calc/calc.ast.action.dr', 47
717
+ def _act_5 val
718
+ val[0]
719
+
720
+ end
721
+ .,.,120998293164676.,.,
722
+
723
+ module_eval <<-'.,.,120998293119648.,.,', 'sample_calc/calc.ast.action.dr', 52
724
+ def _act_6 val
725
+ val[0].value
726
+
727
+ end
728
+ .,.,120998293119648.,.,
729
+
730
+ module_eval <<-'.,.,120998293146539.,.,', 'sample_calc/calc.ast.action.dr', 55
731
+ def _act_7 val
732
+ val[1].value
733
+
734
+ end
735
+ .,.,120998293146539.,.,
736
+
737
+ end
738
+
739
+
740
+ def createDecoratedTinyCalc
741
+ D4TinyCalc::Action.new(D4TinyCalc::ASTBuilder.new(TinyCalc.new()))
742
+ end
743
+
744
+ ### main
745
+ if __FILE__ == $0
746
+ ### Main Code
747
+ require 'pp'
748
+ parser = createDecoratedTinyCalc()
749
+ t, r = parser.yyparse(STDIN)
750
+ v = Visitor.new
751
+ pp r
752
+ pp t.accept(v).value
753
+ pp t
754
+
755
+ end