2015-02-15 13 views
10

Mam realizację słuchacza drzewo wyprowadzenia że używam pobrać deklaracje globalne-Scope w standardowych modułów VBA:Czy można zatrzymać walker?

public class DeclarationSectionListener : DeclarationListener 
{ 
    private bool _insideProcedure; 

    public override void EnterVariableStmt(VisualBasic6Parser.VariableStmtContext context) 
    { 
     var visibility = context.visibility(); 
     if (!_insideProcedure && visibility == null 
      || visibility.GetText() == Tokens.Public 
      || visibility.GetText() == Tokens.Global) 
     { 
      base.EnterVariableStmt(context); 
     } 
    } 

    public override void EnterConstStmt(VisualBasic6Parser.ConstStmtContext context) 
    { 
     var visibility = context.visibility(); 
     if (!_insideProcedure && visibility == null 
      || visibility.GetText() == Tokens.Public 
      || visibility.GetText() == Tokens.Global) 
     { 
      base.EnterConstStmt(context); 
     } 
    } 

    public override void EnterArg(VisualBasic6Parser.ArgContext context) 
    { 
     return; 
    } 

    public override void EnterSubStmt(VisualBasic6Parser.SubStmtContext context) 
    { 
     _insideProcedure = true; 
    } 

    public override void EnterFunctionStmt(VisualBasic6Parser.FunctionStmtContext context) 
    { 
     _insideProcedure = true; 
    } 

    public override void EnterPropertyGetStmt(VisualBasic6Parser.PropertyGetStmtContext context) 
    { 
     _insideProcedure = true; 
    } 

    public override void EnterPropertyLetStmt(VisualBasic6Parser.PropertyLetStmtContext context) 
    { 
     _insideProcedure = true; 
    } 

    public override void ExitPropertySetStmt(VisualBasic6Parser.PropertySetStmtContext context) 
    { 
     _insideProcedure = true; 
    } 
} 

Czy istnieje sposób, aby powiedzieć drzewa walker zatrzymać chodzenie? Że mam moduł VBA takiego:

Public Const foo = 123 
Public bar As String 

Public Sub DoSomething() 
    ' some code 
End Sub 

' ... 
' 10K more lines of code 
' ... 

Private Function GetSomething() As String 
    ' some code 
End Function 

chciałbym drzewa walker, aby zatrzymać chodzenie drzewo parsującej jak tylko wejdzie Public Sub DoSomething(), bo ja nie jestem zainteresowany niczego poniżej tego. Obecnie przechodzę przez całe drzewo parsowania, po prostu nie robiąc nic z tym, co znajdę w zakresie procedur.

Czy istnieje sposób, z poziomu implementacji nasłuchiwania drzewa analizatora, aby powiedzieć spacerowiczowi, aby przestał chodzić po drzewie?

+3

Cóż, myślę, że mógłbym rzucić wyjątek, który prawdopodobnie zabiłby spacerowicza. Ale jeśli to możliwe, chciałbym bez przemocy! –

Odpowiedz

5

Tak, można wykonać jedną z następujących czynności:

  1. wyjątek, takich jak CancellationException
  2. utworzyć nową klasę, która rozciąga ParseTreeWalker i zapewniają własną implementację walk który rozumie anulowanie koncepcja, której potrzebujesz. Warto zacząć od wersji current implementation of walk i zmodyfikować ją zgodnie z własnymi potrzebami.