def define_racc_tasks
racc_files = self.spec.files.find_all { |f| f =~ /\.y$/ }
rex_files = self.spec.files.find_all { |f| f =~ /\.rex$/ }
parser_files = racc_files.map { |f| f.sub(/\.y$/, ".rb") }
lexer_files = rex_files.map { |f| f.sub(/\.rex$/, ".rex.rb") }
self.clean_globs += parser_files
self.clean_globs += lexer_files
rule ".rb" => ".y" do |t|
begin
sh "racc #{racc_flags} -o #{t.name} #{t.source}"
rescue
abort "need racc, sudo gem install racc"
end
end
rule ".rex.rb" => proc { |path| path.sub(/\.rb$/, "") } do |t|
require "oedipus_lex"
warn "Generating #{t.name} from #{t.source} from #{OedipusLex::VERSION}"
oedipus = OedipusLex.new oedipus_options
oedipus.parse_file t.source
File.open t.name, "w" do |f|
f.write oedipus.generate
end
end
task :isolate
desc "build the parser" unless parser_files.empty?
task :parser => :isolate
desc "build the lexer" unless lexer_files.empty?
task :lexer => :isolate
task :parser => parser_files
task :lexer => lexer_files
racc_tasks.each do |t|
task t => [:parser, :lexer]
end
end