ruby_parser 3.15.0 → 3.19.2

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 (47) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/History.rdoc +151 -0
  4. data/Manifest.txt +7 -0
  5. data/README.rdoc +9 -6
  6. data/Rakefile +141 -31
  7. data/bin/ruby_parse_extract_error +1 -1
  8. data/compare/normalize.rb +8 -3
  9. data/debugging.md +133 -0
  10. data/gauntlet.md +107 -0
  11. data/lib/rp_extensions.rb +15 -36
  12. data/lib/rp_stringscanner.rb +20 -51
  13. data/lib/ruby20_parser.rb +7544 -3633
  14. data/lib/ruby20_parser.y +335 -257
  15. data/lib/ruby21_parser.rb +7518 -3678
  16. data/lib/ruby21_parser.y +330 -254
  17. data/lib/ruby22_parser.rb +7652 -3689
  18. data/lib/ruby22_parser.y +334 -256
  19. data/lib/ruby23_parser.rb +7659 -3702
  20. data/lib/ruby23_parser.y +334 -256
  21. data/lib/ruby24_parser.rb +7748 -3721
  22. data/lib/ruby24_parser.y +334 -256
  23. data/lib/ruby25_parser.rb +7748 -3721
  24. data/lib/ruby25_parser.y +334 -256
  25. data/lib/ruby26_parser.rb +7755 -3726
  26. data/lib/ruby26_parser.y +334 -255
  27. data/lib/ruby27_parser.rb +10290 -4518
  28. data/lib/ruby27_parser.y +933 -254
  29. data/lib/ruby30_parser.rb +13258 -0
  30. data/lib/ruby30_parser.y +3459 -0
  31. data/lib/ruby31_parser.rb +13638 -0
  32. data/lib/ruby31_parser.y +3493 -0
  33. data/lib/ruby3_parser.yy +3548 -0
  34. data/lib/ruby_lexer.rb +277 -599
  35. data/lib/ruby_lexer.rex +28 -21
  36. data/lib/ruby_lexer.rex.rb +60 -24
  37. data/lib/ruby_lexer_strings.rb +638 -0
  38. data/lib/ruby_parser.rb +4 -0
  39. data/lib/ruby_parser.yy +974 -261
  40. data/lib/ruby_parser_extras.rb +355 -114
  41. data/test/test_ruby_lexer.rb +226 -129
  42. data/test/test_ruby_parser.rb +1653 -267
  43. data/tools/munge.rb +36 -8
  44. data/tools/ripper.rb +15 -10
  45. data.tar.gz.sig +0 -0
  46. metadata +55 -37
  47. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b1172d3be0aa30a6d959bd6ab265a6e05b391923196ec30236705637f8b05cc0
4
- data.tar.gz: bedbe7c23eb256413a34d9b5dc67d975c70a8757edea6b22cebfcb82fb42d412
3
+ metadata.gz: 82ff82f1d9693451e0d2f740f5e7a9cbeaa31034bee66ffa61486bc0f930d60b
4
+ data.tar.gz: 15d8b71b9533534ffaa4184e50f0e5a795e4a7f190bf13a55858f59b17c1ed99
5
5
  SHA512:
6
- metadata.gz: 4e3174ada892182f6f60497feaa74668517e71bcffd44b10590f9c2fc153ba1744dbb8afd35493d1f7cb96598795e30505c922c2e53e441cbb1a7a646e9005ef
7
- data.tar.gz: 2cab3beeefb45cba366c482e862bb2594169560f8920d39b28a7a86ad5c6c6582393fe91e082cd6387314f36ae5e660d8e18c2de8a4ddcefce9d40600593f795
6
+ metadata.gz: 78332be9c05d511d05f1c47977c74390658fcc00fc412009dba172d0e53c0e698b8e28c4803c4969720f2d2d29ed3fc891be2a990618098ae0cf04d00ad28e9f
7
+ data.tar.gz: 72f7e1c089bc80662ea2eb8c8056d7bb3bf84ff27224c2d450ffde94abd2fb5ba2317d1405a880bebb2c91ac34bcb7023685065f1a8b2e69f62ed8f6b0362e77
checksums.yaml.gz.sig CHANGED
Binary file
data/History.rdoc CHANGED
@@ -1,3 +1,154 @@
1
+ === 3.19.2 / 2022-12-03
2
+
3
+ * 5 bug fixes:
4
+
5
+ * Fixed bug parsing array patterns using %w, %i, etc.
6
+ * Fixed dedenting when heredoc has only empty line and interpolation. (mvz)
7
+ * Fixed dsym unescaping. (mvz)
8
+ * Fixed vars in pattern matching that should be lasgn, not lvar.
9
+ * find_pat mid-patterns are now splatted inline, not wrapped in an array_pat.
10
+
11
+ === 3.19.1 / 2022-04-05
12
+
13
+ * 2 bug fixes:
14
+
15
+ * Added comments to endless defn and defs. (mvz)
16
+ * Fixed endless method bug handling attrset names.
17
+
18
+ === 3.19.0 / 2022-03-29
19
+
20
+ * 1 major enhancement:
21
+
22
+ * Added tentative 3.1 support.
23
+
24
+ * 7 minor enhancements:
25
+
26
+ * 3.1: bare RHS assoc: { y: } => s(:hash, s(:lit, :y), nil)
27
+ * 3.1: calls w/ unnamed block args (bare &)
28
+ * 3.1: endless defn/defs w/ paren-less calls (aka commands)
29
+ * 3.1: pattern capture to nonlocal vars, eg: ^@a, ^$b, ^@@c
30
+ * 3.1: pattern: ^(expr) => expr
31
+ * Improved steps for adding new versions.
32
+ * Improved steps for running gauntlets.
33
+
34
+ * 2 bug fixes:
35
+
36
+ * Bumped 2.6+ cached versions for rake compare.
37
+ * Skip test_regexp_esc_C_slash on ruby 3.1.0 because of MRI bug.
38
+
39
+ === 3.18.1 / 2021-11-10
40
+
41
+ * 1 minor enhancement:
42
+
43
+ * All parser tests are now explicitly testing line numbers at every level.
44
+
45
+ * 3 bug fixes:
46
+
47
+ * Fixed endless method with noargs. (mitsuru)
48
+ * Fixed line numbers on some yield forms.
49
+ * Handle and clearly report if unifdef is missing.
50
+
51
+ === 3.18.0 / 2021-10-27
52
+
53
+ Holy crap... 58 commits! 2.7 and 3.0 are feature complete. Strings
54
+ & heredocs have been rewritten.
55
+
56
+ * 9 major enhancements:
57
+
58
+ * !!! Rewrote lexer (and friends) for strings, heredocs, and %*[] constructs.
59
+ * Massive overhaul on line numbers.
60
+ * Freeze input! Finally!!! No more modifying the input string for heredocs.
61
+ * Overhauled RPStringScanner. Removed OLD compatibility methods!
62
+ * Removed Sexp methods: value, to_sym, add, add_all, node_type, values.
63
+ * value moved to sexp_processor.
64
+ * Removed String#grep monkey-patch.
65
+ * Removed String#lineno monkey-patch.
66
+ * Removed string_to_pos, charpos, etc hacks for ancient ruby versions.
67
+ * Removed unread_many... NO! NO EDITING THE INPUT STRING!
68
+
69
+ * 31 minor enhancements:
70
+
71
+ * 2.7/3.0: many more pattern edge cases
72
+ * 2.7: Added `mlhs = rhs rescue expr`
73
+ * 2.7: refactored destructured args (`|(k,v)|`) and unfactored(?!) case_body/args.
74
+ * 3.0: excessed_comma
75
+ * 3.0: finished most everything: endless methods, patterns, etc.
76
+ * 3.0: refactored / added new pattern changes
77
+ * Added RubyLexer#in_heredoc? (ie, is there old_ss ?)
78
+ * Added RubyLexer#old_ss and old_lineno and removed much of SSStack(ish).
79
+ * Added Symbol#end_with? when necessary
80
+ * Added TALLY and DEBUG options for ss.getch and ss.scan
81
+ * Added ignore_body_comments to make parser productions more clear.
82
+ * Added support for no_kwarg (eg `def f(**nil)`).
83
+ * Added support for no_kwarg in blocks (eg `f { |**nil| }`).
84
+ * Augmented generated parser files to have frozen_string_literal comments and fixed tests.
85
+ * Broke out 3.0 parser into its own to ease development.
86
+ * Bumped dependencies on sexp_processor and oedipus_lex.
87
+ * Clean generated 3.x files.
88
+ * Extracted all string scanner methods to their own module.
89
+ * Fixed some precedence decls.
90
+ * Implemented most of pattern matching for 2.7+.
91
+ * Improve lex_state= to report location in verbose debug mode.
92
+ * Made it easier to debug with a particular version of ruby via rake.
93
+ * Make sure ripper uses the same version of ruby we specified.
94
+ * Moved all string/heredoc/etc code to ruby_lexer_strings.rb
95
+ * Remove warning from newer bisons.
96
+ * Sprinkled in some frozen_string_literal, but mostly helped by oedipus bump.
97
+ * Switch to comparing against ruby binary since ripper is buggy.
98
+ * bugs task should try both bug*.rb and bad*.rb.
99
+ * endless methods
100
+ * f_any_kwrest refactoring.
101
+ * refactored defn/defs
102
+
103
+ * 15 bug fixes:
104
+
105
+ * Cleaned a bunch of old hacks. Initializing RubyLexer w/ Parser is cleaner now.
106
+ * Corrected some lex_state errors in process_token_keyword.
107
+ * Fixed ancient ruby2 change (use #lines) in ruby_parse_extract_error.
108
+ * Fixed bug where else without rescue only raises on 2.6+
109
+ * Fixed caller for getch and scan when DEBUG=1
110
+ * Fixed comments in the middle of message cascades.
111
+ * Fixed differences w/ symbol productions against ruby 2.7.
112
+ * Fixed dsym to use string_contents production.
113
+ * Fixed error in bdot2/3 in some edge cases. Fixed p_alt line.
114
+ * Fixed heredoc dedenting in the presence of empty lines. (mvz)
115
+ * Fixed some leading whitespace / comment processing
116
+ * Fixed up how class/module/defn/defs comments were collected.
117
+ * Overhauled ripper.rb to deal with buggy ripper w/ yydebug.
118
+ * Removed dsym from literal.
119
+ * Removed tUBANG lexeme but kept it distinct as a method name (eg: `def !@`).
120
+
121
+ === 3.17.0 / 2021-08-03
122
+
123
+ * 1 minor enhancement:
124
+
125
+ * Added support for arg forwarding (eg `def f(...); m(...); end`) (presidentbeef)
126
+
127
+ === 3.16.0 / 2021-05-15
128
+
129
+ * 1 major enhancement:
130
+
131
+ * Added tentative 3.0 support.
132
+
133
+ * 3 minor enhancements:
134
+
135
+ * Added lexing for "beginless range" (bdots).
136
+ * Added parsing for bdots.
137
+ * Updated rake compare task to download xz files, bumped versions, etc
138
+
139
+ * 4 bug fixes:
140
+
141
+ * Bump rake dependency to >= 10, < 15. (presidentbeef)
142
+ * Bump sexp_processor dependency to 4.15.1+. (pravi)
143
+ * Fixed minor state mismatch at the end of parsing to make diffing a little cleaner.
144
+ * Fixed normalizer to deal with new bison token syntax
145
+
146
+ === 3.15.1 / 2021-01-10
147
+
148
+ * 1 bug fix:
149
+
150
+ * Bumped ruby version to include < 4 (trunk).
151
+
1
152
  === 3.15.0 / 2020-08-31
2
153
 
3
154
  * 1 major enhancement:
data/Manifest.txt CHANGED
@@ -7,6 +7,7 @@ bin/ruby_parse
7
7
  bin/ruby_parse_extract_error
8
8
  compare/normalize.rb
9
9
  debugging.md
10
+ gauntlet.md
10
11
  lib/.document
11
12
  lib/rp_extensions.rb
12
13
  lib/rp_stringscanner.rb
@@ -26,9 +27,15 @@ lib/ruby26_parser.rb
26
27
  lib/ruby26_parser.y
27
28
  lib/ruby27_parser.rb
28
29
  lib/ruby27_parser.y
30
+ lib/ruby30_parser.rb
31
+ lib/ruby30_parser.y
32
+ lib/ruby31_parser.rb
33
+ lib/ruby31_parser.y
34
+ lib/ruby3_parser.yy
29
35
  lib/ruby_lexer.rb
30
36
  lib/ruby_lexer.rex
31
37
  lib/ruby_lexer.rex.rb
38
+ lib/ruby_lexer_strings.rb
32
39
  lib/ruby_parser.rb
33
40
  lib/ruby_parser.yy
34
41
  lib/ruby_parser_extras.rb
data/README.rdoc CHANGED
@@ -32,6 +32,10 @@ Tested against 801,039 files from the latest of all rubygems (as of 2013-05):
32
32
  * 1.8 parser is at 99.9739% accuracy, 3.651 sigma
33
33
  * 1.9 parser is at 99.9940% accuracy, 4.013 sigma
34
34
  * 2.0 parser is at 99.9939% accuracy, 4.008 sigma
35
+ * 2.6 parser is at 99.9972% accuracy, 4.191 sigma
36
+ * 3.0 parser has a 100% parse rate.
37
+ * Tested against 2,672,412 unique ruby files across 167k gems.
38
+ * As do all the others now, basically.
35
39
 
36
40
  == FEATURES/PROBLEMS:
37
41
 
@@ -61,15 +65,14 @@ You can also use Ruby19Parser, Ruby18Parser, or RubyParser.for_current_ruby:
61
65
 
62
66
  To add a new version:
63
67
 
64
- * New parser should be generated from lib/ruby_parser.yy.
65
- * Extend lib/ruby_parser.yy with new class name.
66
- * Add new version number to V2 in Rakefile for rule creation.
68
+ * New parser should be generated from lib/ruby[3]_parser.yy.
69
+ * Extend lib/ruby[3]_parser.yy with new class name.
70
+ * Add new version number to V2/V3 in Rakefile for rule creation.
71
+ * Add new (full) version to `ruby_parse` section of Rakefile for rake compare
67
72
  * Require generated parser in lib/ruby_parser.rb.
68
73
  * Add empty TestRubyParserShared##Plus module and TestRubyParserV## to test/test_ruby_parser.rb.
69
74
  * Extend Manifest.txt with generated file names.
70
- * Extend sexp_processor's pt_testcase.rb to match version
71
- * add_19tests needs to have the version added
72
- * VER_RE needs to have the regexp expanded
75
+ * Add new version number to sexp_processor's pt_testcase.rb in all_versions
73
76
 
74
77
  Until all of these are done, you won't have a clean test run.
75
78
 
data/Rakefile CHANGED
@@ -12,27 +12,40 @@ Hoe.add_include_dirs "lib"
12
12
  Hoe.add_include_dirs "../../sexp_processor/dev/lib"
13
13
  Hoe.add_include_dirs "../../minitest/dev/lib"
14
14
  Hoe.add_include_dirs "../../oedipus_lex/dev/lib"
15
+ Hoe.add_include_dirs "../../ruby2ruby/dev/lib"
15
16
 
16
17
  V2 = %w[20 21 22 23 24 25 26 27]
17
- V2.replace [V2.last] if ENV["FAST"] # HACK
18
+ V3 = %w[30 31]
19
+
20
+ VERS = V2 + V3
21
+
22
+ ENV["FAST"] = VERS.last if ENV["FAST"] && !VERS.include?(ENV["FAST"])
23
+ VERS.replace [ENV["FAST"]] if ENV["FAST"]
18
24
 
19
25
  Hoe.spec "ruby_parser" do
20
26
  developer "Ryan Davis", "ryand-ruby@zenspider.com"
21
27
 
22
28
  license "MIT"
23
29
 
24
- dependency "sexp_processor", "~> 4.9"
25
- dependency "rake", "< 11", :developer
26
- dependency "oedipus_lex", "~> 2.5", :developer
30
+ dependency "sexp_processor", "~> 4.16"
31
+ dependency "rake", [">= 10", "< 15"], :developer
32
+ dependency "oedipus_lex", "~> 2.6", :developer
33
+
34
+ # NOTE: Ryan!!! Stop trying to fix this dependency! Isolate just
35
+ # can't handle having a faux-gem half-installed! Stop! Just `gem
36
+ # install racc` and move on. Revisit this ONLY once racc-compiler
37
+ # gets split out.
27
38
 
28
- require_ruby_version [">= 2.1", "< 3.1"]
39
+ dependency "racc", "~> 1.5", :developer
40
+
41
+ require_ruby_version [">= 2.1", "< 4"]
29
42
 
30
43
  if plugin? :perforce then # generated files
31
- V2.each do |n|
44
+ VERS.each do |n|
32
45
  self.perforce_ignore << "lib/ruby#{n}_parser.rb"
33
46
  end
34
47
 
35
- V2.each do |n|
48
+ VERS.each do |n|
36
49
  self.perforce_ignore << "lib/ruby#{n}_parser.y"
37
50
  end
38
51
 
@@ -46,8 +59,44 @@ Hoe.spec "ruby_parser" do
46
59
  end
47
60
  end
48
61
 
62
+ def maybe_add_to_top path, string
63
+ file = File.read path
64
+
65
+ return if file.start_with? string
66
+
67
+ warn "Altering top of #{path}"
68
+ tmp_path = "#{path}.tmp"
69
+ File.open(tmp_path, "w") do |f|
70
+ f.puts string
71
+ f.puts
72
+
73
+ f.write file
74
+ # TODO: make this deal with encoding comments properly?
75
+ end
76
+ File.rename tmp_path, path
77
+ end
78
+
79
+ def unifdef?
80
+ @unifdef ||= system("which unifdef") or abort <<~EOM
81
+ unifdef not found!
82
+
83
+ Please install 'unifdef' package on your system or `rake generate` on a mac.
84
+ EOM
85
+ end
86
+
49
87
  V2.each do |n|
50
88
  file "lib/ruby#{n}_parser.y" => "lib/ruby_parser.yy" do |t|
89
+ unifdef?
90
+ cmd = 'unifdef -tk -DV=%s -UDEAD %s > %s || true' % [n, t.source, t.name]
91
+ sh cmd
92
+ end
93
+
94
+ file "lib/ruby#{n}_parser.rb" => "lib/ruby#{n}_parser.y"
95
+ end
96
+
97
+ V3.each do |n|
98
+ file "lib/ruby#{n}_parser.y" => "lib/ruby3_parser.yy" do |t|
99
+ unifdef?
51
100
  cmd = 'unifdef -tk -DV=%s -UDEAD %s > %s || true' % [n, t.source, t.name]
52
101
  sh cmd
53
102
  end
@@ -57,6 +106,12 @@ end
57
106
 
58
107
  file "lib/ruby_lexer.rex.rb" => "lib/ruby_lexer.rex"
59
108
 
109
+ task :parser do |t|
110
+ t.prerequisite_tasks.grep(Rake::FileTask).select(&:already_invoked).each do |f|
111
+ maybe_add_to_top f.name, "# frozen_string_literal: true"
112
+ end
113
+ end
114
+
60
115
  task :generate => [:lexer, :parser]
61
116
 
62
117
  task :clean do
@@ -65,6 +120,7 @@ task :clean do
65
120
  Dir["coverage.info"] +
66
121
  Dir["coverage"] +
67
122
  Dir["lib/ruby2*_parser.y"] +
123
+ Dir["lib/ruby3*_parser.y"] +
68
124
  Dir["lib/*.output"])
69
125
  end
70
126
 
@@ -92,7 +148,7 @@ end
92
148
 
93
149
  def dl v
94
150
  dir = v[/^\d+\.\d+/]
95
- url = "https://cache.ruby-lang.org/pub/ruby/#{dir}/ruby-#{v}.tar.bz2"
151
+ url = "https://cache.ruby-lang.org/pub/ruby/#{dir}/ruby-#{v}.tar.xz"
96
152
  path = File.basename url
97
153
  unless File.exist? path then
98
154
  system "curl -O #{url}"
@@ -104,7 +160,7 @@ def ruby_parse version
104
160
  rp_txt = "rp#{v}.txt"
105
161
  mri_txt = "mri#{v}.txt"
106
162
  parse_y = "parse#{v}.y"
107
- tarball = "ruby-#{version}.tar.bz2"
163
+ tarball = "ruby-#{version}.tar.xz"
108
164
  ruby_dir = "ruby-#{version}"
109
165
  diff = "diff#{v}.diff"
110
166
  rp_out = "lib/ruby#{v}_parser.output"
@@ -124,15 +180,18 @@ def ruby_parse version
124
180
  end
125
181
  end
126
182
 
183
+ desc "fetch all tarballs"
184
+ task :fetch => c_tarball
185
+
127
186
  file c_parse_y => c_tarball do
128
187
  in_compare do
129
- extract_glob = case version
130
- when /2\.7/
188
+ extract_glob = case
189
+ when version > "2.7" then
131
190
  "{id.h,parse.y,tool/{id2token.rb,lib/vpath.rb}}"
132
191
  else
133
192
  "{id.h,parse.y,tool/{id2token.rb,vpath.rb}}"
134
193
  end
135
- system "tar yxf #{tarball} #{ruby_dir}/#{extract_glob}"
194
+ system "tar Jxf #{tarball} #{ruby_dir}/#{extract_glob}"
136
195
 
137
196
  Dir.chdir ruby_dir do
138
197
  if File.exist? "tool/id2token.rb" then
@@ -141,15 +200,20 @@ def ruby_parse version
141
200
  sh "expand parse.y > ../#{parse_y}"
142
201
  end
143
202
 
144
- ruby "-pi", "-e", 'gsub(/^%define\s+api\.pure/, "%pure-parser")', "../#{parse_y}"
203
+ ruby "-pi", "-e", 'gsub(/^%pure-parser/, "%define api.pure")', "../#{parse_y}"
145
204
  end
146
205
  sh "rm -rf #{ruby_dir}"
147
206
  end
148
207
  end
149
208
 
209
+ bison = Dir["/opt/homebrew/opt/bison/bin/bison",
210
+ "/usr/local/opt/bison/bin/bison",
211
+ `which bison`.chomp,
212
+ ].first
213
+
150
214
  file c_mri_txt => [c_parse_y, normalize] do
151
215
  in_compare do
152
- sh "bison -r all #{parse_y}"
216
+ sh "#{bison} -r all #{parse_y}"
153
217
  sh "./normalize.rb parse#{v}.output > #{mri_txt}"
154
218
  rm ["parse#{v}.output", "parse#{v}.tab.c"]
155
219
  end
@@ -190,17 +254,51 @@ def ruby_parse version
190
254
  end
191
255
  end
192
256
 
257
+ task :versions do
258
+ require "open-uri"
259
+ require "net/http" # avoid require issues in threads
260
+ require "net/https"
261
+
262
+ versions = VERS.map { |s| s.split(//).join "." }
263
+
264
+ base_url = "https://cache.ruby-lang.org/pub/ruby"
265
+
266
+ class Array
267
+ def human_sort
268
+ sort_by { |item| item.to_s.split(/(\d+)/).map { |e| [e.to_i, e] } }
269
+ end
270
+ end
271
+
272
+ versions = versions.map { |ver|
273
+ Thread.new {
274
+ URI
275
+ .parse("#{base_url}/#{ver}/")
276
+ .read
277
+ .scan(/ruby-\d+\.\d+\.\d+[-\w.]*?.tar.gz/)
278
+ .reject { |s| s =~ /-(?:rc|preview)\d/ }
279
+ .human_sort
280
+ .last
281
+ .delete_prefix("ruby-")
282
+ .delete_suffix ".tar.gz"
283
+ }
284
+ }.map(&:value).sort
285
+
286
+ puts versions.map { |v| "ruby_parse %p" % [v] }
287
+ end
288
+
193
289
  ruby_parse "2.0.0-p648"
194
- ruby_parse "2.1.9"
195
- ruby_parse "2.2.9"
290
+ ruby_parse "2.1.10"
291
+ ruby_parse "2.2.10"
196
292
  ruby_parse "2.3.8"
197
- ruby_parse "2.4.9"
198
- ruby_parse "2.5.8"
199
- ruby_parse "2.6.6"
200
- ruby_parse "2.7.1"
293
+ ruby_parse "2.4.10"
294
+ ruby_parse "2.5.9"
295
+ ruby_parse "2.6.9"
296
+ ruby_parse "2.7.5"
297
+ ruby_parse "3.0.3"
298
+ ruby_parse "3.1.1"
201
299
 
202
300
  task :debug => :isolate do
203
- ENV["V"] ||= V2.last
301
+ ENV["V"] ||= VERS.last
204
302
  Rake.application[:parser].invoke # this way we can have DEBUG set
205
303
  Rake.application[:lexer].invoke # this way we can have DEBUG set
206
304
 
@@ -215,7 +313,7 @@ task :debug => :isolate do
215
313
  time = (ENV["RP_TIMEOUT"] || 10).to_i
216
314
 
217
315
  n = ENV["BUG"]
218
- file = (n && "bug#{n}.rb") || ENV["F"] || ENV["FILE"] || "bug.rb"
316
+ file = (n && "bug#{n}.rb") || ENV["F"] || ENV["FILE"] || "debug.rb"
219
317
  ruby = ENV["R"] || ENV["RUBY"]
220
318
 
221
319
  if ruby then
@@ -238,19 +336,22 @@ task :debug => :isolate do
238
336
  end
239
337
 
240
338
  task :debug3 do
241
- file = ENV["F"] || "bug.rb"
242
- verbose = ENV["V"] ? "-v" : ""
339
+ file = ENV["F"] || "debug.rb"
340
+ version = ENV["V"] || ""
341
+ verbose = ENV["VERBOSE"] ? "-v" : ""
243
342
  munge = "./tools/munge.rb #{verbose}"
244
343
 
245
344
  abort "Need a file to parse, via: F=path.rb" unless file
246
345
 
247
346
  ENV.delete "V"
248
347
 
249
- sh "ruby -v"
250
- sh "ruby -y #{file} 2>&1 | #{munge} > tmp/ruby"
251
- sh "./tools/ripper.rb -d #{file} | #{munge} > tmp/rip"
348
+ ruby = "ruby#{version}"
349
+
350
+ sh "#{ruby} -v"
351
+ sh "#{ruby} -y #{file} 2>&1 | #{munge} > tmp/ruby"
352
+ sh "#{ruby} ./tools/ripper.rb -d #{file} | #{munge} > tmp/rip"
252
353
  sh "rake debug F=#{file} DEBUG=1 2>&1 | #{munge} > tmp/rp"
253
- sh "diff -U 999 -d tmp/{rip,rp}"
354
+ sh "diff -U 999 -d tmp/{ruby,rp}"
254
355
  end
255
356
 
256
357
  task :cmp do
@@ -262,16 +363,25 @@ task :cmp3 do
262
363
  end
263
364
 
264
365
  task :extract => :isolate do
265
- ENV["V"] ||= V2.last
366
+ ENV["V"] ||= VERS.last
266
367
  Rake.application[:parser].invoke # this way we can have DEBUG set
267
368
 
268
- file = ENV["F"] || ENV["FILE"]
369
+ file = ENV["F"] || ENV["FILE"] || abort("Need to provide F=<path>")
269
370
 
270
371
  ruby "-Ilib", "bin/ruby_parse_extract_error", file
271
372
  end
272
373
 
374
+ task :parse => :isolate do
375
+ ENV["V"] ||= VERS.last
376
+ Rake.application[:parser].invoke # this way we can have DEBUG set
377
+
378
+ file = ENV["F"] || ENV["FILE"] || abort("Need to provide F=<path>")
379
+
380
+ ruby "-Ilib", "bin/ruby_parse", file
381
+ end
382
+
273
383
  task :bugs do
274
- sh "for f in bug*.rb ; do #{Gem.ruby} -S rake debug F=$f && rm $f ; done"
384
+ sh "for f in bug*.rb bad*.rb ; do #{Gem.ruby} -S rake debug F=$f && rm $f ; done"
275
385
  end
276
386
 
277
387
  # vim: syntax=Ruby
@@ -21,7 +21,7 @@ class RubyParser
21
21
  src = ss.string
22
22
  pre_error = src[0...ss.pos]
23
23
 
24
- defs = pre_error.grep(/^ *(?:def|it)/)
24
+ defs = pre_error.lines.grep(/^ *(?:def|it)/)
25
25
 
26
26
  raise "can't figure out where the bad code starts" unless defs.last
27
27
 
data/compare/normalize.rb CHANGED
@@ -84,6 +84,7 @@ def munge s
84
84
 
85
85
  "' '", "tSPACE", # needs to be later to avoid bad hits
86
86
 
87
+ "%empty", "none", # newer bison
87
88
  "/* empty */", "none",
88
89
  /^\s*$/, "none",
89
90
 
@@ -140,6 +141,7 @@ def munge s
140
141
  '"do for block"', "kDO_BLOCK",
141
142
  '"do for condition"', "kDO_COND",
142
143
  '"do for lambda"', "kDO_LAMBDA",
144
+ "tLABEL", "kLABEL",
143
145
 
144
146
  # UGH
145
147
  "k_LINE__", "k__LINE__",
@@ -155,7 +157,10 @@ def munge s
155
157
  /\"(\w+) \(?modifier\)?\"/, proc { |x| "k#{$1.upcase}_MOD" },
156
158
  /\"(\w+)\"/, proc { |x| "k#{$1.upcase}" },
157
159
 
158
- /@(\d+)(\s+|$)/, "",
160
+ /\$?@(\d+)(\s+|$)/, "", # newer bison
161
+
162
+ # TODO: remove for 3.0 work:
163
+ "lex_ctxt ", "" # 3.0 production that's mostly noise right now
159
164
  ]
160
165
 
161
166
  renames.each_slice(2) do |(a, b)|
@@ -174,7 +179,7 @@ ARGF.each_line do |line|
174
179
 
175
180
  case line.strip
176
181
  when /^$/ then
177
- when /^(\d+) (\$?\w+): (.*)/ then # yacc
182
+ when /^(\d+) (\$?[@\w]+): (.*)/ then # yacc
178
183
  rule = $2
179
184
  order << rule unless rules.has_key? rule
180
185
  rules[rule] << munge($3)
@@ -199,7 +204,7 @@ ARGF.each_line do |line|
199
204
  when /^\cL/ then # byacc
200
205
  break
201
206
  else
202
- warn "unparsed: #{$.}: #{line.chomp}"
207
+ warn "unparsed: #{$.}: #{line.strip.inspect}"
203
208
  end
204
209
  end
205
210