class Daedalus::DependencyGrapher::FileParser

Parses a file for all preprocessor control directives into a tree of Node objects. The parser can operate on a file or an array of lines.

Attributes

directories[R]
line[R]

Public Class Methods

new(root, directories) click to toggle source
    # File lib/daedalus/dependency_grapher.rb
338 def initialize(root, directories)
339   @stack = [root]
340   @directories = directories
341 end

Public Instance Methods

add_body(node) click to toggle source

Parser operations

    # File lib/daedalus/dependency_grapher.rb
345 def add_body(node)
346   @stack.last.body << node
347 end
add_else(node) click to toggle source
    # File lib/daedalus/dependency_grapher.rb
349 def add_else(node)
350   @stack.last.add_else node
351 end
close() click to toggle source
    # File lib/daedalus/dependency_grapher.rb
365 def close
366   @stack.last.close
367 end
parse(lines) click to toggle source
    # File lib/daedalus/dependency_grapher.rb
437 def parse(lines)
438   @line = 0
439 
440   re = /^\s*#(include|ifdef|ifndef|endif|else|define|undef|if|elif)(.*)$/o
441   full_line = ""
442 
443   lines.each do |line|
444     @line += 1
445 
446     full_line.chomp!
447 
448     if line[-2] == ?\\
449       full_line += line.chomp("\\\n") + "\n"
450       next
451     else
452       full_line += line
453     end
454 
455     m = full_line.match re
456     full_line = ""
457 
458     send :"process_#{m[1]}", m[2] if m
459   end
460 end
parse_file(name) click to toggle source
    # File lib/daedalus/dependency_grapher.rb
428 def parse_file(name)
429   parse IO.readlines(name, :encoding => "ascii-8bit")
430 end
process_define(macro) click to toggle source
    # File lib/daedalus/dependency_grapher.rb
402 def process_define(macro)
403   node = Define.new macro, self
404   add_body node
405 end
process_elif(expression) click to toggle source
    # File lib/daedalus/dependency_grapher.rb
418 def process_elif(expression)
419   node = ElseIf.new expression, self
420   add_else node
421   add_body node
422   stack_push node
423 end
process_else(rest) click to toggle source
    # File lib/daedalus/dependency_grapher.rb
397 def process_else(rest)
398   node = Else.new self
399   add_else node
400 end
process_endif(rest) click to toggle source
    # File lib/daedalus/dependency_grapher.rb
393 def process_endif(rest)
394   close
395 end
process_if(expression) click to toggle source
    # File lib/daedalus/dependency_grapher.rb
412 def process_if(expression)
413   node = If.new expression, self
414   add_body node
415   stack_push node
416 end
process_ifdef(macro) click to toggle source
    # File lib/daedalus/dependency_grapher.rb
381 def process_ifdef(macro)
382   node = IfDefined.new macro, self
383   add_body node
384   stack_push node
385 end
process_ifndef(macro) click to toggle source
    # File lib/daedalus/dependency_grapher.rb
387 def process_ifndef(macro)
388   node = IfNotDefined.new macro, self
389   add_body node
390   stack_push node
391 end
process_include(name) click to toggle source

Events

    # File lib/daedalus/dependency_grapher.rb
371 def process_include(name)
372   # We do not process any <files>. This could be enabled as
373   # an option, but we don't need it or want it now.
374   name =~ /\s*"([^"]+)".*$/
375   return unless $1
376 
377   node = IncludedFile.new $1, self
378   add_body node
379 end
process_undef(macro) click to toggle source
    # File lib/daedalus/dependency_grapher.rb
407 def process_undef(macro)
408   node = Undefine.new macro, self
409   add_body node
410 end
stack_pop() click to toggle source
    # File lib/daedalus/dependency_grapher.rb
357 def stack_pop
358   @stack.pop
359 end
stack_push(node) click to toggle source
    # File lib/daedalus/dependency_grapher.rb
353 def stack_push(node)
354   @stack.push node
355 end
stack_top() click to toggle source
    # File lib/daedalus/dependency_grapher.rb
361 def stack_top
362   @stack.last
363 end