使用新关键字扩展c ++

时间:2013-02-20 05:27:52

标签: 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 ++。   当然,我需要扩展翻译器(为其编写代码,以便它可以理解如何处理“属性关键字”)。   你知道我可以用来做我想要的“翻译”吗?

2 个答案:

答案 0 :(得分: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 .*? ...

然后,您可以将操作附加到settergetter,以便将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 ++解析器(参见here),但我不确定它是否也会为你生成符号表。

答案 1 :(得分:0)

我认为你应该看看boost::waveLLVM。前者更容易,也更有限,但也许这就是你需要的东西。