У меня есть реализация слушателя ParseTree, что я использую для извлечения деклараций глобальной области видимости, в стандартных модулях VBA:Можно ли остановить ходунка?
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;
}
}
Есть ли способ сказать дереву ходок, чтобы остановить ходить? Скажем, у меня есть модуль VBA, как это:
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
Я хотел бы дерево ходок, чтобы остановить ходьба дерева разбора, как только он входит в Public Sub DoSomething()
, для меня ничего не интересует, что ниже. В настоящее время я иду по всему дереву синтаксического разбора, просто не делая ничего с тем, что я забираю в рамках области действия.
Есть ли способ, изнутри реализации прослушивателя дерева разбора, сказать ходоку, чтобы он не шел по дереву?
Ну, я думаю, я мог бы выбросить исключение, и это могло бы убить ходунка. Но я бы хотел ненасильственный путь, если возможно :) –