depager 0.2.3 → 0.3.0.b20160729

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 (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 %>