depager 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. data/ChangeLog +4 -0
  2. data/Manifest.txt +52 -0
  3. data/README.en +64 -0
  4. data/README.ja +128 -0
  5. data/bin/depager +47 -0
  6. data/data/depager/misc/depager-mode.el +209 -0
  7. data/data/depager/sample/extension/paction.dr +15 -0
  8. data/data/depager/sample/extension/pactiontest.dr +14 -0
  9. data/data/depager/sample/pl0d/pl0ds.dr +334 -0
  10. data/data/depager/sample/pl0d/pl0test.pl0 +34 -0
  11. data/data/depager/sample/sample_calc/calc.action.dr +33 -0
  12. data/data/depager/sample/sample_calc/calc.astdf.dr +54 -0
  13. data/data/depager/sample/sample_calc/calc.astl.action.dr +66 -0
  14. data/data/depager/sample/sample_calc/calc.astl.dr +55 -0
  15. data/data/depager/sample/sample_calc/calc.atree.dr +43 -0
  16. data/data/depager/sample/sample_calc/calc.cst.dr +45 -0
  17. data/data/depager/sample/sample_calc/calc.dr +43 -0
  18. data/data/depager/sample/sample_calc/calc.lex.dr +29 -0
  19. data/data/depager/sample/sample_calc/calc.nvaction.dr +33 -0
  20. data/data/depager/sample/sample_calc/calc_prec.nvaction.dr +31 -0
  21. data/data/depager/sample/slex_test/slextest1.dr +37 -0
  22. data/data/depager/sample/slex_test/slextest2.dr +33 -0
  23. data/lib/depager.rb +608 -0
  24. data/lib/depager/Rakefile +30 -0
  25. data/lib/depager/action.rb +47 -0
  26. data/lib/depager/ast_base.dr +232 -0
  27. data/lib/depager/ast_base.rb +1249 -0
  28. data/lib/depager/astdf.rb +10 -0
  29. data/lib/depager/astl.rb +14 -0
  30. data/lib/depager/atree.dr +55 -0
  31. data/lib/depager/atree.rb +336 -0
  32. data/lib/depager/cst.dr +182 -0
  33. data/lib/depager/cst.rb +625 -0
  34. data/lib/depager/lex.dr +76 -0
  35. data/lib/depager/lex.rb +306 -0
  36. data/lib/depager/lr.rb +604 -0
  37. data/lib/depager/nvaction.rb +21 -0
  38. data/lib/depager/parse_action.rb +24 -0
  39. data/lib/depager/parser.rb +248 -0
  40. data/lib/depager/psrtmpl.rb +33 -0
  41. data/lib/depager/slex.dr +161 -0
  42. data/lib/depager/slex.rb +646 -0
  43. data/lib/depager/srp.rb +50 -0
  44. data/lib/depager/template/astdf.erbs +57 -0
  45. data/lib/depager/template/astl.erbs +57 -0
  46. data/lib/depager/template/extension_lalr_master.erb +51 -0
  47. data/lib/depager/template/extension_lalr_slave.erb +107 -0
  48. data/lib/depager/template/simple.erb +21 -0
  49. data/lib/depager/template/single_lalr_parser.erb +97 -0
  50. data/lib/depager/utils.rb +355 -0
  51. data/lib/depager/version.rb +9 -0
  52. data/setup.rb +1585 -0
  53. metadata +103 -0
@@ -0,0 +1,50 @@
1
+ class ShiftReducePrinter < Depager::AdvancedParser
2
+ def initialize inside
3
+ super
4
+ end
5
+ def dumpstack stack
6
+ r = ''
7
+ _stack.each_with_index do |v,x|
8
+ r += if x % 2 == 0
9
+ "(#{v}) "
10
+ else
11
+ if v[1] == :NT
12
+ "#{@i2nt[v[0]]}:#{v[1..-1].inspect} "
13
+ elsif @i2t[v[0]].class == String
14
+ "'#{@i2t[v[0]]}' "
15
+ else
16
+ "#{@i2t[v[0]]}:#{v[1..-1].inspect} "
17
+ end
18
+ end
19
+ end
20
+ r
21
+ end
22
+ def afterShift
23
+ st0 = _stack[_stack.size-3]
24
+ st = _stack.last
25
+ sh = @i2t[_stack[_stack.size-2][0]]
26
+ la = @i2t[_lookahead[0]]
27
+ warn "LA:<#{la}> shift:<#{sh}> state:#{st0}->#{st}"
28
+ warn "LINE:<#{@basis.line}>"
29
+ warn dumpstack(_stack) + "\n"
30
+ end
31
+ def afterReduce
32
+ st = _stack.last
33
+ re = @i2nt[_stack[_stack.size-2][0]]
34
+ la = @i2t[_lookahead[0]]
35
+ warn "LA:<#{la}> reduce:<#{re}> state: ->#{st}"
36
+ warn "LINE:<#{@basis.line}>"
37
+ warn dumpstack(_stack) + "\n"
38
+ end
39
+ def afterAccept
40
+ warn "acc."
41
+ end
42
+ def afterError
43
+ st = _stack.last
44
+ re = @i2nt[_stack[_stack.size-2][0]]
45
+ la = @i2t[_lookahead[0]]
46
+ warn "LA:<#{la}> last_state:#{st}"
47
+ warn "LINE:<#{@basis.line}>"
48
+ warn dumpstack(_stack) + "\n"
49
+ end
50
+ end
@@ -0,0 +1,57 @@
1
+ ===:defnode
2
+ class Node
3
+ attr_accessor :lineno
4
+ attr_accessor <%= _opt_attr.map{|i| ":#{i}" }.join(', ') %>
5
+ <%= ini %>
6
+ def to_ary
7
+ [self]
8
+ end
9
+ def self.[] lineno, *args
10
+ self.new lineno, *args
11
+ end
12
+ def accept v
13
+ end
14
+ end
15
+ require 'forwardable'
16
+ class NodeList < Node
17
+ attr_accessor :lineno
18
+ extend Forwardable
19
+ _methods = Array.instance_methods -
20
+ Object.instance_methods -
21
+ ['push', 'concat', 'to_ary', 'map']
22
+ def_delegators(:@lst, *_methods)
23
+ def initialize(lineno, lst=[])
24
+ @lineno = lineno
25
+ @lst = lst.to_a
26
+ end
27
+ <%=
28
+ _opt_attr.map {|i| ;%{
29
+ def #{i}
30
+ @lst.map{|i| "i.#{i}"}
31
+ end
32
+ }}.join("\n ")
33
+ %>
34
+ def push(i) @lst.push i; self; end
35
+ def concat(i) @lst.concat i; self; end
36
+ def map(&b) @lst.map(&b); end
37
+ def to_ary() @lst; end
38
+ def accept(v)
39
+ @lst.each{|i| i.accept(v) }
40
+ end
41
+ end
42
+ ===:node
43
+ class Node_<%= name %> < Node
44
+ attr_accessor <%= nodes.map{|i| ":#{i}" }.join(', ') %>
45
+ attr_accessor <%= attrs.map{|i| ":#{i}" }.join(', ') %>
46
+ def initialize <%= nodes.unshift('lineno').join(', ') %>
47
+ super()
48
+ @lineno = lineno
49
+ <%= nodes.map{|i| " @#{i} = #{i}\n"} %>
50
+ end
51
+ def accept v
52
+ warn @lineno.to_s+':'+self.class.to_s if $DEBUG
53
+ <%= accept %>
54
+ v.visit_Node_<%= name %>(self)
55
+ self
56
+ end
57
+ end
@@ -0,0 +1,57 @@
1
+ ===:defnode
2
+ class Node
3
+ attr_accessor :lineno
4
+ attr_accessor <%= _opt_attr.map{|i| ":#{i}" }.join(', ') %>
5
+ <%= ini %>
6
+ def to_ary
7
+ [self]
8
+ end
9
+ def self.[] lineno, *args
10
+ self.new lineno, *args
11
+ end
12
+ def accept v
13
+ end
14
+ end
15
+ require 'forwardable'
16
+ class NodeList < Node
17
+ attr_accessor :lineno
18
+ extend Forwardable
19
+ _methods = Array.instance_methods -
20
+ Object.instance_methods -
21
+ ['push', 'concat', 'to_ary', 'map']
22
+ def_delegators(:@lst, *_methods)
23
+ def initialize(lineno, lst=[])
24
+ @lineno = lineno
25
+ @lst = lst.to_a
26
+ end
27
+ <%=
28
+ _opt_attr.map {|i| ;%{
29
+ def #{i}
30
+ @lst.map{|i| "i.#{i}"}
31
+ end
32
+ }}.join("\n ")
33
+ %>
34
+ def push(i) @lst.push i; self; end
35
+ def concat(i) @lst.concat i; self; end
36
+ def map(&b) @lst.map(&b); end
37
+ def to_ary() @lst; end
38
+ def accept(v)
39
+ @lst.each{|i| i.accept(v) }
40
+ end
41
+ end
42
+ ===:node
43
+ class Node_<%= name %> < Node
44
+ attr_accessor <%= nodes.map{|i| ":#{i}" }.join(', ') %>
45
+ attr_accessor <%= attrs.map{|i| ":#{i}" }.join(', ') %>
46
+ def initialize <%= nodes.unshift('lineno').join(', ') %>
47
+ super()
48
+ @lineno = lineno
49
+ <%= nodes.map{|i| " @#{i} = #{i}\n"} %>
50
+ end
51
+ <%= accept %>
52
+ def accept v
53
+ warn @lineno.to_s+':'+self.class.to_s if $DEBUG
54
+ v.visit_Node_<%= name %>(self)
55
+ self
56
+ end
57
+ end
@@ -0,0 +1,51 @@
1
+ <%
2
+ target_name = @d_parser.target_name
3
+ optouter = @optouter
4
+ optinner = @optinner
5
+ optmain = @optmain
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|; if m%>
38
+ <%unless h[m[1]]%>@hook[<%=x%>] = <%=m[1]%>.new(p, @nparam, self)<%h[m[1]]=x%>
39
+ @h2p['<%=m[1].sub(/#{target_name}_/,'')%>'] = @hook[<%=h[m[1]]%>] <%else
40
+ %># use @hook[<%=h[m[1]]%>](<%=m[1]%>)<%end%>
41
+ p.<%=i%>.push [@hook[<%=h[m[1]]%>], :do_parse]
42
+ <% x+=1; end; end%>
43
+ regext p
44
+ end
45
+
46
+ ### Inner Code
47
+ <%= optinner %>
48
+ end
49
+
50
+ ### Outer Code
51
+ <%= optouter %>
@@ -0,0 +1,107 @@
1
+ <%
2
+ target_name = g_parser.target_name
3
+ table = g_parser.table
4
+ g = table.g
5
+ rulelist = g.rulelist
6
+ t2i = (g.nssize ... g.syms.size).map{|i| [ g.syms[i].inspect, i - g.nssize] }
7
+ nt2i = (1 ... g.nssize).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
13
+ optinner = g_parser.optinner
14
+ optmain = g_parser.optmain
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 %> < 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.l - 1%>, <%= i.r.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 %>
@@ -0,0 +1,21 @@
1
+ <%
2
+ optouter = @optouter + g_parser.optouter
3
+ optmain = @optmain
4
+ req = @req.uniq
5
+ mixin = @mixin
6
+ %>
7
+ begin; require 'rubygems'; rescue Exception; end
8
+ require 'depager/parser.rb'
9
+ <%req.each do |i|%>require <%=i%>
10
+ <%end%>
11
+
12
+ module D4<%= target_name %> ; end
13
+
14
+ ### Outer Code
15
+ <%= optouter %>
16
+
17
+ ### main
18
+ if __FILE__ == $0
19
+ ### Main Code
20
+ <%= optmain %>
21
+ end
@@ -0,0 +1,97 @@
1
+ <%
2
+ target_name = g_parser.target_name
3
+ table = g_parser.table
4
+ g = table.g
5
+ nparams = g_parser.nparams
6
+ rulelist = g.rulelist
7
+ t2i = (g.nssize ... g.syms.size).map{|i| [ g.syms[i].inspect, i - g.nssize] }
8
+ nt2i = (1 ... g.nssize).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
14
+ optinner = @optinner + g_parser.optinner
15
+ optmain = @optmain
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
+ %>
22
+ begin; require 'rubygems'; rescue Exception; end
23
+ require 'depager/parser.rb'
24
+ <%req.each do |i|%>require <%=i%>
25
+ <%end%>
26
+
27
+ module D4<%= target_name %>
28
+ end
29
+
30
+ class <%= target_name %> < Depager::Basis
31
+ <% mixin.each do |i| %>
32
+ include <%=i%><%end%>
33
+
34
+ ### Reduce Table
35
+ reduce_table = [<% rulelist.each do |i| %>
36
+ [ <%= '%04s'%(i.l - 1)%>, <%= "%04s"%i.r.size %> ], # <%= i %><% end %>
37
+ ]
38
+ ### Extension Params
39
+ nparams = {<% nparams.each do |c, i| %>
40
+ '<%= c %>' => <%= i %>, <% end %>
41
+ }
42
+ ### Term to Int
43
+ t2i = {<% t2i.each do |k, v| %>
44
+ <%= k %> => <%= v %>, <% end %>
45
+ }
46
+ ### Int to Term
47
+ i2t = [<% t2i.each do |k, v| %>
48
+ <%= k %>, <% end %>
49
+ ]
50
+ ### Action Table
51
+ action_table = [<% taction.each do |i| %>
52
+ [ <% i.each do |j| %><%= j ? "#{j}" : 'nil' %>, <% end %>], <% end %>
53
+ ]
54
+ ### Default Reduce Table
55
+ defred_table = [<% tdefred.each do |i| %>
56
+ <%= i ? "#{i}" : 'nil' %>, <% end %>
57
+ ]
58
+ defred_after_shift_table = [<% tdefreds.each do |i| %>
59
+ <%= i ? "#{i}" : 'nil' %>, <% end %>
60
+ ]
61
+ ### Nonterm to Int
62
+ nt2i = {<% nt2i.each do |k, v| %>
63
+ <%= k %> => <%= v %>, <% end %>
64
+ }
65
+ ### Int to Nonterm
66
+ i2nt = [<% nt2i.each do |k, v| %>
67
+ <%= k %>, <% end %>
68
+ ]
69
+ ### Goto Table
70
+ goto_table = [ <% tgoto.each do |i| %>
71
+ [ <% i.each do |j| %><%= j ? "#{j}" : 'nil' %>, <% end %>], <% end %>
72
+ ]
73
+
74
+ Tables = [ reduce_table, nparams, action_table,
75
+ defred_table, defred_after_shift_table, goto_table,
76
+ t2i, i2t, nt2i, i2nt ]
77
+
78
+ def self.createDecoratedParser
79
+ <%= decparser %>
80
+ end
81
+
82
+ ### Inner Code
83
+ <%= optinner %>
84
+ end
85
+
86
+ ### Outer Code
87
+ <%= optouter %>
88
+
89
+ def createDecorated<%= target_name %>
90
+ <%= decparser %>
91
+ end
92
+
93
+ ### main
94
+ if __FILE__ == $0
95
+ ### Main Code
96
+ <%= optmain %>
97
+ end