2

クラス/オブジェクトにプロパティを追加するために、「プロパティ」などのいくつかのキーワードで c++ を拡張したい (Visual Studio が「マネージ」バージョンで C++ を拡張するように)。コード例:

  class Example {
     public:
       [...]
       property int size {
             get: {
                   return __size;
                  }
             set: {
                   if( value > 0 )
                      __size = value;
                   else
                      throw new Exception("Invalid Size");
                   }
       };
};

使用する:

   [...]
    int totalSize = example1.size + example2.size + example3.size;
    example1.size = 2 * example1.size;

私が望むのは、QT MOC のように、C++ の「拡張」ソース コードを「通常の」ソース コードに変換するトランスレータの形式を使用することです。これは、C++ ソース コードを解析し、別の C++ ソース コードを QT で生成します。 " ベア C++ に変換されます。もちろん、トランスレータを拡張する必要があります (「プロパティ キーワード」の処理方法を理解できるように、トランスレータにコードを記述します)。私がやりたいことをするために使用できる「翻訳者」を知っていますか?

4

2 に答える 2

2

ヘッダーの処理は、 pyparsingを使用して簡単に実行できます。これは、強力でありながら簡単なソリューションである Python-lib です。私自身、仕事で C にインスパイアされた定義ファイルを解析し、そこから有効な C コードを生成するために使用しています。たとえば、ヘッダー ファイルをコピーするだけでプロパティ定義を書き直すことができます。たとえば、次のようなものを使用します。

property  := Literal('property') id id Literal('{') [getter] [setter] 
             Literal('}') Literal(';')
getter    := Literal('get:') Literal('{') cpp_block Literal('}')
setter    := Literal('set:') Literal('{') cpp_block Literal('}')
id        := Word(alphas + '_', alphanums + '_')
cpp_block := ... don't know probably just match everything a la .*? ...

setter次に、アクションをメソッドにアタッチして、メソッドgetterに書き直すことができcpp_blockます。

問題は、C++ コードを書き直すことから始まります。単純なパーサーは、フィールド (変更されるべきではない)example1.sizeへのアクセスであるか、プロパティの取得またはプロパティの設定の呼び出しであるかを認識しません。structしたがって、の型を知る必要がありexample1ますが、左辺値または右辺値にアクセスする場合example1.size = 1は、に変換する必要example1.set_size(1)がありますが、にint a = example1.sizeなる必要がありますint a = example1.get_size()

基本的に、コード変換には変数の型を検索するための AST とシンボル テーブルが必要です。ANTLRには C++ パーサーがあります (こちらを参照) が、シンボル テーブルも生成するかどうかはわかりません。

于 2013-02-20T07:17:20.840 に答える
0

boost::waveLLVMをご覧になる必要があると思います。前者ははるかに簡単で、はるかに制限されていますが、おそらくそれはまさにあなたが必要としているものです.

于 2013-02-20T06:11:58.460 に答える