Mat*_*don 10 c# metaprogramming antlr4
我有一个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;
}
}
Run Code Online (Sandbox Code Playgroud)
有办法告诉树木步行者不要走路吗?假设我有一个像这样的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
Run Code Online (Sandbox Code Playgroud)
我希望树步行者一进入就停止走在解析树上Public Sub DoSomething(),因为我对这下面的任何东西都不感兴趣.目前我正在遍历整个解析树,只是在程序范围内没有做任何事情.
从解析树监听器实现中有没有办法告诉walker停止走树?
是的,您可以执行以下任一操作:
ParseTreeWalker,并提供您自己的实现walk,了解您需要的取消概念.从当前的实现walk开始并对其进行修改以满足您的需求是有意义的.| 归档时间: |
|
| 查看次数: |
332 次 |
| 最近记录: |