2015-02-15 4 views
10

У меня есть реализация слушателя 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(), для меня ничего не интересует, что ниже. В настоящее время я иду по всему дереву синтаксического разбора, просто не делая ничего с тем, что я забираю в рамках области действия.

Есть ли способ, изнутри реализации прослушивателя дерева разбора, сказать ходоку, чтобы он не шел по дереву?

+3

Ну, я думаю, я мог бы выбросить исключение, и это могло бы убить ходунка. Но я бы хотел ненасильственный путь, если возможно :) –

ответ

5

Да, вы можете сделать одно из следующих действий:

  1. сгенерирует исключение, такие как CancellationException
  2. Создайте новый класс, который расширяет ParseTreeWalker и обеспечить собственную реализацию walk, который понимает отмену концепция, в которой вы нуждаетесь. Было бы целесообразно начать с current implementation of walk и изменить его в соответствии с вашими потребностями.
Смежные вопросы