我想用一些关键字扩展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 ++。 当然,我需要扩展翻译器(为其编写代码,以便它可以理解如何处理“属性关键字”)。 你知道我可以用来做我想要的“翻译”吗?
答案 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 .*? ...
然后,您可以将操作附加到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 ++解析器(参见here),但我不确定它是否也会为你生成符号表。
答案 1 :(得分:0)
我认为你应该看看boost::wave和LLVM。前者更容易,也更有限,但也许这就是你需要的东西。