2013-02-20 168 views
2

我想用一些关键字来扩展C++,例如“property”,以向类/对象(如Visual Studio在“managed”版本中扩展C++)添加属性。 有关代码示例:用一个新的关键字扩展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关键字”)。 你知道我可以用来做我想做的“翻译”吗?

+3

#define – stark 2013-02-20 05:32:55

+0

Noop。我想在“属性”旁边添加其他关键字。另外,如何扩展,例如,只使用example1.size定义? – user2089799 2013-02-20 05:46:58

+0

C++是一种足够强大的语言来解析(甚至只是标记),这将是相当困难的。这样做是为了实现一个'不好'作为'财产'的想法,这完全是疯狂的。如果你花时间在上面,我希望你想做的其他事情能够比“财产”所希望的更能证明这项工作的合理性。 – 2013-02-20 06:17:54

回答

0

我想你应该看看boost::waveLLVM。前者更容易,更受限制,但也许是你需要的东西。

+0

我会研究2,谢谢。我看到[Youtube上的这个视频 - 链接](http://youtu.be/yuIOGfcOH0k),关于使用clang/LLVM重构C++,我会和他们一起玩。谢谢。 – user2089799 2013-02-22 02:08:47

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),但我不确定它是否也会为您生成符号表。

+0

我会研究它,谢谢。 – user2089799 2013-02-22 02:04:30