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 rexical.

Instance Attribute Summary (collapse)

Instance Method Summary (collapse)

Instance Attribute Details

- (Object) racc_flags

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

- (Object) racc_tasks

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

- (Object) rex_flags

Optional: Defines what flags to use for rex. default: "--independent"



33
34
35
# File 'lib/hoe/racc.rb', line 33

def rex_flags
  @rex_flags
end

Instance Method Details

- (Object) define_racc_tasks

Define tasks for racc plugin



52
53
54
55
56
57
58
59
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
# File 'lib/hoe/racc.rb', line 52

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$/, ".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 ".rb" => ".rex" do |t|
    begin
      sh "rex #{rex_flags} -o #{t.name} #{t.source}"
    rescue
      abort "need rexical, sudo gem install rexical"
    end
  end

  desc "build the parser" unless parser_files.empty?
  task :parser

  desc "build the lexer" unless lexer_files.empty?
  task :lexer

  task :parser => parser_files
  task :lexer  => lexer_files

  racc_tasks.each do |t|
    task t => [:parser, :lexer]
  end
end

- (Object) initialize_racc

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.rex_flags  ||= "--independent"

  extra_dev_deps << ['racc', '~> 1.4.7']
end