Somehow I cannot find those "spatial" (for lack of better name) rules useful.
What works for me is "type declaration mimics usage". So I find the variable name, parse the declaration as usage and then reconstruct the type. It goes like this:
char *((*foo)[3])(int);
Ok, so if you dereference foo, then index[3], then call with int, then dereference, you get char?
Cool, looks like foo is a pointer to an array of size 3 of functions that take int and return pointer to char.
Not sure what's going on with your second example, but that first one looks like an odd consequence of how a cdecl feature is implemented. cdecl doesn't just explain C declarations, it can also create them based on a more verbose pseudo-english language (the same one it spits out in response to being fed an actual C declaration, I believe). "func" is an alias for that language's reserved word "function".
Note that this is “C gibberish ↔ English”, not just “to English”. So it also converts (specially-formatted) English to C gibberish. The second and third examples at the top demonstrate this feature.
I did something like this using C++ template metaprogramming, which means you can make use of the compiler to figure out the types for you, and you just have to write class templates to produce the English description. It's described at http://blog.asymptotic.co.uk/2011/02/c-type-declaration-deco... , although somewhere along the line the markup got corrupted so the code samples don't quite render correctly.
I'd like to see an equivalent for parsing common shell commands and their arguments. Just converting the short form to the long form would be a good start
Should anyone take this on (to write a version of cdecl that translates statements to English) as a personal challenge, please consider making it adaptable to whatever language is currently in fad for teaching beginning programming. This could be an extremely useful tool for teachers.
Websites for these little utilities are definitely useful, though. :)