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?
Beh, immagino che potrei lanciare un'eccezione e che potrebbe uccidere il camminatore. Ma mi piacerebbe un modo non violento, se possibile :) –