depager 0.2.3 → 0.3.0.b20160729

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +7 -0
  2. data/README.en +4 -19
  3. data/README.ja +42 -79
  4. data/bin/depager +42 -45
  5. data/examples/action_pl0d/pl0d.action.dr +421 -0
  6. data/examples/action_pl0d/test.pl0ds +49 -0
  7. data/examples/c89/c89.dr +493 -496
  8. data/examples/c89/test.c89 +10 -10
  9. data/examples/extension/astdf.rb +10 -0
  10. data/examples/extension/atree.dr +55 -0
  11. data/examples/{sample_calc → extension}/calc.atree.dr +42 -43
  12. data/examples/extension/calc.simple_action.dr +33 -0
  13. data/examples/extension/paction.dr +16 -15
  14. data/examples/extension/pactiontest.dr +14 -14
  15. data/examples/extension/simple_action.rb +44 -0
  16. data/examples/pl0d/pl0ds.dr +337 -334
  17. data/examples/pl0d/test.pl0ds +33 -33
  18. data/examples/rie_calc/calc.rie.dr +57 -0
  19. data/examples/rie_calc/test.calc +4 -0
  20. data/examples/rie_dcuse/dcuse.rie.dr +71 -0
  21. data/examples/rie_dcuse/test.dcuse +1 -0
  22. data/examples/rie_pl0/orig_ex/exerrdg.pl0 +44 -0
  23. data/examples/rie_pl0/orig_ex/exerrm.pl0 +19 -0
  24. data/examples/rie_pl0/orig_ex/exerrmre.pl0 +20 -0
  25. data/examples/rie_pl0/orig_ex/exerrtok.pl0 +18 -0
  26. data/examples/rie_pl0/orig_ex/exmdg.pl0 +40 -0
  27. data/examples/rie_pl0/orig_ex/exmdgwwl.pl0 +43 -0
  28. data/examples/rie_pl0/orig_ex/exmrw.pl0 +22 -0
  29. data/examples/rie_pl0/orig_ex/exmwwl.pl0 +18 -0
  30. data/examples/rie_pl0/orig_ex/exnorw.pl0 +17 -0
  31. data/examples/rie_pl0/pl0.rie.dr +450 -0
  32. data/examples/rie_pl0/test.pl0 +10 -0
  33. data/examples/sample_calc/calc.action.dr +33 -33
  34. data/examples/sample_calc/calc.ast.action.dr +65 -66
  35. data/examples/sample_calc/calc.ast.dr +55 -55
  36. data/examples/sample_calc/calc.cst.dr +45 -45
  37. data/examples/sample_calc/calc.dr +43 -43
  38. data/examples/sample_calc/calc.lex.dr +29 -29
  39. data/examples/sample_calc/{calc_prec.nvaction.dr → calc_prec.action.dr} +31 -31
  40. data/examples/slex_test/divreg.slex.dr +29 -29
  41. data/examples/slex_test/ljoin.slex.dr +36 -36
  42. data/examples/slex_test/test.divreg +1 -1
  43. data/examples/slex_test/test.ljoin +3 -3
  44. data/lib/depager.rb +582 -670
  45. data/lib/depager/grammar.rb +256 -291
  46. data/lib/depager/lr.rb +574 -579
  47. data/lib/depager/parser.rb +282 -277
  48. data/lib/depager/ruby/plugins/_rie_debug.rb +35 -0
  49. data/lib/depager/ruby/plugins/action.rb +53 -43
  50. data/lib/depager/ruby/plugins/ast.dr +364 -269
  51. data/lib/depager/ruby/plugins/ast.rb +1367 -1308
  52. data/lib/depager/ruby/plugins/cst.dr +172 -180
  53. data/lib/depager/ruby/plugins/cst.rb +587 -626
  54. data/lib/depager/ruby/plugins/lex.dr +85 -89
  55. data/lib/depager/ruby/plugins/lex.rb +310 -336
  56. data/lib/depager/ruby/plugins/rie.dr +723 -0
  57. data/lib/depager/ruby/plugins/rie.rb +1653 -0
  58. data/lib/depager/ruby/plugins/slex.dr +202 -200
  59. data/lib/depager/ruby/plugins/slex.rb +780 -817
  60. data/lib/depager/ruby/plugins/srp.rb +56 -51
  61. data/lib/depager/ruby/templates/extension_lalr_master.erb +46 -51
  62. data/lib/depager/ruby/templates/extension_lalr_slave.erb +99 -107
  63. data/lib/depager/ruby/templates/single_lalr_parser.erb +115 -117
  64. data/lib/depager/utils.rb +148 -318
  65. data/lib/depager/version.rb +4 -3
  66. metadata +52 -60
  67. data/ChangeLog +0 -16
  68. data/data/depager/pre-setup.rb +0 -3
  69. data/examples/c89/c89.tab.rb +0 -7127
  70. data/examples/pl0d/pl0ds.tab.rb +0 -2698
  71. data/examples/sample_calc/calc.action.tab.rb +0 -457
  72. data/examples/sample_calc/calc.ast.action.tab.rb +0 -749
  73. data/examples/sample_calc/calc.ast.tab.rb +0 -665
  74. data/examples/sample_calc/calc.astdf.dr +0 -54
  75. data/examples/sample_calc/calc.astdf.tab.rb +0 -672
  76. data/examples/sample_calc/calc.atree.tab.rb +0 -451
  77. data/examples/sample_calc/calc.cst.tab.rb +0 -644
  78. data/examples/sample_calc/calc.lex.tab.rb +0 -374
  79. data/examples/sample_calc/calc.nvaction.dr +0 -33
  80. data/examples/sample_calc/calc.nvaction.tab.rb +0 -465
  81. data/examples/sample_calc/calc.tab.rb +0 -365
  82. data/examples/sample_calc/calc_prec.nvaction.tab.rb +0 -431
  83. data/examples/slex_test/divreg.slex.tab.rb +0 -303
  84. data/examples/slex_test/ljoin.slex.tab.rb +0 -370
  85. data/lib/depager/ruby/plugins/_ast_tmpl.rb +0 -73
  86. data/lib/depager/ruby/plugins/astdf.rb +0 -6
  87. data/lib/depager/ruby/plugins/atree.dr +0 -55
  88. data/lib/depager/ruby/plugins/atree.rb +0 -347
  89. data/lib/depager/ruby/plugins/nvaction.rb +0 -19
  90. data/lib/depager/ruby/templates/simple.erb +0 -23
  91. data/setup.rb +0 -1585
@@ -1,51 +1,56 @@
1
- class ShiftReducePrinter < Depager::LALR::AdvancedParser
2
- def initialize inside
3
- super
4
- @i2nt, @i2t = @basis.i2nt, @basis.i2t
5
- end
6
- def dumpstack stack
7
- r = ''
8
- _stack.each_with_index do |v,x|
9
- r += if x % 2 == 0
10
- "(#{v}) "
11
- else
12
- if v[1] == :NT
13
- "#{@i2nt[v[0]]}:#{v[1..-1].inspect} "
14
- elsif @i2t[v[0]].class == String
15
- "'#{@i2t[v[0]]}':#{v[1..-1].inspect}"
16
- else
17
- "#{@i2t[v[0]]}:#{v[1..-1].inspect} "
18
- end
19
- end
20
- end
21
- r
22
- end
23
- def after_shift
24
- st0 = _stack[_stack.size-3]
25
- st = _stack.last
26
- sh = @i2t[_stack[_stack.size-2][0]]
27
- la = @i2t[_lookahead[0]]
28
- warn "LA:<#{la}> shift:<#{sh}> state:#{st0}->#{st}"
29
- warn "LINE:<#{@basis.line}>"
30
- warn dumpstack(_stack) + "\n"
31
- end
32
- def after_reduce
33
- st = _stack.last
34
- re = @i2nt[_stack[_stack.size-2][0]]
35
- la = @i2t[_lookahead[0]]
36
- warn "LA:<#{la}> reduce:<#{re}> state: ->#{st}"
37
- warn "LINE:<#{@basis.line}>"
38
- warn dumpstack(_stack) + "\n"
39
- end
40
- def after_accept
41
- warn "acc."
42
- end
43
- def after_error
44
- st = _stack.last
45
- re = @i2nt[_stack[_stack.size-2][0]]
46
- la = @i2t[_lookahead[0]]
47
- warn "LA:<#{la}> last_state:#{st}"
48
- warn "LINE:<#{@basis.line}>"
49
- warn dumpstack(_stack) + "\n"
50
- end
51
- end
1
+ # -*- coding: utf-8 -*-
2
+ class Depager::LALR::ShiftReducePrinter < Depager::LALR::AdvancedParser
3
+ def initialize inside
4
+ super
5
+ end
6
+
7
+ def dumpstack stack
8
+ result = ''
9
+ stack.each_with_index do |v, x|
10
+ result += if x % 2 == 0
11
+ "(#{v}) "
12
+ else
13
+ if v[1] == :NT
14
+ "#{int_to_nonterm[v[0]]}:#{v[1..-1].inspect} "
15
+ elsif int_to_term[v[0]].class == String
16
+ "'#{int_to_term[v[0]]}':#{v[1..-1].inspect}"
17
+ else
18
+ "#{int_to_term[v[0]]}:#{v[1..-1].inspect} "
19
+ end
20
+ end
21
+ end
22
+ result
23
+ end
24
+
25
+ def after_shift
26
+ st0 = stack[stack.size - 3]
27
+ st = stack.last
28
+ sh = int_to_term[stack[stack.size - 2][0]]
29
+ la = int_to_term[lookahead[0]]
30
+ warn "LA:<#{la}> shift:<#{sh}> state:#{st0}->#{st}"
31
+ warn "LINE:<#{basis.line}>"
32
+ warn dumpstack(stack) + "\n"
33
+ end
34
+
35
+ def after_reduce
36
+ st = stack.last
37
+ re = int_to_nonterm[stack[stack.size - 2][0]]
38
+ la = int_to_term[lookahead[0]]
39
+ warn "LA:<#{la}> reduce:<#{re}> state: ->#{st}"
40
+ warn "LINE:<#{basis.line}>"
41
+ warn dumpstack(stack) + "\n"
42
+ end
43
+
44
+ def after_accept
45
+ warn "acc."
46
+ end
47
+
48
+ def after_error
49
+ st = stack.last
50
+ re = int_to_nonterm[stack[stack.size - 2][0]]
51
+ la = int_to_term[lookahead[0]]
52
+ warn "LA:<#{la}> last_state:#{st}"
53
+ warn "LINE:<#{basis.line}>"
54
+ warn dumpstack(stack) + "\n"
55
+ end
56
+ end
@@ -1,51 +1,46 @@
1
- <%
2
- target_name = @d_parser.target_name
3
- optouter = @optouter.join
4
- optinner = @optinner.join
5
- optmain = @optmain.join
6
- req = @req.uniq
7
- paramkey = @paramkey || ":default"
8
- regs = @regs
9
- mixin = @mixin.uniq
10
- %>
11
- ###
12
- ### <%=target_name%> - Depager Extension (master)
13
- ###
14
- require 'pp.rb'
15
- require 'depager/parser.rb'
16
- <%req.each do |i|%>require <%=i%>
17
- <%end%>
18
-
19
- module D4<%= target_name %> #:nodoc:all
20
- end
21
-
22
- class <%= target_name %> #:nodoc:all
23
- include Depager::ExtensionUtils
24
- <% mixin.each do |i| %>
25
- include <%=i%><%end%>
26
- attr_accessor :h2p
27
-
28
- def initialize
29
- @master = self
30
- @hook = []
31
- @h2p = {}
32
- init_parser
33
- end
34
-
35
- def __regext__ p
36
- super p, <%= paramkey %>, nil
37
- <% x = 0; h = {}; regs.each do |i, m| %>
38
- <% unless h[m] %>@hook[<%=x%>] = <%= m %>.new(p, @nparam, self)<%h[m]=x%>
39
- @h2p['<%= m.sub(/#{target_name}_/,'')%>'] = @hook[<%=h[m]%>] <%else
40
- %># use @hook[<%=h[m]%>](<%=m%>)<%end%>
41
- p.hooks[:<%=i%>].push [@hook[<%=h[m]%>], :do_parse]
42
- <% x+=1; end %>
43
- regext p
44
- end
45
-
46
- ### Inner Code
47
- <%= optinner %>
48
- end
49
-
50
- ### Outer Code
51
- <%= optouter %>
1
+ # -*- coding: utf-8 -*-
2
+
3
+ ###
4
+ ### <%= d_parser.target_namespace %> - Depager Extension (master)
5
+ ###
6
+ require 'depager/parser.rb'
7
+
8
+ <%- @requirements.each do |i| -%>
9
+ require <%= i %>
10
+ <%- end -%>
11
+
12
+ <%- r = ''; d_parser.target_namespace.split('::')[0..-2].each do |i| -%>
13
+ module <%= "#{r}#{i}" %> ; end
14
+ <%- r << "#{i}::"-%>
15
+ <%- end -%>
16
+
17
+ class <%= d_parser.target_namespace %> < Depager::Extension
18
+ <%- @mixins.uniq.each do |i| -%>
19
+ include <%= i %>
20
+ <%- end -%>
21
+
22
+ def initialize
23
+ @master = self
24
+ @slaves = []
25
+ end
26
+
27
+ def extension_registered g_parser
28
+ super g_parser
29
+
30
+ <%- x = 0; h = {}; -%>
31
+ <%- @slaves.each do |i, m| -%>
32
+ <%- unless h[m] -%>
33
+ @slaves[<%= x %>] = <%= m %>.new(g_parser, self)
34
+ <%- h[m] = x -%>
35
+ <%- else -%>
36
+ # use @slaves[<%= h[m] %>](<%= m %>)
37
+ <%- end -%>
38
+ g_parser.hooks[:<%= i %>].push [@slaves[<%= h[m] %>], :do_parse]
39
+ <%- x += 1; -%>
40
+ <%- end -%>
41
+ end
42
+
43
+ <%= @inner_code %>
44
+ end
45
+
46
+ <%= @outer_code %>
@@ -1,107 +1,99 @@
1
- <%
2
- target_name = g_parser.target_name
3
- table = g_parser.table
4
- g = table.grammar
5
- rulelist = g.rulelist
6
- t2i = (g.nonterms.size ... g.syms.size).map{|i| [ g.syms[i].inspect, i - g.nonterms.size] }
7
- nt2i = (1 ... g.nonterms.size).map{|i| [ ":#{g.syms[i]}", i-1] }
8
- taction = table.action_table
9
- tgoto = table.goto_table
10
- tdefred = table.defred_table
11
- tdefreds = table.defred_after_shift_table
12
- optouter = g_parser.optouter.join
13
- optinner = g_parser.optinner.join
14
- optmain = g_parser.optmain.join
15
- nparams = g_parser.nparams
16
- decparser = @deco.inject(@basis_name) { |r, i|
17
- "#{i.sub(/^@/, "D4#{target_name}::")}.new(#{r})"
18
- }
19
- banner ||= target_name
20
- mixin = mixin.uniq
21
- %>
22
- ###
23
- ### <%=target_name%> - Part of Depager Extension (slave)
24
- ###
25
- module D4<%= target_name %> #:nodoc:all
26
- end
27
-
28
- class <%= target_name %> < Depager::LALR::Basis #:nodoc:all
29
- include Depager::ExtensionUtils
30
- <% mixin.each do |i| %>
31
- include <%=i%><%end%>
32
-
33
- ### Reduce Table
34
- reduce_table = [<% rulelist.each do |i| %>
35
- [ <%= i.lhs - 1%>, <%= i.rhs.size %> ],<% end %>
36
- ]
37
- ### Extension Params
38
- nparams = {<% nparams.each do |c, i| %>
39
- '<%= c %>' => <%= i %>, <% end %>
40
- }
41
- ### Term to Int
42
- t2i = {<% t2i.each do |k, v| %>
43
- <%= k %> => <%= v %>, <% end %>
44
- }
45
- ### Int to Term
46
- i2t = [<% t2i.each do |k, v| %>
47
- <%= k %>, <% end %>
48
- ]
49
- ### Action Table
50
- action_table = [<% taction.each do |i| %>
51
- [ <% i.each do |j| %><%= j ? "#{j}" : 'nil' %>, <% end %>], <% end %>
52
- ]
53
- ### Default Reduce Table
54
- defred_table = [<% tdefred.each do |i| %>
55
- <%= i ? "#{i}" : 'nil' %>, <% end %>
56
- ]
57
- defred_after_shift_table = [<% tdefreds.each do |i| %>
58
- <%= i ? "#{i}" : 'nil' %>, <% end %>
59
- ]
60
- ### Nonterm to Int
61
- nt2i = {<% nt2i.each do |k, v| %>
62
- <%= k %> => <%= v %>, <% end %>
63
- }
64
- ### Int to Nonterm
65
- i2nt = [<% nt2i.each do |k, v| %>
66
- <%= k %>, <% end %>
67
- ]
68
- ### Goto Table
69
- goto_table = [ <% tgoto.each do |i| %>
70
- [ <% i.each do |j| %><%= j ? "#{j}" : 'nil' %>, <% end %>], <% end %>
71
- ]
72
-
73
- Tables = [ reduce_table, nparams, action_table,
74
- defred_table, defred_after_shift_table, goto_table,
75
- t2i, i2t, nt2i, i2nt ]
76
-
77
- attr_accessor :p, :m
78
- def initialize p, nparam, master = nil
79
- super()
80
- @g_parser = @p = p
81
- @master = @m = master
82
- @nparam = nparam
83
- @dect = <%=decparser%>
84
- init_parser
85
- end
86
-
87
- <% if mtsk %>
88
- def do_parse?
89
- if @line =~ /^\s*<%= mtsk[0] %>/
90
- <% if mtsk[1] %> @line = $' <% end %>
91
- true
92
- else
93
- false
94
- end
95
- end
96
- <% end %>
97
-
98
- def banner
99
- "<%= banner %> / #{@master.class.name}"
100
- end
101
-
102
- ### Inner Code
103
- <%= optinner %>
104
- end
105
-
106
- ### Outer Code
107
- <%= optouter %>
1
+ <%- g = g_parser.table.grammar -%>
2
+ ###
3
+ ### <%= target_namespace %> - Part of Depager Extension (slave)
4
+ ###
5
+
6
+ module <%= target_namespace %> #:nodoc:all
7
+ class <%= target_name %> < Depager::LALR::Basis #:nodoc:all
8
+ include Depager::Utils::ExtensionSlaveMethods
9
+ <% @slave_mixins.uniq.each do |i| %>
10
+ include <%=i%><%end%>
11
+
12
+ ### Reduce Table
13
+ reduce_table = [
14
+ <%- g_parser.table.grammar.rulelist.each do |i| -%>
15
+ [ <%= i.lhs - 1%>, <%= i.rhs.size %> ],
16
+ <%- end -%>
17
+ ]
18
+ ### Term to Int
19
+ <%- values = (g.nonterms.size ... g.syms.size).map{|i| [ g.syms[i].inspect, i - g.nonterms.size] } -%>
20
+ term_to_int = {
21
+ <%- values.each do |k, v| -%>
22
+ <%= k %> => <%= v %>,
23
+ <%- end -%>
24
+ }
25
+ ### Int to Term
26
+ int_to_term = [
27
+ <%- values.each do |k, v| -%>
28
+ <%= k %>,
29
+ <%- end -%>
30
+ ]
31
+ ### Action Table
32
+ action_table = [
33
+ <%- g_parser.table.action_table.each do |i| -%>
34
+ [ <% i.each do |j| %><%= j ? "#{j}" : 'nil' %>, <% end %>],
35
+ <%- end -%>
36
+ ]
37
+ ### Default Reduce Table
38
+ defred_table = [
39
+ <%- g_parser.table.defred_table.each do |i| -%>
40
+ <%= i ? "#{i}" : 'nil' %>,
41
+ <%- end -%>
42
+ ]
43
+ defred_after_shift_table = [
44
+ <%- g_parser.table.defred_after_shift_table.each do |i| -%>
45
+ <%= i ? "#{i}" : 'nil' %>,
46
+ <%- end -%>
47
+ ]
48
+ ### Nonterm to Int
49
+ <%- values = (1 ... g.nonterms.size).map{|i| [ ":#{g.syms[i]}", i-1] } -%>
50
+ nonterm_to_int = {
51
+ <%- values.each do |k, v| -%>
52
+ <%= k %> => <%= v %>,
53
+ <%- end -%>
54
+ }
55
+ ### Int to Nonterm
56
+ int_to_nonterm = [
57
+ <%- values.each do |k, v| -%>
58
+ <%= k %>,
59
+ <%- end -%>
60
+ ]
61
+ ### Goto Table
62
+ goto_table = [
63
+ <%- g_parser.table.goto_table.each do |i| -%>
64
+ [ <% i.each do |j| %><%= j ? "#{j}" : 'nil' %>, <% end %>],
65
+ <%- end -%>
66
+ ]
67
+
68
+ Tables = [ reduce_table, action_table,
69
+ defred_table, defred_after_shift_table, goto_table,
70
+ term_to_int, int_to_term, nonterm_to_int, int_to_nonterm ]
71
+
72
+ def initialize g_parser, master
73
+ super()
74
+ @g_parser = g_parser
75
+ @d_parser = g_parser.d_parser
76
+ @master = master
77
+ @decorated = <%= @decorators.inject('self'){|r, i| "#{i.sub(/^@/, '')}.new(#{r})" } %>
78
+ end
79
+
80
+ <% if @do_parse_re %>
81
+ def do_parse?
82
+ if @line.match(/^\s*<%= @do_parse_re %>/)
83
+ <% if @do_parse_skip %> @line = $' <% end %>
84
+ true
85
+ else
86
+ false
87
+ end
88
+ end
89
+ <% end %>
90
+
91
+ def banner
92
+ "<%= @banner %> / <%= d_parser.target_namespace %>"
93
+ end
94
+
95
+ <%= g_parser.inner_code %>
96
+ end
97
+ end
98
+
99
+ <%= g_parser.outer_code %>
@@ -1,117 +1,115 @@
1
- <%
2
- target_name = g_parser.target_name
3
- table = g_parser.table
4
- g = table.grammar
5
- nparams = g_parser.nparams
6
- rulelist = g.rulelist
7
- t2i = (g.nonterms.size ... g.syms.size).map{|i| [ g.syms[i].inspect, i - g.nonterms.size] }
8
- nt2i = (1 ... g.nonterms.size).map{|i| [ ":#{g.syms[i]}", i-1] }
9
- taction = table.action_table
10
- tgoto = table.goto_table
11
- tdefred = table.defred_table
12
- tdefreds = table.defred_after_shift_table
13
- optouter = (@optouter + g_parser.optouter).join
14
- optinner = (@optinner + g_parser.optinner).join
15
- optmain = @optmain.join
16
- decparser = @deco.inject(@basis_name) { |r, i|
17
- "#{i.sub(/^@/, "D4#{target_name}::")}.new(#{r})"
18
- }
19
- req = @req.uniq
20
- mixin = @mixin
21
- req_rt = if @dr_option['embed_runtime']
22
- File.read File.expand_path("#{Depager::Tmpldir}/../parser.rb")
23
- else
24
- "require 'depager/parser.rb'"
25
- end
26
- %>
27
- begin; require 'rubygems'; rescue Exception; end
28
- <%= req_rt %>
29
- <%req.each do |i|%>require <%=i%>
30
- <%end%>
31
-
32
- module Depager::DecoratorUtils; end
33
- module D4<%= target_name %>; end
34
-
35
- class <%= target_name %> < Depager::LALR::Basis
36
- <% mixin.each do |i| %>
37
- include <%=i%><%end%>
38
-
39
- ### Reduce Table
40
- reduce_table = [<% rulelist.each do |i| %>
41
- [ <%= '%04s'%(i.lhs - 1)%>, <%= "%04s"%i.rhs.size %> ], # <%= i %><% end %>
42
- ]
43
- ### Extension Params
44
- nparams = {<% nparams.each do |c, i| %>
45
- '<%= c %>' => <%= i %>, <% end %>
46
- }
47
- ### Term to Int
48
- t2i = {<% t2i.each do |k, v| %>
49
- <%= k %> => <%= v %>, <% end %>
50
- }
51
- ### Int to Term
52
- i2t = [<% t2i.each do |k, v| %>
53
- <%= k %>, <% end %>
54
- ]
55
- ### Action Table
56
- action_table = [<% taction.each do |i| %>
57
- [ <% i.each do |j| %><%= j ? "#{j}" : 'nil' %>, <% end %>], <% end %>
58
- ]
59
- ### Default Reduce Table
60
- defred_table = [<% tdefred.each do |i| %>
61
- <%= i ? "#{i}" : 'nil' %>, <% end %>
62
- ]
63
- defred_after_shift_table = [<% tdefreds.each do |i| %>
64
- <%= i ? "#{i}" : 'nil' %>, <% end %>
65
- ]
66
- ### Nonterm to Int
67
- nt2i = {<% nt2i.each do |k, v| %>
68
- <%= k %> => <%= v %>, <% end %>
69
- }
70
- ### Int to Nonterm
71
- i2nt = [<% nt2i.each do |k, v| %>
72
- <%= k %>, <% end %>
73
- ]
74
- ### Goto Table
75
- goto_table = [ <% tgoto.each do |i| %>
76
- [ <% i.each do |j| %><%= j ? "#{j}" : 'nil' %>, <% end %>], <% end %>
77
- ]
78
-
79
- <% if $MP_DEBUG %>
80
- alias orig_error error
81
- def error
82
- orig_error
83
- warn "current state: #{StateInfo[@stack.last]}"
84
- end
85
-
86
- ### States
87
- StateInfo = [ <% table.state_info.each do |s| %>
88
- <<'----------',
89
- <%=s.chomp%>
90
- ----------
91
- <% end %>]
92
- <% end %>
93
-
94
- Tables = [ reduce_table, nparams, action_table,
95
- defred_table, defred_after_shift_table, goto_table,
96
- t2i, i2t, nt2i, i2nt ]
97
-
98
- def self.createDecoratedParser
99
- <%= decparser %>
100
- end
101
-
102
- ### Inner Code
103
- <%= optinner %>
104
- end
105
-
106
- ### Outer Code
107
- <%= optouter %>
108
-
109
- def createDecorated<%= target_name %>
110
- <%= decparser %>
111
- end
112
-
113
- ### main
114
- if __FILE__ == $0
115
- ### Main Code
116
- <%= optmain %>
117
- end
1
+ # -*- coding: utf-8 -*-
2
+ <%- g = g_parser.table.grammar -%>
3
+ begin
4
+ require 'rubygems'
5
+ rescue LoadError
6
+ end
7
+
8
+ <%- if Depager.configuration[:embed_runtime] -%>
9
+ <%= File.read File.expand_path("#{Depager::TEMPLATES_DIR}/../parser.rb") %>
10
+ <%- else -%>
11
+ require 'depager/parser.rb'
12
+ <%- end -%>
13
+
14
+ <%- @requirements.uniq.each do |i| -%>
15
+ require <%=i%>
16
+ <%- end -%>
17
+
18
+ <%- r = ''; target_namespace.split('::')[0..-2].each do |i| -%>
19
+ module <%= "#{r}#{i}" %> ; end
20
+ <%- r << "#{i}::"-%>
21
+ <%- end-%>
22
+
23
+ module <%= target_namespace %>
24
+ def self.create_decorated_parser(*args)
25
+ basis = <%= target_name %>.new(*args)
26
+ <%= @decorators.inject("basis"){|r, i| "#{i.tr('@', '') }.new(#{r})" } %>
27
+ end
28
+
29
+ class <%= target_name %> < Depager::LALR::Basis
30
+ <%- @mixins.each do |i| -%>
31
+ include <%= i %>
32
+ <%- end -%>
33
+
34
+ ### Reduce Table
35
+ reduce_table = [
36
+ <%- g_parser.table.grammar.rulelist.each do |i| -%>
37
+ [ <%= '%04s' % (i.lhs - 1)%>, <%= "%04s" % i.rhs.size %> ], # <%= i %>
38
+ <%- end -%>
39
+ ]
40
+ ### Term to Int
41
+ <%- values = (g.nonterms.size ... g.syms.size).map{|i| [ g.syms[i].inspect, i - g.nonterms.size] } -%>
42
+ term_to_int = {
43
+ <%- values.each do |k, v| -%>
44
+ <%= k %> => <%= v %>,
45
+ <%- end -%>
46
+ }
47
+ ### Int to Term
48
+ int_to_term = [
49
+ <%- values.each do |k, v| -%>
50
+ <%= k %>,
51
+ <%- end -%>
52
+ ]
53
+ ### Action Table
54
+ action_table = [
55
+ <%- g_parser.table.action_table.each do |i| -%>
56
+ [ <% i.each do |j| %><%= j ? "#{j}" : 'nil' %>, <% end %>],
57
+ <%- end -%>
58
+ ]
59
+ ### Default Reduce Table
60
+ defred_table = [
61
+ <%- g_parser.table.defred_table.each do |i| -%>
62
+ <%= i ? "#{i}" : 'nil' %>,
63
+ <%- end -%>
64
+ ]
65
+ defred_after_shift_table = [
66
+ <%- g_parser.table.defred_after_shift_table.each do |i| -%>
67
+ <%= i ? "#{i}" : 'nil' %>,
68
+ <%- end -%>
69
+ ]
70
+ ### Nonterm to Int
71
+ <%- values = (1 ... g.nonterms.size).map{|i| [ ":#{g.syms[i]}", i-1] } -%>
72
+ nonterm_to_int = {
73
+ <%- values.each do |k, v| -%>
74
+ <%= k %> => <%= v %>,
75
+ <%- end -%>
76
+ }
77
+ ### Int to Nonterm
78
+ int_to_nonterm = [
79
+ <%- values.each do |k, v| -%>
80
+ <%= k %>,
81
+ <%- end -%>
82
+ ]
83
+ ### Goto Table
84
+ goto_table = [
85
+ <%- g_parser.table.goto_table.each do |i| -%>
86
+ [ <% i.each do |j| %><%= j ? "#{j}" : 'nil' %>, <% end %>],
87
+ <%- end -%>
88
+ ]
89
+
90
+ <%- if Depager.debug_mode? -%>
91
+ alias orig_error error
92
+ def error
93
+ orig_error
94
+ warn "current state: #{StateInfo[@stack.last]}"
95
+ end
96
+
97
+ ### States
98
+ StateInfo = [
99
+ <%- g_parser.table.state_info.each do |s| -%>
100
+ <<'----------',
101
+ <%= s.strip %>
102
+ ----------
103
+ <%- end -%>
104
+ ]
105
+ <%- end -%>
106
+
107
+ Tables = [ reduce_table, action_table,
108
+ defred_table, defred_after_shift_table, goto_table,
109
+ term_to_int, int_to_term, nonterm_to_int, int_to_nonterm ]
110
+
111
+ <%= g_parser.inner_code + @inner_code %>
112
+ end
113
+ end
114
+
115
+ <%= g_parser.outer_code + @outer_code %>