I suspect that the context-dependence in C is more an issue with the implementation than the overall syntactic philosophy.

It's a thing in c.

foo * bar;

Is that multiplication? Or a declaration of type foo*?

Right; and my argument is that this isn't because the type expression `foo *` precedes the name `bar`; it's because the type "pointer to foo" is expressed in a way that could also be a prefix of a multiplication expression.