司马中实现了一种叫作“线锁”的结构,线锁把结构体的定义头链在一起,逻辑上可以把它看作是树形结构。这种结构可以把诸如结构体变量属性的引用简化为一个线性遍历过程。当分析某个结构体变量语义时可以在线锁中搜索,上例中的结构体“定义头”a是线锁父节点,其余b、c、d、e、d都它在的线锁上,该规则可以推广到任意满足这个特性的结构体定义头上,例如上例的定义头c是a的递归,它的基本性质跟a相同。
C语言规定,凡是出现在分析树同一层次上的结构体定义头必须是唯一的。这个语义可以用线锁号来实现。
为了生成线锁号,我们必须先为每个节点编号,C语言的语法分析器是预测分析算法,从遍历分析树的方向来看是先根遍历,节点编号号可以在遍历分析树的时候生成。有了节点编号之后分析器就可以生成节点的线锁号了,某个节点的线锁号是它的父节点的编号,如下图所示:
对于结构体的定义头命名空间分析只需要比较线锁号即可,当一个定义头名称相同并且线锁号也相同时,说明出现了语义错误。运行效果如下:
司马编译器:
开发:
项目地址:
http://gforge.osdn.net.cn/projects/unixtok/
struct a{
struct b{};
struct c{
struct d{};
struct e{};
};
struct d{};
};