如何使编译器支持新语法?即如何拓展C++语法。
如果想在原有C99的标准上拓展C++语言,使它有一些可以为我所用的新功能(例如synchronized关键字),在windows平台上(或者linux),除了重写编译器外,有什么插件或者第三方软件可以实现类似的功能吗?
[解决办法]
扯一句纯语法糖的东西,是Ruby的,Ruby1.9里面有一个语法
a.(xxx)
不管a是什么,都是a.call(xxx)的意思
在Ruby1.8里面(没有这个语法糖),我们就是直接替换'.('为'.call(',不会有别的歧义,也与Ruby的具体语法关系不大。
C++不是上下文无关文法的语言,但LZ自定义的部分可以通过明显不属于C++的语法来插入所需要的东西(而且明显也不属于C预处理器的部分),比如
#(x,y) F(void){
return @(3, 5);
}
@(x,y) = F();
[解决办法]
当然新版C++本来就有
std::tuple<int, int> F(){
return make_tuple(3,5);
}
tie(x, y) = F();
是另外一回事了,语法设施都是人想出来的。LZ用的
S s = F(void);
x = s.a;
y = s.b;
的技巧也是coffeescript转换为javascript时使用的类似的
Coffeescript:
f = ()=>
a:3
b:5
{a:x, b:y}=f()
它被翻译成下面的javascript
var f, x, y, _ref,
_this = this;
f = function() {
return {
a: 3,
b: 5
};
};
_ref = f(), x = _ref.a, y = _ref.b;
当然,本来就可以直接写成:
CoffeeScript:
f=()->[3,5]
[x,y]=f();
翻译成:
var f, x, y, _ref;
f = function() {
return [3, 5];
};
_ref = f(), x = _ref[0], y = _ref[1];
[解决办法]
亲,用YACC自己重新写一个编译器.或者干脆用YACC来写程序,反正这东西就是用来设计语法的,你想怎么设计就怎么弄,最后把语义写上就行了,呵呵.
[解决办法]
如果你所扩展的语法都可以通过标准 C++ 来实现的话, 那你只需修改 gcc 的 C++ 预处理部分就行了.