语法分析,并没有构建出类型系统,只是构建出关系骨架
语义分析,才赋予了每个标识符灵魂
struct Data{
struct { // 无名结构体,若改为 struct ABC,则导致 dt.b 语法错误
int a;
int b;
}; // 无名域成员
int c;
}
struct Data1 dt;
dt.b; //合法的,相当于把内部匿名结构体当作自己的成员了
#define ALIGN(size, align) ((align == 0) ? size: ((size + align - 1) & (~(align - 1)))) //后面的与其实把二进制的低x位置0,因为,按照align对齐,总能被align整除
//这个宏表示的意思是:
现在要分配一个内存空间,从0地址开始,size为需要占据的字节大小,按照align个字节对齐,则结束地址应该为多少。举个例:
ALIGN(15, 4),就应该等于16,我们计算一下,会发现确实等于16
在这一小节中,我们来讨论一下声明中的初始化。在不少程序设计语言的教材中,对变
量的声明和定义是有严格区分的。但从 C 标准文法的角度来看,它们都是由非终结符
Declaration 产生的,因此对变量初始化的语义检查也在 declchk.c 中进行