2015-02-15 12 views
10

Ho un'implementazione ascoltatore ParseTree che sto usando per andare a prendere le dichiarazioni globale portata nei moduli standard VBA:È possibile arrestare un deambulatore?

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; 
    } 
} 

C'è un modo per dire l'albero camminatore a smettere di camminare? Dire che ho un modulo VBA in questo modo:

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 

Vorrei l'albero camminatore per smettere di camminare l'albero di analisi non appena entra Public Sub DoSomething(), perché io non sono interessato a nulla al di sotto che. Attualmente sto percorrendo l'intero albero di analisi, semplicemente non facendo nulla con quello che raccolgo nell'ambito di una procedura.

Esiste un modo, dall'interno di un'implementazione di listener dell'albero di analisi, per dire al deambulatore di smettere di camminare sull'albero?

+3

Beh, immagino che potrei lanciare un'eccezione e che potrebbe uccidere il camminatore. Ma mi piacerebbe un modo non violento, se possibile :) –

risposta

5

Sì, si può fare una delle seguenti operazioni:

  1. un'eccezione, come ad esempio un CancellationException
  2. Creare una nuova classe che si estende ParseTreeWalker, e fornire la propria implementazione di walk che comprende la cancellazione concetto di cui hai bisogno. Avrebbe senso iniziare con current implementation of walk e modificarlo in base alle proprie esigenze.
Problemi correlati