2017-02-01 9 views
2

Visual Studio 2015でC#にAnTLRのプラグインを使用しています。AnTLRには、すべてのパーサールールクラスが継承するクラスParserRuleContextがあります。私が行うために、すべての構文規則のための私自身のパーシャルクラスを実装しています継承のない複数のクラスの同じコード

public class ParserRuleContext : RuleContext 
{ 
} 

public partial class SomeRuleContext : ParserRuleContext { 
    /* stuff goes here */ 
} 

ParserRuleContextの定義は次のようになります。パーサー規則のクラス自体は、このように、部分クラスとして宣言されていますパーサーツリーを使ったカスタムのもの。 ParserRuleContext(および後で他のプロパティ/フィールド/メソッド)にプロパティを追加できますが、ParserRuleContextpartialとして宣言されていません。ルールクラスはすでに他のクラスから継承しているので、クラスの一部の実装もクラスから継承することはできません。拡張メソッドは、私が望むすべての機能(プロパティ/フィールドを追加することはできません)を得ることはできません。また、インターフェイスは文字通り、すべてのクラスにまったく同じコードをコピー/貼り付けてくれます。ソフトウェア開発者として、その最後の部分はほとんど文字通り私を吐き気にさせます。

私が望む機能を含むオブジェクトを指し示す単一の定数プロパティを追加することを考えましたが、その解決策は私には気難しいと感じて、そのタイプのメンバーのいずれかに余分な呼び出しを追加します。だから、この:

SomeRuleContextInstance.CustomProperty = new FileInfo("path"); 

はこれを次のようになります。

SomeRuleContextInstance.CommonFunctionality.CustomProperty = new FileInfo("path"); 

私はよりよい解決策を好むだろう。

誰でもParserRuleContextベースクラスを変更する方法を提供することができますか、そうでなければどこにでもコードをコピー/ペーストすることはできませんか?これはReflectionで行うことができますか?

答えて

4

具体的なコンテキストクラスとParserRuleContextの間に追加の継承レベルを追加できます。

だけParserRuleContextを継承したクラスを作成:

public abstract class MyParserRuleContext : ParserRuleContext 
{ 
    // Whatever you want here 
} 

をし、次のオプションで使用するには、あなたの文法を教えて:

grammar MyGrammar; 

options { 
    contextSuperClass = MyParserRuleContext; 
} 

// ... 
+0

2つのノートは、私がこれを発見:A)私は '必要MyParserRuleContext'クラスが別の名前空間にあること、B)Javaターゲットを使用してコマンドラインから文法を実行して、構文解析ツリー(obv ... I haz facepalm)を視覚化することはできません。名前空間の問題は、 'options = Namespace.Names.MoreNames.MyParserRuleContext'を設定することで解決しました。そうでなければ、これは完璧です。ありがとう! (すべての文法オプションは[ここ](https://github.com/antlr/antlr4/blob/master/doc/options.md)にあります)。 – wizard07KSU

関連する問題