Module: Hoe::Racc
- Defined in:
- lib/hoe/racc.rb
Overview
Racc plugin for hoe.
Tasks Provided:
- lexer
-
Generate lexers for all .rex files in your Manifest.txt.
- parser
-
Generate parsers for all .y files in your Manifest.txt.
- .y -> .rb rule
-
Generate a parser using racc.
- .rex -> .rb rule
-
Generate a lexer using oedipus_lex.
Instance Attribute Summary collapse
-
#oedipus_options ⇒ Object
Optional: Defines what flags to use for oedipus_lex.
-
#racc_flags ⇒ Object
Optional: Defines what flags to use for racc.
-
#racc_tasks ⇒ Object
Optional: Defines what tasks need to generate parsers/lexers first.
Instance Method Summary collapse
-
#activate_racc_deps ⇒ Object
Activate the racc dependencies.
-
#define_racc_tasks ⇒ Object
Define tasks for racc plugin.
-
#initialize_racc ⇒ Object
Initialize variables for racc plugin.
Instance Attribute Details
#oedipus_options ⇒ Object
Optional: Defines what flags to use for oedipus_lex. default: “–independent”
33 34 35 |
# File 'lib/hoe/racc.rb', line 33 def @oedipus_options end |
#racc_flags ⇒ Object
Optional: Defines what flags to use for racc. default: “-v -l”
28 29 30 |
# File 'lib/hoe/racc.rb', line 28 def racc_flags @racc_flags end |
#racc_tasks ⇒ Object
Optional: Defines what tasks need to generate parsers/lexers first.
Defaults to [:multi, :test, :check_manifest]
If you have extra tasks that require your parser/lexer to be built, add their names here in your hoe spec. eg:
racc_tasks << :debug
23 24 25 |
# File 'lib/hoe/racc.rb', line 23 def racc_tasks @racc_tasks end |
Instance Method Details
#activate_racc_deps ⇒ Object
Activate the racc dependencies
52 53 54 55 |
# File 'lib/hoe/racc.rb', line 52 def activate_racc_deps dependency "racc", "~> 1.5", :development dependency "oedipus_lex", "~> 2.6", :development end |
#define_racc_tasks ⇒ Object
Define tasks for racc plugin
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
# File 'lib/hoe/racc.rb', line 60 def define_racc_tasks y_files = self.spec.files.grep(/\.y$/) yy_files = self.spec.files.grep(/\.yy$/) rex_files = self.spec.files.grep(/\.rex$/) yy_re = Regexp.union yy_files.map { |s| s.delete_suffix ".yy" } parser_files = y_files.map { |f| f.sub(/\.y$/, ".rb") } + spec.files.grep(/(#{yy_re})\d+\.rb$/) - yy_files 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 # HACK: taken from oedipus_lex's .rake file to bypass isolate bootstrap 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.parse_file t.source File.open t.name, "w" do |f| f.write oedipus.generate end end task :isolate # stub task multitask :parser # make them multithreaded! multitask :lexer 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 |
#initialize_racc ⇒ Object
Initialize variables for racc plugin.
38 39 40 41 42 43 44 45 46 47 |
# File 'lib/hoe/racc.rb', line 38 def initialize_racc self.racc_tasks = [:multi, :test, :check_manifest] # -v = verbose # -l = no-line-convert (they don't ever line up anyhow) self.racc_flags ||= +"-v -l" self. ||= { :do_parse => false, } end |