より正確に言うと、文法上正しい位置に現れた識別子は、
その文法に従って変数名, 関数名, 構造体/共用体名, typedef名, …
のいずれかの属性が付けられる (仮定される)。

例えば
 a = 3; // aは変数
 b();   // bは関数

変数と仮定した識別子の定義と参照に矛盾がないことを
チェックするのは意味解析フェーズの仕事。

 typedef int integer; // 定義1:integerはtypedefされた型名
 integer a;       // 定義2:a は integer型変数
 a();           // 参照:a は 関数名のはずだったが
              //     定義2と矛盾している→エラー