我在Visual Studio 2015中使用AnTLR的C#插件.AnTLR有一个类ParserRuleContext
,所有解析器规则类都从该类继承。解析器规则类本身被声明为部分类,如下所示:
public partial class SomeRuleContext : ParserRuleContext {
/* stuff goes here */
}
ParserRuleContext
的定义如下:
public class ParserRuleContext : RuleContext
{
}
我正在为所有解析器规则实现我自己的部分类,以使用解析器树执行自定义内容。我希望能够向ParserRuleContext
(以及之后的其他属性/字段/方法)添加属性,但ParserRuleContext
未声明为partial
。由于规则类都已经从另一个类继承,因此我无法使其部分实现也从类继承。扩展方法没有得到我想要的所有功能(不能添加属性/字段),并且接口让我从字面上将完全相同的代码复制/粘贴到每个类中。作为一名软件开发人员,最后一部分几乎让我感到恶心。
我已经考虑过添加一个指向包含我想要的功能的对象的单个常量属性的想法,但是这个解决方案对我来说很笨拙,并且对该类型的任何成员添加了额外的调用。所以这个:
SomeRuleContextInstance.CustomProperty = new FileInfo( "path" );
成为这个:
SomeRuleContextInstance.CommonFunctionality.CustomProperty = new FileInfo( "path" );
我希望有更好的解决方案。
任何人都可以提供修改ParserRuleContext
基类的方法,或者不让我在任何地方复制/粘贴代码吗?这可以用反射来完成吗?
答案 0 :(得分:4)
您可以在具体上下文类和ParserRuleContext
之间添加其他继承级别。
只需创建一个继承ParserRuleContext
:
public abstract class MyParserRuleContext : ParserRuleContext
{
// Whatever you want here
}
然后告诉你的语法使用以下选项:
grammar MyGrammar;
options {
contextSuperClass = MyParserRuleContext;
}
// ...