Rakefile in ruby_parser-3.8.4 vs Rakefile in ruby_parser-3.9.0

- old
+ new

@@ -12,59 +12,53 @@ Hoe.add_include_dirs "../../sexp_processor/dev/lib" Hoe.add_include_dirs "../../minitest/dev/lib" Hoe.add_include_dirs "../../oedipus_lex/dev/lib" +V1 = %w[18 19] +V2 = %w[20 21 22 23 24] +V1_2 = V1 + V2 + Hoe.spec "ruby_parser" do developer "Ryan Davis", "ryand-ruby@zenspider.com" license "MIT" dependency "sexp_processor", "~> 4.1" dependency "rake", "< 11", :developer dependency "oedipus_lex", "~> 2.1", :developer if plugin? :perforce then # generated files - self.perforce_ignore << "lib/ruby18_parser.rb" - self.perforce_ignore << "lib/ruby19_parser.rb" - self.perforce_ignore << "lib/ruby20_parser.rb" - self.perforce_ignore << "lib/ruby20_parser.y" - self.perforce_ignore << "lib/ruby21_parser.rb" - self.perforce_ignore << "lib/ruby21_parser.y" - self.perforce_ignore << "lib/ruby22_parser.rb" - self.perforce_ignore << "lib/ruby22_parser.y" - self.perforce_ignore << "lib/ruby23_parser.rb" - self.perforce_ignore << "lib/ruby23_parser.y" + V1_2.each do |n| + self.perforce_ignore << "lib/ruby#{n}_parser.rb" + end + + V2.each do |n| + self.perforce_ignore << "lib/ruby#{n}_parser.y" + end + self.perforce_ignore << "lib/ruby_lexer.rex.rb" end - self.racc_flags << " -t" if plugin?(:racc) && ENV["DEBUG"] + if plugin?(:racc) + self.racc_flags << " -t" if ENV["DEBUG"] + self.racc_flags << " --superclass RubyParser::Parser" + # self.racc_flags << " --runtime ruby_parser" # TODO: broken in racc + end end -file "lib/ruby20_parser.y" => "lib/ruby_parser.yy" do |t| - sh "unifdef -tk -DRUBY20 -URUBY21 -URUBY22 -URUBY23 -UDEAD #{t.source} > #{t.name} || true" +V2.each do |n| + file "lib/ruby#{n}_parser.y" => "lib/ruby_parser.yy" do |t| + cmd = 'unifdef -tk -DV=%s -UDEAD %s > %s || true' % [n, t.source, t.name] + sh cmd + end end -file "lib/ruby21_parser.y" => "lib/ruby_parser.yy" do |t| - sh "unifdef -tk -URUBY20 -DRUBY21 -URUBY22 -URUBY23 -UDEAD #{t.source} > #{t.name} || true" +V1_2.each do |n| + file "lib/ruby#{n}_parser.rb" => "lib/ruby#{n}_parser.y" end -file "lib/ruby22_parser.y" => "lib/ruby_parser.yy" do |t| - sh "unifdef -tk -URUBY20 -URUBY21 -DRUBY22 -URUBY23 -UDEAD #{t.source} > #{t.name} || true" -end - -file "lib/ruby23_parser.y" => "lib/ruby_parser.yy" do |t| - sh "unifdef -tk -URUBY20 -URUBY21 -URUBY22 -DRUBY23 -UDEAD #{t.source} > #{t.name} || true" -end - - -file "lib/ruby18_parser.rb" => "lib/ruby18_parser.y" -file "lib/ruby19_parser.rb" => "lib/ruby19_parser.y" -file "lib/ruby20_parser.rb" => "lib/ruby20_parser.y" -file "lib/ruby21_parser.rb" => "lib/ruby21_parser.y" -file "lib/ruby22_parser.rb" => "lib/ruby22_parser.y" -file "lib/ruby23_parser.rb" => "lib/ruby23_parser.y" file "lib/ruby_lexer.rex.rb" => "lib/ruby_lexer.rex" task :clean do rm_rf(Dir["**/*~"] + Dir["diff.diff"] + # not all diffs. bit me too many times @@ -92,59 +86,124 @@ Time.at 0 end task :isolate => :phony -# to create parseXX.output: -# -# 1) check out the XX version of ruby -# 2) Edit uncommon.mk, find the ".y.c" rule and remove the RM lines -# 3) run `rm -f parse.c; make parse.c` -# 4) run `bison -r all parse.tmp.y` -# 5) mv parse.tmp.output parseXX.output +def in_compare + Dir.chdir "compare" do + yield + end +end -# possibly new instructions: -# -# 1) check out the XX version of ruby -# 2) YFLAGS="-r all" make parse.c -# 3) mv y.output parseXX.output +def dl v + dir = v[/^\d+\.\d+/] + url = "https://cache.ruby-lang.org/pub/ruby/#{dir}/ruby-#{v}.tar.bz2" + path = File.basename url + unless File.exist? path then + system "curl -O #{url}" + end +end -%w[18 19 20 21 22 23].each do |v| - task "compare#{v}" do - sh "./yack.rb lib/ruby#{v}_parser.output > racc#{v}.txt" - sh "./yack.rb parse#{v}.output > yacc#{v}.txt" - sh "diff -du racc#{v}.txt yacc#{v}.txt || true" - puts - sh "diff -du racc#{v}.txt yacc#{v}.txt | wc -l" +def ruby_parse version + v = version[/^\d+\.\d+/].delete "." + rp_txt = "rp#{v}.txt" + mri_txt = "mri#{v}.txt" + parse_y = "parse#{v}.y" + tarball = "ruby-#{version}.tar.bz2" + ruby_dir = "ruby-#{version}" + diff = "diff#{v}.diff" + rp_out = "lib/ruby#{v}_parser.output" + + c_diff = "compare/#{diff}" + c_rp_txt = "compare/#{rp_txt}" + c_mri_txt = "compare/#{mri_txt}" + c_parse_y = "compare/#{parse_y}" + c_tarball = "compare/#{tarball}" + + file tarball do + in_compare do + dl version + end end + + file c_parse_y => c_tarball do + in_compare do + system "tar yxf #{tarball} #{ruby_dir}/{id.h,parse.y,tool/{id2token.rb,vpath.rb}}" + Dir.chdir ruby_dir do + if File.exist? "tool/id2token.rb" then + sh "ruby tool/id2token.rb --path-separator=.:./ id.h parse.y > ../#{parse_y}" + else + cp "parse.y", "../#{parse_y}" + end + end + sh "rm -rf #{ruby_dir}" + end + end + + file c_mri_txt => c_parse_y do + in_compare do + sh "bison -r all #{parse_y}" + sh "./normalize.rb parse#{v}.output > #{mri_txt}" + rm ["parse#{v}.output", "parse#{v}.tab.c"] + end + end + + file rp_out => :parser + + file c_rp_txt => rp_out do + in_compare do + sh "./normalize.rb ../#{rp_out} > #{rp_txt}" + end + end + + compare = "compare#{v}" + + desc "Compare all grammars to MRI" + task :compare => compare + + task c_diff => [c_mri_txt, c_rp_txt] do + in_compare do + system "diff -du #{mri_txt} #{rp_txt} > #{diff}" + end + end + + desc "Compare #{v} grammar to MRI #{version}" + task compare => c_diff do + in_compare do + system "wc -l #{diff}" + end + end + + task :clean do + rm_f Dir[c_parse_y, c_mri_txt, c_rp_txt] + end + + task :realclean do + rm_f Dir[tarball] + end end +ruby_parse "1.8.7-p374" +ruby_parse "1.9.3-p551" +ruby_parse "2.0.0-p648" +ruby_parse "2.1.9" +ruby_parse "2.2.6" +ruby_parse "2.3.3" +# TODO ruby_parse "2.4.0" + task :debug => :isolate do - ENV["V"] ||= "23" + ENV["V"] ||= V1_2.last Rake.application[:parser].invoke # this way we can have DEBUG set Rake.application[:lexer].invoke # this way we can have DEBUG set $: << "lib" require "ruby_parser" require "pp" - parser = case ENV["V"] - when "18" then - Ruby18Parser.new - when "19" then - Ruby19Parser.new - when "20" then - Ruby20Parser.new - when "21" then - Ruby21Parser.new - when "22" then - Ruby22Parser.new - when "23" then - Ruby23Parser.new - else - raise "Unsupported version #{ENV["V"]}" - end + klass = Object.const_get("Ruby#{ENV["V"]}Parser") rescue nil + raise "Unsupported version #{ENV["V"]}" unless klass + parser = klass.new time = (ENV["RP_TIMEOUT"] || 10).to_i n = ENV["BUG"] file = (n && "bug#{n}.rb") || ENV["F"] || ENV["FILE"] @@ -171,10 +230,10 @@ file = ENV["F"] || ENV["FILE"] sh "/Users/ryan/Desktop/DVDs/debugparser/miniruby -cwy #{file} 2>&1 | ./yuck.rb" end task :extract => :isolate do - ENV["V"] ||= "19" + ENV["V"] ||= V1_2.last Rake.application[:parser].invoke # this way we can have DEBUG set file = ENV["F"] || ENV["FILE"] ruby "-Ilib", "bin/ruby_parse_extract_error", file