Rubberduck VBA Parser, Episode V: The ANTLR Strikes Back
One would expect that a method of a parser which returns an IParseTree would be named Parse() instead of startRule() which is in addition violating the naming guidelines.  



You should declare variables as near as possible to their usage. You could also omit the assignment of the call to Parse()

public INode Parse(string projectName, string componentName, string code)
{
    var walker = new ParseTreeWalker();                
    var listener = new VBTreeListener(projectName, componentName);

    walker.Walk(listener, Parse(code));

    return listener.Root;
}  




The VisualBasic6Parser.SubStmtContext.visibility() method is also not going conform with the naming guidelines.




  Is it a good idea to "walk" the tree like this?


It is hard to say something about something one can't see.  




  It looks to me like VBParser is somewhat mixing abstraction levels... but is that much of an issue?  


It is a little bit distracting to see inside a Parse() method of a VBParser class which implements an IRubberduckParser interface that a VisualBasic6Parser class is used. But I have no idea how to solve this and if this has to be solved.