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.
Files changed (58) hide show
  1. checksums.yaml +7 -0
  2. checksums.yaml.gz.sig +0 -0
  3. data/.autotest +36 -19
  4. data/History.rdoc +1297 -0
  5. data/Manifest.txt +35 -7
  6. data/{README.txt → README.rdoc} +44 -14
  7. data/Rakefile +308 -110
  8. data/bin/ruby_parse +3 -1
  9. data/bin/ruby_parse_extract_error +36 -16
  10. data/compare/normalize.rb +218 -0
  11. data/debugging.md +190 -0
  12. data/gauntlet.md +107 -0
  13. data/lib/.document +1 -0
  14. data/lib/rp_extensions.rb +53 -0
  15. data/lib/rp_stringscanner.rb +33 -0
  16. data/lib/ruby20_parser.rb +10973 -0
  17. data/lib/ruby20_parser.y +2683 -0
  18. data/lib/ruby21_parser.rb +10980 -0
  19. data/lib/ruby21_parser.y +2700 -0
  20. data/lib/ruby22_parser.rb +11123 -0
  21. data/lib/ruby22_parser.y +2711 -0
  22. data/lib/ruby23_parser.rb +11132 -0
  23. data/lib/ruby23_parser.y +2713 -0
  24. data/lib/ruby24_parser.rb +11231 -0
  25. data/lib/ruby24_parser.y +2721 -0
  26. data/lib/ruby25_parser.rb +11231 -0
  27. data/lib/ruby25_parser.y +2721 -0
  28. data/lib/ruby26_parser.rb +11253 -0
  29. data/lib/ruby26_parser.y +2736 -0
  30. data/lib/ruby27_parser.rb +12980 -0
  31. data/lib/ruby27_parser.y +3324 -0
  32. data/lib/ruby30_parser.rb +13242 -0
  33. data/lib/ruby30_parser.y +3447 -0
  34. data/lib/ruby31_parser.rb +13622 -0
  35. data/lib/ruby31_parser.y +3481 -0
  36. data/lib/ruby3_parser.yy +3536 -0
  37. data/lib/ruby_lexer.rb +933 -1232
  38. data/lib/ruby_lexer.rex +185 -0
  39. data/lib/ruby_lexer.rex.rb +399 -0
  40. data/lib/ruby_lexer_strings.rb +638 -0
  41. data/lib/ruby_parser.rb +97 -3
  42. data/lib/ruby_parser.yy +3465 -0
  43. data/lib/ruby_parser_extras.rb +1216 -687
  44. data/test/test_ruby_lexer.rb +2249 -1092
  45. data/test/test_ruby_parser.rb +5156 -975
  46. data/test/test_ruby_parser_extras.rb +47 -77
  47. data/tools/munge.rb +250 -0
  48. data/tools/ripper.rb +44 -0
  49. data.tar.gz.sig +1 -1
  50. metadata +200 -155
  51. metadata.gz.sig +0 -0
  52. data/.gemtest +0 -0
  53. data/History.txt +0 -482
  54. data/lib/gauntlet_rubyparser.rb +0 -120
  55. data/lib/ruby18_parser.rb +0 -5747
  56. data/lib/ruby18_parser.y +0 -1873
  57. data/lib/ruby19_parser.rb +0 -6110
  58. data/lib/ruby19_parser.y +0 -2078
@@ -1,13 +1,10 @@
1
1
  # encoding: US-ASCII
2
2
 
3
- require 'rubygems'
4
- gem "minitest"
5
- require 'minitest/autorun'
6
- require 'ruby_parser_extras'
3
+ require "minitest/autorun"
4
+ require "ruby_parser_extras"
5
+ require "ruby_parser"
7
6
 
8
- require 'minitest/unit'
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 = Ruby19Parser.new
16
+ p = RubyParser.latest
20
17
  s = nil
21
18
 
22
- out, err = capture_io do
19
+ out, err = capture_io {
23
20
  s = p.handle_encoding str
24
- end
21
+ }
25
22
 
26
- assert_equal orig_str.sub(/\357\273\277/, ''), s
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 < MiniTest::Unit::TestCase
163
+ class TestEnvironment < Minitest::Test
167
164
  def deny t
168
- assert ! t
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
- assert_equal nil, @env[:blah]
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
- FȔCd�qyC0m� cScI�=�� 
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���