depager 0.1.9 → 0.2.0

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 (63) hide show
  1. data/ChangeLog +4 -0
  2. data/bin/depager +1 -0
  3. data/data/depager/misc/depager-mode.el +35 -24
  4. data/data/depager/pre-setup.rb +3 -0
  5. data/examples/Rakefile +36 -0
  6. data/examples/c89/c89.dr +496 -0
  7. data/examples/c89/c89.tab.rb +2197 -0
  8. data/examples/c89/test.c89 +10 -0
  9. data/{data/depager/sample → examples}/extension/paction.dr +0 -0
  10. data/{data/depager/sample → examples}/extension/pactiontest.dr +0 -0
  11. data/{data/depager/sample → examples}/pl0d/pl0ds.dr +0 -0
  12. data/examples/pl0d/pl0ds.tab.rb +1702 -0
  13. data/{data/depager/sample/pl0d/pl0test.pl0 → examples/pl0d/test.pl0ds} +0 -0
  14. data/{data/depager/sample → examples}/sample_calc/calc.action.dr +0 -0
  15. data/examples/sample_calc/calc.action.tab.rb +283 -0
  16. data/{data/depager/sample → examples}/sample_calc/calc.astdf.dr +0 -0
  17. data/examples/sample_calc/calc.astdf.tab.rb +476 -0
  18. data/{data/depager/sample → examples}/sample_calc/calc.astl.action.dr +0 -0
  19. data/examples/sample_calc/calc.astl.action.tab.rb +593 -0
  20. data/{data/depager/sample → examples}/sample_calc/calc.astl.dr +0 -0
  21. data/examples/sample_calc/calc.astl.tab.rb +501 -0
  22. data/{data/depager/sample → examples}/sample_calc/calc.atree.dr +0 -0
  23. data/examples/sample_calc/calc.atree.tab.rb +277 -0
  24. data/{data/depager/sample → examples}/sample_calc/calc.cst.dr +0 -0
  25. data/examples/sample_calc/calc.cst.tab.rb +478 -0
  26. data/{data/depager/sample → examples}/sample_calc/calc.dr +0 -0
  27. data/{data/depager/sample → examples}/sample_calc/calc.lex.dr +0 -0
  28. data/examples/sample_calc/calc.lex.tab.rb +192 -0
  29. data/{data/depager/sample → examples}/sample_calc/calc.nvaction.dr +0 -0
  30. data/examples/sample_calc/calc.nvaction.tab.rb +291 -0
  31. data/examples/sample_calc/calc.tab.rb +183 -0
  32. data/{data/depager/sample → examples}/sample_calc/calc_prec.nvaction.dr +0 -0
  33. data/examples/sample_calc/calc_prec.nvaction.tab.rb +257 -0
  34. data/examples/sample_calc/test.calc +1 -0
  35. data/{data/depager/sample/slex_test/slextest1.dr → examples/slex_test/divreg.slex.dr} +3 -11
  36. data/examples/slex_test/divreg.slex.tab.rb +227 -0
  37. data/{data/depager/sample/slex_test/slextest2.dr → examples/slex_test/ljoin.slex.dr} +10 -7
  38. data/examples/slex_test/ljoin.slex.tab.rb +277 -0
  39. data/examples/slex_test/test.divreg +1 -0
  40. data/examples/slex_test/test.ljoin +3 -0
  41. data/lib/depager.rb +194 -127
  42. data/lib/depager/Rakefile +8 -4
  43. data/lib/depager/ast_base.dr +3 -3
  44. data/lib/depager/ast_base.rb +197 -144
  45. data/lib/depager/atree.rb +55 -36
  46. data/lib/depager/cst.dr +6 -4
  47. data/lib/depager/cst.rb +69 -49
  48. data/lib/depager/grammar.rb +136 -0
  49. data/lib/depager/lex.dr +22 -8
  50. data/lib/depager/lex.rb +94 -53
  51. data/lib/depager/lr.rb +101 -167
  52. data/lib/depager/parse_action.rb +1 -1
  53. data/lib/depager/parser.rb +34 -7
  54. data/lib/depager/slex.dr +76 -36
  55. data/lib/depager/slex.rb +345 -151
  56. data/lib/depager/srp.rb +3 -2
  57. data/lib/depager/template/extension_lalr_slave.erb +1 -1
  58. data/lib/depager/template/single_lalr_parser.erb +1 -1
  59. data/lib/depager/utils.rb +2 -1
  60. data/lib/depager/version.rb +2 -2
  61. metadata +42 -28
  62. data/Manifest.txt +0 -52
  63. data/lib/depager/psrtmpl.rb +0 -33
@@ -0,0 +1,136 @@
1
+ module Depager::ParsingMethodCommon
2
+ class G
3
+ attr_accessor :rulelist, :gh, :syms, :nonterms, :terms, :closure, :ismap, :nssize, :tla
4
+ attr_accessor :precs, :epr, :epr2, :f0e, :first1, :eoi
5
+ Eps = 0x3fffffff #epsilon
6
+ #Eps = []
7
+ def initialize rulelist, ts, ns, precs = nil
8
+ @nssize = ns.size
9
+ @precs = precs
10
+ @eoi = ts[nil]
11
+ @syms = ns.invert.merge(ts.invert)
12
+ @tla = @syms.size
13
+
14
+ @rulelist = rulelist
15
+ @gh = []; @nssize.times{|i| @gh[i] = []}
16
+ @epr = {}
17
+ @f0e = {}
18
+ @rulelist.each_with_index do |rule, rx|
19
+ rule.g = self
20
+ rule.n = rx
21
+ @gh[rule.l].push rule
22
+ if rule.r.empty?
23
+ @epr[rule.l] = rule.n
24
+ @f0e[rule.l] = { rule.n => [Eps] }
25
+ end
26
+ end
27
+ make_sym_first
28
+ initialize_depend
29
+ end
30
+
31
+ def initialize_depend
32
+ end
33
+
34
+ def make_sym_first
35
+ @first1 = {@tla => [@tla]}
36
+ @syms.each_key do |s|
37
+ if terms? s
38
+ @first1[s] = [s]
39
+ else
40
+ @first1[s] = []
41
+ @first1[s].push Eps if @epr[s]
42
+ end
43
+ end
44
+ begin
45
+ cnt = false
46
+ @syms.each_key do |s|
47
+ @gh[s].each do |rule|
48
+ rule.r.each do |es|
49
+ ss = @first1[es] - @first1[s]
50
+ unless ss.empty?
51
+ @first1[s] |= ss
52
+ cnt = true
53
+ end
54
+ break unless @first1[es].include? Eps
55
+ end
56
+ unless @first1[s].include? Eps
57
+ if rule.r.all?{|i| @first1[i].include? Eps }
58
+ @first1.push Eps
59
+ cnt = true
60
+ end
61
+ end
62
+ end if nonterms? s
63
+ end
64
+ end while cnt
65
+ end
66
+
67
+ def first p
68
+ r = []
69
+ x = 0
70
+ p.each do |i|
71
+ if i == Eps
72
+ elsif i.class == Array
73
+ i.each do |j|
74
+ r |= @first1[j]
75
+ end
76
+ break unless i.any?{|j| @epr[j] || j==Eps }
77
+ else
78
+ r |= @first1[i]
79
+ break unless @epr[i]
80
+ end
81
+ x += 1
82
+ end
83
+ r -= [Eps]
84
+ r |= [Eps] if x == p.size
85
+ return r
86
+ end
87
+
88
+ def terms? i
89
+ i && i >= @nssize
90
+ end
91
+
92
+ def nonterms? i
93
+ i && i < @nssize
94
+ end
95
+
96
+ def [](n)
97
+ @rulelist[n]
98
+ end
99
+ end
100
+
101
+ class Rule
102
+ def self.[] l, r, prec = nil
103
+ self.new l, r, nil, nil, nil, prec
104
+ end
105
+
106
+ attr_accessor :l, :r, :g, :n, :act, :epr, :prec
107
+ def initialize l, r, g = nil, n = nil, act = nil, prec = nil
108
+ @l = l
109
+ @r = r
110
+ @g = g
111
+ @n = n
112
+ @act = act
113
+ @epr = []
114
+ @prec = prec
115
+ initialize_depend
116
+ end
117
+ def initialize_depend
118
+ end
119
+
120
+ alias lhs l
121
+ alias rhs r
122
+
123
+ def to_s
124
+ r = @r.map{|i| @g.syms[i]}.join(' ')
125
+ "(#{'%03s'%@n}) #{@g.syms[@l]} : #{r}"
126
+ end
127
+
128
+ def hash
129
+ (@l.hash % 37) * (@r.hash % 37)
130
+ end
131
+ def eql? i
132
+ @l == i.l && @r == i.r
133
+ end
134
+ alias == eql?
135
+ end
136
+ end
data/lib/depager/lex.dr CHANGED
@@ -13,15 +13,20 @@
13
13
  end
14
14
  def lex
15
15
  until @file.eof?
16
- until @line.empty? do
16
+ until @line.empty?
17
17
  case @line
18
18
  when /\A\s+/
19
19
  #skip blank
20
20
  when /\A%\}\s*\Z/
21
21
  @line = $'
22
22
  yield nil,nil
23
- when /\A\/(([^\/\\]+|\\.)*)\//, /\A'([^'\\]+|\\.)*\'/
23
+ when /\A\/(([^\/\\]+|\\.)*)\//
24
24
  yield :LEX, "/\\A#{$1}/"
25
+ when /\A'([^'\\]+|\\.)*'/, /\A"([^"\\]+|\\.)*"/
26
+ rest = $'
27
+ str = Regexp.escape($1).gsub('/', '\/')
28
+ rest.match(/^/)
29
+ yield :LEX, "/\\A#{str}/"
25
30
  when /\A\{/
26
31
  yield :ACTION, parse_action
27
32
  /./=~'.'
@@ -46,16 +51,14 @@
46
51
  g_parser.optinner << %{
47
52
  def lex
48
53
  begin
49
- until @line.empty? do
54
+ until @line.empty?
50
55
  case @line
51
- #{_lexactlist}
56
+ #{ _lexactlist }
52
57
  else
53
58
  raise RuntimeError, "must not happen \#{@line}"
54
59
  end
55
- @oldline = @line
56
- @line = $'
57
60
  end
58
- end while @line = getline
61
+ end while @line0 = @line = getline
59
62
  yield nil, nil
60
63
  end
61
64
  }; #code
@@ -66,7 +69,18 @@
66
69
  | lexactlist lexact { _lexactlist << _lexact }
67
70
  ;
68
71
  lexact:
69
- lexlist ACTION { "when #{_lexlist.join(', ')}\n#{_ACTION}" }
72
+ lexlist opt_noskip ACTION
73
+ {
74
+ %{
75
+ when #{_lexlist.join(', ')}
76
+ #{ _opt_noskip ? '#' : "@oldline = @line; @line = $'" }
77
+ #{ _ACTION }
78
+ }; #code
79
+ }
80
+ ;
81
+ opt_noskip:
82
+ { false }
83
+ | '!' { true }
70
84
  ;
71
85
  lexlist:
72
86
  LEX { [ _LEX ] }
data/lib/depager/lex.rb CHANGED
@@ -44,7 +44,7 @@ end
44
44
  module D4LexerExtension_prerulelist #:nodoc:all
45
45
  end
46
46
 
47
- class LexerExtension_prerulelist < Basis #:nodoc:all
47
+ class LexerExtension_prerulelist < Depager::LALR::Basis #:nodoc:all
48
48
  include Depager::ExtensionUtils
49
49
 
50
50
  include ActionParser
@@ -55,7 +55,9 @@ class LexerExtension_prerulelist < Basis #:nodoc:all
55
55
  [ 0, 1 ],
56
56
  [ 1, 1 ],
57
57
  [ 1, 2 ],
58
- [ 2, 2 ],
58
+ [ 2, 3 ],
59
+ [ 4, 0 ],
60
+ [ 4, 1 ],
59
61
  [ 3, 1 ],
60
62
  [ 3, 3 ],
61
63
  ]
@@ -68,61 +70,70 @@ class LexerExtension_prerulelist < Basis #:nodoc:all
68
70
  nil => 0,
69
71
  false => 1,
70
72
  :ACTION => 2,
71
- :LEX => 3,
72
- "," => 4,
73
+ "!" => 3,
74
+ :LEX => 4,
75
+ "," => 5,
73
76
  }
74
77
  ### Int to Term
75
78
  i2t = [
76
79
  nil,
77
80
  false,
78
81
  :ACTION,
82
+ "!",
79
83
  :LEX,
80
84
  ",",
81
85
  ]
82
86
  ### Action Table
83
87
  action_table = [
84
- [ nil, nil, nil, 3, nil, ],
85
- [ ACC, nil, nil, nil, nil, ],
86
- [ nil, nil, nil, 3, nil, ],
87
- [ nil, nil, nil, nil, nil, ],
88
- [ nil, nil, nil, nil, nil, ],
89
- [ nil, nil, 7, nil, 8, ],
90
- [ nil, nil, nil, nil, nil, ],
91
- [ nil, nil, nil, nil, nil, ],
92
- [ nil, nil, nil, 9, nil, ],
93
- [ nil, nil, nil, nil, nil, ],
88
+ [ nil, nil, nil, nil, 5, nil, ],
89
+ [ ACC, nil, nil, nil, nil, nil, ],
90
+ [ nil, nil, nil, nil, 5, nil, ],
91
+ [ nil, nil, nil, nil, nil, nil, ],
92
+ [ nil, nil, nil, 9, nil, 8, ],
93
+ [ nil, nil, nil, nil, nil, nil, ],
94
+ [ nil, nil, nil, nil, nil, nil, ],
95
+ [ nil, nil, 10, nil, nil, nil, ],
96
+ [ nil, nil, nil, nil, 11, nil, ],
97
+ [ nil, nil, nil, nil, nil, nil, ],
98
+ [ nil, nil, nil, nil, nil, nil, ],
99
+ [ nil, nil, nil, nil, nil, nil, ],
94
100
  ]
95
101
  ### Default Reduce Table
96
102
  defred_table = [
97
103
  nil,
98
104
  nil,
99
105
  -1,
100
- -5,
101
106
  -2,
102
- nil,
107
+ -5,
108
+ -7,
103
109
  -3,
104
- -4,
110
+ nil,
105
111
  nil,
106
112
  -6,
113
+ -4,
114
+ -8,
107
115
  ]
108
116
  defred_after_shift_table = [
109
117
  nil,
110
118
  nil,
111
119
  nil,
112
- -5,
113
120
  -2,
114
121
  nil,
122
+ -7,
115
123
  -3,
116
- -4,
124
+ nil,
117
125
  nil,
118
126
  -6,
127
+ -4,
128
+ -8,
119
129
  ]
120
130
  ### Nonterm to Int
121
131
  nt2i = {
122
132
  :start => 0,
123
133
  :lexactlist => 1,
124
134
  :lexact => 2,
125
- :lexlist => 3,
135
+ :lexlist => 3,
136
+ :opt_noskip => 4,
126
137
  }
127
138
  ### Int to Nonterm
128
139
  i2nt = [
@@ -130,19 +141,22 @@ class LexerExtension_prerulelist < Basis #:nodoc:all
130
141
  :lexactlist,
131
142
  :lexact,
132
143
  :lexlist,
144
+ :opt_noskip,
133
145
  ]
134
146
  ### Goto Table
135
147
  goto_table = [
136
- [ 1, 2, 4, 5, ],
137
- [ nil, nil, nil, nil, ],
138
- [ nil, nil, 6, 5, ],
139
- [ nil, nil, nil, nil, ],
140
- [ nil, nil, nil, nil, ],
141
- [ nil, nil, nil, nil, ],
142
- [ nil, nil, nil, nil, ],
143
- [ nil, nil, nil, nil, ],
144
- [ nil, nil, nil, nil, ],
145
- [ nil, nil, nil, nil, ],
148
+ [ 1, 2, 3, 4, nil, ],
149
+ [ nil, nil, nil, nil, nil, ],
150
+ [ nil, nil, 6, 4, nil, ],
151
+ [ nil, nil, nil, nil, nil, ],
152
+ [ nil, nil, nil, nil, 7, ],
153
+ [ nil, nil, nil, nil, nil, ],
154
+ [ nil, nil, nil, nil, nil, ],
155
+ [ nil, nil, nil, nil, nil, ],
156
+ [ nil, nil, nil, nil, nil, ],
157
+ [ nil, nil, nil, nil, nil, ],
158
+ [ nil, nil, nil, nil, nil, ],
159
+ [ nil, nil, nil, nil, nil, ],
146
160
  ]
147
161
 
148
162
  Tables = [ reduce_table, nparams, action_table,
@@ -181,15 +195,20 @@ class LexerExtension_prerulelist < Basis #:nodoc:all
181
195
  end
182
196
  def lex
183
197
  until @file.eof?
184
- until @line.empty? do
198
+ until @line.empty?
185
199
  case @line
186
200
  when /\A\s+/
187
201
  #skip blank
188
202
  when /\A%\}\s*\Z/
189
203
  @line = $'
190
204
  yield nil,nil
191
- when /\A\/(([^\/\\]+|\\.)*)\//, /\A'([^'\\]+|\\.)*\'/
205
+ when /\A\/(([^\/\\]+|\\.)*)\//
192
206
  yield :LEX, "/\\A#{$1}/"
207
+ when /\A'([^'\\]+|\\.)*'/, /\A"([^"\\]+|\\.)*"/
208
+ rest = $'
209
+ str = Regexp.escape($1).gsub('/', '\/')
210
+ rest.match(/^/)
211
+ yield :LEX, "/\\A#{str}/"
193
212
  when /\A\{/
194
213
  yield :ACTION, parse_action
195
214
  /./=~'.'
@@ -209,7 +228,7 @@ end
209
228
 
210
229
  ### Outer Code
211
230
 
212
- class D4LexerExtension_prerulelist::NVAction < Depager::Action #:nodoc:all
231
+ class D4LexerExtension_prerulelist::NVAction < Depager::LALR::Action #:nodoc:all
213
232
  include Depager::DecoratorUtils
214
233
  include ActionParser
215
234
 
@@ -221,6 +240,8 @@ class D4LexerExtension_prerulelist::NVAction < Depager::Action #:nodoc:all
221
240
  :_act_3,
222
241
  :_act_4,
223
242
  :_act_5,
243
+ :_act_6,
244
+ :_act_7,
224
245
 
225
246
  ]
226
247
  Tables = [on_reduce]
@@ -231,75 +252,95 @@ class D4LexerExtension_prerulelist::NVAction < Depager::Action #:nodoc:all
231
252
  end
232
253
 
233
254
 
234
- module_eval <<-'.,.,118028145942522.,.,', 'lex.dr', 43
255
+ module_eval <<-'.,.,118754107729449.,.,', 'lex.dr', 48
235
256
  def _act_0 val
236
257
  _lexactlist = *val
237
258
 
238
259
  g_parser.optinner << %{
239
260
  def lex
240
261
  begin
241
- until @line.empty? do
262
+ until @line.empty?
242
263
  case @line
243
- #{_lexactlist}
264
+ #{ _lexactlist }
244
265
  else
245
266
  raise RuntimeError, "must not happen \#{@line}"
246
267
  end
247
- @oldline = @line
248
- @line = $'
249
268
  end
250
- end while @line = getline
269
+ end while @line0 = @line = getline
251
270
  yield nil, nil
252
271
  end
253
272
  }; #code
254
273
 
255
274
  end
256
275
 
257
- .,.,118028145942522.,.,
276
+ .,.,118754107729449.,.,
258
277
 
259
- module_eval <<-'.,.,118028145936749.,.,', 'lex.dr', 63
278
+ module_eval <<-'.,.,118754107760430.,.,', 'lex.dr', 66
260
279
  def _act_1 val
261
280
  _lexact = *val
262
281
  [ _lexact ]
263
282
 
264
283
  end
265
284
 
266
- .,.,118028145936749.,.,
285
+ .,.,118754107760430.,.,
267
286
 
268
- module_eval <<-'.,.,118028145915595.,.,', 'lex.dr', 64
287
+ module_eval <<-'.,.,118754107730115.,.,', 'lex.dr', 67
269
288
  def _act_2 val
270
289
  _lexactlist, _lexact = *val
271
290
  _lexactlist << _lexact
272
291
 
273
292
  end
274
293
 
275
- .,.,118028145915595.,.,
294
+ .,.,118754107730115.,.,
276
295
 
277
- module_eval <<-'.,.,118028145922278.,.,', 'lex.dr', 67
296
+ module_eval <<-'.,.,118754107747000.,.,', 'lex.dr', 71
278
297
  def _act_3 val
279
- _lexlist, _ACTION = *val
280
- "when #{_lexlist.join(', ')}\n#{_ACTION}"
298
+ _lexlist, _opt_noskip, _ACTION = *val
299
+
300
+ %{
301
+ when #{_lexlist.join(', ')}
302
+ #{ _opt_noskip ? '#' : "@oldline = @line; @line = $'" }
303
+ #{ _ACTION }
304
+ }; #code
281
305
 
282
306
  end
283
307
 
284
- .,.,118028145922278.,.,
308
+ .,.,118754107747000.,.,
285
309
 
286
- module_eval <<-'.,.,118028145957906.,.,', 'lex.dr', 70
310
+ module_eval <<-'.,.,118754107727512.,.,', 'lex.dr', 80
287
311
  def _act_4 val
312
+ false
313
+
314
+ end
315
+
316
+ .,.,118754107727512.,.,
317
+
318
+ module_eval <<-'.,.,118754107710888.,.,', 'lex.dr', 81
319
+ def _act_5 val
320
+ _ = *val
321
+ true
322
+
323
+ end
324
+
325
+ .,.,118754107710888.,.,
326
+
327
+ module_eval <<-'.,.,118754107743010.,.,', 'lex.dr', 84
328
+ def _act_6 val
288
329
  _LEX = *val
289
330
  [ _LEX ]
290
331
 
291
332
  end
292
333
 
293
- .,.,118028145957906.,.,
334
+ .,.,118754107743010.,.,
294
335
 
295
- module_eval <<-'.,.,1180281459420.,.,', 'lex.dr', 71
296
- def _act_5 val
336
+ module_eval <<-'.,.,118754107718606.,.,', 'lex.dr', 85
337
+ def _act_7 val
297
338
  _lexlist, _, _LEX = *val
298
339
  _lexlist << _LEX
299
340
 
300
341
  end
301
342
 
302
- .,.,1180281459420.,.,
343
+ .,.,118754107718606.,.,
303
344
 
304
345
  end
305
346