>>105839709
char sex;

Is context-sensitive thanks to typedef
You need the lexer to know the types you declared, thanks to ambiguities like:
foo * bar;

Is this foo multiplied by bar, or a foo pointer called bar?
This was not intended in the original C, but over time they added stuff without caring for parsers

This is unambiguous
let sex:char
let ass:char *
let bar: foo *
bar * sex

So the lexer doesn't need to be context-sensitive, and in fact you can parse with a LL(1) parser