2

我想使用一些关键字来扩展 c++,例如“property”,以向类/对象添加属性(如 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;

我想要的是使用一种翻译器将 C++“扩展”源代码翻译成“普通”源代码,就像 QT MOC 一样,它解析一个 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 回答