作者回复: 没有工具。原因:
语义分析的工作比较多,作用域解析、类型检查等等,比较难以统一解决。
而每个语言的个性化差异,最大的就体现在语义方面。词法差异最小,语法次之,语义差异最大。语法差异再大,但都可以用CFG表示,所有都可以统一地解决。但语义的差异,目前还不好用统一的形式化的方法去解决。
比如类型系统,每种语言的设计相差很大,很难用统一的方式来处理。
属性文法是语义分析领域从形式化的角度做得不错的工作了,所以可以基于属性文法实现一些自动的工作。
作者回复: 是的。你看得很细:-)
我这里是偷懒了。因为左值比右值更强,所以我在示例代码里都用的是左值。
我抽空会在语义分析中加上左右值分析的代码:-)
作者回复: C++的模板与泛型编程是一种元编程技术,就叫做模板元编程,是C++最强大的能力之一。
在第38讲,我们提到了元编程的基础知识。简单的来说,它是在编译期由程序生成另外的程序。
具体到C++的模板元编程技术,它会在编译期把模板展开,比如把某个数据类型替换成真实的类型,然后再进一步编译所形成的代码。
模板元编程技术能够让编写类库等任务变得更简单。代价是编译期的计算量变大,编译时间变长。
另外注意,C++的泛型跟Java的泛型机制是不一样的。Java的泛型比较简单,只是做类型检查,没有做新代码的生成。
作者回复: 是的。语义分析时会去做检查。