depager 0.1.9 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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