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.
- checksums.yaml +7 -0
- data/.rubocop.yml +44 -0
- data/.simplecov +5 -0
- data/Gemfile +12 -0
- data/LICENSE.gpl +339 -0
- data/Manifest.txt +73 -0
- data/README.en +7 -21
- data/README.ja +19 -99
- data/Rakefile +31 -0
- data/bin/depager +7 -45
- data/examples/action_pl0d/pl0d.action.dr +421 -0
- data/examples/action_pl0d/test.pl0ds +48 -0
- data/examples/c89/c89.dr +493 -496
- data/examples/c89/test.c89 +10 -10
- data/examples/extension/astdf.rb +9 -0
- data/examples/extension/atree.dr +55 -0
- data/examples/{sample_calc → extension}/calc.atree.dr +42 -43
- data/examples/{sample_calc/calc.action.dr → extension/calc.simple_action.dr} +33 -33
- data/examples/extension/paction.dr +16 -15
- data/examples/extension/pactiontest.dr +14 -14
- data/examples/extension/simple_action.rb +46 -0
- data/examples/pl0d/pl0ds.dr +337 -334
- data/examples/pl0d/test.pl0ds +33 -33
- data/examples/rie_calc/calc.rie.dr +57 -0
- data/examples/rie_calc/test.calc +4 -0
- data/examples/rie_dcuse/dcuse.rie.dr +71 -0
- data/examples/rie_dcuse/test.dcuse +1 -0
- data/examples/rie_pl0/orig_ex/exerrdg.pl0 +44 -0
- data/examples/rie_pl0/orig_ex/exerrm.pl0 +19 -0
- data/examples/rie_pl0/orig_ex/exerrmre.pl0 +20 -0
- data/examples/rie_pl0/orig_ex/exerrtok.pl0 +18 -0
- data/examples/rie_pl0/orig_ex/exmdg.pl0 +40 -0
- data/examples/rie_pl0/orig_ex/exmdgwwl.pl0 +43 -0
- data/examples/rie_pl0/orig_ex/exmrw.pl0 +22 -0
- data/examples/rie_pl0/orig_ex/exmwwl.pl0 +18 -0
- data/examples/rie_pl0/orig_ex/exnorw.pl0 +17 -0
- data/examples/rie_pl0/pl0.rie.dr +450 -0
- data/examples/rie_pl0/test.pl0 +10 -0
- data/examples/slex_test/divreg.slex.dr +29 -29
- data/examples/slex_test/ljoin.slex.dr +36 -36
- data/examples/slex_test/test.divreg +1 -1
- data/examples/slex_test/test.ljoin +3 -3
- data/examples/{sample_calc/calc.nvaction.dr → tiny_calc/calc.action.dr} +33 -33
- data/examples/{sample_calc → tiny_calc}/calc.ast.action.dr +76 -66
- data/examples/{sample_calc → tiny_calc}/calc.ast.dr +67 -55
- data/examples/tiny_calc/calc.cst.dr +50 -0
- data/examples/{sample_calc → tiny_calc}/calc.dr +43 -43
- data/examples/{sample_calc → tiny_calc}/calc.lex.dr +29 -29
- data/examples/{sample_calc/calc_prec.nvaction.dr → tiny_calc/calc_prec.action.dr} +31 -31
- data/lib/depager/cli.rb +44 -0
- data/lib/depager/grammar.rb +253 -291
- data/lib/depager/lr.rb +589 -579
- data/lib/depager/parser.rb +269 -277
- data/lib/depager/plugins/_rie_debug.rb +63 -0
- data/lib/depager/plugins/action.rb +47 -0
- data/lib/depager/plugins/ast.dr +367 -0
- data/lib/depager/plugins/ast.rb +1329 -0
- data/lib/depager/{ruby/plugins → plugins}/cst.dr +174 -180
- data/lib/depager/plugins/cst.rb +591 -0
- data/lib/depager/{ruby/plugins → plugins}/lex.dr +85 -89
- data/lib/depager/plugins/lex.rb +313 -0
- data/lib/depager/plugins/rie.dr +725 -0
- data/lib/depager/plugins/rie.rb +1614 -0
- data/lib/depager/{ruby/plugins → plugins}/slex.dr +201 -200
- data/lib/depager/plugins/slex.rb +769 -0
- data/lib/depager/plugins/srp.rb +46 -0
- data/lib/depager/ruby/templates/extension_lalr_master.erb +40 -51
- data/lib/depager/ruby/templates/extension_lalr_slave.erb +113 -107
- data/lib/depager/ruby/templates/single_lalr_parser.erb +124 -117
- data/lib/depager/utils.rb +158 -318
- data/lib/depager/version.rb +3 -3
- data/lib/depager.rb +572 -670
- metadata +77 -80
- data/ChangeLog +0 -16
- data/data/depager/pre-setup.rb +0 -3
- data/examples/c89/c89.tab.rb +0 -7127
- data/examples/pl0d/pl0ds.tab.rb +0 -2698
- data/examples/sample_calc/calc.action.tab.rb +0 -457
- data/examples/sample_calc/calc.ast.action.tab.rb +0 -749
- data/examples/sample_calc/calc.ast.tab.rb +0 -665
- data/examples/sample_calc/calc.astdf.dr +0 -54
- data/examples/sample_calc/calc.astdf.tab.rb +0 -672
- data/examples/sample_calc/calc.atree.tab.rb +0 -451
- data/examples/sample_calc/calc.cst.dr +0 -45
- data/examples/sample_calc/calc.cst.tab.rb +0 -644
- data/examples/sample_calc/calc.lex.tab.rb +0 -374
- data/examples/sample_calc/calc.nvaction.tab.rb +0 -465
- data/examples/sample_calc/calc.tab.rb +0 -365
- data/examples/sample_calc/calc_prec.nvaction.tab.rb +0 -431
- data/examples/slex_test/divreg.slex.tab.rb +0 -303
- data/examples/slex_test/ljoin.slex.tab.rb +0 -370
- data/lib/depager/ruby/plugins/_ast_tmpl.rb +0 -73
- data/lib/depager/ruby/plugins/action.rb +0 -43
- data/lib/depager/ruby/plugins/ast.dr +0 -269
- data/lib/depager/ruby/plugins/ast.rb +0 -1308
- data/lib/depager/ruby/plugins/astdf.rb +0 -6
- data/lib/depager/ruby/plugins/atree.dr +0 -55
- data/lib/depager/ruby/plugins/atree.rb +0 -347
- data/lib/depager/ruby/plugins/cst.rb +0 -626
- data/lib/depager/ruby/plugins/lex.rb +0 -336
- data/lib/depager/ruby/plugins/nvaction.rb +0 -19
- data/lib/depager/ruby/plugins/slex.rb +0 -817
- data/lib/depager/ruby/plugins/srp.rb +0 -51
- data/lib/depager/ruby/templates/simple.erb +0 -23
- data/setup.rb +0 -1585
- /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
|
-
%%
|