用一个新关键字扩展c++



我想用一些关键字来扩展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++。当然,我需要扩展翻译器(给它写代码,这样它就可以理解如何处理"property关键字")。你知道我可以用"翻译"做我想做的事吗?

处理头可以简单地使用pyparsing来完成。它是一个Python库,是一个强大但简单的解决方案。我自己在工作中使用它来解析一个受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 .*? ...

然后可以将操作附加到settergetter,以将cpp_block重新写入方法中。

困难从重写C++代码开始。简单的解析器将不知道example1.size是对struct字段的访问(不应更改)、属性get还是属性集调用。所以你需要知道example1的类型,也需要知道你是否访问了一个左值或右值,因为example1.size = 1必须转换为example1.set_size(1),但int a = example1.size必须变成int a = example1.get_size()

因此,本质上,对于代码转换,您需要AST和符号表来查找变量的类型。ANTLR有一个C++解析器(请参阅此处),但我不确定它是否也为您生成符号表。

我认为您应该了解boost::wave和LLVM。前者更容易,也更有限,但也许它正是你所需要的。

最新更新