Первый абзац
Более того, тип ты не сможешь и от функции :-)
V(a);
Тут V может быть как типом, и тогда это объявление переменной, так и функцией, тогда это вызов оной функции :-) И лексерная раскраска тут ну никак не поможет, скорее запутает.
частично опровергает второй
Также в плюсах нет какогого смысла в выделении как-то предопределенных типов, вроде int, char и так далее, просто потому, что типы рукотворные ничем не хуже и могут иметь в точности ту же семантику.
Помимо того, что семантика в Си(без плюсов) не совсем та же. Рукотворный тип, который суть переменная со спецификатором хранения typedef, может быть переопределен во вложенной области видимости, причем самым забавным способом - type a, b, type; с int такое не пройдет. Переменная рукотворный типа не может быть объявлена с signed, unsigned, long, short. Опять же, рукотворный тип может быть объявлен уже с квалификатором const/volatile, что может привести к невозможности объявления переменной с теми же явными квалификаторами. Это просто уточнение про ту же самую семантику, как этому делу может помочь боевая раскраска - дело 10-е.
Ключевые слова от идентификаторов в языке, где есть шаблоны и макросы смысла не имеет отделять, просто потому, что "идентификатор" может выполнять те же функции что и ключевое слово языка. Кстати, то же творится и в Haskell'e - ключевые слова выделять не нужно. Да их там почти и нет :-)
К счастью, с таким отмороженным кодом приходится иметь дело нечасто. И это одна из причин, почему я не люблю эмулировать цикл Дейкстры или что там еще взбредет в голову через макросы. Чем больше явного, тем для меня лучше.