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,269 +0,0 @@
1
- %defext ASTBuilderExtension
2
- %extend Lexer ('plugins/lex.rb')
3
- %extend NVAction ('plugins/nvaction.rb')
4
- %decorate @NVAction
5
- #%decorate ShiftReducePrinter ('plugins/srp.rb')
6
- %inner{
7
- require 'plugins/_ast_tmpl'
8
- attr_accessor :optouter, :on_reduce, :visitor
9
- def init_parser
10
- super
11
- @visitor = Hash.new{|hash, key| hash[key] = []}
12
- @optouter = []
13
- @on_reduce = []
14
- @output_file_name = nil
15
- end
16
- def post_rule_list
17
- g_parser.optouter <<
18
- gen_action_decorator_code(target_name, paramkey,
19
- @on_reduce, @optouter)
20
- end
21
-
22
- def modify_action_code code, nodes=[]
23
- code = code.gsub(/\$\.([a-z_])/, 'node.\1')
24
- code << %{
25
- rescue
26
- warn "raise at src:\#{node.lineno}/\#{node.class.name}"
27
- raise
28
- }
29
- end
30
- def gen_accept_code sym
31
- return ''
32
- end
33
-
34
- attr_reader :output_file_name
35
- def output_file_name= ofname
36
- ofname = ofname.match(/'(.+)'/) ? $1 : ofname
37
- @output_file_name = ofname
38
- end
39
- %}
40
- %hook pre_rule_list /%AST\{\s*\Z/ skip
41
- %banner '%AST{ ... }'
42
- %%
43
-
44
- %LEX{
45
- /\s+/, /#.*/ { }
46
- /%\}\s*\Z/ { @line = $'; yield nil,nil }
47
- 'Node' { yield token(:NODE, $&) }
48
- 'Visitor' { yield token(:VISITOR, $&) }
49
- /[a-zA-Z][a-zA-Z0-9_]*/ { yield token(:ID, $&) }
50
- '{' ! { ln = lineno; yield token(:ACTION, parse_action, ln) }
51
- /./ { yield token($&, $&) }
52
- %}
53
-
54
- #begin-rule
55
- start:
56
- opt_defnode opt_defvis defnode_list
57
- {
58
- code = _opt_defnode
59
- code << val[2] << %{
60
- class Visitor
61
- def visit node
62
- node.accept(self)
63
- end
64
- #{master.visitor[nil].join}
65
- end
66
- };#code
67
- master.visitor.each do |k, v|
68
- next unless k
69
- code << %{
70
- class Visitor_#{k}
71
- #{v.join}
72
- end
73
- };#code
74
- end
75
- if master.output_file_name
76
- File.open(master.output_file_name, 'w') do |f|
77
- f.write code
78
- end
79
- g_parser.optouter << %!require '#{master.output_file_name}'\n!
80
- else
81
- g_parser.optouter << code
82
- end
83
- }
84
- ;
85
- opt_defnode:
86
- { "" }
87
- | NODE opt_attr ACTION
88
- {
89
- ini = %{
90
- def initialize
91
- #{_ACTION.value}
92
- end
93
- };#code
94
- ERB.new(master.class::TMPL_NODE_BASE).result(binding)
95
- }
96
- ;
97
- opt_defvis:
98
- { [] }
99
- | VISITOR opt_action
100
- {
101
- _opt_action[nil] ||= Token['', 0]
102
- _opt_action.each do |pass, act|
103
- master.visitor[pass].unshift(
104
- master.gen_meval_code(act.lineno, 0, act.value.to_s))
105
- end
106
- }
107
- ;
108
- defnode_list:
109
- defnode { _defnode }
110
- | defnode_list defnode { _defnode_list << _defnode}
111
- ;
112
- defnode:
113
- defnode_header opt_attr opt_action
114
- {
115
- name, args = _defnode_header
116
- nodes, accept, attrs = [], '', _opt_attr
117
- args.each do |i|
118
- if i =~ /\-(.*)/
119
- nodes.push $1
120
- attrs.push $1
121
- else
122
- nodes.push i
123
- accept << master.gen_accept_code(i)
124
- end
125
- end
126
- _opt_action[nil] = Token['', 0] unless _opt_action[nil]
127
- _opt_action.each do |pass, act|
128
- vis_code = master.modify_action_code(act.value, nodes - attrs)
129
- master.visitor[pass] <<
130
- master.gen_defm_code("visit_Node_#{name} node",
131
- vis_code, act.lineno)
132
- end
133
- ERB.new(master.class::TMPL_NODE).result(binding)
134
- }
135
- ;
136
- defnode_header:
137
- ID '(' ')' { [_ID.value, []]}
138
- | ID '(' fact_list ')' { [_ID.value, _fact_list] }
139
- ;
140
- opt_attr:
141
- { [] }
142
- | '[' ']' { [] }
143
- | '[' id_list ']' { _id_list }
144
- ;
145
- fact_list:
146
- fact { [_fact] }
147
- | fact_list ',' fact { _fact_list.push _fact }
148
- ;
149
- fact:
150
- ID { _ID.value }
151
- | '-' ID { '-' + _ID.value }
152
- ;
153
- id_list:
154
- ID { [ _ID.value ] }
155
- | id_list ',' ID { _id_list.push _ID.value }
156
- ;
157
- opt_action:
158
- { {nil => Token['', 0]} }
159
- | ACTION { {nil => _ACTION} }
160
- | pass_action_list
161
- {
162
- Hash[ *_pass_action_list.flatten ].merge({nil => Token['', 0]})
163
- }
164
- ;
165
- pass_action_list:
166
- pass_action { [ _pass_action ] }
167
- | pass_action_list pass_action { _pass_action_list << _pass_action }
168
- ;
169
-
170
- pass_action:
171
- '<' ID '>' ACTION { [_ID.value, _ACTION]}
172
- ;
173
- #end-rule
174
- %%
175
- %hook post_rhs /=>/ skip
176
- %banner '=>...'
177
- %prec{
178
- left LL '@'
179
- %}
180
- %inner{
181
- def do_default
182
- n = master.nrules
183
- master.optouter <<
184
- master.gen_defm_code("_ast_#{n} val", "NilNode.new(basis.file.lineno)", lineno)
185
- master.on_reduce[n] = ":_ast_#{n}"
186
- end
187
- %}
188
- %%
189
-
190
- %LEX{
191
- /[ \t]+/ { }
192
- /\r?\n/ { yield nil, nil }
193
- /<</ { yield token(:LL, $&) }
194
- /%([a-zA-Z0-9_]+)((::[a-zA-Z0-9_]+)*)/
195
- { yield token(:CONST, $1+$2) }
196
- /%\((.+)\)%/ { yield token(:EMBED, $1) }
197
- 'nil' { yield token(:NIL, $&) }
198
- 'NilNode' { yield token(:NILNODE, $&) }
199
- /[0-9]+/ { yield token(:NUMBER, $&.to_i) }
200
- /:[a-zA-Z0-9_]+/ { yield token(:SYMBOL, $&) }
201
- /[a-zA-Z][a-zA-Z0-9_]*/ { yield token(:ID, $&) }
202
- /'(.+)'/ { yield token(:STR, $1) }
203
- /./ { yield token($&, $&) }
204
- %}
205
- #begin-rule
206
- start:
207
- fnl
208
- {
209
- n = master.nrules
210
- master.optouter <<
211
- master.gen_defm_code("_ast_#{n} val", _fnl, basis.file.lineno)
212
- master.on_reduce[n] = ":_ast_#{n}"
213
- }
214
- ;
215
- node:
216
- ID '(' ')' { "Node_#{_ID.value}.new(basis.file.lineno)" }
217
- | ID '(' fnlpair ')'
218
- {
219
- if g_parser.rhs.size > 0
220
- "Node_#{_ID.value}.new(val[0].lineno, #{_fnlpair.join(', ')})"
221
- else
222
- "Node_#{_ID.value}.new(basis.file.lineno, #{_fnlpair.join(', ')})"
223
- end
224
- }
225
- ;
226
- fnlpair:
227
- fnl { [_fnl] }
228
- | fnlpair ',' fnl { _fnlpair << _fnl }
229
- ;
230
- fnl:
231
- fact { _fact }
232
- | node { _node }
233
- | list { _list }
234
- ;
235
- fact:
236
- ID opt_embed
237
- {
238
- unless i = g_parser.name_to_rhs_index(_ID.value)
239
- warn "#{g_parser.lineno}: ?#{_ID.value}"
240
- raise
241
- end
242
- "val[#{i}]#{val[1]}"
243
- }
244
- | CONST { "Depager::Token[#{_CONST.value}]" }
245
- | SYMBOL { "Depager::Token[#{_SYMBOL.value}]" }
246
- | STR { "Depager::Token['#{_STR.value}']" }
247
- | NILNODE { "NilNode.new(basis.file.lineno)" }
248
- | NUMBER { "Depager::Token[#{_NUMBER.value}]" }
249
- | NIL { "nil" }
250
- ;
251
- opt_embed:
252
- { '' }
253
- | EMBED { _EMBED.value }
254
- ;
255
- list:
256
- '['']' { "NodeList.new(basis.file.lineno, [])" }
257
- | '['fnlpair']'
258
- {
259
- if g_parser.rhs.size > 0
260
- "NodeList.new(val[0].lineno, [#{_fnlpair.join(', ')}])"
261
- else
262
- "NodeList.new(basis.file.lineno, #{_fnlpair.join(', ')})"
263
- end
264
- }
265
- | fnl-l LL fnl-r { "#{_l}.push(#{_r})" }
266
- | fnl-l '@' fnl-r { "#{_l}.concat(#{_r})" }
267
- ;
268
- #end-rule
269
- %%