def build(exp, parent_exp = nil)
      context_processor = "process_#{exp.type}"
      if context_processor_exists?(context_processor)
        send(context_processor, exp, parent_exp)
      else
        process exp
      end
      current_context
    end
def build(exp, parent_exp = nil)
      context_processor = "process_#{exp.type}"
      if context_processor_exists?(context_processor)
        send(context_processor, exp, parent_exp)
      else
        process exp
      end
      current_context
    end
Processes the given AST, memoizes it and returns a tree of nested
 contexts.

 For example this ruby code:

   class Car; def drive; end; end

 would get compiled into this AST:

   (class
     (const nil :Car) nil
     (def :drive
       (args) nil))

 Processing this AST would result in a context tree where each node
 contains the outer context, the AST and the child contexts. The top
 node is always Reek::Context::RootContext. Using the example above,
 the tree would look like this:

 RootContext -> children: 1 ModuleContext -> children: 1 MethodContext

 @return [Reek::Context::RootContext] tree of nested contexts