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