ruby_parser 3.0.0 → 3.19.1
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
- checksums.yaml.gz.sig +0 -0
- data/.autotest +36 -19
- data/History.rdoc +1297 -0
- data/Manifest.txt +35 -7
- data/{README.txt → README.rdoc} +44 -14
- data/Rakefile +308 -110
- data/bin/ruby_parse +3 -1
- data/bin/ruby_parse_extract_error +36 -16
- data/compare/normalize.rb +218 -0
- data/debugging.md +190 -0
- data/gauntlet.md +107 -0
- data/lib/.document +1 -0
- data/lib/rp_extensions.rb +53 -0
- data/lib/rp_stringscanner.rb +33 -0
- data/lib/ruby20_parser.rb +10973 -0
- data/lib/ruby20_parser.y +2683 -0
- data/lib/ruby21_parser.rb +10980 -0
- data/lib/ruby21_parser.y +2700 -0
- data/lib/ruby22_parser.rb +11123 -0
- data/lib/ruby22_parser.y +2711 -0
- data/lib/ruby23_parser.rb +11132 -0
- data/lib/ruby23_parser.y +2713 -0
- data/lib/ruby24_parser.rb +11231 -0
- data/lib/ruby24_parser.y +2721 -0
- data/lib/ruby25_parser.rb +11231 -0
- data/lib/ruby25_parser.y +2721 -0
- data/lib/ruby26_parser.rb +11253 -0
- data/lib/ruby26_parser.y +2736 -0
- data/lib/ruby27_parser.rb +12980 -0
- data/lib/ruby27_parser.y +3324 -0
- data/lib/ruby30_parser.rb +13242 -0
- data/lib/ruby30_parser.y +3447 -0
- data/lib/ruby31_parser.rb +13622 -0
- data/lib/ruby31_parser.y +3481 -0
- data/lib/ruby3_parser.yy +3536 -0
- data/lib/ruby_lexer.rb +933 -1232
- data/lib/ruby_lexer.rex +185 -0
- data/lib/ruby_lexer.rex.rb +399 -0
- data/lib/ruby_lexer_strings.rb +638 -0
- data/lib/ruby_parser.rb +97 -3
- data/lib/ruby_parser.yy +3465 -0
- data/lib/ruby_parser_extras.rb +1216 -687
- data/test/test_ruby_lexer.rb +2249 -1092
- data/test/test_ruby_parser.rb +5156 -975
- data/test/test_ruby_parser_extras.rb +47 -77
- data/tools/munge.rb +250 -0
- data/tools/ripper.rb +44 -0
- data.tar.gz.sig +1 -1
- metadata +200 -155
- metadata.gz.sig +0 -0
- data/.gemtest +0 -0
- data/History.txt +0 -482
- data/lib/gauntlet_rubyparser.rb +0 -120
- data/lib/ruby18_parser.rb +0 -5747
- data/lib/ruby18_parser.y +0 -1873
- data/lib/ruby19_parser.rb +0 -6110
- data/lib/ruby19_parser.y +0 -2078
@@ -1,13 +1,10 @@
|
|
1
1
|
# encoding: US-ASCII
|
2
2
|
|
3
|
-
require
|
4
|
-
|
5
|
-
require
|
6
|
-
require 'ruby_parser_extras'
|
3
|
+
require "minitest/autorun"
|
4
|
+
require "ruby_parser_extras"
|
5
|
+
require "ruby_parser"
|
7
6
|
|
8
|
-
|
9
|
-
|
10
|
-
class TestStackState < MiniTest::Unit::TestCase
|
7
|
+
class TestStackState < Minitest::Test
|
11
8
|
attr_reader :s
|
12
9
|
|
13
10
|
def setup
|
@@ -16,14 +13,14 @@ class TestStackState < MiniTest::Unit::TestCase
|
|
16
13
|
|
17
14
|
def assert_encoding str, default = false
|
18
15
|
orig_str = str.dup
|
19
|
-
p =
|
16
|
+
p = RubyParser.latest
|
20
17
|
s = nil
|
21
18
|
|
22
|
-
out, err = capture_io
|
19
|
+
out, err = capture_io {
|
23
20
|
s = p.handle_encoding str
|
24
|
-
|
21
|
+
}
|
25
22
|
|
26
|
-
assert_equal orig_str.sub(/\357\273\277/,
|
23
|
+
assert_equal orig_str.sub(/\357\273\277/, ""), s
|
27
24
|
|
28
25
|
exp_err = ""
|
29
26
|
|
@@ -163,9 +160,9 @@ class TestStackState < MiniTest::Unit::TestCase
|
|
163
160
|
end
|
164
161
|
end
|
165
162
|
|
166
|
-
class TestEnvironment <
|
163
|
+
class TestEnvironment < Minitest::Test
|
167
164
|
def deny t
|
168
|
-
assert !
|
165
|
+
assert !t
|
169
166
|
end
|
170
167
|
|
171
168
|
def setup
|
@@ -174,36 +171,6 @@ class TestEnvironment < MiniTest::Unit::TestCase
|
|
174
171
|
assert_equal 42, @env[:blah]
|
175
172
|
end
|
176
173
|
|
177
|
-
def test_use
|
178
|
-
@env.use :blah
|
179
|
-
expected = [{ :blah => true }]
|
180
|
-
assert_equal expected, @env.instance_variable_get(:"@use")
|
181
|
-
end
|
182
|
-
|
183
|
-
def test_use_scoped
|
184
|
-
@env.use :blah
|
185
|
-
@env.extend
|
186
|
-
expected = [{}, { :blah => true }]
|
187
|
-
assert_equal expected, @env.instance_variable_get(:"@use")
|
188
|
-
end
|
189
|
-
|
190
|
-
def test_used_eh
|
191
|
-
@env.extend :dynamic
|
192
|
-
@env[:x] = :dvar
|
193
|
-
@env.use :x
|
194
|
-
assert_equal true, @env.used?(:x)
|
195
|
-
end
|
196
|
-
|
197
|
-
def test_used_eh_none
|
198
|
-
assert_equal nil, @env.used?(:x)
|
199
|
-
end
|
200
|
-
|
201
|
-
def test_used_eh_scoped
|
202
|
-
self.test_used_eh
|
203
|
-
@env.extend :dynamic
|
204
|
-
assert_equal true, @env.used?(:x)
|
205
|
-
end
|
206
|
-
|
207
174
|
def test_var_scope_dynamic
|
208
175
|
@env.extend :dynamic
|
209
176
|
assert_equal 42, @env[:blah]
|
@@ -213,35 +180,11 @@ class TestEnvironment < MiniTest::Unit::TestCase
|
|
213
180
|
|
214
181
|
def test_var_scope_static
|
215
182
|
@env.extend
|
216
|
-
|
183
|
+
assert_nil @env[:blah]
|
217
184
|
@env.unextend
|
218
185
|
assert_equal 42, @env[:blah]
|
219
186
|
end
|
220
187
|
|
221
|
-
def test_dynamic
|
222
|
-
expected1 = {}
|
223
|
-
expected2 = { :x => 42 }
|
224
|
-
|
225
|
-
assert_equal expected1, @env.dynamic
|
226
|
-
begin
|
227
|
-
@env.extend :dynamic
|
228
|
-
assert_equal expected1, @env.dynamic
|
229
|
-
|
230
|
-
@env[:x] = 42
|
231
|
-
assert_equal expected2, @env.dynamic
|
232
|
-
|
233
|
-
begin
|
234
|
-
@env.extend :dynamic
|
235
|
-
assert_equal expected2, @env.dynamic
|
236
|
-
@env.unextend
|
237
|
-
end
|
238
|
-
|
239
|
-
assert_equal expected2, @env.dynamic
|
240
|
-
@env.unextend
|
241
|
-
end
|
242
|
-
assert_equal expected1, @env.dynamic
|
243
|
-
end
|
244
|
-
|
245
188
|
def test_all_dynamic
|
246
189
|
expected = { :blah => 42 }
|
247
190
|
|
@@ -261,14 +204,6 @@ class TestEnvironment < MiniTest::Unit::TestCase
|
|
261
204
|
assert_equal expected, @env.all
|
262
205
|
end
|
263
206
|
|
264
|
-
def test_dynamic_eh
|
265
|
-
assert_equal false, @env.dynamic?
|
266
|
-
@env.extend :dynamic
|
267
|
-
assert_equal true, @env.dynamic?
|
268
|
-
@env.extend
|
269
|
-
assert_equal false, @env.dynamic?
|
270
|
-
end
|
271
|
-
|
272
207
|
def test_all_static_deeper
|
273
208
|
expected0 = { :blah => 42 }
|
274
209
|
expected1 = { :blah => 42, :blah2 => 24 }
|
@@ -278,7 +213,7 @@ class TestEnvironment < MiniTest::Unit::TestCase
|
|
278
213
|
@env[:blah2] = 24
|
279
214
|
assert_equal expected1, @env.all
|
280
215
|
|
281
|
-
@env.extend
|
216
|
+
@env.extend
|
282
217
|
@env[:blah] = 27
|
283
218
|
assert_equal expected2, @env.all
|
284
219
|
|
@@ -289,3 +224,38 @@ class TestEnvironment < MiniTest::Unit::TestCase
|
|
289
224
|
assert_equal expected0, @env.all
|
290
225
|
end
|
291
226
|
end
|
227
|
+
|
228
|
+
class Fake20
|
229
|
+
include RubyParserStuff
|
230
|
+
|
231
|
+
def initialize
|
232
|
+
end
|
233
|
+
|
234
|
+
def s(*a) # bypass lexer/lineno stuff that RP overrides in
|
235
|
+
Kernel.send :s, *a
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
class TestValueExpr < Minitest::Test
|
240
|
+
def assert_value_expr exp, input
|
241
|
+
assert_equal exp, Fake20.new.value_expr(input.line(1))
|
242
|
+
end
|
243
|
+
|
244
|
+
def assert_remove_begin exp, input
|
245
|
+
assert_equal exp, Fake20.new.remove_begin(input.line(1))
|
246
|
+
end
|
247
|
+
|
248
|
+
def test_value_expr
|
249
|
+
assert_value_expr s(:nil), s(:begin)
|
250
|
+
assert_value_expr s(:nil), s(:begin, s(:nil))
|
251
|
+
assert_value_expr s(:nil), s(:begin, s(:begin, s(:nil)))
|
252
|
+
assert_value_expr s(:begin, s(:nil), s(:nil)), s(:begin, s(:nil), s(:nil))
|
253
|
+
end
|
254
|
+
|
255
|
+
def test_remove_begin
|
256
|
+
assert_remove_begin s(:nil), s(:begin)
|
257
|
+
assert_remove_begin s(:nil), s(:begin, s(:nil))
|
258
|
+
assert_remove_begin s(:nil), s(:begin, s(:begin, s(:nil)))
|
259
|
+
assert_remove_begin s(:begin, s(:nil), s(:nil)), s(:begin, s(:nil), s(:nil))
|
260
|
+
end
|
261
|
+
end
|
data/tools/munge.rb
ADDED
@@ -0,0 +1,250 @@
|
|
1
|
+
#!/usr/bin/env ruby -ws
|
2
|
+
|
3
|
+
$v ||= false
|
4
|
+
|
5
|
+
stack = []
|
6
|
+
last_token = nil
|
7
|
+
reduce_line = nil
|
8
|
+
|
9
|
+
def munge s
|
10
|
+
renames = [
|
11
|
+
"'='", "tEQL",
|
12
|
+
"'!'", "tBANG",
|
13
|
+
"'%'", "tPERCENT",
|
14
|
+
"'&'", "tAMPER2",
|
15
|
+
"'('", "tLPAREN2",
|
16
|
+
"')'", "tRPAREN",
|
17
|
+
"'*'", "tSTAR2",
|
18
|
+
"'+'", "tPLUS",
|
19
|
+
"','", "tCOMMA",
|
20
|
+
"'-'", "tMINUS",
|
21
|
+
"'.'", "tDOT",
|
22
|
+
"'/'", "tDIVIDE",
|
23
|
+
"';'", "tSEMI",
|
24
|
+
"':'", "tCOLON",
|
25
|
+
"'<'", "tLT",
|
26
|
+
"'>'", "tGT",
|
27
|
+
"'?'", "tEH",
|
28
|
+
"'['", "tLBRACK",
|
29
|
+
"'\\n'", "tNL",
|
30
|
+
"']'", "tRBRACK",
|
31
|
+
"'^'", "tCARET",
|
32
|
+
"'`'", "tBACK_REF2",
|
33
|
+
"'{'", "tLCURLY",
|
34
|
+
"'|'", "tPIPE",
|
35
|
+
"'}'", "tRCURLY",
|
36
|
+
"'~'", "tTILDE",
|
37
|
+
'"["', "tLBRACK",
|
38
|
+
|
39
|
+
# 2.0 changes?
|
40
|
+
'"<=>"', "tCMP",
|
41
|
+
'"=="', "tEQ",
|
42
|
+
'"==="', "tEQQ",
|
43
|
+
'"!~"', "tNMATCH",
|
44
|
+
'"=~"', "tMATCH",
|
45
|
+
'">="', "tGEQ",
|
46
|
+
'"<="', "tLEQ",
|
47
|
+
'"!="', "tNEQ",
|
48
|
+
'"<<"', "tLSHFT",
|
49
|
+
'">>"', "tRSHFT",
|
50
|
+
'"*"', "tSTAR",
|
51
|
+
|
52
|
+
'".."', "tDOT2",
|
53
|
+
|
54
|
+
'"&"', "tAMPER",
|
55
|
+
'"&&"', "tANDOP",
|
56
|
+
'"&."', "tLONELY",
|
57
|
+
'"||"', "tOROP",
|
58
|
+
|
59
|
+
'"..."', "tDOT3",
|
60
|
+
'"**"', "tPOW",
|
61
|
+
'"unary+"', "tUPLUS",
|
62
|
+
'"unary-"', "tUMINUS",
|
63
|
+
'"[]"', "tAREF",
|
64
|
+
'"[]="', "tASET",
|
65
|
+
'"::"', "tCOLON2",
|
66
|
+
'"{ arg"', "tLBRACE_ARG",
|
67
|
+
'"( arg"', "tLPAREN_ARG",
|
68
|
+
'"("', "tLPAREN",
|
69
|
+
'rparen', "tRPAREN",
|
70
|
+
'"{"', "tLBRACE",
|
71
|
+
'"=>"', "tASSOC",
|
72
|
+
'"->"', "tLAMBDA",
|
73
|
+
'":: at EXPR_BEG"', "tCOLON3",
|
74
|
+
'"**arg"', "tDSTAR",
|
75
|
+
'","', "tCOMMA",
|
76
|
+
|
77
|
+
# other
|
78
|
+
|
79
|
+
'kTERMINATOR', "tSTRING_END",
|
80
|
+
'"kTERMINATOR"', "tSTRING_END",
|
81
|
+
'kTRCURLY', "tSTRING_DEND",
|
82
|
+
|
83
|
+
'"symbol literal"', "tSYMBEG",
|
84
|
+
'"string literal"', "tSTRING_BEG",
|
85
|
+
'"backtick literal"', "tXSTRING_BEG",
|
86
|
+
'"regexp literal"', "tREGEXP_BEG",
|
87
|
+
'"word list"', "tWORDS_BEG",
|
88
|
+
'"verbatim word list"', "tQWORDS_BEG",
|
89
|
+
'"symbol list"', "tSYMBOLS_BEG",
|
90
|
+
'"verbatim symbol list"', "tQSYMBOLS_BEG",
|
91
|
+
'"terminator"', "tSTRING_END",
|
92
|
+
'"\'}\'"', "tSTRING_DEND",
|
93
|
+
|
94
|
+
'"string literal"',"tSTRING_BEG",
|
95
|
+
'"literal content"', "tSTRING_CONTENT",
|
96
|
+
/\$/, "", # try to remove these lumps?
|
97
|
+
|
98
|
+
'tLBRACK2', "tLBRACK", # HACK
|
99
|
+
|
100
|
+
"' '", "tSPACE", # needs to be later to avoid bad hits
|
101
|
+
|
102
|
+
"/* empty */", "none",
|
103
|
+
/^\s*$/, "",
|
104
|
+
|
105
|
+
"keyword_BEGIN", "klBEGIN",
|
106
|
+
"keyword_END", "klEND",
|
107
|
+
/keyword_(\w+)/, proc { "k#{$1.upcase}" },
|
108
|
+
/\bk_([a-z_]+)/, proc { "k#{$1.upcase}" },
|
109
|
+
/modifier_(\w+)/, proc { "k#{$1.upcase}_MOD" },
|
110
|
+
"kVARIABLE", "keyword_variable", # ugh
|
111
|
+
"tCONST", "kCONST",
|
112
|
+
|
113
|
+
# 2.6 collapses klBEGIN to kBEGIN
|
114
|
+
"klBEGIN", "kBEGIN",
|
115
|
+
"klEND", "kEND",
|
116
|
+
|
117
|
+
/keyword_(\w+)/, proc { "k#{$1.upcase}" },
|
118
|
+
/\bk_([^_][a-z_]+)/, proc { "k#{$1.upcase}" },
|
119
|
+
/modifier_(\w+)/, proc { "k#{$1.upcase}_MOD" },
|
120
|
+
|
121
|
+
"kVARIABLE", "keyword_variable", # ugh: this is a rule name
|
122
|
+
|
123
|
+
# UGH
|
124
|
+
"k_LINE__", "k__LINE__",
|
125
|
+
"k_FILE__", "k__FILE__",
|
126
|
+
"k_ENCODING__", "k__ENCODING__",
|
127
|
+
|
128
|
+
'"defined?"', "kDEFINED",
|
129
|
+
|
130
|
+
"<none>", "none",
|
131
|
+
|
132
|
+
'"do (for condition)"', "kDO_COND",
|
133
|
+
'"do (for lambda)"', "kDO_LAMBDA",
|
134
|
+
'"do (for block)"', "kDO_BLOCK",
|
135
|
+
'"local variable or method"', "tIDENTIFIER",
|
136
|
+
|
137
|
+
/\"(\w+) \(modifier\)\"/, proc { |x| "k#{$1.upcase}_MOD" },
|
138
|
+
/\"(\w+)\"/, proc { |x| "k#{$1.upcase}" },
|
139
|
+
/\"`(\w+)'\"/, proc { |x| "k#{$1.upcase}" },
|
140
|
+
|
141
|
+
/@(\d+)(\s+|$)/, "",
|
142
|
+
/\$?@(\d+) */, "", # TODO: remove?
|
143
|
+
|
144
|
+
/_EXPR/, "",
|
145
|
+
]
|
146
|
+
|
147
|
+
renames.each_slice(2) do |(a, b)|
|
148
|
+
if Proc === b then
|
149
|
+
s.gsub!(a, &b)
|
150
|
+
else
|
151
|
+
s.gsub!(a, b)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
if s.empty? then
|
156
|
+
nil
|
157
|
+
else
|
158
|
+
s.strip.squeeze " "
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
ARGF.each_line do |line|
|
163
|
+
case line
|
164
|
+
when /^(Stack now|Entering state|Shifting|Cleanup|Starting)/ then
|
165
|
+
# do nothing
|
166
|
+
when /^vtable_/ then
|
167
|
+
# do nothing
|
168
|
+
when /Gem::MissingSpecError/ then
|
169
|
+
# do nothing -- ruby 2.5 is being bitchy?
|
170
|
+
when /^Reading a token: Next token is token (.*?) \(\)/ then
|
171
|
+
token = munge $1
|
172
|
+
next if last_token == token
|
173
|
+
puts "next token is %p" % [token]
|
174
|
+
last_token = token
|
175
|
+
when /^Reading a token: / then
|
176
|
+
next # skip
|
177
|
+
when /^read\s+:(\w+)/ then # read :tNL(tNL) nil
|
178
|
+
token = munge $1
|
179
|
+
next if last_token == token
|
180
|
+
puts "next token is %p" % [token]
|
181
|
+
last_token = token
|
182
|
+
when /^Next token is token ("[^"]+"|\S+)/ then
|
183
|
+
token = munge $1
|
184
|
+
next if last_token == token
|
185
|
+
puts "next token is %p" % [token]
|
186
|
+
last_token = token
|
187
|
+
when /^read\s+false/ then # read false($end) "$end"
|
188
|
+
puts "next token is EOF"
|
189
|
+
when /^Now at end of input./ then
|
190
|
+
# do nothing
|
191
|
+
when /^.:scan=>\["([^"]+)"/ then
|
192
|
+
puts "scan = %p" % [$1]
|
193
|
+
when /^.:getch=>\["([^"]+)/ then
|
194
|
+
puts "SCAN = %p" % [$1]
|
195
|
+
when /^Reducing stack by rule (\d+) \(line (\d+)\):/ then
|
196
|
+
reduce_line = $2.to_i
|
197
|
+
when /^ \$\d+ = (?:token|nterm) (.+) \(.*\)/ then
|
198
|
+
item = $1
|
199
|
+
stack << munge(item)
|
200
|
+
when /^-> \$\$ = (?:token|nterm) (.+) \(.*\)/ then
|
201
|
+
stack << "none" if stack.empty?
|
202
|
+
item = munge $1
|
203
|
+
x = stack.compact.map { |s| munge s.strip }.compact.join " "
|
204
|
+
if x != item then # prevent kdef -> kdef
|
205
|
+
if $v && reduce_line then
|
206
|
+
puts "reduce #{x} --> #{item} at #{reduce_line}".squeeze " "
|
207
|
+
else
|
208
|
+
puts "reduce #{x} --> #{item}".squeeze " "
|
209
|
+
end
|
210
|
+
puts
|
211
|
+
end
|
212
|
+
reduce_line = nil
|
213
|
+
stack.clear
|
214
|
+
when /^reduce/ then # ruby_parser side
|
215
|
+
puts munge line.chomp
|
216
|
+
puts
|
217
|
+
when /^(\w+_stack)\.(\w+)/ then
|
218
|
+
# TODO: make pretty, but still informative w/ line numbers etc
|
219
|
+
puts line.gsub("true", "1").gsub("false", "0")
|
220
|
+
# puts "#{$1}(#{$2})"
|
221
|
+
when /^(\w+_stack(\(\w+\))?: \S+)/ then
|
222
|
+
# _data = $v ? line.chomp : $1
|
223
|
+
# puts line
|
224
|
+
# TODO: make pretty, but still informative w/ line numbers etc
|
225
|
+
puts line.gsub("true", "1").gsub("false", "0")
|
226
|
+
when /^lex_state: :?([\w|]+) -> :?([\w|]+)(?: (?:at|from) (.*))?/ then
|
227
|
+
a, b, c = $1.upcase, $2.upcase, $3
|
228
|
+
a.gsub!(/EXPR_/, "")
|
229
|
+
b.gsub!(/EXPR_/, "")
|
230
|
+
if c && $v then
|
231
|
+
puts "lex_state: #{a} -> #{b} at #{c}"
|
232
|
+
else
|
233
|
+
puts "lex_state: #{a} -> #{b}"
|
234
|
+
end
|
235
|
+
when /debug|FUCK/ then
|
236
|
+
puts line.chomp
|
237
|
+
when /^(#.*parse error|on )/ then
|
238
|
+
puts line.chomp
|
239
|
+
when /^(goto|shift| +\[|$)/ then # racc
|
240
|
+
# do nothing
|
241
|
+
# when /^Reading a token: Now at end of input./ then
|
242
|
+
# # puts "EOF"
|
243
|
+
# when /^Reading a token: Next token is token (.+)/ then
|
244
|
+
# puts "READ: #{$1.inspect}"
|
245
|
+
when /^accept/ then
|
246
|
+
puts "DONE"
|
247
|
+
else
|
248
|
+
puts "unparsed: #{line.chomp}"
|
249
|
+
end
|
250
|
+
end
|
data/tools/ripper.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/env ruby -ws
|
2
|
+
|
3
|
+
$b ||= false # bug mode -- ripper is buggy, use Ripper.sexp
|
4
|
+
$d ||= false # debug -- turn on yydebug
|
5
|
+
$p ||= false # Use pp
|
6
|
+
|
7
|
+
require "ripper/sexp"
|
8
|
+
require "pp" if $p
|
9
|
+
|
10
|
+
if ARGV.empty? then
|
11
|
+
warn "reading from stdin"
|
12
|
+
ARGV << "-"
|
13
|
+
end
|
14
|
+
|
15
|
+
class MySexpBuilder < Ripper::SexpBuilderPP
|
16
|
+
def on_parse_error msg
|
17
|
+
Kernel.warn msg
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
ARGV.each do |path|
|
22
|
+
src = path == "-" ? $stdin.read : File.read(path)
|
23
|
+
|
24
|
+
sexp = if $b then
|
25
|
+
Ripper.sexp src
|
26
|
+
else
|
27
|
+
rip = MySexpBuilder.new src
|
28
|
+
rip.yydebug = $d
|
29
|
+
rip.parse
|
30
|
+
|
31
|
+
if rip.error? then
|
32
|
+
warn "skipping"
|
33
|
+
next
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
puts "accept"
|
38
|
+
|
39
|
+
if $p then
|
40
|
+
pp sexp
|
41
|
+
else
|
42
|
+
p sexp
|
43
|
+
end
|
44
|
+
end
|
data.tar.gz.sig
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
��C-]̓�˺��)5J��������I�[���Y5��S�t?���e��z�1�Q����e��i��ł��^���BU4�'b�����o!_�ٝ:�Q�"l�l�$c��5n�V6L5{І��� 0�}���By�p3�^�H�{���5�����j�y���I�N^�6�����IZ�DQ݆M� 2w|(|x�uaP�F��L�i���6��M�>5s��@_�%�|�P����[��GP��i���
|