2011-02-03 90 views
2

我有兴趣在C++代码块中定义我自己的语言(例如可以说main),为此我需要使用预处理器及其指令,我的问题依赖于以下规则:预处理器和空格规则

#define INSERT create() ... 

称为函数类的定义和预处理不允许我们定义任何空格,

所以,当我用我自己的语言的功能我得到了解析权得心应手下面的语句:

INSERT INTO variable_name VALUES(arg_list) 

到不同的两个函数调用可以说

insertINTO(variable_name) and valuePARSE(arg_list) 

但是由于预处理指令规则不允许我在我的定义中的空格我怎么能达到变量名,然后拨打电话到第一个函数调用我想实现?

任何线索都会有所帮助。 PS:我尝试使用g ++ -E file.cpp来查看预处理器如何工作并将语法调整为有效的C++规则。

+2

对于这个问题,这听起来不太明智......或实际。 – delnan 2011-02-03 17:01:30

+0

这不是一个智慧问题语法必须像上面说的那样,事情是如何能够得到变量名称:/,谢谢。 – gchatzip 2011-02-03 17:11:14

+1

请勿为此使用预处理器。它不是为这种进程而设计的。 – 2011-02-03 17:19:28

回答

0

包含在大多数C++编译器中的预处理器对于这类任务来说可能太弱了。它从来没有为这种滥用而设计。 boost预处理器库可以帮助你,但我仍然认为你在这里单向走。

如果你真的想这样定义你的语言,我建议你自己编写预处理程序,或者使用比默认语言更强大的语言。 Here是一位尝试将Python用作C++预处理器的人。

0

1)define INSERT create()不是一个类似于函数的宏,它像对象一样,就像define INSERT(a, b, c) create(a, b, c)一样;

2)如果你想扩展INSERT INTO variable_name VALUES(arg_list)insertINTO(variable_name); valuePARSE(arg_list);你可以这样做:

#define INSERT insertINTO(
#define INTO 
#define VALUES(...)); valueParse(__VA_ARGS__); 

3)你可以看到宏变得丑陋很容易,哪怕是一丁点的错误在你的语法会有你花大量的时间追踪它

4)因为它被标记为C++看看Boost.ProtoBoost.Preprocessor