depager 0.2.3 → 0.3.0.b20250423

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 (106) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +44 -0
  3. data/.simplecov +5 -0
  4. data/Gemfile +12 -0
  5. data/LICENSE.gpl +339 -0
  6. data/Manifest.txt +73 -0
  7. data/README.en +7 -21
  8. data/README.ja +19 -99
  9. data/Rakefile +31 -0
  10. data/bin/depager +7 -45
  11. data/examples/action_pl0d/pl0d.action.dr +421 -0
  12. data/examples/action_pl0d/test.pl0ds +48 -0
  13. data/examples/c89/c89.dr +493 -496
  14. data/examples/c89/test.c89 +10 -10
  15. data/examples/extension/astdf.rb +9 -0
  16. data/examples/extension/atree.dr +55 -0
  17. data/examples/{sample_calc → extension}/calc.atree.dr +42 -43
  18. data/examples/{sample_calc/calc.action.dr → extension/calc.simple_action.dr} +33 -33
  19. data/examples/extension/paction.dr +16 -15
  20. data/examples/extension/pactiontest.dr +14 -14
  21. data/examples/extension/simple_action.rb +46 -0
  22. data/examples/pl0d/pl0ds.dr +337 -334
  23. data/examples/pl0d/test.pl0ds +33 -33
  24. data/examples/rie_calc/calc.rie.dr +57 -0
  25. data/examples/rie_calc/test.calc +4 -0
  26. data/examples/rie_dcuse/dcuse.rie.dr +71 -0
  27. data/examples/rie_dcuse/test.dcuse +1 -0
  28. data/examples/rie_pl0/orig_ex/exerrdg.pl0 +44 -0
  29. data/examples/rie_pl0/orig_ex/exerrm.pl0 +19 -0
  30. data/examples/rie_pl0/orig_ex/exerrmre.pl0 +20 -0
  31. data/examples/rie_pl0/orig_ex/exerrtok.pl0 +18 -0
  32. data/examples/rie_pl0/orig_ex/exmdg.pl0 +40 -0
  33. data/examples/rie_pl0/orig_ex/exmdgwwl.pl0 +43 -0
  34. data/examples/rie_pl0/orig_ex/exmrw.pl0 +22 -0
  35. data/examples/rie_pl0/orig_ex/exmwwl.pl0 +18 -0
  36. data/examples/rie_pl0/orig_ex/exnorw.pl0 +17 -0
  37. data/examples/rie_pl0/pl0.rie.dr +450 -0
  38. data/examples/rie_pl0/test.pl0 +10 -0
  39. data/examples/slex_test/divreg.slex.dr +29 -29
  40. data/examples/slex_test/ljoin.slex.dr +36 -36
  41. data/examples/slex_test/test.divreg +1 -1
  42. data/examples/slex_test/test.ljoin +3 -3
  43. data/examples/{sample_calc/calc.nvaction.dr → tiny_calc/calc.action.dr} +33 -33
  44. data/examples/{sample_calc → tiny_calc}/calc.ast.action.dr +76 -66
  45. data/examples/{sample_calc → tiny_calc}/calc.ast.dr +67 -55
  46. data/examples/tiny_calc/calc.cst.dr +50 -0
  47. data/examples/{sample_calc → tiny_calc}/calc.dr +43 -43
  48. data/examples/{sample_calc → tiny_calc}/calc.lex.dr +29 -29
  49. data/examples/{sample_calc/calc_prec.nvaction.dr → tiny_calc/calc_prec.action.dr} +31 -31
  50. data/lib/depager/cli.rb +44 -0
  51. data/lib/depager/grammar.rb +253 -291
  52. data/lib/depager/lr.rb +589 -579
  53. data/lib/depager/parser.rb +269 -277
  54. data/lib/depager/plugins/_rie_debug.rb +63 -0
  55. data/lib/depager/plugins/action.rb +47 -0
  56. data/lib/depager/plugins/ast.dr +367 -0
  57. data/lib/depager/plugins/ast.rb +1329 -0
  58. data/lib/depager/{ruby/plugins → plugins}/cst.dr +174 -180
  59. data/lib/depager/plugins/cst.rb +591 -0
  60. data/lib/depager/{ruby/plugins → plugins}/lex.dr +85 -89
  61. data/lib/depager/plugins/lex.rb +313 -0
  62. data/lib/depager/plugins/rie.dr +725 -0
  63. data/lib/depager/plugins/rie.rb +1614 -0
  64. data/lib/depager/{ruby/plugins → plugins}/slex.dr +201 -200
  65. data/lib/depager/plugins/slex.rb +769 -0
  66. data/lib/depager/plugins/srp.rb +46 -0
  67. data/lib/depager/ruby/templates/extension_lalr_master.erb +40 -51
  68. data/lib/depager/ruby/templates/extension_lalr_slave.erb +113 -107
  69. data/lib/depager/ruby/templates/single_lalr_parser.erb +124 -117
  70. data/lib/depager/utils.rb +158 -318
  71. data/lib/depager/version.rb +3 -3
  72. data/lib/depager.rb +572 -670
  73. metadata +77 -80
  74. data/ChangeLog +0 -16
  75. data/data/depager/pre-setup.rb +0 -3
  76. data/examples/c89/c89.tab.rb +0 -7127
  77. data/examples/pl0d/pl0ds.tab.rb +0 -2698
  78. data/examples/sample_calc/calc.action.tab.rb +0 -457
  79. data/examples/sample_calc/calc.ast.action.tab.rb +0 -749
  80. data/examples/sample_calc/calc.ast.tab.rb +0 -665
  81. data/examples/sample_calc/calc.astdf.dr +0 -54
  82. data/examples/sample_calc/calc.astdf.tab.rb +0 -672
  83. data/examples/sample_calc/calc.atree.tab.rb +0 -451
  84. data/examples/sample_calc/calc.cst.dr +0 -45
  85. data/examples/sample_calc/calc.cst.tab.rb +0 -644
  86. data/examples/sample_calc/calc.lex.tab.rb +0 -374
  87. data/examples/sample_calc/calc.nvaction.tab.rb +0 -465
  88. data/examples/sample_calc/calc.tab.rb +0 -365
  89. data/examples/sample_calc/calc_prec.nvaction.tab.rb +0 -431
  90. data/examples/slex_test/divreg.slex.tab.rb +0 -303
  91. data/examples/slex_test/ljoin.slex.tab.rb +0 -370
  92. data/lib/depager/ruby/plugins/_ast_tmpl.rb +0 -73
  93. data/lib/depager/ruby/plugins/action.rb +0 -43
  94. data/lib/depager/ruby/plugins/ast.dr +0 -269
  95. data/lib/depager/ruby/plugins/ast.rb +0 -1308
  96. data/lib/depager/ruby/plugins/astdf.rb +0 -6
  97. data/lib/depager/ruby/plugins/atree.dr +0 -55
  98. data/lib/depager/ruby/plugins/atree.rb +0 -347
  99. data/lib/depager/ruby/plugins/cst.rb +0 -626
  100. data/lib/depager/ruby/plugins/lex.rb +0 -336
  101. data/lib/depager/ruby/plugins/nvaction.rb +0 -19
  102. data/lib/depager/ruby/plugins/slex.rb +0 -817
  103. data/lib/depager/ruby/plugins/srp.rb +0 -51
  104. data/lib/depager/ruby/templates/simple.erb +0 -23
  105. data/setup.rb +0 -1585
  106. /data/examples/{sample_calc → tiny_calc}/test.calc +0 -0
@@ -1,89 +1,85 @@
1
- %defext LexerExtension
2
- %extend NVAction ('plugins/nvaction.rb')
3
- %decorate @NVAction
4
- #%decorate ShiftReducePrinter ('plugins/srp.rb')
5
- %param :none
6
- %hook pre_rule_list /%LEX\{\s*\Z/ skip
7
- %banner '%LEX{ ... }'
8
- %inner{
9
- def init_parser
10
- super
11
- @code = []
12
- end
13
- def lex
14
- until @file.eof?
15
- until @line.empty?
16
- case @line
17
- when /\A\s+/
18
- #skip blank
19
- when /\A%\}\s*\Z/
20
- @line = $'
21
- yield nil,nil
22
- when /\A\/(([^\/\\]+|\\.)*)\//
23
- yield :LEX, "/\\A#{$1}/"
24
- when /\A'([^'\\]+|\\.)*'/, /\A"([^"\\]+|\\.)*"/
25
- rest = $'
26
- str = Regexp.escape($1).gsub('/', '\/')
27
- rest.match(/^/)
28
- yield :LEX, "/\\A#{str}/"
29
- when /\A\{/
30
- yield :ACTION, parse_action
31
- /./=~'.'
32
- when /\A(.)/
33
- yield $&, $&
34
- else
35
- raise RuntimeError, "must not happen #{line}"
36
- end
37
- @line = $'
38
- end
39
- getline
40
- end
41
- yield nil, nil
42
- end
43
- %}
44
- %%
45
-
46
- #begin-rule
47
- start:
48
- lexactlist
49
- {
50
- g_parser.optinner << %{
51
- def lex
52
- begin
53
- until @line.empty?
54
- case @line
55
- #{ _lexactlist }
56
- else
57
- raise RuntimeError, "must not happen \#{@line}"
58
- end
59
- end
60
- end while @line0 = @line = getline
61
- yield nil, nil
62
- end
63
- }; #code
64
- }
65
- ;
66
- lexactlist:
67
- lexact { _lexact }
68
- | lexactlist lexact { _lexactlist << _lexact }
69
- ;
70
- lexact:
71
- lexlist opt_noskip ACTION
72
- {
73
- %{
74
- when #{_lexlist.join(', ')}
75
- #{ _opt_noskip ? '#' : "@oldline = @line; @line = $'" }
76
- #{ _ACTION }
77
- }; #code
78
- }
79
- ;
80
- opt_noskip:
81
- { false }
82
- | '!' { true }
83
- ;
84
- lexlist:
85
- LEX { [ _LEX ] }
86
- | lexlist ',' LEX { _lexlist << _LEX }
87
- ;
88
- #end-rule
89
- %%
1
+ %defext Depager::LexerExtension
2
+ %extend Depager::Action ('depager/plugins/action.rb')
3
+ %decorate @Action
4
+ #%decorate Depager::LALR::ShiftReducePrinter ('depager/plugins/srp.rb')
5
+ %expanded_code_delimiter DEPAGER_EXPANDED_CODE
6
+ %hook pre_rule_list /%LEX\{\s*\Z/ skip
7
+ %banner '%LEX{ ... }'
8
+ %inner{
9
+ def lex
10
+ until @file.eof?
11
+ until @line.empty?
12
+ case @line
13
+ when /\A\s+/
14
+ #skip blank
15
+ when /\A%\}\s*\Z/
16
+ @line = $'
17
+ yield nil,nil
18
+ when /\A\/(([^\/\\]+|\\.)*)\//
19
+ yield :LEX, "/\\A#{$1}/"
20
+ when /\A'([^'\\]+|\\.)*'/, /\A"([^"\\]+|\\.)*"/
21
+ rest = $'
22
+ str = Regexp.escape($1).gsub('/', '\/')
23
+ rest.match(/^/)
24
+ yield :LEX, "/\\A#{str}/"
25
+ when /\A\{/
26
+ yield :ACTION, parse_block
27
+ /./=~'.'
28
+ when /\A(.)/
29
+ yield $&, $&
30
+ else
31
+ raise RuntimeError, "must not happen #{line}"
32
+ end
33
+ @line = $'
34
+ end
35
+ @original_line = @line = file.gets
36
+ end
37
+ yield nil, nil
38
+ end
39
+ %}
40
+ %%
41
+
42
+ #begin-rule
43
+ start:
44
+ lexactlist
45
+ {
46
+ g_parser.inner_code << <<~CODE
47
+ def lex
48
+ begin
49
+ until @line.empty?
50
+ case @line
51
+ #{ _lexactlist }
52
+ else
53
+ raise RuntimeError, "must not happen \#{@line}"
54
+ end
55
+ end
56
+ end while @original_line = @line = file.gets
57
+ yield nil, nil
58
+ end
59
+ CODE
60
+ }
61
+ ;
62
+ lexactlist:
63
+ lexact { _lexact }
64
+ | lexactlist lexact { _lexactlist << _lexact }
65
+ ;
66
+ lexact:
67
+ lexlist opt_noskip ACTION
68
+ {
69
+ <<-CODE
70
+ when #{_lexlist.join(', ')}
71
+ #{ _opt_noskip ? '#' : "@line = $'" }
72
+ #{ _ACTION }
73
+ CODE
74
+ }
75
+ ;
76
+ opt_noskip:
77
+ { false }
78
+ | '!' { true }
79
+ ;
80
+ lexlist:
81
+ LEX { [ _LEX ] }
82
+ | lexlist ',' LEX { _lexlist << _LEX }
83
+ ;
84
+ #end-rule
85
+ %%
@@ -0,0 +1,313 @@
1
+ ###
2
+ ### Depager::LexerExtension - Depager Extension (master)
3
+ ###
4
+ require 'depager/parser.rb'
5
+
6
+
7
+ module Depager ; end
8
+
9
+ class Depager::LexerExtension < Depager::Extension
10
+
11
+ def initialize
12
+ super
13
+ @master = self
14
+ @slaves = []
15
+ end
16
+
17
+ def extension_registered g_parser
18
+ super g_parser
19
+
20
+ @slaves << Depager::LexerExtension::PreRuleList0::Parser.new(g_parser, self)
21
+ g_parser.hooks[:pre_rule_list].push [@slaves.last, :do_parse]
22
+ end
23
+
24
+
25
+ end
26
+
27
+ ###
28
+ ### Depager::LexerExtension::PreRuleList0 - Part of Depager Extension (slave)
29
+ ###
30
+
31
+ module Depager::LexerExtension::PreRuleList0 #:nodoc:all
32
+ class Parser < Depager::LALR::Basis #:nodoc:all
33
+ include Depager::Utils::ExtensionSlaveMethods
34
+
35
+ ### Reduce Table
36
+ REDUCE_TABLE = [
37
+ [ -1, 1 ],
38
+ [ 0, 1 ],
39
+ [ 1, 1 ],
40
+ [ 1, 2 ],
41
+ [ 2, 3 ],
42
+ [ 4, 0 ],
43
+ [ 4, 1 ],
44
+ [ 3, 1 ],
45
+ [ 3, 3 ],
46
+ ]
47
+ def reduce_table; REDUCE_TABLE; end
48
+
49
+ ### Term to Int
50
+ TERM_TO_INT = {
51
+ nil => 0,
52
+ false => 1,
53
+ :ACTION => 2,
54
+ "!" => 3,
55
+ :LEX => 4,
56
+ "," => 5,
57
+ }
58
+ def term_to_int; TERM_TO_INT; end
59
+
60
+ ### Int to Term
61
+ INT_TO_TERM = [
62
+ nil,
63
+ false,
64
+ :ACTION,
65
+ "!",
66
+ :LEX,
67
+ ",",
68
+ ]
69
+ def int_to_term; INT_TO_TERM; end
70
+
71
+ ### Action Table
72
+ ACTION_TABLE = [
73
+ [ nil, nil, nil, nil, 5, nil, ],
74
+ [ ACC, nil, nil, nil, nil, nil, ],
75
+ [ nil, nil, nil, nil, 5, nil, ],
76
+ [ nil, nil, nil, nil, nil, nil, ],
77
+ [ nil, nil, nil, 8, nil, 9, ],
78
+ [ nil, nil, nil, nil, nil, nil, ],
79
+ [ nil, nil, nil, nil, nil, nil, ],
80
+ [ nil, nil, 10, nil, nil, nil, ],
81
+ [ nil, nil, nil, nil, nil, nil, ],
82
+ [ nil, nil, nil, nil, 11, nil, ],
83
+ [ nil, nil, nil, nil, nil, nil, ],
84
+ [ nil, nil, nil, nil, nil, nil, ],
85
+ ]
86
+ def action_table; ACTION_TABLE; end
87
+
88
+ ### Default Reduce Table
89
+ DEFRED_TABLE = [
90
+ nil,
91
+ nil,
92
+ -1,
93
+ -2,
94
+ -5,
95
+ -7,
96
+ -3,
97
+ nil,
98
+ -6,
99
+ nil,
100
+ -4,
101
+ -8,
102
+ ]
103
+ def defred_table; DEFRED_TABLE; end
104
+
105
+ DEFRED_AFTER_SHIFT_TABLE = [
106
+ nil,
107
+ nil,
108
+ nil,
109
+ -2,
110
+ nil,
111
+ -7,
112
+ -3,
113
+ nil,
114
+ -6,
115
+ nil,
116
+ -4,
117
+ -8,
118
+ ]
119
+ def defred_after_shift_table; DEFRED_AFTER_SHIFT_TABLE; end
120
+
121
+ ### Nonterm to Int
122
+ NONTERM_TO_INT = {
123
+ :start => 0,
124
+ :lexactlist => 1,
125
+ :lexact => 2,
126
+ :lexlist => 3,
127
+ :opt_noskip => 4,
128
+ }
129
+ def nonterm_to_int; NONTERM_TO_INT; end
130
+
131
+ ### Int to Nonterm
132
+ INT_TO_NONTERM = [
133
+ :start,
134
+ :lexactlist,
135
+ :lexact,
136
+ :lexlist,
137
+ :opt_noskip,
138
+ ]
139
+ def int_to_nonterm; INT_TO_NONTERM; end
140
+
141
+ ### Goto Table
142
+ GOTO_TABLE = [
143
+ [ 1, 2, 3, 4, nil, ],
144
+ [ nil, nil, nil, nil, nil, ],
145
+ [ nil, nil, 6, 4, nil, ],
146
+ [ nil, nil, nil, nil, nil, ],
147
+ [ nil, nil, nil, nil, 7, ],
148
+ [ nil, nil, nil, nil, nil, ],
149
+ [ nil, nil, nil, nil, nil, ],
150
+ [ nil, nil, nil, nil, nil, ],
151
+ [ nil, nil, nil, nil, nil, ],
152
+ [ nil, nil, nil, nil, nil, ],
153
+ [ nil, nil, nil, nil, nil, ],
154
+ [ nil, nil, nil, nil, nil, ],
155
+ ]
156
+ def goto_table; GOTO_TABLE; end
157
+
158
+ def initialize g_parser, master
159
+ super()
160
+ @g_parser = g_parser
161
+ @d_parser = g_parser.d_parser
162
+ @master = master
163
+ @decorated = Action.new(self)
164
+ end
165
+
166
+
167
+ def do_parse?
168
+ if @line.match(/^\s*%LEX\{\s*\Z/)
169
+ @line = $'
170
+ true
171
+ else
172
+ false
173
+ end
174
+ end
175
+
176
+
177
+ def banner
178
+ "%LEX{ ... } / Depager::LexerExtension"
179
+ end
180
+
181
+ module_eval <<'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/lex.dr', 9
182
+ def lex
183
+ until @file.eof?
184
+ until @line.empty?
185
+ case @line
186
+ when /\A\s+/
187
+ #skip blank
188
+ when /\A%\}\s*\Z/
189
+ @line = $'
190
+ yield nil,nil
191
+ when /\A\/(([^\/\\]+|\\.)*)\//
192
+ yield :LEX, "/\\A#{$1}/"
193
+ when /\A'([^'\\]+|\\.)*'/, /\A"([^"\\]+|\\.)*"/
194
+ rest = $'
195
+ str = Regexp.escape($1).gsub('/', '\/')
196
+ rest.match(/^/)
197
+ yield :LEX, "/\\A#{str}/"
198
+ when /\A\{/
199
+ yield :ACTION, parse_block
200
+ /./=~'.'
201
+ when /\A(.)/
202
+ yield $&, $&
203
+ else
204
+ raise RuntimeError, "must not happen #{line}"
205
+ end
206
+ @line = $'
207
+ end
208
+ @original_line = @line = file.gets
209
+ end
210
+ yield nil, nil
211
+ end
212
+
213
+ DEPAGER_EXPANDED_CODE
214
+
215
+ end
216
+ end
217
+
218
+ class Depager::LexerExtension::PreRuleList0::Action < Depager::LALR::Action #:nodoc:all
219
+ include Depager::Utils::ExtensionSlaveDecoratorMethods
220
+ ON_REDUCE = [
221
+ nil,
222
+ :_act_1,
223
+ :_act_2,
224
+ :_act_3,
225
+ :_act_4,
226
+ :_act_5,
227
+ :_act_6,
228
+ :_act_7,
229
+ :_act_8,
230
+
231
+ ]
232
+ def on_reduce; ON_REDUCE; end
233
+
234
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/lex.dr', 43
235
+ def _act_1 val
236
+ _lexactlist, = *val
237
+
238
+ g_parser.inner_code << <<~CODE
239
+ def lex
240
+ begin
241
+ until @line.empty?
242
+ case @line
243
+ #{ _lexactlist }
244
+ else
245
+ raise RuntimeError, "must not happen \#{@line}"
246
+ end
247
+ end
248
+ end while @original_line = @line = file.gets
249
+ yield nil, nil
250
+ end
251
+ CODE
252
+
253
+ end
254
+ DEPAGER_EXPANDED_CODE
255
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/lex.dr', 61
256
+ def _act_2 val
257
+ _lexact, = *val
258
+ _lexact
259
+
260
+ end
261
+ DEPAGER_EXPANDED_CODE
262
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/lex.dr', 62
263
+ def _act_3 val
264
+ _lexactlist, _lexact, = *val
265
+ _lexactlist << _lexact
266
+
267
+ end
268
+ DEPAGER_EXPANDED_CODE
269
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/lex.dr', 66
270
+ def _act_4 val
271
+ _lexlist, _opt_noskip, _ACTION, = *val
272
+
273
+ <<-CODE
274
+ when #{_lexlist.join(', ')}
275
+ #{ _opt_noskip ? '#' : "@line = $'" }
276
+ #{ _ACTION }
277
+ CODE
278
+
279
+ end
280
+ DEPAGER_EXPANDED_CODE
281
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/lex.dr', 75
282
+ def _act_5 val
283
+ # empty rule
284
+ false
285
+
286
+ end
287
+ DEPAGER_EXPANDED_CODE
288
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/lex.dr', 76
289
+ def _act_6 val
290
+ _, = *val
291
+ true
292
+
293
+ end
294
+ DEPAGER_EXPANDED_CODE
295
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/lex.dr', 79
296
+ def _act_7 val
297
+ _LEX, = *val
298
+ [ _LEX ]
299
+
300
+ end
301
+ DEPAGER_EXPANDED_CODE
302
+ module_eval <<-'DEPAGER_EXPANDED_CODE', 'lib/depager/plugins/lex.dr', 80
303
+ def _act_8 val
304
+ _lexlist, _, _LEX, = *val
305
+ _lexlist << _LEX
306
+
307
+ end
308
+ DEPAGER_EXPANDED_CODE
309
+
310
+
311
+ end
312
+
313
+