Antlr4,C# - 如何在更全局的监听器中检查触发器?

时间:2014-04-03 12:12:07

标签: c# antlr antlr4

我正在覆盖一些侦听器方法。我有几个对应以下语法的对象:

object : BEGIN o1+ END ;
o1 : ( Token1 | (name | Token2 ) );

以下是EnterObject()覆盖方法的代码:

if (context.o1(1).name() != null)
{
 object.Field = context.o1(1).name().GetChild(0).GetText();
}
else
{
 object.Field = context.o1(1).Token2().GetText();
}

虽然我有些疑惑,但它确实有效。是否有更有效的方法可以检查EnterObject()中的EnterName()?

1 个答案:

答案 0 :(得分:0)

我相信您可以使用context.o1(1).GetText()代替更长的表达。

我还建议您在方法中添加一个属性,使用此代码来声明对o1后代的依赖(因为这些后代隐式定义了GetText()调用的结果)。 / p>

[RuleDependency(
    typeof(YourParserType),
    YourParserType.RULE_o1,
    0,
    Dependents.Descendants)]

您可以在应用程序或库初始化代码中调用以下内容来验证此属性的所有用法。

Assembly assembly = typeof(YourListenerClass).Assembly;
RuleDependencyChecker.CheckDependencies(assembly);